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_dropdown.c (4544B)

      1 /**
      2  * @file lv_calendar_obj_dropdown.c
      3  *
      4  */
      5 
      6 /*********************
      7  *      INCLUDES
      8  *********************/
      9 #include "lv_calendar_header_dropdown.h"
     10 #if LV_USE_CALENDAR_HEADER_DROPDOWN
     11 
     12 #include "lv_calendar.h"
     13 #include "../../../widgets/lv_dropdown.h"
     14 #include "../../layouts/flex/lv_flex.h"
     15 
     16 /*********************
     17  *      DEFINES
     18  *********************/
     19 
     20 /**********************
     21  *      TYPEDEFS
     22  **********************/
     23 
     24 /**********************
     25  *  STATIC PROTOTYPES
     26  **********************/
     27 static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
     28 static void year_event_cb(lv_event_t * e);
     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_dropdown_class = {
     36     .base_class = &lv_obj_class,
     37     .width_def = LV_PCT(100),
     38     .height_def = LV_SIZE_CONTENT,
     39     .constructor_cb = my_constructor
     40 };
     41 
     42 static const char * month_list = "01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12";
     43 static const char * year_list = {
     44     "2023\n2022\n2021\n"
     45     "2020\n2019\n2018\n2017\n2016\n2015\n2014\n2013\n2012\n2011\n2010\n2009\n2008\n2007\n2006\n2005\n2004\n2003\n2002\n2001\n"
     46     "2000\n1999\n1998\n1997\n1996\n1995\n1994\n1993\n1992\n1991\n1990\n1989\n1988\n1987\n1986\n1985\n1984\n1983\n1982\n1981\n"
     47     "1980\n1979\n1978\n1977\n1976\n1975\n1974\n1973\n1972\n1971\n1970\n1969\n1968\n1967\n1966\n1965\n1964\n1963\n1962\n1961\n"
     48     "1960\n1959\n1958\n1957\n1956\n1955\n1954\n1953\n1952\n1951\n1950\n1949\n1948\n1947\n1946\n1945\n1944\n1943\n1942\n1941\n"
     49     "1940\n1939\n1938\n1937\n1936\n1935\n1934\n1933\n1932\n1931\n1930\n1929\n1928\n1927\n1926\n1925\n1924\n1923\n1922\n1921\n"
     50     "1920\n1919\n1918\n1917\n1916\n1915\n1914\n1913\n1912\n1911\n1910\n1909\n1908\n1907\n1906\n1905\n1904\n1903\n1902\n1901"
     51 };
     52 
     53 /**********************
     54  *      MACROS
     55  **********************/
     56 
     57 /**********************
     58  *   GLOBAL FUNCTIONS
     59  **********************/
     60 
     61 lv_obj_t * lv_calendar_header_dropdown_create(lv_obj_t * parent)
     62 {
     63     lv_obj_t * obj = lv_obj_class_create_obj(&lv_calendar_header_dropdown_class, parent);
     64     lv_obj_class_init_obj(obj);
     65 
     66     return obj;
     67 }
     68 
     69 /**********************
     70  *  STATIC FUNCTIONS
     71  **********************/
     72 
     73 static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
     74 {
     75     LV_TRACE_OBJ_CREATE("begin");
     76 
     77     LV_UNUSED(class_p);
     78 
     79     lv_obj_t * calendar = lv_obj_get_parent(obj);
     80     lv_obj_move_to_index(obj, 0);
     81     lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW);
     82 
     83     lv_obj_t * year_dd = lv_dropdown_create(obj);
     84     lv_dropdown_set_options(year_dd, year_list);
     85     lv_obj_add_event_cb(year_dd, year_event_cb, LV_EVENT_VALUE_CHANGED, calendar);
     86     lv_obj_set_flex_grow(year_dd, 1);
     87 
     88     lv_obj_t * month_dd = lv_dropdown_create(obj);
     89     lv_dropdown_set_options(month_dd, month_list);
     90     lv_obj_add_event_cb(month_dd, month_event_cb, LV_EVENT_VALUE_CHANGED, calendar);
     91     lv_obj_set_flex_grow(month_dd, 1);
     92 
     93     lv_obj_add_event_cb(obj, value_changed_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
     94     /*Refresh the drop downs*/
     95     lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL);
     96 }
     97 
     98 static void month_event_cb(lv_event_t * e)
     99 {
    100     lv_obj_t * dropdown = lv_event_get_target(e);
    101     lv_obj_t * calendar = lv_event_get_user_data(e);
    102 
    103     uint16_t sel = lv_dropdown_get_selected(dropdown);
    104 
    105     const lv_calendar_date_t * d;
    106     d = lv_calendar_get_showed_date(calendar);
    107     lv_calendar_date_t newd = *d;
    108     newd.month = sel + 1;
    109 
    110     lv_calendar_set_showed_date(calendar, newd.year, newd.month);
    111 }
    112 
    113 static void year_event_cb(lv_event_t * e)
    114 {
    115     lv_obj_t * dropdown = lv_event_get_target(e);
    116     lv_obj_t * calendar = lv_event_get_user_data(e);
    117 
    118     uint16_t sel = lv_dropdown_get_selected(dropdown);
    119 
    120     const lv_calendar_date_t * d;
    121     d = lv_calendar_get_showed_date(calendar);
    122     lv_calendar_date_t newd = *d;
    123     newd.year = 2023 - sel;
    124 
    125     lv_calendar_set_showed_date(calendar, newd.year, newd.month);
    126 }
    127 
    128 static void value_changed_event_cb(lv_event_t * e)
    129 {
    130     lv_obj_t * header = lv_event_get_target(e);
    131     lv_obj_t * calendar = lv_obj_get_parent(header);
    132     const lv_calendar_date_t * cur_date = lv_calendar_get_showed_date(calendar);
    133 
    134     lv_obj_t * year_dd = lv_obj_get_child(header, 0);
    135     lv_dropdown_set_selected(year_dd, 2023 - cur_date->year);
    136 
    137     lv_obj_t * month_dd = lv_obj_get_child(header, 1);
    138     lv_dropdown_set_selected(month_dd, cur_date->month - 1);
    139 }
    140 
    141 #endif /*LV_USE_CALENDAR_HEADER_ARROW*/
    142