340 lines
9.1 KiB
C
340 lines
9.1 KiB
C
/**
|
|
* Public header for Fragment
|
|
* @file lv_fragment.h
|
|
*/
|
|
|
|
#ifndef LV_FRAGMENT_H
|
|
#define LV_FRAGMENT_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*********************
|
|
* INCLUDES
|
|
*********************/
|
|
#include "../../../lv_conf_internal.h"
|
|
|
|
#if LV_USE_FRAGMENT
|
|
|
|
#include "../../../core/lv_obj.h"
|
|
|
|
/*********************
|
|
* DEFINES
|
|
*********************/
|
|
|
|
/**********************
|
|
* TYPEDEFS
|
|
**********************/
|
|
|
|
typedef struct _lv_fragment_manager_t lv_fragment_manager_t;
|
|
|
|
typedef struct _lv_fragment_t lv_fragment_t;
|
|
typedef struct _lv_fragment_class_t lv_fragment_class_t;
|
|
typedef struct _lv_fragment_managed_states_t lv_fragment_managed_states_t;
|
|
|
|
struct _lv_fragment_t {
|
|
/**
|
|
* Class of this fragment
|
|
*/
|
|
const lv_fragment_class_t * cls;
|
|
/**
|
|
* Managed fragment states. If not null, then this fragment is managed.
|
|
*
|
|
* @warning Don't modify values inside this struct!
|
|
*/
|
|
lv_fragment_managed_states_t * managed;
|
|
/**
|
|
* Child fragment manager
|
|
*/
|
|
lv_fragment_manager_t * child_manager;
|
|
/**
|
|
* lv_obj returned by create_obj_cb
|
|
*/
|
|
lv_obj_t * obj;
|
|
|
|
};
|
|
|
|
struct _lv_fragment_class_t {
|
|
/**
|
|
* Constructor function for fragment class
|
|
* @param self Fragment instance
|
|
* @param args Arguments assigned by fragment manager
|
|
*/
|
|
void (*constructor_cb)(lv_fragment_t * self, void * args);
|
|
|
|
/**
|
|
* Destructor function for fragment class
|
|
* @param self Fragment instance, will be freed after this call
|
|
*/
|
|
void (*destructor_cb)(lv_fragment_t * self);
|
|
|
|
/**
|
|
* Fragment attached to manager
|
|
* @param self Fragment instance
|
|
*/
|
|
void (*attached_cb)(lv_fragment_t * self);
|
|
|
|
/**
|
|
* Fragment detached from manager
|
|
* @param self Fragment instance
|
|
*/
|
|
void (*detached_cb)(lv_fragment_t * self);
|
|
|
|
/**
|
|
* Create objects
|
|
* @param self Fragment instance
|
|
* @param container Container of the objects should be created upon
|
|
* @return Created object, NULL if multiple objects has been created
|
|
*/
|
|
lv_obj_t * (*create_obj_cb)(lv_fragment_t * self, lv_obj_t * container);
|
|
|
|
/**
|
|
*
|
|
* @param self Fragment instance
|
|
* @param obj lv_obj returned by create_obj_cb
|
|
*/
|
|
void (*obj_created_cb)(lv_fragment_t * self, lv_obj_t * obj);
|
|
|
|
/**
|
|
* Called before objects in the fragment will be deleted.
|
|
*
|
|
* @param self Fragment instance
|
|
* @param obj object with this fragment
|
|
*/
|
|
void (*obj_will_delete_cb)(lv_fragment_t * self, lv_obj_t * obj);
|
|
|
|
/**
|
|
* Called when the object created by fragment received `LV_EVENT_DELETE` event
|
|
* @param self Fragment instance
|
|
* @param obj object with this fragment
|
|
*/
|
|
void (*obj_deleted_cb)(lv_fragment_t * self, lv_obj_t * obj);
|
|
|
|
/**
|
|
* Handle event
|
|
* @param self Fragment instance
|
|
* @param which User-defined ID of event
|
|
* @param data1 User-defined data
|
|
* @param data2 User-defined data
|
|
*/
|
|
bool (*event_cb)(lv_fragment_t * self, int code, void * userdata);
|
|
|
|
/**
|
|
* *REQUIRED*: Allocation size of fragment
|
|
*/
|
|
size_t instance_size;
|
|
};
|
|
|
|
/**
|
|
* Fragment states
|
|
*/
|
|
typedef struct _lv_fragment_managed_states_t {
|
|
/**
|
|
* Class of the fragment
|
|
*/
|
|
const lv_fragment_class_t * cls;
|
|
/**
|
|
* Manager the fragment attached to
|
|
*/
|
|
lv_fragment_manager_t * manager;
|
|
/**
|
|
* Container object the fragment adding view to
|
|
*/
|
|
lv_obj_t * const * container;
|
|
/**
|
|
* Fragment instance
|
|
*/
|
|
lv_fragment_t * instance;
|
|
/**
|
|
* true between `create_obj_cb` and `obj_deleted_cb`
|
|
*/
|
|
bool obj_created;
|
|
/**
|
|
* true before `lv_fragment_del_obj` is called. Don't touch any object if this is true
|
|
*/
|
|
bool destroying_obj;
|
|
/**
|
|
* true if this fragment is in navigation stack that can be popped
|
|
*/
|
|
bool in_stack;
|
|
} lv_fragment_managed_states_t;
|
|
|
|
/**********************
|
|
* GLOBAL PROTOTYPES
|
|
**********************/
|
|
|
|
/**
|
|
* Create fragment manager instance
|
|
* @param parent Parent fragment if this manager is placed inside another fragment, can be null.
|
|
* @return Fragment manager instance
|
|
*/
|
|
lv_fragment_manager_t * lv_fragment_manager_create(lv_fragment_t * parent);
|
|
|
|
/**
|
|
* Destroy fragment manager instance
|
|
* @param manager Fragment manager instance
|
|
*/
|
|
void lv_fragment_manager_del(lv_fragment_manager_t * manager);
|
|
|
|
/**
|
|
* Create object of all fragments managed by this manager.
|
|
* @param manager Fragment manager instance
|
|
*/
|
|
void lv_fragment_manager_create_obj(lv_fragment_manager_t * manager);
|
|
|
|
/**
|
|
* Delete object created by all fragments managed by this manager. Instance of fragments will not be deleted.
|
|
* @param manager Fragment manager instance
|
|
*/
|
|
void lv_fragment_manager_del_obj(lv_fragment_manager_t * manager);
|
|
|
|
/**
|
|
* Attach fragment to manager, and add to container.
|
|
* @param manager Fragment manager instance
|
|
* @param fragment Fragment instance
|
|
* @param container Pointer to container object for manager to add objects to
|
|
*/
|
|
void lv_fragment_manager_add(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container);
|
|
|
|
/**
|
|
* Detach and destroy fragment. If fragment is in navigation stack, remove from it.
|
|
* @param manager Fragment manager instance
|
|
* @param fragment Fragment instance
|
|
*/
|
|
void lv_fragment_manager_remove(lv_fragment_manager_t * manager, lv_fragment_t * fragment);
|
|
|
|
/**
|
|
* Attach fragment to manager and add to navigation stack.
|
|
* @param manager Fragment manager instance
|
|
* @param fragment Fragment instance
|
|
* @param container Pointer to container object for manager to add objects to
|
|
*/
|
|
void lv_fragment_manager_push(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container);
|
|
|
|
/**
|
|
* Remove the top-most fragment for stack
|
|
* @param manager Fragment manager instance
|
|
* @return true if there is fragment to pop
|
|
*/
|
|
bool lv_fragment_manager_pop(lv_fragment_manager_t * manager);
|
|
|
|
/**
|
|
* Replace fragment. Old item in the stack will be removed.
|
|
* @param manager Fragment manager instance
|
|
* @param fragment Fragment instance
|
|
* @param container Pointer to container object for manager to add objects to
|
|
*/
|
|
void lv_fragment_manager_replace(lv_fragment_manager_t * manager, lv_fragment_t * fragment,
|
|
lv_obj_t * const * container);
|
|
|
|
/**
|
|
* Send event to top-most fragment
|
|
* @param manager Fragment manager instance
|
|
* @param code User-defined ID of event
|
|
* @param userdata User-defined data
|
|
* @return true if fragment returned true
|
|
*/
|
|
bool lv_fragment_manager_send_event(lv_fragment_manager_t * manager, int code, void * userdata);
|
|
|
|
/**
|
|
* Get stack size of this fragment manager
|
|
* @param manager Fragment manager instance
|
|
* @return Stack size of this fragment manager
|
|
*/
|
|
size_t lv_fragment_manager_get_stack_size(lv_fragment_manager_t * manager);
|
|
|
|
/**
|
|
* Get top most fragment instance
|
|
* @param manager Fragment manager instance
|
|
* @return Top most fragment instance
|
|
*/
|
|
lv_fragment_t * lv_fragment_manager_get_top(lv_fragment_manager_t * manager);
|
|
|
|
/**
|
|
* Find first fragment instance in the container
|
|
* @param manager Fragment manager instance
|
|
* @param container Container which target fragment added to
|
|
* @return First fragment instance in the container
|
|
*/
|
|
lv_fragment_t * lv_fragment_manager_find_by_container(lv_fragment_manager_t * manager, const lv_obj_t * container);
|
|
|
|
/**
|
|
* Get parent fragment
|
|
* @param manager Fragment manager instance
|
|
* @return Parent fragment instance
|
|
*/
|
|
lv_fragment_t * lv_fragment_manager_get_parent_fragment(lv_fragment_manager_t * manager);
|
|
|
|
|
|
/**
|
|
* Create a fragment instance.
|
|
*
|
|
* @param cls Fragment class. This fragment must return non null object.
|
|
* @param args Arguments assigned by fragment manager
|
|
* @return Fragment instance
|
|
*/
|
|
lv_fragment_t * lv_fragment_create(const lv_fragment_class_t * cls, void * args);
|
|
|
|
/**
|
|
* Destroy a fragment.
|
|
* @param fragment Fragment instance.
|
|
*/
|
|
void lv_fragment_del(lv_fragment_t * fragment);
|
|
|
|
/**
|
|
* Get associated manager of this fragment
|
|
* @param fragment Fragment instance
|
|
* @return Fragment manager instance
|
|
*/
|
|
lv_fragment_manager_t * lv_fragment_get_manager(lv_fragment_t * fragment);
|
|
|
|
/**
|
|
* Get container object of this fragment
|
|
* @param fragment Fragment instance
|
|
* @return Reference to container object
|
|
*/
|
|
lv_obj_t * const * lv_fragment_get_container(lv_fragment_t * fragment);
|
|
|
|
/**
|
|
* Get parent fragment of this fragment
|
|
* @param fragment Fragment instance
|
|
* @return Parent fragment
|
|
*/
|
|
lv_fragment_t * lv_fragment_get_parent(lv_fragment_t * fragment);
|
|
|
|
/**
|
|
* Create object by fragment.
|
|
*
|
|
* @param fragment Fragment instance.
|
|
* @param container Container of the objects should be created upon.
|
|
* @return Created object
|
|
*/
|
|
lv_obj_t * lv_fragment_create_obj(lv_fragment_t * fragment, lv_obj_t * container);
|
|
|
|
/**
|
|
* Delete created object of a fragment
|
|
*
|
|
* @param fragment Fragment instance.
|
|
*/
|
|
void lv_fragment_del_obj(lv_fragment_t * fragment);
|
|
|
|
/**
|
|
* Destroy obj in fragment, and recreate them.
|
|
* @param fragment Fragment instance
|
|
*/
|
|
void lv_fragment_recreate_obj(lv_fragment_t * fragment);
|
|
|
|
|
|
/**********************
|
|
* MACROS
|
|
**********************/
|
|
|
|
#endif /*LV_USE_FRAGMENT*/
|
|
|
|
#ifdef __cplusplus
|
|
} /*extern "C"*/
|
|
#endif
|
|
|
|
#endif /*LV_FRAGMENT_H*/
|