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.c (3972B)
1 /** 2 * @file lv_fragment.c 3 * 4 */ 5 6 /********************* 7 * INCLUDES 8 *********************/ 9 10 #include "lv_fragment.h" 11 12 #if LV_USE_FRAGMENT 13 14 /********************** 15 * STATIC PROTOTYPES 16 **********************/ 17 18 static void cb_delete_assertion(lv_event_t * event); 19 20 /********************** 21 * GLOBAL FUNCTIONS 22 **********************/ 23 24 lv_fragment_t * lv_fragment_create(const lv_fragment_class_t * cls, void * args) 25 { 26 LV_ASSERT_NULL(cls); 27 LV_ASSERT_NULL(cls->create_obj_cb); 28 LV_ASSERT(cls->instance_size > 0); 29 lv_fragment_t * instance = lv_mem_alloc(cls->instance_size); 30 lv_memset_00(instance, cls->instance_size); 31 instance->cls = cls; 32 instance->child_manager = lv_fragment_manager_create(instance); 33 if(cls->constructor_cb) { 34 cls->constructor_cb(instance, args); 35 } 36 return instance; 37 } 38 39 void lv_fragment_del(lv_fragment_t * fragment) 40 { 41 LV_ASSERT_NULL(fragment); 42 if(fragment->managed) { 43 lv_fragment_manager_remove(fragment->managed->manager, fragment); 44 return; 45 } 46 if(fragment->obj) { 47 lv_fragment_del_obj(fragment); 48 } 49 /* Objects will leak if this function called before objects deleted */ 50 const lv_fragment_class_t * cls = fragment->cls; 51 if(cls->destructor_cb) { 52 cls->destructor_cb(fragment); 53 } 54 lv_fragment_manager_del(fragment->child_manager); 55 lv_mem_free(fragment); 56 } 57 58 lv_fragment_manager_t * lv_fragment_get_manager(lv_fragment_t * fragment) 59 { 60 LV_ASSERT_NULL(fragment); 61 LV_ASSERT_NULL(fragment->managed); 62 return fragment->managed->manager; 63 } 64 65 lv_obj_t * const * lv_fragment_get_container(lv_fragment_t * fragment) 66 { 67 LV_ASSERT_NULL(fragment); 68 LV_ASSERT_NULL(fragment->managed); 69 return fragment->managed->container; 70 } 71 72 lv_fragment_t * lv_fragment_get_parent(lv_fragment_t * fragment) 73 { 74 LV_ASSERT_NULL(fragment); 75 LV_ASSERT_NULL(fragment->managed); 76 return lv_fragment_manager_get_parent_fragment(fragment->managed->manager); 77 } 78 79 lv_obj_t * lv_fragment_create_obj(lv_fragment_t * fragment, lv_obj_t * container) 80 { 81 lv_fragment_managed_states_t * states = fragment->managed; 82 if(states) { 83 states->destroying_obj = false; 84 } 85 const lv_fragment_class_t * cls = fragment->cls; 86 lv_obj_t * obj = cls->create_obj_cb(fragment, container); 87 LV_ASSERT_NULL(obj); 88 fragment->obj = obj; 89 lv_fragment_manager_create_obj(fragment->child_manager); 90 if(states) { 91 states->obj_created = true; 92 lv_obj_add_event_cb(obj, cb_delete_assertion, LV_EVENT_DELETE, NULL); 93 } 94 if(cls->obj_created_cb) { 95 cls->obj_created_cb(fragment, obj); 96 } 97 return obj; 98 } 99 100 void lv_fragment_del_obj(lv_fragment_t * fragment) 101 { 102 LV_ASSERT_NULL(fragment); 103 lv_fragment_manager_del_obj(fragment->child_manager); 104 lv_fragment_managed_states_t * states = fragment->managed; 105 if(states) { 106 if(!states->obj_created) return; 107 states->destroying_obj = true; 108 bool cb_removed = lv_obj_remove_event_cb(fragment->obj, cb_delete_assertion); 109 LV_ASSERT(cb_removed); 110 } 111 LV_ASSERT_NULL(fragment->obj); 112 const lv_fragment_class_t * cls = fragment->cls; 113 if(cls->obj_will_delete_cb) { 114 cls->obj_will_delete_cb(fragment, fragment->obj); 115 } 116 lv_obj_del(fragment->obj); 117 if(cls->obj_deleted_cb) { 118 cls->obj_deleted_cb(fragment, fragment->obj); 119 } 120 if(states) { 121 states->obj_created = false; 122 } 123 fragment->obj = NULL; 124 } 125 126 void lv_fragment_recreate_obj(lv_fragment_t * fragment) 127 { 128 LV_ASSERT_NULL(fragment); 129 LV_ASSERT_NULL(fragment->managed); 130 lv_fragment_del_obj(fragment); 131 lv_fragment_create_obj(fragment, *fragment->managed->container); 132 } 133 134 /********************** 135 * STATIC FUNCTIONS 136 **********************/ 137 138 static void cb_delete_assertion(lv_event_t * event) 139 { 140 LV_UNUSED(event); 141 LV_ASSERT_MSG(0, "Please delete objects with lv_fragment_destroy_obj"); 142 } 143 144 #endif /*LV_USE_FRAGMENT*/