From a08e7fa89dd9a59b95d64fb1e04d63e8e5b008a6 Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Tue, 21 Jun 2022 21:24:27 +0100 Subject: [PATCH] UI improvements, relative goto, better program icon --- assets-cg/icon-sel.png | Bin 18650 -> 18599 bytes assets-cg/icon-uns.png | Bin 15130 -> 15014 bytes assets-cg/icon.xcf | Bin 42143 -> 41343 bytes src/heditor.c | 21 ++- src/heditor.h | 6 + src/main.c | 343 +++++++++++++++++++++++++++++++++-------- src/source.c | 4 +- 7 files changed, 308 insertions(+), 66 deletions(-) diff --git a/assets-cg/icon-sel.png b/assets-cg/icon-sel.png index 2d6b250b2a3faaa9e11f131070ae2a46615cbb9f..738a9f96455ba451e2fbd1fccc65887150b71318 100644 GIT binary patch delta 15466 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 O0000-QC?C3R~Qr``!1FmzPX3lQWu3 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 z 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 k_PY?Y1kAVYZC6y#<#7qMJ2j7Zdpa1{> delta 11949 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 J&&n4@{~zxbG@Jkc literal 42143 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 diff --git a/src/heditor.c b/src/heditor.c index dc9186f..0c67174 100644 --- a/src/heditor.c +++ b/src/heditor.c @@ -27,6 +27,7 @@ heditor *heditor_create(jwidget *parent) e->source = NULL; e->scroll = 0; e->cursor = 0; + e->insert = false; e->visible_lines = 0; e->bytes_per_line = 8; e->line_spacing = 3; @@ -117,6 +118,14 @@ bool heditor_move_to(heditor *e, int target_cursor) return changed; } +void heditor_set_insert_mode(heditor *e, bool insert) +{ + e->insert = false; + if(e->source && e->source->intf->cap & SOURCE_EXPAND) + e->insert = insert; + e->widget.update = true; +} + void heditor_set_source(heditor *e, source_t *source) { e->source = source; @@ -208,9 +217,15 @@ static void heditor_poly_render(void *e0, int x, int y) int fg = C_BLACK; if(e->cursor == o) { - drect(bytes_x - 1, line_y - 1, bytes_x + text_w, - line_y + e->font->line_height, C_BLACK); - fg = C_WHITE; + if(e->insert) { + drect(bytes_x - 2, line_y - 1, bytes_x - 1, + line_y + e->font->line_height, C_BLACK); + } + else { + drect(bytes_x - 1, line_y - 1, bytes_x + text_w, + line_y + e->font->line_height, C_BLACK); + fg = C_WHITE; + } } dtext(bytes_x, line_y, fg, byte); diff --git a/src/heditor.h b/src/heditor.h index 7605d82..6feacca 100644 --- a/src/heditor.h +++ b/src/heditor.h @@ -23,6 +23,8 @@ typedef struct { int scroll; /* Current cursor position in source, in bytes */ int cursor; + /* Current insertion mode (false=overwrite, true=insert) */ + bool insert; /* Number of visible lines */ int8_t visible_lines; /* Number of bytes printed per line */ @@ -47,6 +49,10 @@ void heditor_set_source(heditor *e, source_t *source); /* Scroll to the requested cursor position. */ bool heditor_move_to(heditor *e, int offset); +/* Change the insertion mode; true for insertion, false for overwrite. If the + source doesn't support insertion, this function is a no-op. */ +void heditor_set_insert_mode(heditor *e, bool insert); + /* Trivial properties */ void heditor_set_font(heditor *e, font_t const *font); void heditor_set_line_spacing(heditor *e, int line_spacig); diff --git a/src/main.c b/src/main.c index 66c4f54..128526d 100644 --- a/src/main.c +++ b/src/main.c @@ -15,38 +15,170 @@ #include #include -static void update_status(jlabel *status, jlabel *title, source_t *s) +// Global application data // + +struct { + /* Title widget, status bar widget, f-keys widget. */ + jlabel *title; + jlabel *status; + jfkeys *fkeys; + /* Source info widget. */ + jlabel *source_info; + + /* Current data source. */ + source_t *source; + /* Current edition mode. */ + bool insert; + + /* Current view. */ + int view; + /* Current position in the menus. */ + int fkmenu; +} app; + +enum { + VIEW_EDITOR, + VIEW_INFO, + VIEW_STATS, +}; +enum { + FK_EDITOR, + FK_EDITOR_SOURCE, + FK_EDITOR_OPEN, + FK_VIEW, +}; + +// General UI update functions // + +static void fkeys_sprintf(jfkeys *fk, char const *fmt, ...) { + static char str[128]; + va_list args; + va_start(args, fmt); + vsnprintf(str, sizeof str, fmt, args); + va_end(args); + jfkeys_set(fk, str); +} + +static void update_fkeys(void) +{ + if(app.fkmenu == FK_EDITOR) { + if(!app.source) + jfkeys_set(app.fkeys, "/OPEN;;;;;"); + else { + bool can_insert = (app.source->intf->cap & SOURCE_EXPAND) != 0; + fkeys_sprintf(app.fkeys, "/OPEN;/SOURCE;%s%s;@GOTO;;#VIEW", + can_insert ? "@" : "#", + app.insert ? "INSERT" : "OVERW"); + } + } + else if(app.fkmenu == FK_EDITOR_SOURCE) { + jfkeys_set(app.fkeys, "@SAVE;@SAVE AS;;;;"); + } + else if(app.fkmenu == FK_EDITOR_OPEN) { + jfkeys_set(app.fkeys, "@FILE;@LAZY;@MEMORY;@NEW"); + } + else if(app.fkmenu == FK_VIEW) { + fkeys_sprintf(app.fkeys, ";;;%sEDITOR;%sINFO;%sSTATS", + app.view == VIEW_EDITOR ? "#" : "@", + app.view == VIEW_INFO ? "#" : "@", + app.view == VIEW_STATS ? "#" : "@"); + } +} + +static void update_status(void) +{ + /* TODO: (*) and (**) markers on title/status bar */ + source_t *s = app.source; + if(!s) { - jlabel_set_text(status, "-"); - jlabel_set_text(title, "Hex Editor"); + jwidget_set_visible(app.status, false); + jlabel_set_text(app.title, "Hex Editor"); return; } size_t size = source_size(s); + jwidget_set_visible(app.status, true); if(s->origin) - jlabel_asprintf(title, "%s (%d B) - Hex Editor", s->origin, size); + jlabel_asprintf(app.title, "%s (%d B) - Hex Editor", s->origin, size); else - jlabel_set_text(title, "(nil) - Hex Editor"); + jlabel_set_text(app.title, "(nil) - Hex Editor"); - jlabel_asprintf(status, "Buffer: @%X %d/%d", + jlabel_asprintf(app.status, "Buffer: @%X %d/%d", s->buf_offset, s->buf->data_size, s->buf->mem_size); } +static void update_source_info(void) +{ + source_t *s = app.source; + + if(!s) { + jlabel_set_text(app.source_info, "No source."); + return; + } + + char caps[48]; + memset(caps, 0, sizeof caps); + + if(s->intf->cap & SOURCE_WRITE) + strcat(caps, " WRITE"); + if(s->intf->cap & SOURCE_EXPAND) + strcat(caps, " EXPAND"); + if(s->intf->cap & SOURCE_SHRINK) + strcat(caps, " SHRINK"); + + jlabel_asprintf(app.source_info, + "%s\n" + "Size: %d bytes\n" + "Front buffer: %p, size %d/%d (x%d)\n" + "Front buffer maps to: @%d, size TODO\n" + "Capabilities: %s", + s->origin ? s->origin : "", + source_size(s), + s->buf->mem, s->buf->data_size, s->buf->mem_size, s->buf->block_size, + s->buf_offset, /* s->buf_size, */ + caps + 1); +} + +static jwidget *make_popup(void *parent0, int w, int h) +{ + J_CAST(parent) + + jwidget *popup = jwidget_create(parent); + if(!popup) + return NULL; + + jwidget_set_floating(popup, true); + jwidget_set_border(popup, J_BORDER_SOLID, 2, C_BLACK); + jwidget_set_padding(popup, 4, 4, 4, 4); + jwidget_set_background(popup, C_WHITE); + jwidget_set_visible(popup, false); + jwidget_set_fixed_size(popup, w, h); + + popup->x = (DWIDTH - w) / 2; + popup->y = (DHEIGHT - h) / 2; + return popup; +} + void hex_view(void) { - source_t *s = NULL; + app.source = NULL; + app.insert = false; + app.view = VIEW_EDITOR; + app.fkmenu = FK_EDITOR; jscene *scene = jscene_create_fullscreen(NULL); jlabel *title = jlabel_create("Hex Editor", scene); jwidget *stack = jwidget_create(scene); - jfkeys *fkeys = jfkeys_create("@JUMP;@OPEN",scene); + jfkeys *fkeys = jfkeys_create(";;;;;",scene); if(!scene || !title || !stack || !fkeys) { jwidget_destroy(scene); return; } + app.title = title; + app.fkeys = fkeys; jwidget_set_background(title, C_BLACK); jlabel_set_text_color(title, C_WHITE); @@ -62,58 +194,51 @@ void hex_view(void) jwidget *tab = jwidget_create(NULL); heditor *mem = heditor_create(tab); /* previously 321x153 */ + jinput *goto_input = jinput_create("Goto: ", 12, tab); jlabel *status = jlabel_create("", tab); + app.status = status; - jwidget_set_margin(mem, 3, 0, 3, 0); + jwidget_set_margin(mem, 2, 0, 0, 0); jwidget_set_stretch(mem, 1, 1, false); jwidget_set_stretch(status, 1, 0, false); + jwidget_set_padding(status, 2, 0, 0, 0); + jwidget_set_borders(status, J_BORDER_SOLID, C_BLACK, 1, 0, 0, 0); + + jwidget_set_stretch(goto_input, 1, 0, false); + jwidget_set_visible(goto_input, false); jlayout_set_vbox(tab)->spacing = 3; jwidget_add_child(stack, tab); jwidget_set_stretch(tab, 1, 1, false); - update_status(status, title, s); - jscene_show_and_focus(scene, mem); - // File selection tab // jfileselect *fileselect = jfileselect_create(stack); jfileselect_set_show_file_size(fileselect, true); jwidget_set_stretch(fileselect, 1, 1, false); - // Goto popup // + // Source info popup // - jwidget *popup_goto = jwidget_create(scene); - jwidget_set_floating(popup_goto, true); - jwidget_set_border(popup_goto, J_BORDER_SOLID, 2, C_BLACK); - jwidget_set_padding(popup_goto, 4, 4, 4, 4); - jwidget_set_background(popup_goto, C_WHITE); - jwidget_set_visible(popup_goto, false); - jwidget_set_fixed_size(popup_goto, DWIDTH * 3 / 4, DHEIGHT / 2); - popup_goto->x = DWIDTH / 8; - popup_goto->y = DHEIGHT / 4; - jlayout_set_vbox(popup_goto)->spacing = 3; + jwidget *popup_source_info = make_popup(scene, DWIDTH*3/4, DHEIGHT/2); + jlayout_set_vbox(popup_source_info)->spacing = 3; + jlabel *source_info = jlabel_create("", popup_source_info); + jlabel_set_wrap_mode(source_info, J_WRAP_WORD); + jlabel_set_line_spacing(source_info, 2); + jlabel_set_block_alignment(source_info, J_ALIGN_LEFT, J_ALIGN_TOP); + jwidget_set_stretch(source_info, 1, 1, false); - jinput *goto_input = jinput_create("Go to: ", 12, popup_goto); - jwidget_set_stretch(goto_input, 1, 0, false); + // Initial state // - jlabel *goto_help = jlabel_create( - "In hexadecimal. Use [ALPHA] to type letters.\n" - "Prefix with [+] or [-] to move relative to the current position.", - popup_goto); - jlabel_set_wrap_mode(goto_help, J_WRAP_WORD); - jlabel_set_line_spacing(goto_help, 2); - jlabel_set_block_alignment(goto_help, J_ALIGN_LEFT, J_ALIGN_TOP); - jwidget_set_stretch(goto_help, 1, 1, false); + update_status(); + update_fkeys(); + jscene_show_and_focus(scene, mem); // Event handling // int key = 0; - while(key != KEY_EXIT) - { - bool input_focus = (jscene_focused_widget(scene) == goto_input); + while(1) { jevent e = jscene_run(scene); if(e.type == JSCENE_PAINT) { @@ -124,50 +249,146 @@ void hex_view(void) if(e.type == JINPUT_VALIDATED) { /* Parse string into hexa */ char const *str = jinput_value(goto_input); - uint32_t target = strtoul(str, NULL, 16); - heditor_move_to(mem, target); + int mode = (*str == '+') ? 1 : (*str == '-') ? -1 : 0; + int target = strtoul(str + (mode != 0), NULL, 16); + heditor_move_to(mem, mode ? mem->cursor + target * mode : target); } if(e.type == JINPUT_VALIDATED || e.type == JINPUT_CANCELED) { - jwidget_set_visible(popup_goto, false); + jwidget_set_visible(goto_input, false); jscene_show_and_focus(scene, mem); } if(e.type == JFILESELECT_LOADED) { char const *path = jfileselect_current_folder(fileselect); jlabel_asprintf(title, "Browsing: %s", path ? path : "(nil)"); } - if(e.type == JFILESELECT_CANCELED || e.type == JFILESELECT_VALIDATED) { + if(e.type == JFILESELECT_CANCELED) { jscene_show_and_focus(scene, mem); - - if(e.type == JFILESELECT_VALIDATED) { - char const *file = jfileselect_selected_file(fileselect); - if(file) { - if(s) - source_free(s); - s = source_loaded_file_open(file); - if(s) { - source_load(s, 0, 2048); - } - heditor_set_source(mem, s); - } + update_status(); + } + if(e.type == JFILESELECT_VALIDATED) { + char const *file = jfileselect_selected_file(fileselect); + if(file) { + if(app.source) + source_free(app.source); + app.source = source_loaded_file_open(file); + app.fkmenu = FK_EDITOR; + app.insert = false; + source_load(app.source, 0, 2048); + heditor_set_source(mem, app.source); + heditor_set_insert_mode(mem, app.insert); + update_fkeys(); } - update_status(status, title, s); + jscene_show_and_focus(scene, mem); + update_status(); } if(e.type == HEDITOR_CHANGED) { - update_status(status, title, s); + update_status(); } + // Fkey menu navigation // + if(e.type != JSCENE_KEY || e.key.type == KEYEV_UP) continue; key = e.key.key; - if(key == KEY_F1 && stack->layout_stack.active == 0 && !input_focus) { - jinput_clear(goto_input); - jwidget_set_visible(popup_goto, true); - jscene_set_focused_widget(scene, goto_input); + if(jscene_focused_widget(scene) == goto_input) + continue; + + if(app.fkmenu == FK_EDITOR) { + if(key == KEY_F1) { + app.fkmenu = FK_EDITOR_OPEN; + update_fkeys(); + } + else if(key == KEY_F2 && app.source) { + app.fkmenu = FK_EDITOR_SOURCE; + update_fkeys(); + } + else if(key == KEY_F3 && app.source) { + if(app.source->intf->cap & SOURCE_EXPAND) { + app.insert = !app.insert; + heditor_set_insert_mode(mem, app.insert); + update_fkeys(); + } + } + else if(key == KEY_F4 && app.source) { + jinput_clear(goto_input); + jscene_show_and_focus(scene, goto_input); + } + else if(key == KEY_F6 && app.source) { + app.fkmenu = FK_VIEW; + update_fkeys(); + } } - if(key == KEY_F2 && !input_focus) { - jfileselect_browse(fileselect, "/"); - jscene_show_and_focus(scene, fileselect); + else if(app.fkmenu == FK_EDITOR_SOURCE) { + if(key == KEY_F1 && app.source) { + /* TODO: Source save */ + } + else if(key == KEY_F2 && app.source) { + /* TODO: Source save as */ + } + else if(key == KEY_EXIT) { + app.fkmenu = FK_EDITOR; + update_fkeys(); + } } + else if(app.fkmenu == FK_EDITOR_OPEN) { + if(key == KEY_F1 || key == KEY_F2) { + /* TODO: Check if current source is unsaved? */ + jfileselect_browse(fileselect, "/"); + jscene_show_and_focus(scene, fileselect); + } + else if(key == KEY_F3) { + /* TODO: Memory browser */ + } + else if(key == KEY_F4) { + /* TODO: New empty source */ + } + else if(key == KEY_EXIT) { + app.fkmenu = FK_EDITOR; + update_fkeys(); + } + } + else if(app.fkmenu == FK_VIEW) { + if(key == KEY_F4) { + jscene_show_and_focus(scene, mem); + app.fkmenu = FK_EDITOR; + update_fkeys(); + } + else if(key == KEY_F5) { + /* TODO: Show info panel */ + // jscene_show_and_focus(scene, tab_info); + // app.fkmenu = FK_INFO; + // update_fkeys(); + } + else if(key == KEY_F6) { + /* TODO: Show statistics panel */ + // jscene_show_and_focus(scene, tab_stats); + // app.fkmenu = FK_STATS; + // update_fkeys(); + } + else if(key == KEY_EXIT) { + // if(current_tab == tab_editor) + app.fkmenu = FK_EDITOR; + // else if(current_tab == tab_info) + // app.fkmenu = FK_INFO; + // else if(current_tab == tab_stats) + // app.fkmenu = FK_STATS; + update_fkeys(); + } + } + +#if 0 + if(key == KEY_F3 && !input_focus) { + if(!jwidget_visible(popup_source_info)) { + update_source_info(); + jwidget_set_visible(popup_source_info, true); + jscene_set_focused_widget(scene, source_info); + } + else { + jwidget_set_visible(popup_source_info, false); + jscene_show_and_focus(scene, mem); + } + } +#endif } jwidget_destroy(scene); } diff --git a/src/source.c b/src/source.c index acf4dd6..de30c3b 100644 --- a/src/source.c +++ b/src/source.c @@ -30,8 +30,8 @@ size_t source_size(source_t *s) ssize_t source_load(source_t *s, off_t offset, size_t segment_size) { - if(!buffer_resize(s->buf, segment_size)) - return false; + if(!s || !buffer_resize(s->buf, segment_size)) + return -1; s->buf_offset = offset; ssize_t rc = s->intf->read(s->cookie, s->buf->mem, offset, segment_size);