Implemented color saving

main
noah metz 2024-11-17 16:48:39 -07:00
parent d82269f640
commit d129f3432d
1 changed files with 125 additions and 6 deletions

@ -96,13 +96,12 @@ uint32_t add_hex_region(ClientContext* context) {
typedef struct ColorUIDataStruct {
double current_hsv[3];
vec4 current;
vec3 saved[12];
vec4 saved[12];
char string[10];
int string_len;
} ColorUIData;
void set_rgb_from_hsv(UIContext* ui, RenderContext* gpu, ColorUIData* data, double hsv[3]) {
hsv_to_rgb(hsv, data->current);
void update_hex_string(UIContext* ui, RenderContext* gpu, ColorUIData* data) {
snprintf(data->string, 10, "#%02X%02X%02X%02X",
(uint)rintf(data->current[0]*255),
(uint)rintf(data->current[1]*255),
@ -166,7 +165,8 @@ void sv_square_pick(UIContext* ui, RenderContext* gpu, ColorUIData* data, float
4*sizeof(vec4),
gpu);
set_rgb_from_hsv(ui, gpu, data, data->current_hsv);
hsv_to_rgb(data->current_hsv, data->current);
update_hex_string(ui, gpu, data);
}
void sv_square_button_callback(void* data, UIContext* ui, RenderContext* gpu, float x, float y, int button, int action, int mods) {
@ -234,7 +234,8 @@ void hue_bar_set(UIContext* ui, RenderContext* gpu, ColorUIData* data, float y)
1*sizeof(float),
gpu);
set_rgb_from_hsv(ui, gpu, data, data->current_hsv);
hsv_to_rgb(data->current_hsv, data->current);
update_hex_string(ui, gpu, data);
}
void hue_bar_scroll_callback(void* data, UIContext* ui, RenderContext* gpu, double x, double y) {
@ -312,7 +313,8 @@ bool hex_string_key_callback(void* ptr, UIContext* ui, RenderContext* gpu, int k
if(action == GLFW_PRESS) {
switch(key) {
case GLFW_KEY_ESCAPE:
set_rgb_from_hsv(ui, gpu, data, data->current_hsv);
hsv_to_rgb(data->current_hsv, data->current);
update_hex_string(ui, gpu, data);
clear_active_element(ui, gpu);
break;
case GLFW_KEY_ENTER:
@ -369,9 +371,102 @@ void hex_string_button_callback(void* data, UIContext* ui, RenderContext* gpu, f
}
void hex_string_deselect_callback(void* data, UIContext* ui, RenderContext* gpu) {
(void)data;
hex_string_set_color(ui, gpu, 0);
}
void set_saved_color(UIContext* ui, RenderContext* gpu, ColorUIData* 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];
saved_color->color[0][0] = data->current[0];
saved_color->color[0][1] = data->current[1];
saved_color->color[0][2] = data->current[2];
saved_color->color[1][0] = data->current[0];
saved_color->color[1][1] = data->current[1];
saved_color->color[1][2] = data->current[2];
saved_color->color[2][0] = data->current[0];
saved_color->color[2][1] = data->current[1];
saved_color->color[2][2] = data->current[2];
saved_color->color[3][0] = data->current[0];
saved_color->color[3][1] = data->current[1];
saved_color->color[3][2] = data->current[2];
add_transfers(
&saved_color->color[0],
layer->drawables,
(7+index)*sizeof(GPUDrawable) + offsetof(GPUDrawable, color),
4*sizeof(vec4),
gpu);
}
void saved_color_button_callback(
void* ptr,
UIContext* ui,
RenderContext* gpu,
float x, float y,
int button, int action, int mods,
uint32_t index) {
(void)x;
(void)y;
(void)mods;
ColorUIData* data = ptr;
if(action == GLFW_PRESS) {
if(button == GLFW_MOUSE_BUTTON_LEFT) {
data->current[0] = data->saved[index][0];
data->current[1] = data->saved[index][1];
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);
} else if(button == GLFW_MOUSE_BUTTON_RIGHT) {
set_saved_color(ui, 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);
}
}
}
#define SAVED_COLOR_BUTTON_CALLBACK(n) \
void saved_color_button_callback_##n(void* data, UIContext* ui, RenderContext* gpu, float x, float y, int button, int action, int mods) { \
saved_color_button_callback(data, ui, gpu, x, y, button, action, mods, n); \
}
SAVED_COLOR_BUTTON_CALLBACK( 0);
SAVED_COLOR_BUTTON_CALLBACK( 1);
SAVED_COLOR_BUTTON_CALLBACK( 2);
SAVED_COLOR_BUTTON_CALLBACK( 3);
SAVED_COLOR_BUTTON_CALLBACK( 4);
SAVED_COLOR_BUTTON_CALLBACK( 5);
SAVED_COLOR_BUTTON_CALLBACK( 6);
SAVED_COLOR_BUTTON_CALLBACK( 7);
SAVED_COLOR_BUTTON_CALLBACK( 8);
SAVED_COLOR_BUTTON_CALLBACK( 9);
SAVED_COLOR_BUTTON_CALLBACK(10);
SAVED_COLOR_BUTTON_CALLBACK(11);
#define SAVED_COLOR_CALLBACK_ENTRY(n) \
{ \
.layer = 0, \
.element = 7 + n, \
.data = data, \
.button = saved_color_button_callback_##n, \
}
VkResult color_ui(ClientContext* context) {
GPUString strings[] = {
{
@ -429,61 +524,73 @@ VkResult color_ui(ClientContext* context) {
.pos = {146, 2},
.size = {20, 20},
.color = {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}},
.events = UI_EVENT_BUTTON,
},
{
.pos = {168, 2},
.size = {20, 20},
.color = {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}},
.events = UI_EVENT_BUTTON,
},
{
.pos = {146, 24},
.size = {20, 20},
.color = {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}},
.events = UI_EVENT_BUTTON,
},
{
.pos = {168, 24},
.size = {20, 20},
.color = {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}},
.events = UI_EVENT_BUTTON,
},
{
.pos = {146, 46},
.size = {20, 20},
.color = {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}},
.events = UI_EVENT_BUTTON,
},
{
.pos = {168, 46},
.size = {20, 20},
.color = {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}},
.events = UI_EVENT_BUTTON,
},
{
.pos = {146, 68},
.size = {20, 20},
.color = {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}},
.events = UI_EVENT_BUTTON,
},
{
.pos = {168, 68},
.size = {20, 20},
.color = {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}},
.events = UI_EVENT_BUTTON,
},
{
.pos = {146, 90},
.size = {20, 20},
.color = {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}},
.events = UI_EVENT_BUTTON,
},
{
.pos = {168, 90},
.size = {20, 20},
.color = {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}},
.events = UI_EVENT_BUTTON,
},
{
.pos = {146, 112},
.size = {20, 20},
.color = {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}},
.events = UI_EVENT_BUTTON,
},
{
.pos = {168, 112},
.size = {20, 20},
.color = {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}},
.events = UI_EVENT_BUTTON,
},
};
@ -542,6 +649,18 @@ VkResult color_ui(ClientContext* context) {
.text = hex_string_text_callback,
.deselect = hex_string_deselect_callback,
},
SAVED_COLOR_CALLBACK_ENTRY( 0),
SAVED_COLOR_CALLBACK_ENTRY( 1),
SAVED_COLOR_CALLBACK_ENTRY( 2),
SAVED_COLOR_CALLBACK_ENTRY( 3),
SAVED_COLOR_CALLBACK_ENTRY( 4),
SAVED_COLOR_CALLBACK_ENTRY( 5),
SAVED_COLOR_CALLBACK_ENTRY( 6),
SAVED_COLOR_CALLBACK_ENTRY( 7),
SAVED_COLOR_CALLBACK_ENTRY( 8),
SAVED_COLOR_CALLBACK_ENTRY( 9),
SAVED_COLOR_CALLBACK_ENTRY(10),
SAVED_COLOR_CALLBACK_ENTRY(11),
};
ContainerInput container = {