From 7c731d53368e15aeb162a26edcdc5c01193bd075 Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Tue, 21 Oct 2025 20:28:27 +0200 Subject: [PATCH] show go back/forward buttons, when the notelist is hidden --- application/application.h | 1 + application/menu.c | 6 ++++++ application/window.c | 5 +++++ ui/cocoa/ListDataSource.m | 6 ++++++ ui/cocoa/appdelegate.m | 1 + ui/cocoa/container.m | 16 ++++++++++++++++ ui/cocoa/label.m | 2 +- ui/cocoa/list.m | 12 ++++++++++++ ui/cocoa/objs.mk | 1 + ui/cocoa/toolkit.h | 8 ++++---- ui/cocoa/toolkit.m | 13 +++++++++---- ui/cocoa/widget.h | 2 +- ui/cocoa/widget.m | 5 +++++ ui/cocoa/window.m | 15 +++++++++++++++ ui/common/object.c | 5 ++++- ui/common/toolbar.c | 15 +++++++++------ ui/common/toolbar.h | 3 +++ ui/gtk/headerbar.c | 3 +++ ui/gtk/toolkit.c | 16 ++++++++++++++++ ui/gtk/toolkit.h | 2 ++ ui/gtk/window.c | 4 ---- ui/ui/toolbar.h | 3 +++ 22 files changed, 123 insertions(+), 21 deletions(-) diff --git a/application/application.h b/application/application.h index 1fdd9f9..3ef47d4 100644 --- a/application/application.h +++ b/application/application.h @@ -38,6 +38,7 @@ extern "C" { #endif +#define APP_STATE_HIDE_NOTELIST 80 #define APP_STATE_NOTEBOOK_SELECTED 100 #define APP_STATE_NOTE_SELECTED 110 #define APP_STATE_NOTE_HAS_ATTACHMENTS 201 diff --git a/application/menu.c b/application/menu.c index 3bbd536..9a590d6 100644 --- a/application/menu.c +++ b/application/menu.c @@ -46,9 +46,15 @@ void toolbar_init() { ui_toolbar_item("GoForward", .icon = UI_ICON_GO_FORWARD, .onclick = action_go_forward); ui_toolbar_item("AddNote", .icon = UI_ICON_ADD, .onclick = action_note_new, .groups = UI_GROUPS(APP_STATE_NOTEBOOK_SELECTED)); + ui_toolbar_item("GoBack2", .icon = UI_ICON_GO_BACK, .onclick = action_go_back, .visibility_states = UI_GROUPS(APP_STATE_HIDE_NOTELIST)); + ui_toolbar_item("GoForward2", .icon = UI_ICON_GO_FORWARD, .onclick = action_go_forward, .visibility_states = UI_GROUPS(APP_STATE_HIDE_NOTELIST)); + ui_toolbar_add_default("GoBack", UI_TOOLBAR_LEFT); ui_toolbar_add_default("GoForward", UI_TOOLBAR_LEFT); ui_toolbar_add_default("AddNote", UI_TOOLBAR_LEFT); + + ui_toolbar_add_default("GoBack2", UI_TOOLBAR_RIGHTPANEL_LEFT); + ui_toolbar_add_default("GoForward2", UI_TOOLBAR_RIGHTPANEL_LEFT); } diff --git a/application/window.c b/application/window.c index b68801b..8276839 100644 --- a/application/window.c +++ b/application/window.c @@ -143,6 +143,11 @@ MainWindow* window_init_data(UiObject *obj) { void window_notelist_setvisible(MainWindow *window, UiBool visible) { ui_splitview_window_set_visible(window->obj, 0, visible); window->notelist_isvisible = visible; + if(visible) { + ui_unset_group(window->obj->ctx, APP_STATE_HIDE_NOTELIST); + } else { + ui_set_group(window->obj->ctx, APP_STATE_HIDE_NOTELIST); + } } void window_sidebar_getvalue(UiList *list, void *sublist_userdata, void *rowdata, int index, UiSubListItem *item, void *userdata) { diff --git a/ui/cocoa/ListDataSource.m b/ui/cocoa/ListDataSource.m index 3be08f7..8894b20 100644 --- a/ui/cocoa/ListDataSource.m +++ b/ui/cocoa/ListDataSource.m @@ -98,6 +98,12 @@ objectValueForTableColumn:(NSTableColumn *) tableColumn case UI_ICON_TEXT_FREE: { break; } + case UI_STRING_EDITABLE: { + break; + } + case UI_BOOL_EDITABLE: { + break; + } } if(freeResult) { diff --git a/ui/cocoa/appdelegate.m b/ui/cocoa/appdelegate.m index ae4d3fc..f0967ed 100644 --- a/ui/cocoa/appdelegate.m +++ b/ui/cocoa/appdelegate.m @@ -35,6 +35,7 @@ - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { ui_menu_init(); + NSLog(@"toolkit applicationDidFinishLaunching"); ui_cocoa_onstartup(); } diff --git a/ui/cocoa/container.m b/ui/cocoa/container.m index e7bcf0c..d9b2e2d 100644 --- a/ui/cocoa/container.m +++ b/ui/cocoa/container.m @@ -185,6 +185,22 @@ UiObject* ui_tabview_add(UIWIDGET tabview, const char *name, int tab_index) { } +UIWIDGET ui_headerbar_create(UiObject *obj, UiHeaderbarArgs *args) { + return NULL; // TODO +} + +UIWIDGET ui_itemlist_create(UiObject *obj, UiItemListContainerArgs *args) { + return NULL; // TODO +} + +UIWIDGET ui_hsplitpane_create(UiObject *obj, UiSplitPaneArgs *args) { + return NULL; // TODO +} + +UIWIDGET ui_vsplitpane_create(UiObject *obj, UiSplitPaneArgs *args) { + return NULL; // TODO +} + void ui_container_begin_close(UiObject *obj) { diff --git a/ui/cocoa/label.m b/ui/cocoa/label.m index 44e9045..4e75e01 100644 --- a/ui/cocoa/label.m +++ b/ui/cocoa/label.m @@ -27,7 +27,7 @@ */ #import "label.h" -#import "container.h" +#import "Container.h" #import diff --git a/ui/cocoa/list.m b/ui/cocoa/list.m index de2e98e..e776eeb 100644 --- a/ui/cocoa/list.m +++ b/ui/cocoa/list.m @@ -363,6 +363,18 @@ void ui_dropdown_setselection(UiList *list, UiListSelection selection) { /* --------------------------- SourceList --------------------------- */ +static ui_sourcelist_update_func sclist_update_callback = NULL; + +void ui_sourcelist_set_update_callback(ui_sourcelist_update_func cb) { + sclist_update_callback = cb; +} + +void ui_sourcelist_updated(void) { + if(sclist_update_callback) { + sclist_update_callback(); + } +} + static void sublist_free(const CxAllocator *a, UiSubList *sl) { cxFree(a, (char*)sl->varname); cxFree(a, (char*)sl->header); diff --git a/ui/cocoa/objs.mk b/ui/cocoa/objs.mk index b0326be..d4d0e61 100644 --- a/ui/cocoa/objs.mk +++ b/ui/cocoa/objs.mk @@ -50,6 +50,7 @@ COCOAOBJ += list.o COCOAOBJ += widget.o COCOAOBJ += image.o COCOAOBJ += entry.o +COCOAOBJ += TabView.o TOOLKITOBJS += $(COCOAOBJ:%=$(COCOA_OBJPRE)%) TOOLKITSOURCE += $(COCOAOBJ:%.o=cocoa/%.m) diff --git a/ui/cocoa/toolkit.h b/ui/cocoa/toolkit.h index da755d3..9a377b3 100644 --- a/ui/cocoa/toolkit.h +++ b/ui/cocoa/toolkit.h @@ -31,10 +31,10 @@ #include "../common/context.h" #include "../common/object.h" -@interface UiAppCallback : NSObject { - ui_threadfunc callback; - void *userdata; -} +@interface UiAppCallback : NSObject + +@property ui_threadfunc callback; +@property void *userdata; - (id) initWithCallback:(ui_threadfunc)func userdata:(void*)userdata; diff --git a/ui/cocoa/toolkit.m b/ui/cocoa/toolkit.m index 33332a5..fd97b2c 100644 --- a/ui/cocoa/toolkit.m +++ b/ui/cocoa/toolkit.m @@ -57,6 +57,7 @@ static UiBool exit_on_shutdown; /* ------------------- App Init / Event Loop functions ------------------- */ + void ui_init(const char *appname, int argc, char **argv) { application_name = appname; app_argc = argc; @@ -69,7 +70,9 @@ void ui_init(const char *appname, int argc, char **argv) { uic_load_app_properties(); - [NSApplication sharedApplication]; + NSApplication *app = [NSApplication sharedApplication]; + //[app setActivationPolicy:NSApplicationActivationPolicyRegular]; + //[NSBundle loadNibNamed:@"MainMenu" owner:NSApp ]; //[[NSBundle mainBundle] loadNibNamed:@"MainMenu" owner:NSApp topLevelObjects:&topLevelObjects]; @@ -178,8 +181,8 @@ void ui_job(UiObject *obj, ui_threadfunc tf, void *td, ui_callback f, void *fd) @implementation UiAppCallback - (id) initWithCallback:(ui_threadfunc)func userdata:(void*)userdata { - self->callback = func; - self->userdata = userdata; + _callback = func; + _userdata = userdata; return self; } @@ -190,7 +193,9 @@ void ui_job(UiObject *obj, ui_threadfunc tf, void *td, ui_callback f, void *fd) } - (void) mainThread:(id)n { - callback(userdata); + if(_callback) { + _callback(_userdata); + } } @end diff --git a/ui/cocoa/widget.h b/ui/cocoa/widget.h index 5857c86..772bf88 100644 --- a/ui/cocoa/widget.h +++ b/ui/cocoa/widget.h @@ -27,5 +27,5 @@ */ #import "toolkit.h" -#import "container.h" +#import "Container.h" #import "../ui/widget.h" diff --git a/ui/cocoa/widget.m b/ui/cocoa/widget.m index 1c2e90a..edc78c1 100644 --- a/ui/cocoa/widget.m +++ b/ui/cocoa/widget.m @@ -45,6 +45,11 @@ void ui_set_visible(UIWIDGET widget, int visible) { } +UIWIDGET ui_separator_create(UiObject *obj, UiWidgetArgs *args) { + // TODO + return NULL; +} + /* custom widget */ diff --git a/ui/cocoa/window.m b/ui/cocoa/window.m index 811226e..c4efb6b 100644 --- a/ui/cocoa/window.m +++ b/ui/cocoa/window.m @@ -44,6 +44,11 @@ #include +static int window_default_width = 650; +static int window_default_height = 550; + +static int splitview_window_default_pos = -1; +static UiBool splitview_window_use_prop = TRUE; static UiObject* create_window(const char *title, BOOL simple, BOOL sidebar, BOOL splitview) { UiObject *obj = uic_object_new_toplevel(); @@ -81,9 +86,19 @@ UiObject* ui_sidebar_window(const char *title, void *window_data) { } UiObject* ui_splitview_window(const char *title, UiBool sidebar) { + sleep(1); return create_window(title, FALSE, sidebar, TRUE); } +void ui_window_size(UiObject *obj, int width, int height) { + // TODO +} + +void ui_window_default_size(int width, int height) { + window_default_width = width; + window_default_height = height; +} + /* --------------------------------- File Dialogs --------------------------------- */ void ui_openfiledialog(UiObject *obj, unsigned int mode, ui_callback file_selected_callback, void *cbdata) { diff --git a/ui/common/object.c b/ui/common/object.c index 6d6b547..4c41e28 100644 --- a/ui/common/object.c +++ b/ui/common/object.c @@ -28,7 +28,6 @@ #include #include - #include "object.h" #include "context.h" @@ -107,11 +106,15 @@ void uic_object_destroy(UiObject *obj) { } UiObject* uic_object_new_toplevel(void) { + fflush(stdout); CxMempool *mp = cxMempoolCreateSimple(256); UiObject *obj = cxCalloc(mp->allocator, 1, sizeof(UiObject)); + fflush(stdout); obj->ctx = uic_context(obj, mp); obj->ctx->parent = ui_global_context(); + fflush(stdout); uic_object_created(obj); + fflush(stdout); return obj; } diff --git a/ui/common/toolbar.c b/ui/common/toolbar.c index 5164f0c..f237290 100644 --- a/ui/common/toolbar.c +++ b/ui/common/toolbar.c @@ -50,7 +50,7 @@ static char* nl_strdup(const char* str) { return str ? strdup(str) : NULL; } -static UiToolbarItemArgs itemargs_copy(UiToolbarItemArgs *args, size_t *ngroups) { +static UiToolbarItemArgs itemargs_copy(UiToolbarItemArgs *args, size_t *ngroups, size_t *nvstates) { UiToolbarItemArgs newargs; newargs.label = nl_strdup(args->label); newargs.icon = nl_strdup(args->icon); @@ -58,18 +58,19 @@ static UiToolbarItemArgs itemargs_copy(UiToolbarItemArgs *args, size_t *ngroups) newargs.onclick = args->onclick; newargs.onclickdata = args->onclickdata; newargs.groups = uic_copy_groups(args->groups, ngroups); + newargs.visibility_states = uic_copy_groups(args->visibility_states, nvstates); return newargs; } void ui_toolbar_item_create(const char* name, UiToolbarItemArgs *args) { UiToolbarItem* item = malloc(sizeof(UiToolbarItem)); item->item.type = UI_TOOLBAR_ITEM; - item->args = itemargs_copy(args, &item->ngroups); + item->args = itemargs_copy(args, &item->ngroups, &item->nvstates); cxMapPut(toolbar_items, name, item); } -static UiToolbarToggleItemArgs toggleitemargs_copy(UiToolbarToggleItemArgs *args, size_t *ngroups) { +static UiToolbarToggleItemArgs toggleitemargs_copy(UiToolbarToggleItemArgs *args, size_t *ngroups, size_t *nvstates) { UiToolbarToggleItemArgs newargs; newargs.label = nl_strdup(args->label); newargs.icon = nl_strdup(args->icon); @@ -78,21 +79,23 @@ static UiToolbarToggleItemArgs toggleitemargs_copy(UiToolbarToggleItemArgs *args newargs.onchange = args->onchange; newargs.onchangedata = args->onchangedata; newargs.groups = uic_copy_groups(args->groups, ngroups); + newargs.visibility_states = uic_copy_groups(args->visibility_states, nvstates); return newargs; } void ui_toolbar_toggleitem_create(const char* name, UiToolbarToggleItemArgs *args) { UiToolbarToggleItem* item = malloc(sizeof(UiToolbarToggleItem)); item->item.type = UI_TOOLBAR_TOGGLEITEM; - item->args = toggleitemargs_copy(args, &item->ngroups); + item->args = toggleitemargs_copy(args, &item->ngroups, &item->nvstates); cxMapPut(toolbar_items, name, item); } -static UiToolbarMenuArgs menuargs_copy(UiToolbarMenuArgs *args) { +static UiToolbarMenuArgs menuargs_copy(UiToolbarMenuArgs *args, size_t *nvstates) { UiToolbarMenuArgs newargs; newargs.label = nl_strdup(args->label); newargs.icon = nl_strdup(args->icon); newargs.tooltip = nl_strdup(args->tooltip); + newargs.visibility_states = uic_copy_groups(args->visibility_states, nvstates); return newargs; } @@ -100,7 +103,7 @@ UIEXPORT void ui_toolbar_menu_create(const char* name, UiToolbarMenuArgs *args) UiToolbarMenuItem* item = malloc(sizeof(UiToolbarMenuItem)); item->item.type = UI_TOOLBAR_MENU; memset(&item->menu, 0, sizeof(UiMenu)); - item->args = menuargs_copy(args); + item->args = menuargs_copy(args, &item->nvstates); item->end = 0; diff --git a/ui/common/toolbar.h b/ui/common/toolbar.h index a13828e..1ac1d55 100644 --- a/ui/common/toolbar.h +++ b/ui/common/toolbar.h @@ -63,18 +63,21 @@ struct UiToolbarItem { UiToolbarItemI item; UiToolbarItemArgs args; size_t ngroups; + size_t nvstates; }; struct UiToolbarToggleItem { UiToolbarItemI item; UiToolbarToggleItemArgs args; size_t ngroups; + size_t nvstates; }; struct UiToolbarMenuItem { UiToolbarItemI item; UiMenu menu; UiToolbarMenuArgs args; + size_t nvstates; int end; }; diff --git a/ui/gtk/headerbar.c b/ui/gtk/headerbar.c index 3cd76d0..0a9bd3e 100644 --- a/ui/gtk/headerbar.c +++ b/ui/gtk/headerbar.c @@ -165,6 +165,7 @@ void ui_add_headerbar_item( { GtkWidget *button = ui_create_button(obj, item->args.label, item->args.icon, item->args.tooltip, item->args.onclick, item->args.onclickdata, 0, FALSE); ui_set_widget_groups(obj->ctx, button, item->args.groups); + ui_set_widget_visibility_states(obj->ctx, button, item->args.visibility_states); WIDGET_ADD_CSS_CLASS(button, "flat"); headerbar_add(headerbar, box, button, pos); } @@ -178,6 +179,7 @@ void ui_add_headerbar_toggleitem( { GtkWidget *button = gtk_toggle_button_new(); ui_set_widget_groups(obj->ctx, button, item->args.groups); + ui_set_widget_visibility_states(obj->ctx, button, item->args.visibility_states); WIDGET_ADD_CSS_CLASS(button, "flat"); ui_setup_togglebutton(obj, button, item->args.label, item->args.icon, item->args.tooltip, item->args.varname, NULL, item->args.onchange, item->args.onchangedata, 0); headerbar_add(headerbar, box, button, pos); @@ -194,6 +196,7 @@ void ui_add_headerbar_menu( #if GTK_MAJOR_VERSION >= 4 GtkWidget *menubutton = gtk_menu_button_new(); + ui_set_widget_visibility_states(obj->ctx, menubutton, item->args.visibility_states); if(item->args.label) { gtk_menu_button_set_label(GTK_MENU_BUTTON(menubutton), item->args.label); } diff --git a/ui/gtk/toolkit.c b/ui/gtk/toolkit.c index 3596c5e..b22b66c 100644 --- a/ui/gtk/toolkit.c +++ b/ui/gtk/toolkit.c @@ -544,3 +544,19 @@ void ui_set_widget_ngroups(UiContext *ctx, GtkWidget *widget, const int *groups, ui_set_enabled(widget, FALSE); } } + +void ui_set_widget_visibility_states(UiContext *ctx, GtkWidget *widget, const int *states) { + if(!states) { + return; + } + size_t nstates = uic_group_array_size(states); + ui_set_widget_nvisibility_states(ctx, widget, states, nstates); +} + + +void ui_set_widget_nvisibility_states(UiContext *ctx, GtkWidget *widget, const int *states, size_t ngroups) { + if(ngroups > 0) { + uic_add_group_widget_i(ctx, widget, (ui_enablefunc)ui_set_visible, states, ngroups); + ui_set_visible(widget, FALSE); + } +} diff --git a/ui/gtk/toolkit.h b/ui/gtk/toolkit.h index 7d97772..cfa25bb 100644 --- a/ui/gtk/toolkit.h +++ b/ui/gtk/toolkit.h @@ -180,6 +180,8 @@ int ui_get_scalefactor(); void ui_set_name_and_style(GtkWidget *widget, const char *name, const char *style); void ui_set_widget_groups(UiContext *ctx, GtkWidget *widget, const int *groups); void ui_set_widget_ngroups(UiContext *ctx, GtkWidget *widget, const int *groups, size_t ngroups); +void ui_set_widget_visibility_states(UiContext *ctx, GtkWidget *widget, const int *states); +void ui_set_widget_nvisibility_states(UiContext *ctx, GtkWidget *widget, const int *states, size_t ngroups); void ui_destroy_userdata(GtkWidget *object, void *userdata); void ui_destroy_vardata(GtkWidget *object, UiVarEventData *data); diff --git a/ui/gtk/window.c b/ui/gtk/window.c index 152b4e5..f90997f 100644 --- a/ui/gtk/window.c +++ b/ui/gtk/window.c @@ -448,11 +448,7 @@ UIEXPORT void ui_splitview_window_set_visible(UiObject *obj, int pane, UiBool vi return; } -#ifdef UI_LIBADWAITA - gtk_widget_set_visible(gtk_widget_get_parent(panel), visible); -#else gtk_widget_set_visible(panel, visible); -#endif } #ifdef UI_LIBADWAITA diff --git a/ui/ui/toolbar.h b/ui/ui/toolbar.h index 066cee2..26a79e6 100644 --- a/ui/ui/toolbar.h +++ b/ui/ui/toolbar.h @@ -45,6 +45,7 @@ typedef struct UiToolbarItemArgs { void* onclickdata; const int *groups; + const int *visibility_states; } UiToolbarItemArgs; typedef struct UiToolbarToggleItemArgs { @@ -57,12 +58,14 @@ typedef struct UiToolbarToggleItemArgs { void *onchangedata; const int *groups; + const int *visibility_states; } UiToolbarToggleItemArgs; typedef struct UiToolbarMenuArgs { const char *label; const char *icon; const char *tooltip; + const int *visibility_states; } UiToolbarMenuArgs; enum UiToolbarPos { -- 2.47.3