ui_elem* ui_elem_new_type_id(char* name, int type_id) { if ( dict_contains(ui_elems, name) ) { error("UI Manager already contains element called %s!", name); } debug("Creating UI Element %s (%s)", name, type_id_name(type_id)); ui_elem* ui_e = NULL; for(int i = 0; i < num_ui_elem_handlers; i++) { ui_elem_handler ui_hand = ui_elem_handlers[i]; if (ui_hand.type_id == type_id) { ui_e = ui_hand.new_func(); } } if (ui_e == NULL) { error("Don't know how to create ui element %s. No handler for type %s!", name, type_id_name(type_id)); } dict_set(ui_elems, name, ui_e); int* type_ptr = malloc(sizeof(int)); *type_ptr = type_id; dict_set(ui_elem_types, name, type_ptr); char* name_copy = malloc(strlen(name) + 1); strcpy(name_copy, name); list_push_back(ui_elem_names, name_copy); return ui_e; }
void asset_reload_type_id(type_id type) { debug("Reloading Assets of type '%s'...", type_id_name(type)); fpath ext; /* Find the file extension for given type */ for(int i=0; i < num_asset_handlers; i++) { asset_handler handler = asset_handlers[i]; if (handler.type == type) { strcpy(ext.ptr, handler.extension); break; } } list* asset_names = list_new(); for(int i = 0; i < asset_dict->size; i++) { struct bucket* b = asset_dict->buckets[i]; while(b != NULL) { fpath bucket_ext; SDL_PathFileExtension(bucket_ext.ptr, b->key); if (strcmp(bucket_ext.ptr, ext.ptr) == 0) { char* new_name = malloc(strlen(b->key)+1); strcpy(new_name, b->key); list_push_back(asset_names, new_name); } b = b->next; } } for(int i = 0; i < asset_names->num_items; i++) { file_unload(P(list_get(asset_names, i))); } for(int i = 0; i < asset_names->num_items; i++) { /* ** Assets can reload their child assets before we do ** So it is important we check before loading again */ if (!file_isloaded(P(list_get(asset_names, i)))) { file_load(P(list_get(asset_names, i))); } } list_delete_with(asset_names, free); asset_cache_flush(); }
char* ui_elem_typename(ui_elem* e) { for(int i = 0; i < ui_elem_names->num_items; i++) { char* name = list_get(ui_elem_names, i); ui_elem* elem = dict_get(ui_elems, name); if (elem == e) { int* type = dict_get(ui_elem_types, name); return type_id_name(*type); } } error("UI Object at %p not loaded into ui manager. Cannot fetch type name.", e); return NULL; }
void ui_elem_delete(char* name) { int* type_ptr = dict_get(ui_elem_types, name); int type_id = *type_ptr; for(int i = 0; i < num_ui_elem_handlers; i++) { ui_elem_handler ui_hand = ui_elem_handlers[i]; if (ui_hand.type_id == type_id) { dict_remove_with(ui_elems, name, ui_hand.del_func); break; } } if (ui_elem_exists(name)) { error("Don't know how to delete UI element %s. No handler for type %s!", name, type_id_name(type_id)); } }
char* asset_ptr_typename(asset* a) { char* path = dict_find(asset_dict, a); if (path == NULL) { error("Asset dict doesn't contain asset pointer %p", a); return NULL; } fpath ext; SDL_PathFileExtension(ext.ptr, path); for(int i=0; i < num_asset_handlers; i++) { asset_handler handler = asset_handlers[i]; if (strcmp(ext.ptr, handler.extension) == 0) { return type_id_name(handler.type); } } return NULL; }
void ui_finish() { for(int i = 0; i < num_ui_events; i++) { free(ui_events[i].name); } for(int i = 0; i < ui_elem_names->num_items; i++) { char* name = list_get(ui_elem_names, i); int* type_id = dict_get(ui_elem_types, name); debug("Deleting UI Element %s (%s)", name, type_id_name(*type_id)); ui_elem_delete(name); } list_delete_with(ui_elem_names, free); dict_delete(ui_elems); dict_map(ui_elem_types, free); dict_delete(ui_elem_types); }
void ui_handler_cast(int type_id, void* ui_elem_new_func(), void ui_elem_del_func(void* ui_elem), void ui_elem_update_func(void* ui_elem), void ui_elem_render_func(void* ui_elem)) { if (num_ui_elem_handlers >= MAX_UI_ELEM_HANDLERS) { warning("Max number of ui element handlers reached. Handler for type %s not added.", type_id_name(type_id)); return; } ui_elem_handler ui_hand; ui_hand.type_id = type_id; ui_hand.new_func = ui_elem_new_func; ui_hand.del_func = ui_elem_del_func; ui_hand.update_func = ui_elem_update_func; ui_hand.render_func = ui_elem_render_func; ui_elem_handlers[num_ui_elem_handlers] = ui_hand; num_ui_elem_handlers++; }
ui_elem* ui_elem_get_as_type_id(char* name, int type_id) { if ( !ui_elem_exists(name) ) { error("UI element %s does not exist!", name); } int* ui_elem_type = dict_get(ui_elem_types, name); if (*ui_elem_type != type_id) { error("UI element %s was created/added as a %s, but you requested it as a %s!", name, type_id_name(*ui_elem_type), type_id_name(type_id)); } return dict_get(ui_elems, name); }