]> uap-core.de Git - note.git/commitdiff
implement list activation events in the config dialog
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 1 Jun 2025 10:51:50 +0000 (12:51 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 1 Jun 2025 10:51:50 +0000 (12:51 +0200)
application/window.c
application/window.h

index 74a100921d17417d45bb6d083783455e3fc843f8..771b3593d6ae01a252625a820f5a938e649969c3 100644 (file)
@@ -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);
 }
index 83d433296aff8247ce81e81e7c9ce3e917bec062..1fef0dd07661d01a14eb1dee73e73dac225d0fec 100644 (file)
@@ -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);