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_fragment.h (9351B)

      1 /**
      2  * Public header for Fragment
      3  * @file lv_fragment.h
      4  */
      5 
      6 #ifndef LV_FRAGMENT_H
      7 #define LV_FRAGMENT_H
      8 
      9 #ifdef __cplusplus
     10 extern "C" {
     11 #endif
     12 
     13 /*********************
     14  *      INCLUDES
     15  *********************/
     16 #include "../../../lv_conf_internal.h"
     17 
     18 #if LV_USE_FRAGMENT
     19 
     20 #include "../../../core/lv_obj.h"
     21 
     22 /*********************
     23  *      DEFINES
     24  *********************/
     25 
     26 /**********************
     27  *      TYPEDEFS
     28  **********************/
     29 
     30 typedef struct _lv_fragment_manager_t lv_fragment_manager_t;
     31 
     32 typedef struct _lv_fragment_t lv_fragment_t;
     33 typedef struct _lv_fragment_class_t lv_fragment_class_t;
     34 typedef struct _lv_fragment_managed_states_t lv_fragment_managed_states_t;
     35 
     36 struct _lv_fragment_t {
     37     /**
     38      * Class of this fragment
     39      */
     40     const lv_fragment_class_t * cls;
     41     /**
     42      * Managed fragment states. If not null, then this fragment is managed.
     43      *
     44      * @warning Don't modify values inside this struct!
     45      */
     46     lv_fragment_managed_states_t * managed;
     47     /**
     48      * Child fragment manager
     49      */
     50     lv_fragment_manager_t * child_manager;
     51     /**
     52      * lv_obj returned by create_obj_cb
     53      */
     54     lv_obj_t * obj;
     55 
     56 };
     57 
     58 struct _lv_fragment_class_t {
     59     /**
     60      * Constructor function for fragment class
     61      * @param self Fragment instance
     62      * @param args Arguments assigned by fragment manager
     63      */
     64     void (*constructor_cb)(lv_fragment_t * self, void * args);
     65 
     66     /**
     67      * Destructor function for fragment class
     68      * @param self Fragment instance, will be freed after this call
     69      */
     70     void (*destructor_cb)(lv_fragment_t * self);
     71 
     72     /**
     73      * Fragment attached to manager
     74      * @param self Fragment instance
     75      */
     76     void (*attached_cb)(lv_fragment_t * self);
     77 
     78     /**
     79      * Fragment detached from manager
     80      * @param self Fragment instance
     81      */
     82     void (*detached_cb)(lv_fragment_t * self);
     83 
     84     /**
     85      * Create objects
     86      * @param self Fragment instance
     87      * @param container Container of the objects should be created upon
     88      * @return Created object, NULL if multiple objects has been created
     89      */
     90     lv_obj_t * (*create_obj_cb)(lv_fragment_t * self, lv_obj_t * container);
     91 
     92     /**
     93      *
     94      * @param self Fragment instance
     95      * @param obj lv_obj returned by create_obj_cb
     96      */
     97     void (*obj_created_cb)(lv_fragment_t * self, lv_obj_t * obj);
     98 
     99     /**
    100      * Called before objects in the fragment will be deleted.
    101      *
    102      * @param self Fragment instance
    103      * @param obj object with this fragment
    104      */
    105     void (*obj_will_delete_cb)(lv_fragment_t * self, lv_obj_t * obj);
    106 
    107     /**
    108      * Called when the object created by fragment received `LV_EVENT_DELETE` event
    109      * @param self Fragment instance
    110      * @param obj object with this fragment
    111      */
    112     void (*obj_deleted_cb)(lv_fragment_t * self, lv_obj_t * obj);
    113 
    114     /**
    115      * Handle event
    116      * @param self Fragment instance
    117      * @param which User-defined ID of event
    118      * @param data1 User-defined data
    119      * @param data2 User-defined data
    120      */
    121     bool (*event_cb)(lv_fragment_t * self, int code, void * userdata);
    122 
    123     /**
    124      * *REQUIRED*: Allocation size of fragment
    125      */
    126     size_t instance_size;
    127 };
    128 
    129 /**
    130  * Fragment states
    131  */
    132 typedef struct _lv_fragment_managed_states_t  {
    133     /**
    134      * Class of the fragment
    135      */
    136     const lv_fragment_class_t * cls;
    137     /**
    138      * Manager the fragment attached to
    139      */
    140     lv_fragment_manager_t * manager;
    141     /**
    142      * Container object the fragment adding view to
    143      */
    144     lv_obj_t * const * container;
    145     /**
    146      * Fragment instance
    147      */
    148     lv_fragment_t * instance;
    149     /**
    150      * true between `create_obj_cb` and `obj_deleted_cb`
    151      */
    152     bool obj_created;
    153     /**
    154      * true before `lv_fragment_del_obj` is called. Don't touch any object if this is true
    155      */
    156     bool destroying_obj;
    157     /**
    158      * true if this fragment is in navigation stack that can be popped
    159      */
    160     bool in_stack;
    161 } lv_fragment_managed_states_t;
    162 
    163 /**********************
    164  * GLOBAL PROTOTYPES
    165  **********************/
    166 
    167 /**
    168  * Create fragment manager instance
    169  * @param parent Parent fragment if this manager is placed inside another fragment, can be null.
    170  * @return Fragment manager instance
    171  */
    172 lv_fragment_manager_t * lv_fragment_manager_create(lv_fragment_t * parent);
    173 
    174 /**
    175  * Destroy fragment manager instance
    176  * @param manager Fragment manager instance
    177  */
    178 void lv_fragment_manager_del(lv_fragment_manager_t * manager);
    179 
    180 /**
    181  * Create object of all fragments managed by this manager.
    182  * @param manager Fragment manager instance
    183  */
    184 void lv_fragment_manager_create_obj(lv_fragment_manager_t * manager);
    185 
    186 /**
    187  * Delete object created by all fragments managed by this manager. Instance of fragments will not be deleted.
    188  * @param manager Fragment manager instance
    189  */
    190 void lv_fragment_manager_del_obj(lv_fragment_manager_t * manager);
    191 
    192 /**
    193  * Attach fragment to manager, and add to container.
    194  * @param manager Fragment manager instance
    195  * @param fragment Fragment instance
    196  * @param container Pointer to container object for manager to add objects to
    197  */
    198 void lv_fragment_manager_add(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container);
    199 
    200 /**
    201  * Detach and destroy fragment. If fragment is in navigation stack, remove from it.
    202  * @param manager Fragment manager instance
    203  * @param fragment Fragment instance
    204  */
    205 void lv_fragment_manager_remove(lv_fragment_manager_t * manager, lv_fragment_t * fragment);
    206 
    207 /**
    208  * Attach fragment to manager and add to navigation stack.
    209  * @param manager Fragment manager instance
    210  * @param fragment Fragment instance
    211  * @param container Pointer to container object for manager to add objects to
    212  */
    213 void lv_fragment_manager_push(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container);
    214 
    215 /**
    216  * Remove the top-most fragment for stack
    217  * @param manager Fragment manager instance
    218  * @return true if there is fragment to pop
    219  */
    220 bool lv_fragment_manager_pop(lv_fragment_manager_t * manager);
    221 
    222 /**
    223  * Replace fragment. Old item in the stack will be removed.
    224  * @param manager Fragment manager instance
    225  * @param fragment Fragment instance
    226  * @param container Pointer to container object for manager to add objects to
    227  */
    228 void lv_fragment_manager_replace(lv_fragment_manager_t * manager, lv_fragment_t * fragment,
    229                                  lv_obj_t * const * container);
    230 
    231 /**
    232  * Send event to top-most fragment
    233  * @param manager Fragment manager instance
    234  * @param code User-defined ID of event
    235  * @param userdata User-defined data
    236  * @return true if fragment returned true
    237  */
    238 bool lv_fragment_manager_send_event(lv_fragment_manager_t * manager, int code, void * userdata);
    239 
    240 /**
    241  * Get stack size of this fragment manager
    242  * @param manager Fragment manager instance
    243  * @return Stack size of this fragment manager
    244  */
    245 size_t lv_fragment_manager_get_stack_size(lv_fragment_manager_t * manager);
    246 
    247 /**
    248  * Get top most fragment instance
    249  * @param manager Fragment manager instance
    250  * @return Top most fragment instance
    251  */
    252 lv_fragment_t * lv_fragment_manager_get_top(lv_fragment_manager_t * manager);
    253 
    254 /**
    255  * Find first fragment instance in the container
    256  * @param manager Fragment manager instance
    257  * @param container Container which target fragment added to
    258  * @return First fragment instance in the container
    259  */
    260 lv_fragment_t * lv_fragment_manager_find_by_container(lv_fragment_manager_t * manager, const lv_obj_t * container);
    261 
    262 /**
    263  * Get parent fragment
    264  * @param manager Fragment manager instance
    265  * @return Parent fragment instance
    266  */
    267 lv_fragment_t * lv_fragment_manager_get_parent_fragment(lv_fragment_manager_t * manager);
    268 
    269 
    270 /**
    271  * Create a fragment instance.
    272  *
    273  * @param cls Fragment class. This fragment must return non null object.
    274  * @param args Arguments assigned by fragment manager
    275  * @return Fragment instance
    276  */
    277 lv_fragment_t * lv_fragment_create(const lv_fragment_class_t * cls, void * args);
    278 
    279 /**
    280  * Destroy a fragment.
    281  * @param fragment Fragment instance.
    282  */
    283 void lv_fragment_del(lv_fragment_t * fragment);
    284 
    285 /**
    286  * Get associated manager of this fragment
    287  * @param fragment Fragment instance
    288  * @return Fragment manager instance
    289  */
    290 lv_fragment_manager_t * lv_fragment_get_manager(lv_fragment_t * fragment);
    291 
    292 /**
    293  * Get container object of this fragment
    294  * @param fragment Fragment instance
    295  * @return Reference to container object
    296  */
    297 lv_obj_t * const * lv_fragment_get_container(lv_fragment_t * fragment);
    298 
    299 /**
    300  * Get parent fragment of this fragment
    301  * @param fragment Fragment instance
    302  * @return Parent fragment
    303  */
    304 lv_fragment_t * lv_fragment_get_parent(lv_fragment_t * fragment);
    305 
    306 /**
    307  * Create object by fragment.
    308  *
    309  * @param fragment Fragment instance.
    310  * @param container Container of the objects should be created upon.
    311  * @return Created object
    312  */
    313 lv_obj_t * lv_fragment_create_obj(lv_fragment_t * fragment, lv_obj_t * container);
    314 
    315 /**
    316  * Delete created object of a fragment
    317  *
    318  * @param fragment Fragment instance.
    319  */
    320 void lv_fragment_del_obj(lv_fragment_t * fragment);
    321 
    322 /**
    323  * Destroy obj in fragment, and recreate them.
    324  * @param fragment Fragment instance
    325  */
    326 void lv_fragment_recreate_obj(lv_fragment_t * fragment);
    327 
    328 
    329 /**********************
    330  *      MACROS
    331  **********************/
    332 
    333 #endif /*LV_USE_FRAGMENT*/
    334 
    335 #ifdef __cplusplus
    336 } /*extern "C"*/
    337 #endif
    338 
    339 #endif /*LV_FRAGMENT_H*/