From 94ff59eae83f431d94e5baf9bd70c6e447de6b10 Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Sun, 1 Jun 2025 12:51:50 +0200 Subject: [PATCH] implement list activation events in the config dialog --- application/window.c | 136 ++++++++++++++++++++++++++++++++++++++----- application/window.h | 24 +++++--- 2 files changed, 137 insertions(+), 23 deletions(-) diff --git a/application/window.c b/application/window.c index 74a1009..771b359 100644 --- a/application/window.c +++ b/application/window.c @@ -376,31 +376,127 @@ static void* reslist_getvalue(void *data, int col) { return NULL; } +void nbconfig_update_lists(NotebookConfigDialog *wdata) { + CxIterator i = cxListIterator(wdata->groups); + cx_foreach(Resource *, res, i) { + ui_list_append(wdata->tab1_groups, res); + ui_list_append(wdata->tab2_groups, res); + } + + i = cxListIterator(wdata->notebooks); + cx_foreach(Resource *, res, i) { + ui_list_append(wdata->tab2_notebooks, res); + } + + i = cxListIterator(wdata->repositories); + // + + ui_list_update(wdata->tab1_groups); + ui_list_update(wdata->tab1_repositories); + ui_list_update(wdata->tab2_groups); + ui_list_update(wdata->tab2_notebooks); + ui_list_update(wdata->tab2_repositories); +} + +static void nbconfig_tab1_load_group(NotebookConfigDialog *wdata, Resource *res) { + Notebook *nb = res->notebook; + + ui_set(wdata->tab1_group_name, res->nodename); +} + +static void nbconfig_tab2_load_notebook(NotebookConfigDialog *wdata, Resource *res) { + Notebook *nb = res->notebook; + CxHashKey key = cx_hash_key(&res->resource_id, sizeof(res->resource_id)); + Resource *parent = cxMapGet(wdata->notebook_parents, key); + + ui_set(wdata->tab2_notebook_name, res->nodename); + if(parent) { + size_t index = cxListFind(wdata->groups, parent); + ui_list_setselection(wdata->tab2_groups, index); + } +} + +static int nbconfig_list_activate_event(UiEvent *event, UiList *list, void **listelm) { + NotebookConfigDialog *wdata = event->window; + UiListSelection *sel = event->eventdata; + if(sel->count != 1) { + return 1; // should not happen + } + + *listelm = ui_list_get(list, sel->rows[0]); + return 0; +} + +static void nbconfig_grouplist_activate(UiEvent *event, void *userdata) { + NotebookConfigDialog *wdata = event->window; + Resource *res; + if(nbconfig_list_activate_event(event, wdata->tab1_groups, (void**)&res)) { + return; + } + nbconfig_tab1_load_group(wdata, res); +} + +static void nbconfig_notebooklist_activate(UiEvent *event, void *userdata) { + NotebookConfigDialog *wdata = event->window; + Resource *res; + if(nbconfig_list_activate_event(event, wdata->tab2_notebooks, (void**)&res)) { + return; + } + nbconfig_tab2_load_notebook(wdata, res); +} + void action_notebook_config(UiEvent *event, void *userdata) { NoteStore *store = note_store_get(); // TODO: check store->root and show different dialog, when root is missing UiObject *obj = ui_simple_window("Notebooks", NULL); + const CxAllocator *a = ui_allocator(obj->ctx); NotebookConfigDialog *wdata = ui_malloc(obj->ctx, sizeof(NotebookConfigDialog)); + memset(wdata, 0, sizeof(NotebookConfigDialog)); + obj->window = wdata; + wdata->tab1_groups = ui_list_new(obj->ctx, NULL); + wdata->tab1_group_name = ui_string_new(obj->ctx, NULL); wdata->tab1_types = ui_list_new(obj->ctx, NULL); wdata->tab1_repositories = ui_list_new(obj->ctx, NULL); wdata->tab2_notebooks = ui_list_new(obj->ctx, NULL); wdata->tab2_groups = ui_list_new(obj->ctx, NULL); + wdata->tab2_notebook_name = ui_string_new(obj->ctx, NULL); wdata->tab2_types = ui_list_new(obj->ctx, NULL); wdata->tab2_repositories = ui_list_new(obj->ctx, NULL); + wdata->repositories = cxArrayListCreate(a, NULL, CX_STORE_POINTERS, 32); + wdata->groups = cxArrayListCreate(a, NULL, CX_STORE_POINTERS, 32); + wdata->notebooks = cxArrayListCreate(a, NULL, CX_STORE_POINTERS, 32); + wdata->notebook_parents = cxHashMapCreate(a, CX_STORE_POINTERS, 32); + // fill data + Resource *group1 = NULL; + Resource *notebook1 = NULL; CxIterator i = cxListIterator(store->root->children); cx_foreach(Resource *, res, i) { - ui_list_append(wdata->tab1_groups, res); - ui_list_append(wdata->tab2_groups, res); + cxListAdd(wdata->groups, res); + if(!group1) { + group1 = res; + } CxIterator k = cxListIterator(res->children); cx_foreach(Resource *, nb, k) { - ui_list_append(wdata->tab2_notebooks, nb); + cxListAdd(wdata->notebooks, nb); + CxHashKey key = cx_hash_key(&nb->resource_id, sizeof(nb->resource_id)); + cxMapPut(wdata->notebook_parents, key, res); + if(!notebook1) { + notebook1 = nb; + } } } + nbconfig_update_lists(wdata); + + ui_list_append(wdata->tab1_types, "Notes"); + ui_list_append(wdata->tab1_types, "Feed"); + + ui_list_append(wdata->tab2_types, "Notes"); + ui_list_append(wdata->tab2_types, "Feed"); // UI @@ -409,7 +505,7 @@ void action_notebook_config(UiEvent *event, void *userdata) { ui_tab(obj, "Groups") { ui_hbox(obj, .margin = 10, .spacing = 10, .fill = UI_ON) { ui_vbox(obj, .fill = UI_OFF) { - ui_listview(obj, .list = wdata->tab1_groups, .getvalue = reslist_getvalue, .fill = UI_ON); + ui_listview(obj, .list = wdata->tab1_groups, .getvalue = reslist_getvalue, .fill = UI_ON, .onactivate = nbconfig_grouplist_activate); ui_hbox(obj, .fill = UI_OFF) { ui_button(obj, .icon = UI_ICON_NEW_FOLDER); ui_button(obj, .icon = UI_ICON_DELETE); @@ -420,23 +516,23 @@ void action_notebook_config(UiEvent *event, void *userdata) { ui_grid(obj, .columnspacing = 10, .rowspacing = 10, .fill = UI_ON, .def_vfill = TRUE) { ui_rlabel(obj, .label = "Name"); - ui_textfield(obj, .varname = "todo1"); - ui_newline(obj); - - ui_rlabel(obj, .label = "Type"); - ui_combobox(obj, .list = wdata->tab1_types); + ui_textfield(obj, .value = wdata->tab1_group_name); ui_newline(obj); - ui_rlabel(obj, .label = "Repository"); + ui_rlabel(obj, .label = "Default Repository"); ui_combobox(obj, .list = wdata->tab1_repositories); ui_newline(obj); + + ui_rlabel(obj, .label = "Default Notebook Type"); + ui_combobox(obj, .list = wdata->tab1_types); + ui_newline(obj); } } } ui_tab(obj, "Notebooks") { ui_hbox(obj, .margin = 10, .spacing = 10, .fill = UI_ON) { ui_vbox(obj, .fill = UI_OFF) { - ui_listview(obj, .list = wdata->tab2_notebooks, .getvalue = reslist_getvalue, .fill = UI_ON); + ui_listview(obj, .list = wdata->tab2_notebooks, .getvalue = reslist_getvalue, .fill = UI_ON, .onactivate = nbconfig_notebooklist_activate); ui_hbox(obj, .fill = UI_OFF) { ui_button(obj, .icon = UI_ICON_NEW_FOLDER); ui_button(obj, .icon = UI_ICON_DELETE); @@ -451,16 +547,16 @@ void action_notebook_config(UiEvent *event, void *userdata) { ui_newline(obj); ui_rlabel(obj, .label = "Name"); - ui_textfield(obj, .varname = "todo1"); - ui_newline(obj); - - ui_rlabel(obj, .label = "Type"); - ui_combobox(obj, .list = wdata->tab2_types); + ui_textfield(obj, .value = wdata->tab2_notebook_name); ui_newline(obj); ui_rlabel(obj, .label = "Repository"); ui_combobox(obj, .list = wdata->tab1_repositories); ui_newline(obj); + + ui_rlabel(obj, .label = "Type"); + ui_combobox(obj, .list = wdata->tab2_types); + ui_newline(obj); } } } @@ -470,7 +566,15 @@ void action_notebook_config(UiEvent *event, void *userdata) { } } + ui_list_setselection(wdata->tab1_groups, 0); + ui_list_setselection(wdata->tab2_notebooks, 0); + if(group1) { + nbconfig_tab1_load_group(wdata, group1); + } + if(notebook1) { + nbconfig_tab2_load_notebook(wdata, notebook1); + } ui_show(obj); } diff --git a/application/window.h b/application/window.h index 83d4332..1fef0dd 100644 --- a/application/window.h +++ b/application/window.h @@ -50,13 +50,21 @@ typedef struct NewNotebookDialog { typedef struct NotebookConfigDialog { MainWindow *parent; - UiList *tab1_groups; - UiList *tab1_types; - UiList *tab1_repositories; - UiList *tab2_notebooks; - UiList *tab2_groups; - UiList *tab2_types; - UiList *tab2_repositories; + + CxList *repositories; + CxList *groups; + CxList *notebooks; + CxMap *notebook_parents; + + UiList *tab1_groups; + UiString *tab1_group_name; + UiList *tab1_types; + UiList *tab1_repositories; + UiList *tab2_notebooks; + UiList *tab2_groups; + UiString *tab2_notebook_name; + UiList *tab2_types; + UiList *tab2_repositories; } NotebookConfigDialog; void window_create(); @@ -75,6 +83,8 @@ void update_sublists(UiContext *ctx, UiList *sublists); void* window_notelist_getvalue(void *data, int col); +void nbconfig_update_lists(NotebookConfigDialog *wdata); + void action_notebook_add(UiEvent *event, void *userdata); void action_notebook_config(UiEvent *event, void *userdata); -- 2.43.5