color editing 50
This commit is contained in:
parent
22afe1ea14
commit
daf9a73672
|
@ -139,7 +139,10 @@ FCPP_LINK int str_to_int(char *s);
|
||||||
FCPP_LINK int str_to_int(String s);
|
FCPP_LINK int str_to_int(String s);
|
||||||
FCPP_LINK int hexchar_to_int(char c);
|
FCPP_LINK int hexchar_to_int(char c);
|
||||||
FCPP_LINK char int_to_hexchar(int c);
|
FCPP_LINK char int_to_hexchar(int c);
|
||||||
FCPP_LINK int hexstr_to_int(String s);
|
FCPP_LINK unsigned int hexstr_to_int(String s);
|
||||||
|
|
||||||
|
FCPP_LINK bool color_to_hexstr(unsigned int color, String *s_out);
|
||||||
|
FCPP_LINK bool hexstr_to_color(String s, unsigned int *color);
|
||||||
|
|
||||||
FCPP_LINK int copy_fast_unsafe(char *dest, char *src);
|
FCPP_LINK int copy_fast_unsafe(char *dest, char *src);
|
||||||
FCPP_LINK void copy_fast_unsafe(char *dest, String src);
|
FCPP_LINK void copy_fast_unsafe(char *dest, String src);
|
||||||
|
@ -810,9 +813,10 @@ int_to_hexchar(int x){
|
||||||
return (x<10)?((char)x+'0'):((char)x+'a'-10);
|
return (x<10)?((char)x+'0'):((char)x+'a'-10);
|
||||||
}
|
}
|
||||||
|
|
||||||
FCPP_LINK int
|
FCPP_LINK unsigned int
|
||||||
hexstr_to_int(String str){
|
hexstr_to_int(String str){
|
||||||
int x, i;
|
unsigned int x;
|
||||||
|
int i;
|
||||||
if (str.size == 0){
|
if (str.size == 0){
|
||||||
x = 0;
|
x = 0;
|
||||||
}
|
}
|
||||||
|
@ -826,6 +830,51 @@ hexstr_to_int(String str){
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FCPP_LINK bool
|
||||||
|
color_to_hexstr(unsigned int color, String *s){
|
||||||
|
bool result = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (s->memory_size == 7 || s->memory_size == 8){
|
||||||
|
result = 1;
|
||||||
|
s->size = 6;
|
||||||
|
s->str[6] = 0;
|
||||||
|
color = color & 0x00FFFFFF;
|
||||||
|
for (i = 5; i >= 0; --i){
|
||||||
|
s->str[i] = int_to_hexchar(color & 0xF);
|
||||||
|
color >>= 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (s->memory_size > 8){
|
||||||
|
result = 1;
|
||||||
|
s->size = 8;
|
||||||
|
s->str[8] = 0;
|
||||||
|
for (i = 7; i >= 0; --i){
|
||||||
|
s->str[i] = int_to_hexchar(color & 0xF);
|
||||||
|
color >>= 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
FCPP_LINK bool
|
||||||
|
hexstr_to_color(String s, unsigned int *out){
|
||||||
|
bool result = 0;
|
||||||
|
unsigned int color = 0;
|
||||||
|
if (s.size == 6){
|
||||||
|
result = 1;
|
||||||
|
color = (unsigned int)hexstr_to_int(s);
|
||||||
|
color |= (0xFF << 24);
|
||||||
|
*out = color;
|
||||||
|
}
|
||||||
|
else if (s.size == 8){
|
||||||
|
result = 1;
|
||||||
|
color = (unsigned int)hexstr_to_int(s);
|
||||||
|
*out = color;
|
||||||
|
}
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
FCPP_LINK int
|
FCPP_LINK int
|
||||||
copy_fast_unsafe(char *dest, char *src){
|
copy_fast_unsafe(char *dest, char *src){
|
||||||
char *start = dest;
|
char *start = dest;
|
||||||
|
|
31
4ed.cpp
31
4ed.cpp
|
@ -3948,22 +3948,6 @@ App_Step_Sig(app_step){
|
||||||
}
|
}
|
||||||
ProfileStart(frame_hook);
|
ProfileStart(frame_hook);
|
||||||
|
|
||||||
ProfileStart(fill_gui_command_buffers);
|
|
||||||
{
|
|
||||||
Panel *panel, *used_panels;
|
|
||||||
View *view, *active_view;
|
|
||||||
|
|
||||||
active_view = cmd->panel->view;
|
|
||||||
used_panels = &models->layout.used_sentinel;
|
|
||||||
for (dll_items(panel, used_panels)){
|
|
||||||
view = panel->view;
|
|
||||||
if (step_file_view(system, view, active_view)){
|
|
||||||
app_result.redraw = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ProfileStart(fill_gui_command_buffers);
|
|
||||||
|
|
||||||
// NOTE(allen): pass raw input to the panels
|
// NOTE(allen): pass raw input to the panels
|
||||||
ProfileStart(step);
|
ProfileStart(step);
|
||||||
|
|
||||||
|
@ -4008,14 +3992,25 @@ App_Step_Sig(app_step){
|
||||||
|
|
||||||
{
|
{
|
||||||
Panel *panel, *used_panels;
|
Panel *panel, *used_panels;
|
||||||
View *view;
|
View *view, *active_view;
|
||||||
b32 active;
|
b32 active;
|
||||||
|
Input_Summary input;
|
||||||
|
|
||||||
|
active_view = cmd->panel->view;
|
||||||
used_panels = &models->layout.used_sentinel;
|
used_panels = &models->layout.used_sentinel;
|
||||||
for (dll_items(panel, used_panels)){
|
for (dll_items(panel, used_panels)){
|
||||||
view = panel->view;
|
view = panel->view;
|
||||||
active = (panel == cmd->panel);
|
active = (panel == cmd->panel);
|
||||||
Input_Summary input = (active)?(active_input):(dead_input);
|
input = (active)?(active_input):(dead_input);
|
||||||
|
if (step_file_view(system, view, active_view, input)){
|
||||||
|
app_result.redraw = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (dll_items(panel, used_panels)){
|
||||||
|
view = panel->view;
|
||||||
|
active = (panel == cmd->panel);
|
||||||
|
input = (active)?(active_input):(dead_input);
|
||||||
if (panel == mouse_panel && !mouse->out_of_window){
|
if (panel == mouse_panel && !mouse->out_of_window){
|
||||||
input.mouse = mouse_state;
|
input.mouse = mouse_state;
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,6 +98,7 @@ struct View{
|
||||||
b8 import_export_check[64];
|
b8 import_export_check[64];
|
||||||
i32 import_file_id;
|
i32 import_file_id;
|
||||||
i32 current_color_editing;
|
i32 current_color_editing;
|
||||||
|
i32 color_cursor;
|
||||||
|
|
||||||
// file stuff
|
// file stuff
|
||||||
i32 font_advance;
|
i32 font_advance;
|
||||||
|
@ -3664,13 +3665,14 @@ static Style_Color_Edit colors_to_edit[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
internal i32
|
internal i32
|
||||||
step_file_view(System_Functions *system, View *view, View *active_view){
|
step_file_view(System_Functions *system, View *view, View *active_view, Input_Summary input){
|
||||||
GUI_Target *target = &view->gui_target;
|
GUI_Target *target = &view->gui_target;
|
||||||
Models *models = view->models;
|
Models *models = view->models;
|
||||||
|
Key_Summary keys = input.keys;
|
||||||
|
|
||||||
f32 min_target_y = view->file_scroll.min_y;
|
f32 min_target_y = view->file_scroll.min_y;
|
||||||
|
|
||||||
gui_begin_top_level(target);
|
gui_begin_top_level(target, input);
|
||||||
{
|
{
|
||||||
gui_do_top_bar(target);
|
gui_do_top_bar(target);
|
||||||
|
|
||||||
|
@ -3817,6 +3819,8 @@ step_file_view(System_Functions *system, View *view, View *active_view){
|
||||||
gui_get_scroll_vars(target, view->showing_ui, &view->gui_scroll);
|
gui_get_scroll_vars(target, view->showing_ui, &view->gui_scroll);
|
||||||
gui_begin_scrollable(target, view->showing_ui, view->gui_scroll, 9.f * view->font_height);
|
gui_begin_scrollable(target, view->showing_ui, view->gui_scroll, 9.f * view->font_height);
|
||||||
|
|
||||||
|
i32 next_color_editing = view->current_color_editing;
|
||||||
|
|
||||||
for (i = 0; i < ArrayCount(colors_to_edit); ++i){
|
for (i = 0; i < ArrayCount(colors_to_edit); ++i){
|
||||||
edit_color = style_index_by_tag(&style->main, colors_to_edit[i].target);
|
edit_color = style_index_by_tag(&style->main, colors_to_edit[i].target);
|
||||||
id.id[0] = (u64)(edit_color);
|
id.id[0] = (u64)(edit_color);
|
||||||
|
@ -3825,12 +3829,62 @@ step_file_view(System_Functions *system, View *view, View *active_view){
|
||||||
back = style_index_by_tag(&style->main, colors_to_edit[i].back);
|
back = style_index_by_tag(&style->main, colors_to_edit[i].back);
|
||||||
|
|
||||||
if (gui_do_color_button(target, id, *fore, *back, colors_to_edit[i].text)){
|
if (gui_do_color_button(target, id, *fore, *back, colors_to_edit[i].text)){
|
||||||
view->current_color_editing = i;
|
next_color_editing = i;
|
||||||
|
view->color_cursor = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (view->current_color_editing == i){
|
if (view->current_color_editing == i){
|
||||||
// TODO(allen): color editor
|
GUI_Item_Update update = {0};
|
||||||
|
char text_space[7];
|
||||||
|
String text = make_fixed_width_string(text_space);
|
||||||
|
|
||||||
|
color_to_hexstr(*edit_color, &text);
|
||||||
|
if (gui_do_text_with_cursor(target, view->color_cursor, text, &update)){
|
||||||
|
b32 r = 0;
|
||||||
|
i32 j = 0;
|
||||||
|
|
||||||
|
for (j = 0; j < keys.count; ++j){
|
||||||
|
i16 key = keys.keys[j].keycode;
|
||||||
|
switch (key){
|
||||||
|
case key_left: --view->color_cursor; r = 1; break;
|
||||||
|
case key_right: ++view->color_cursor; r = 1; break;
|
||||||
|
|
||||||
|
case key_up:
|
||||||
|
if (next_color_editing > 0){
|
||||||
|
--next_color_editing;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case key_down:
|
||||||
|
if (next_color_editing <= ArrayCount(colors_to_edit)-1){
|
||||||
|
++next_color_editing;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if ((key >= '0' && key <= '9') || (key >= 'a' && key <= 'f') || (key >= 'A' && key <= 'F')){
|
||||||
|
text.str[view->color_cursor] = (char)key;
|
||||||
|
r = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (view->color_cursor < 0) view->color_cursor = 0;
|
||||||
|
if (view->color_cursor >= 6) view->color_cursor = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r){
|
||||||
|
hexstr_to_color(text, edit_color);
|
||||||
|
gui_rollback(target, &update);
|
||||||
|
gui_do_text_with_cursor(target, view->color_cursor, text, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (view->current_color_editing != next_color_editing){
|
||||||
|
view->current_color_editing = next_color_editing;
|
||||||
|
view->color_cursor = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
gui_end_scrollable(target);
|
gui_end_scrollable(target);
|
||||||
|
|
34
4ed_gui.cpp
34
4ed_gui.cpp
|
@ -140,6 +140,11 @@ struct GUI_Target{
|
||||||
GUI_Scroll_Vars scroll_updated;
|
GUI_Scroll_Vars scroll_updated;
|
||||||
f32 delta;
|
f32 delta;
|
||||||
u32 scroll_id;
|
u32 scroll_id;
|
||||||
|
b32 has_keys;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GUI_Item_Update{
|
||||||
|
i32 partition_point;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GUI_Header{
|
struct GUI_Header{
|
||||||
|
@ -170,6 +175,7 @@ enum GUI_Command_Type{
|
||||||
guicom_text_input,
|
guicom_text_input,
|
||||||
guicom_file_input,
|
guicom_file_input,
|
||||||
guicom_color_button,
|
guicom_color_button,
|
||||||
|
guicom_text_with_cursor,
|
||||||
guicom_file_option,
|
guicom_file_option,
|
||||||
guicom_fixed_option,
|
guicom_fixed_option,
|
||||||
guicom_button,
|
guicom_button,
|
||||||
|
@ -215,6 +221,16 @@ gui_active_level(GUI_Target *target, GUI_id id){
|
||||||
return(level);
|
return(level);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
gui_rollback(GUI_Target *target, GUI_Item_Update *update){
|
||||||
|
target->push.pos = update->partition_point;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
gui_fill_item_update(GUI_Item_Update *update, GUI_Target *target, GUI_Header *h){
|
||||||
|
update->partition_point = (i32)((char*)h - (char*)target->push.base);
|
||||||
|
}
|
||||||
|
|
||||||
internal void*
|
internal void*
|
||||||
gui_push_item(GUI_Target *target, void *item, i32 size){
|
gui_push_item(GUI_Target *target, void *item, i32 size){
|
||||||
void *dest = partition_allocate(&target->push, size);
|
void *dest = partition_allocate(&target->push, size);
|
||||||
|
@ -350,8 +366,9 @@ gui_end_serial_section(GUI_Target *target){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
gui_begin_top_level(GUI_Target *target){
|
gui_begin_top_level(GUI_Target *target, Input_Summary input){
|
||||||
target->push.pos = 0;
|
target->push.pos = 0;
|
||||||
|
target->has_keys = (input.keys.count > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
|
@ -376,6 +393,18 @@ gui_do_text_field(GUI_Target *target, String prompt, String text){
|
||||||
gui_push_string(target, h, text);
|
gui_push_string(target, h, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal b32
|
||||||
|
gui_do_text_with_cursor(GUI_Target *target, i32 pos, String text, GUI_Item_Update *update){
|
||||||
|
b32 result = 1;
|
||||||
|
GUI_Header *h = gui_push_simple_command(target, guicom_text_with_cursor);
|
||||||
|
gui_push_string(target, h, text);
|
||||||
|
gui_push_item(target, h, &pos, sizeof(i32));
|
||||||
|
|
||||||
|
result = target->has_keys;
|
||||||
|
gui_fill_item_update(update, target, h);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
internal b32
|
internal b32
|
||||||
gui_do_text_input(GUI_Target *target, GUI_id id, void *out){
|
gui_do_text_input(GUI_Target *target, GUI_id id, void *out){
|
||||||
b32 result = 0;
|
b32 result = 0;
|
||||||
|
@ -790,6 +819,7 @@ gui_interpret(GUI_Target *target, GUI_Session *session, GUI_Header *h){
|
||||||
scroll_v = 0;
|
scroll_v = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case guicom_text_with_cursor:
|
||||||
case guicom_text_field:
|
case guicom_text_field:
|
||||||
give_to_user = 1;
|
give_to_user = 1;
|
||||||
rect = gui_layout_fixed_h(session, y, session->line_height + 2);
|
rect = gui_layout_fixed_h(session, y, session->line_height + 2);
|
||||||
|
@ -805,7 +835,7 @@ gui_interpret(GUI_Target *target, GUI_Session *session, GUI_Header *h){
|
||||||
|
|
||||||
case guicom_color_button:
|
case guicom_color_button:
|
||||||
give_to_user = 1;
|
give_to_user = 1;
|
||||||
rect = gui_layout_fixed_h(session, y, session->line_height);
|
rect = gui_layout_fixed_h(session, y, session->line_height + 2);
|
||||||
end_v = rect.y1;
|
end_v = rect.y1;
|
||||||
end_section = section;
|
end_section = section;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue