acid-drop

- Hacking the planet from a LilyGo T-Deck using custom firmware
git clone git://git.acid.vegas/acid-drop.git
Log | Files | Refs | Archive | README | LICENSE

lv_calendar_header_arrow.c (4219B)

      1 /**
      2  * @file lv_calendar_header_arrow.c
      3  *
      4  */
      5 
      6 /*********************
      7  *      INCLUDES
      8  *********************/
      9 #include "lv_calendar_header_arrow.h"
     10 #if LV_USE_CALENDAR_HEADER_ARROW
     11 
     12 #include "lv_calendar.h"
     13 #include "../../../widgets/lv_btn.h"
     14 #include "../../../widgets/lv_label.h"
     15 #include "../../layouts/flex/lv_flex.h"
     16 
     17 /*********************
     18  *      DEFINES
     19  *********************/
     20 
     21 /**********************
     22  *      TYPEDEFS
     23  **********************/
     24 
     25 /**********************
     26  *  STATIC PROTOTYPES
     27  **********************/
     28 static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
     29 static void month_event_cb(lv_event_t * e);
     30 static void value_changed_event_cb(lv_event_t * e);
     31 
     32 /**********************
     33  *  STATIC VARIABLES
     34  **********************/
     35 const lv_obj_class_t lv_calendar_header_arrow_class = {
     36     .base_class = &lv_obj_class,
     37     .constructor_cb = my_constructor,
     38     .width_def = LV_PCT(100),
     39     .height_def = LV_DPI_DEF / 3
     40 };
     41 
     42 static const char * month_names_def[12] = LV_CALENDAR_DEFAULT_MONTH_NAMES;
     43 
     44 /**********************
     45  *      MACROS
     46  **********************/
     47 
     48 /**********************
     49  *   GLOBAL FUNCTIONS
     50  **********************/
     51 
     52 lv_obj_t * lv_calendar_header_arrow_create(lv_obj_t * parent)
     53 {
     54     lv_obj_t * obj = lv_obj_class_create_obj(&lv_calendar_header_arrow_class, parent);
     55     lv_obj_class_init_obj(obj);
     56     return obj;
     57 }
     58 
     59 /**********************
     60  *  STATIC FUNCTIONS
     61  **********************/
     62 
     63 static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
     64 {
     65     LV_TRACE_OBJ_CREATE("begin");
     66 
     67     LV_UNUSED(class_p);
     68 
     69     lv_obj_move_to_index(obj, 0);
     70 
     71     lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW);
     72     lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START);
     73 
     74     lv_obj_t * mo_prev = lv_btn_create(obj);
     75     lv_obj_set_style_bg_img_src(mo_prev, LV_SYMBOL_LEFT, 0);
     76     lv_obj_set_height(mo_prev, lv_pct(100));
     77     lv_obj_update_layout(mo_prev);
     78     lv_coord_t btn_size = lv_obj_get_height(mo_prev);
     79     lv_obj_set_width(mo_prev, btn_size);
     80 
     81     lv_obj_add_event_cb(mo_prev, month_event_cb, LV_EVENT_CLICKED, NULL);
     82     lv_obj_clear_flag(mo_prev, LV_OBJ_FLAG_CLICK_FOCUSABLE);
     83 
     84     lv_obj_t * label = lv_label_create(obj);
     85     lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR);
     86     lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, 0);
     87     lv_obj_set_flex_grow(label, 1);
     88 
     89     lv_obj_t * mo_next = lv_btn_create(obj);
     90     lv_obj_set_style_bg_img_src(mo_next, LV_SYMBOL_RIGHT, 0);
     91     lv_obj_set_size(mo_next, btn_size, btn_size);
     92 
     93     lv_obj_add_event_cb(mo_next, month_event_cb, LV_EVENT_CLICKED, NULL);
     94     lv_obj_clear_flag(mo_next, LV_OBJ_FLAG_CLICK_FOCUSABLE);
     95 
     96     lv_obj_add_event_cb(obj, value_changed_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
     97     /*Refresh the drop downs*/
     98     lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL);
     99 }
    100 
    101 static void month_event_cb(lv_event_t * e)
    102 {
    103     lv_obj_t * btn = lv_event_get_target(e);
    104 
    105     lv_obj_t * header = lv_obj_get_parent(btn);
    106     lv_obj_t * calendar = lv_obj_get_parent(header);
    107 
    108     const lv_calendar_date_t * d;
    109     d = lv_calendar_get_showed_date(calendar);
    110     lv_calendar_date_t newd = *d;
    111 
    112     /*The last child is the right button*/
    113     if(lv_obj_get_child(header, 0) == btn) {
    114         if(newd.month == 1) {
    115             newd.month = 12;
    116             newd.year --;
    117         }
    118         else {
    119             newd.month --;
    120         }
    121     }
    122     else {
    123         if(newd.month == 12) {
    124             newd.month = 1;
    125             newd.year ++;
    126         }
    127         else {
    128             newd.month ++;
    129         }
    130     }
    131 
    132     lv_calendar_set_showed_date(calendar, newd.year, newd.month);
    133 
    134     lv_obj_t * label = lv_obj_get_child(header, 1);
    135     lv_label_set_text_fmt(label, "%d %s", newd.year, month_names_def[newd.month - 1]);
    136 }
    137 
    138 static void value_changed_event_cb(lv_event_t * e)
    139 {
    140     lv_obj_t * header = lv_event_get_target(e);
    141     lv_obj_t * calendar = lv_obj_get_parent(header);
    142 
    143     const lv_calendar_date_t * cur_date = lv_calendar_get_showed_date(calendar);
    144     lv_obj_t * label = lv_obj_get_child(header, 1);
    145     lv_label_set_text_fmt(label, "%d %s", cur_date->year, month_names_def[cur_date->month - 1]);
    146 }
    147 
    148 #endif /*LV_USE_CALENDAR_HEADER_ARROW*/
    149