Include a separator as a toolbar option
authorColin Clark <colin.clark@cclark.uk>
Mon, 16 Oct 2023 09:39:23 +0000 (10:39 +0100)
committerColin Clark <colin.clark@cclark.uk>
Mon, 16 Oct 2023 09:39:23 +0000 (10:39 +0100)
src/layout-util.cc
src/toolbar.cc

index c109d33..8dfac9c 100644 (file)
@@ -3219,13 +3219,21 @@ void layout_toolbar_clear(LayoutWindow *lw, ToolbarType type)
        lw->toolbar_merge_id[type] = gtk_ui_manager_new_merge_id(lw->ui_manager);
 }
 
+/* Used to create a unique name for toolbar separators */
+static gint i = 0;
+
 void layout_toolbar_add(LayoutWindow *lw, ToolbarType type, const gchar *action)
 {
        const gchar *path = nullptr;
+       gchar *separator_name;
 
        if (!action || !lw->ui_manager) return;
 
-       if (g_list_find_custom(lw->toolbar_actions[type], action, reinterpret_cast<GCompareFunc>(strcmp))) return;
+       /* There can be multiple separators, but only a single of others */
+       if (g_strcmp0(action, "Separator") != 0)
+               {
+               if (g_list_find_custom(lw->toolbar_actions[type], action, reinterpret_cast<GCompareFunc>(strcmp))) return;
+               }
 
        switch (type)
                {
@@ -3261,7 +3269,22 @@ void layout_toolbar_add(LayoutWindow *lw, ToolbarType type, const gchar *action)
                        gtk_action_group_add_actions(lw->action_group_editors, &entry, 1, lw);
                        }
                }
-       gtk_ui_manager_add_ui(lw->ui_manager, lw->toolbar_merge_id[type], path, action, action, GTK_UI_MANAGER_TOOLITEM, FALSE);
+
+       if (g_strcmp0(action, "Separator") == 0)
+               {
+               /* gtk_ui_manager requires items to have unique names */
+               i++;
+               separator_name = g_strdup_printf("separator_%i",i);
+
+               gtk_ui_manager_add_ui(lw->ui_manager, lw->toolbar_merge_id[type], path, separator_name, NULL, GTK_UI_MANAGER_SEPARATOR, FALSE);
+
+               g_free(separator_name);
+               }
+       else
+               {
+               gtk_ui_manager_add_ui(lw->ui_manager, lw->toolbar_merge_id[type], path, action, action, GTK_UI_MANAGER_TOOLITEM, FALSE);
+               }
+
        lw->toolbar_actions[type] = g_list_append(lw->toolbar_actions[type], g_strdup(action));
 }
 
index 0096988..7abf598 100644 (file)
@@ -308,6 +308,12 @@ static void toolbar_menu_add_popup(GtkWidget *, gpointer data)
 
        menu = popup_menu_short_lived();
 
+       item = menu_item_add_stock(menu, "Separator", "Separator", G_CALLBACK(toolbarlist_add_cb), toolbarlist);
+       g_object_set_data(G_OBJECT(item), "toolbar_add_name", g_strdup("Separator"));
+       g_object_set_data(G_OBJECT(item), "toolbar_add_label", g_strdup("Separator"));
+       g_object_set_data(G_OBJECT(item), "toolbar_add_stock_id", g_strdup("no-icon"));
+       g_signal_connect(G_OBJECT(item), "destroy", G_CALLBACK(toolbar_button_free), item);
+
        list = get_action_items();
 
        work = list;
@@ -401,7 +407,15 @@ static void toolbarlist_populate(LayoutWindow *lw, GtkBox *box, ToolbarType bar)
                        {
                        get_toolbar_item(name, &label, &icon);
                        }
-               toolbarlist_add_button(name, label, icon, box);
+
+               if (g_strcmp0(name, "Separator") != 0)
+                       {
+                       toolbarlist_add_button(name, label, icon, box);
+                       }
+               else
+                       {
+                       toolbarlist_add_button(name, name, "no-icon", box);
+                       }
                }
 }