|  |  |  | @ -127,17 +127,17 @@ uint32_t add_hex_region(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  |   return i; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | void update_hex_string(UIContext* ui, RenderContext* gpu, EditorData* data) { | 
		
	
		
			
				|  |  |  |  | void update_hex_string(Container* container, UIContext* ui, RenderContext* gpu, EditorData* data) { | 
		
	
		
			
				|  |  |  |  |   snprintf(data->string, 10, "#%02X%02X%02X%02X", | 
		
	
		
			
				|  |  |  |  |       (uint)rintf(data->current[0]*255), | 
		
	
		
			
				|  |  |  |  |       (uint)rintf(data->current[1]*255), | 
		
	
		
			
				|  |  |  |  |       (uint)rintf(data->current[2]*255), | 
		
	
		
			
				|  |  |  |  |       (uint)rintf(data->current[3]*255)); | 
		
	
		
			
				|  |  |  |  |   data->string_len = 8; | 
		
	
		
			
				|  |  |  |  |   update_ui_string(data->string, COLOR_PICK_CONTAINER_ID, 0, 0, ui, gpu); | 
		
	
		
			
				|  |  |  |  |   update_ui_string(data->string, container, 0, 0, ui, gpu); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | void sv_square_pick(UIContext* ui, RenderContext* gpu, EditorData* data, float s, float v) { | 
		
	
		
			
				|  |  |  |  | void sv_square_pick(Container* container, UIContext* ui, RenderContext* gpu, EditorData* data, float s, float v) { | 
		
	
		
			
				|  |  |  |  |   if(s < 0) s = 0; | 
		
	
		
			
				|  |  |  |  |   if(s > 1) s = 1; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | @ -147,7 +147,6 @@ void sv_square_pick(UIContext* ui, RenderContext* gpu, EditorData* data, float s | 
		
	
		
			
				|  |  |  |  |   data->current_hsv[1] = s; | 
		
	
		
			
				|  |  |  |  |   data->current_hsv[2] = v; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   Container* container = context_container(COLOR_PICK_CONTAINER_ID, ui); | 
		
	
		
			
				|  |  |  |  |   Layer* layer = &container->layers[0]; | 
		
	
		
			
				|  |  |  |  |   GPUDrawable* select_outline = &layer->drawables_buffer[3]; | 
		
	
		
			
				|  |  |  |  |   GPUDrawable* select = &layer->drawables_buffer[4]; | 
		
	
	
		
			
				
					|  |  |  | @ -192,16 +191,16 @@ void sv_square_pick(UIContext* ui, RenderContext* gpu, EditorData* data, float s | 
		
	
		
			
				|  |  |  |  |       gpu); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   hsv_to_rgb(data->current_hsv, data->current); | 
		
	
		
			
				|  |  |  |  |   update_hex_string(ui, gpu, data); | 
		
	
		
			
				|  |  |  |  |   update_hex_string(container, ui, gpu, data); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | bool sv_square_button_callback(void* data, UIContext* ui, RenderContext* gpu, float x, float y, int button, int action, int mods) { | 
		
	
		
			
				|  |  |  |  | bool sv_square_button_callback(Container* container, void* data, UIContext* ui, RenderContext* gpu, float x, float y, int button, int action, int mods) { | 
		
	
		
			
				|  |  |  |  |   (void)mods; | 
		
	
		
			
				|  |  |  |  |   (void)x; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   if(action == GLFW_PRESS && button == GLFW_MOUSE_BUTTON_LEFT) { | 
		
	
		
			
				|  |  |  |  |     set_active_element(COLOR_PICK_CONTAINER_ID, 0, 1, ui); | 
		
	
		
			
				|  |  |  |  |     sv_square_pick(ui, gpu, data, x, 1-y); | 
		
	
		
			
				|  |  |  |  |     sv_square_pick(container, ui, gpu, data, x, 1-y); | 
		
	
		
			
				|  |  |  |  |   } else if(action == GLFW_RELEASE && button == GLFW_MOUSE_BUTTON_LEFT) { | 
		
	
		
			
				|  |  |  |  |     clear_active_element(ui, gpu); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
	
		
			
				
					|  |  |  | @ -209,23 +208,22 @@ bool sv_square_button_callback(void* data, UIContext* ui, RenderContext* gpu, fl | 
		
	
		
			
				|  |  |  |  |   return true; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | bool sv_square_cursor_callback(void* data, UIContext* ui, RenderContext* gpu, float x, float y) { | 
		
	
		
			
				|  |  |  |  | bool sv_square_cursor_callback(Container* container, void* data, UIContext* ui, RenderContext* gpu, float x, float y) { | 
		
	
		
			
				|  |  |  |  |   if(ui->active_element == 1 | 
		
	
		
			
				|  |  |  |  |   && ui->active_layer == 0 | 
		
	
		
			
				|  |  |  |  |   && ui->active_container == COLOR_PICK_CONTAINER_ID) { | 
		
	
		
			
				|  |  |  |  |     sv_square_pick(ui, gpu, data, x, 1-y); | 
		
	
		
			
				|  |  |  |  |   && ui->active_container == container) { | 
		
	
		
			
				|  |  |  |  |     sv_square_pick(container, ui, gpu, data, x, 1-y); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   return true; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | void hue_bar_set(UIContext* ui, RenderContext* gpu, EditorData* data, float y) { | 
		
	
		
			
				|  |  |  |  | void hue_bar_set(Container* container, UIContext* ui, RenderContext* gpu, EditorData* data, float y) { | 
		
	
		
			
				|  |  |  |  |   if(y < 0) y = 0; | 
		
	
		
			
				|  |  |  |  |   if(y > 1) y = 1; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   data->current_hsv[0] = y; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   Container* container = context_container(COLOR_PICK_CONTAINER_ID, ui); | 
		
	
		
			
				|  |  |  |  |   Layer* layer = &container->layers[0]; | 
		
	
		
			
				|  |  |  |  |   GPUDrawable* sv_square = &layer->drawables_buffer[1]; | 
		
	
		
			
				|  |  |  |  |   GPUDrawable* sv_select = &layer->drawables_buffer[4]; | 
		
	
	
		
			
				
					|  |  |  | @ -265,37 +263,36 @@ void hue_bar_set(UIContext* ui, RenderContext* gpu, EditorData* data, float y) { | 
		
	
		
			
				|  |  |  |  |       gpu); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   hsv_to_rgb(data->current_hsv, data->current); | 
		
	
		
			
				|  |  |  |  |   update_hex_string(ui, gpu, data); | 
		
	
		
			
				|  |  |  |  |   update_hex_string(container, ui, gpu, data); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | bool hue_bar_scroll_callback(void* data, UIContext* ui, RenderContext* gpu, double x, double y) { | 
		
	
		
			
				|  |  |  |  | bool hue_bar_scroll_callback(Container* container, void* data, UIContext* ui, RenderContext* gpu, double x, double y) { | 
		
	
		
			
				|  |  |  |  |   (void)x; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   Container* container = context_container(COLOR_PICK_CONTAINER_ID, ui); | 
		
	
		
			
				|  |  |  |  |   hue_bar_set(ui, gpu, data, y*0.01 + container->layers[0].drawables_buffer[1].color[0][0]); | 
		
	
		
			
				|  |  |  |  |   hue_bar_set(container, ui, gpu, data, y*0.01 + container->layers[0].drawables_buffer[1].color[0][0]); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   return true; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | bool hue_bar_cursor_callback(void*data, UIContext* ui, RenderContext* gpu, float x, float y) { | 
		
	
		
			
				|  |  |  |  | bool hue_bar_cursor_callback(Container* container, void*data, UIContext* ui, RenderContext* gpu, float x, float y) { | 
		
	
		
			
				|  |  |  |  |   (void)x; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   if(ui->active_element == 2 | 
		
	
		
			
				|  |  |  |  |   && ui->active_layer == 0 | 
		
	
		
			
				|  |  |  |  |   && ui->active_container == COLOR_PICK_CONTAINER_ID) { | 
		
	
		
			
				|  |  |  |  |     hue_bar_set(ui, gpu, data, y); | 
		
	
		
			
				|  |  |  |  |   && ui->active_container == container) { | 
		
	
		
			
				|  |  |  |  |     hue_bar_set(container, ui, gpu, data, y); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   return true; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | bool hue_bar_button_callback(void* data, UIContext* ui, RenderContext* gpu, float x, float y, int button, int action, int mods) { | 
		
	
		
			
				|  |  |  |  | bool hue_bar_button_callback(Container* container, void* data, UIContext* ui, RenderContext* gpu, float x, float y, int button, int action, int mods) { | 
		
	
		
			
				|  |  |  |  |   (void)mods; | 
		
	
		
			
				|  |  |  |  |   (void)x; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   if(action == GLFW_PRESS && button == GLFW_MOUSE_BUTTON_LEFT) { | 
		
	
		
			
				|  |  |  |  |     set_active_element(COLOR_PICK_CONTAINER_ID, 0, 2, ui); | 
		
	
		
			
				|  |  |  |  |     hue_bar_set(ui, gpu, data, y); | 
		
	
		
			
				|  |  |  |  |     hue_bar_set(container, ui, gpu, data, y); | 
		
	
		
			
				|  |  |  |  |   } else if(action == GLFW_RELEASE && button == GLFW_MOUSE_BUTTON_LEFT) { | 
		
	
		
			
				|  |  |  |  |     clear_active_element(ui, gpu); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
	
		
			
				
					|  |  |  | @ -303,8 +300,7 @@ bool hue_bar_button_callback(void* data, UIContext* ui, RenderContext* gpu, floa | 
		
	
		
			
				|  |  |  |  |   return true; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | void hex_string_set_color(UIContext* ui, RenderContext* gpu, float color) { | 
		
	
		
			
				|  |  |  |  |   Container* container = context_container(COLOR_PICK_CONTAINER_ID, ui); | 
		
	
		
			
				|  |  |  |  | void hex_string_set_color(Container* container, RenderContext* gpu, float color) { | 
		
	
		
			
				|  |  |  |  |   container->layers[0].drawables_buffer[5].color[0][2] = color; | 
		
	
		
			
				|  |  |  |  |   container->layers[0].drawables_buffer[5].color[0][3] = color; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | @ -325,7 +321,7 @@ void hex_string_set_color(UIContext* ui, RenderContext* gpu, float color) { | 
		
	
		
			
				|  |  |  |  |       gpu); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | bool hex_string_text_callback(void* ptr, UIContext* ui, RenderContext* gpu, unsigned int codepoint) { | 
		
	
		
			
				|  |  |  |  | bool hex_string_text_callback(Container* container, void* ptr, UIContext* ui, RenderContext* gpu, unsigned int codepoint) { | 
		
	
		
			
				|  |  |  |  |   EditorData* data = ptr; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   if(codepoint >= 'a' && codepoint <= 'f') { | 
		
	
	
		
			
				
					|  |  |  | @ -337,13 +333,13 @@ bool hex_string_text_callback(void* ptr, UIContext* ui, RenderContext* gpu, unsi | 
		
	
		
			
				|  |  |  |  |   if(data->string_len < 8) { | 
		
	
		
			
				|  |  |  |  |     data->string_len += 1; | 
		
	
		
			
				|  |  |  |  |     data->string[data->string_len] = codepoint; | 
		
	
		
			
				|  |  |  |  |     update_ui_string(data->string, COLOR_PICK_CONTAINER_ID, 0, 0, ui, gpu); | 
		
	
		
			
				|  |  |  |  |     update_ui_string(data->string, container, 0, 0, ui, gpu); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   return true; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | bool hex_string_key_callback(void* ptr, UIContext* ui, RenderContext* gpu, int key, int action, int mods) { | 
		
	
		
			
				|  |  |  |  | bool hex_string_key_callback(Container* container, void* ptr, UIContext* ui, RenderContext* gpu, int key, int action, int mods) { | 
		
	
		
			
				|  |  |  |  |   (void)mods; | 
		
	
		
			
				|  |  |  |  |   EditorData* data = ptr; | 
		
	
		
			
				|  |  |  |  |   char tmp[3]; | 
		
	
	
		
			
				
					|  |  |  | @ -352,7 +348,7 @@ bool hex_string_key_callback(void* ptr, UIContext* ui, RenderContext* gpu, int k | 
		
	
		
			
				|  |  |  |  |     switch(key) { | 
		
	
		
			
				|  |  |  |  |     case GLFW_KEY_ESCAPE: | 
		
	
		
			
				|  |  |  |  |       hsv_to_rgb(data->current_hsv, data->current); | 
		
	
		
			
				|  |  |  |  |       update_hex_string(ui, gpu, data); | 
		
	
		
			
				|  |  |  |  |       update_hex_string(container, ui, gpu, data); | 
		
	
		
			
				|  |  |  |  |       clear_active_element(ui, gpu); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     case GLFW_KEY_ENTER: | 
		
	
	
		
			
				
					|  |  |  | @ -378,8 +374,8 @@ bool hex_string_key_callback(void* ptr, UIContext* ui, RenderContext* gpu, int k | 
		
	
		
			
				|  |  |  |  |       data->current[3] = strtol(tmp, NULL, 16)/255.0; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |       rgb_to_hsv(data->current, data->current_hsv); | 
		
	
		
			
				|  |  |  |  |       hue_bar_set(ui, gpu, data, data->current_hsv[0]); | 
		
	
		
			
				|  |  |  |  |       sv_square_pick(ui, gpu, data, data->current_hsv[1], data->current_hsv[2]); | 
		
	
		
			
				|  |  |  |  |       hue_bar_set(container, ui, gpu, data, data->current_hsv[0]); | 
		
	
		
			
				|  |  |  |  |       sv_square_pick(container, ui, gpu, data, data->current_hsv[1], data->current_hsv[2]); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |       clear_active_element(ui, gpu); | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
	
		
			
				
					|  |  |  | @ -387,7 +383,7 @@ bool hex_string_key_callback(void* ptr, UIContext* ui, RenderContext* gpu, int k | 
		
	
		
			
				|  |  |  |  |       if(data->string_len > 0) { | 
		
	
		
			
				|  |  |  |  |         data->string[data->string_len] = '\0'; | 
		
	
		
			
				|  |  |  |  |         data->string_len -= 1; | 
		
	
		
			
				|  |  |  |  |         update_ui_string(data->string, COLOR_PICK_CONTAINER_ID, 0, 0, ui, gpu); | 
		
	
		
			
				|  |  |  |  |         update_ui_string(data->string, container, 0, 0, ui, gpu); | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
	
		
			
				
					|  |  |  | @ -396,7 +392,7 @@ bool hex_string_key_callback(void* ptr, UIContext* ui, RenderContext* gpu, int k | 
		
	
		
			
				|  |  |  |  |   return true; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | bool hex_string_button_callback(void* data, UIContext* ui, RenderContext* gpu, float x, float y, int button, int action, int mods) { | 
		
	
		
			
				|  |  |  |  | bool hex_string_button_callback(Container* container, void* data, UIContext* ui, RenderContext* gpu, float x, float y, int button, int action, int mods) { | 
		
	
		
			
				|  |  |  |  |   (void)data; | 
		
	
		
			
				|  |  |  |  |   (void)mods; | 
		
	
		
			
				|  |  |  |  |   (void)x; | 
		
	
	
		
			
				
					|  |  |  | @ -404,24 +400,24 @@ bool hex_string_button_callback(void* data, UIContext* ui, RenderContext* gpu, f | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   if(action == GLFW_PRESS && button == GLFW_MOUSE_BUTTON_LEFT) { | 
		
	
		
			
				|  |  |  |  |     set_active_element(COLOR_PICK_CONTAINER_ID, 0, 5, ui); | 
		
	
		
			
				|  |  |  |  |     hex_string_set_color(ui, gpu, 1); | 
		
	
		
			
				|  |  |  |  |     hex_string_set_color(container, gpu, 1); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   return true; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | void hex_string_deselect_callback(void* data, UIContext* ui, RenderContext* gpu) { | 
		
	
		
			
				|  |  |  |  | void hex_string_deselect_callback(Container* container, void* data, UIContext* ui, RenderContext* gpu) { | 
		
	
		
			
				|  |  |  |  |   (void)data; | 
		
	
		
			
				|  |  |  |  |   hex_string_set_color(ui, gpu, 0); | 
		
	
		
			
				|  |  |  |  |   (void)ui; | 
		
	
		
			
				|  |  |  |  |   hex_string_set_color(container, gpu, 0); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | void set_saved_color(UIContext* ui, RenderContext* gpu, EditorData* data, uint32_t index, vec4 color) { | 
		
	
		
			
				|  |  |  |  | void set_saved_color(Container* container, RenderContext* gpu, EditorData* data, uint32_t index, vec4 color) { | 
		
	
		
			
				|  |  |  |  |   data->saved[index][0] = color[0]; | 
		
	
		
			
				|  |  |  |  |   data->saved[index][1] = color[1]; | 
		
	
		
			
				|  |  |  |  |   data->saved[index][2] = color[2]; | 
		
	
		
			
				|  |  |  |  |   data->saved[index][3] = color[3]; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   Container* container = context_container(COLOR_PICK_CONTAINER_ID, ui); | 
		
	
		
			
				|  |  |  |  |   Layer* layer = &container->layers[0]; | 
		
	
		
			
				|  |  |  |  |   GPUDrawable* saved_color = &layer->drawables_buffer[7 + index]; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | @ -450,6 +446,7 @@ void set_saved_color(UIContext* ui, RenderContext* gpu, EditorData* data, uint32 | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | bool saved_color_button_callback( | 
		
	
		
			
				|  |  |  |  |     Container* container, | 
		
	
		
			
				|  |  |  |  |     void* ptr, | 
		
	
		
			
				|  |  |  |  |     UIContext* ui, | 
		
	
		
			
				|  |  |  |  |     RenderContext* gpu, | 
		
	
	
		
			
				
					|  |  |  | @ -469,14 +466,14 @@ bool saved_color_button_callback( | 
		
	
		
			
				|  |  |  |  |       data->current[2] = data->saved[index][2]; | 
		
	
		
			
				|  |  |  |  |       data->current[3] = data->saved[index][3]; | 
		
	
		
			
				|  |  |  |  |       rgb_to_hsv(data->current, data->current_hsv); | 
		
	
		
			
				|  |  |  |  |       hue_bar_set(ui, gpu, data, data->current_hsv[0]); | 
		
	
		
			
				|  |  |  |  |       sv_square_pick(ui, gpu, data, data->current_hsv[1], data->current_hsv[2]); | 
		
	
		
			
				|  |  |  |  |       update_hex_string(ui, gpu, data); | 
		
	
		
			
				|  |  |  |  |       hue_bar_set(container, ui, gpu, data, data->current_hsv[0]); | 
		
	
		
			
				|  |  |  |  |       sv_square_pick(container, ui, gpu, data, data->current_hsv[1], data->current_hsv[2]); | 
		
	
		
			
				|  |  |  |  |       update_hex_string(container, ui, gpu, data); | 
		
	
		
			
				|  |  |  |  |     } else if(button == GLFW_MOUSE_BUTTON_RIGHT) { | 
		
	
		
			
				|  |  |  |  |       set_saved_color(ui, gpu, data, index, data->current); | 
		
	
		
			
				|  |  |  |  |       set_saved_color(container, gpu, data, index, data->current); | 
		
	
		
			
				|  |  |  |  |     } else if (button == GLFW_MOUSE_BUTTON_MIDDLE) { | 
		
	
		
			
				|  |  |  |  |       vec4 clear = {0, 0, 0, 0}; | 
		
	
		
			
				|  |  |  |  |       set_saved_color(ui, gpu, data, index, clear); | 
		
	
		
			
				|  |  |  |  |       set_saved_color(container, gpu, data, index, clear); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | @ -484,8 +481,8 @@ bool saved_color_button_callback( | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | #define SAVED_COLOR_BUTTON_CALLBACK(n) \ | 
		
	
		
			
				|  |  |  |  | bool saved_color_button_callback_##n(void* data, UIContext* ui, RenderContext* gpu, float x, float y, int button, int action, int mods) { \ | 
		
	
		
			
				|  |  |  |  |   return saved_color_button_callback(data, ui, gpu, x, y, button, action, mods, n); \ | 
		
	
		
			
				|  |  |  |  | bool saved_color_button_callback_##n(Container* container, void* data, UIContext* ui, RenderContext* gpu, float x, float y, int button, int action, int mods) { \ | 
		
	
		
			
				|  |  |  |  |   return saved_color_button_callback(container, data, ui, gpu, x, y, button, action, mods, n); \ | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | SAVED_COLOR_BUTTON_CALLBACK( 0); | 
		
	
	
		
			
				
					|  |  |  | @ -729,104 +726,6 @@ VkResult color_ui(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  |   return load_container(&container, &context->render, &context->ui); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | VkResult hex_info_ui(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  |   GPUString strings[] = { | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {0, 33}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 32, | 
		
	
		
			
				|  |  |  |  |       .offset = 0, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {2, 50}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 16, | 
		
	
		
			
				|  |  |  |  |       .offset = 20, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {2, 73}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 16, | 
		
	
		
			
				|  |  |  |  |       .offset = 40, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {2, 93}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 16, | 
		
	
		
			
				|  |  |  |  |       .offset = 60, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {2, 113}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 16, | 
		
	
		
			
				|  |  |  |  |       .offset = 80, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {2, 133}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 16, | 
		
	
		
			
				|  |  |  |  |       .offset = 100, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {2, 153}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 16, | 
		
	
		
			
				|  |  |  |  |       .offset = 120, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {2, 173}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 16, | 
		
	
		
			
				|  |  |  |  |       .offset = 140, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   }; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   GPUDrawable drawables[] = { | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {0, 0}, | 
		
	
		
			
				|  |  |  |  |       .size = {150, 175}, | 
		
	
		
			
				|  |  |  |  |       .color = {{0.4, 0.4, 0.4, 0.8}, {0.4, 0.4, 0.4, 0.8}, {0.4, 0.4, 0.4, 0.8}, {0.4, 0.4, 0.4, 0.8}}, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  |   }; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   LayerInput layer = { | 
		
	
		
			
				|  |  |  |  |     .strings = strings, | 
		
	
		
			
				|  |  |  |  |     .num_strings = sizeof(strings)/sizeof(GPUString), | 
		
	
		
			
				|  |  |  |  |     .max_strings = sizeof(strings)/sizeof(GPUString) + 4, | 
		
	
		
			
				|  |  |  |  |     .max_codes = 200, | 
		
	
		
			
				|  |  |  |  |     .drawables = drawables, | 
		
	
		
			
				|  |  |  |  |     .num_drawables = sizeof(drawables)/sizeof(GPUDrawable), | 
		
	
		
			
				|  |  |  |  |   }; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   ContainerInput container = { | 
		
	
		
			
				|  |  |  |  |     .id = 0x02, | 
		
	
		
			
				|  |  |  |  |     .size = {150, 175}, | 
		
	
		
			
				|  |  |  |  |     .offset = {0, 0}, | 
		
	
		
			
				|  |  |  |  |     .anchor = ANCHOR_BOTTOM_RIGHT, | 
		
	
		
			
				|  |  |  |  |     .layers = &layer, | 
		
	
		
			
				|  |  |  |  |     .layer_count = 1, | 
		
	
		
			
				|  |  |  |  |   }; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   return load_container(&container, &context->render, &context->ui); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | VkResult mode_string_ui(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  |   VkResult result; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | @ -861,7 +760,8 @@ VkResult mode_string_ui(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | VkResult update_mode_string(ClientContext* context, EditorData* data) {  | 
		
	
		
			
				|  |  |  |  |   return update_ui_string(ModeStrings[data->mode], MODE_STRING_CONTAINER_ID, 0, 0, &context->ui, &context->render); | 
		
	
		
			
				|  |  |  |  |   Container* container = context_container(MODE_STRING_CONTAINER_ID, &context->ui); | 
		
	
		
			
				|  |  |  |  |   return update_ui_string(ModeStrings[data->mode], container, 0, 0, &context->ui, &context->render); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | void editor_key_callback(ClientContext* context, int key, int action, int mods) { | 
		
	
	
		
			
				
					|  |  |  | 
 |