mirror of
https://gitlab.gnome.org/GNOME/gimp.git
synced 2025-07-03 17:33:25 +00:00
app, menus: add the generated actions in the main menu.
These are the menu items such as the recently opened images, or recently used filters, etc. Some notes: - I added back a "placeholder" concept in the GimpMenu logic. This will allow to place items at specific positions in the menu (either under the placeholder, which will make the last item be on top or above the placeholder to have the last item be in the bottom, depending on needs). Technically placeholders are just menu items with a label (used as placeholder key) and no associated action, which I will leave invisible. - I add a logic for submenus so that they are invisible by default and are only made visible when we add a menu item with an action in there. - I removed filling the "/Filters/Recently Used/Plug-ins" placeholder. As far as I could see, it was never filled (neither with old or new code) and the "/Filters/Recently Used/Filters" actually already takes care of filling the "Recently Used" submenu with both GEGL operations and plug-in calls. - The old gimp_ui_manager_add_ui() API is for all types of menus, e.g. including the ones created by dockables or elsewhere whereas my new API is (for now) still specific to the top menu. This will have to be further implemented later. I left a bunch of "TODO GMenu"-s for the time being. - I see 2 dock-related generated items which seem to never be added, for recently added and closed docks. It doesn't seem to work in the old API as well. I'll want to have a closer look too.
This commit is contained in:
parent
37c11f0134
commit
2f70d1a154
11 changed files with 201 additions and 36 deletions
|
@ -73,6 +73,8 @@ file_menu_setup (GimpUIManager *manager,
|
|||
action_path, action_name, action_name,
|
||||
GTK_UI_MANAGER_MENUITEM,
|
||||
FALSE);
|
||||
gimp_ui_manager_add_ui2 (manager, "/File/Open Recent",
|
||||
action_name, "Files", TRUE);
|
||||
|
||||
full_path = g_strconcat (action_path, "/", action_name, NULL);
|
||||
|
||||
|
|
|
@ -57,6 +57,8 @@ filters_menu_setup (GimpUIManager *manager,
|
|||
action_path, action_name, action_name,
|
||||
GTK_UI_MANAGER_MENUITEM,
|
||||
FALSE);
|
||||
gimp_ui_manager_add_ui2 (manager, "/Filters/Recently Used",
|
||||
action_name, "Filters", TRUE);
|
||||
|
||||
g_free (action_name);
|
||||
g_free (action_path);
|
||||
|
|
|
@ -88,34 +88,12 @@ plug_in_menus_setup (GimpUIManager *manager,
|
|||
GimpPlugInManager *plug_in_manager;
|
||||
GTree *menu_entries;
|
||||
GSList *list;
|
||||
guint merge_id;
|
||||
gint i;
|
||||
|
||||
g_return_if_fail (GIMP_IS_UI_MANAGER (manager));
|
||||
g_return_if_fail (ui_path != NULL);
|
||||
|
||||
plug_in_manager = manager->gimp->plug_in_manager;
|
||||
|
||||
merge_id = gimp_ui_manager_new_merge_id (manager);
|
||||
|
||||
for (i = 0; i < manager->gimp->config->filter_history_size; i++)
|
||||
{
|
||||
gchar *action_name;
|
||||
gchar *action_path;
|
||||
|
||||
action_name = g_strdup_printf ("filter-recent-%02d", i + 1);
|
||||
action_path = g_strdup_printf ("%s/Filters/Recently Used/Plug-ins",
|
||||
ui_path);
|
||||
|
||||
gimp_ui_manager_add_ui (manager, merge_id,
|
||||
action_path, action_name, action_name,
|
||||
GTK_UI_MANAGER_MENUITEM,
|
||||
FALSE);
|
||||
|
||||
g_free (action_name);
|
||||
g_free (action_path);
|
||||
}
|
||||
|
||||
menu_entries = g_tree_new_full ((GCompareDataFunc) strcmp, NULL,
|
||||
g_free,
|
||||
(GDestroyNotify) plug_in_menu_entry_free);
|
||||
|
@ -398,14 +376,14 @@ plug_in_menus_add_proc (GimpUIManager *manager,
|
|||
GTK_UI_MANAGER_MENUITEM,
|
||||
FALSE);
|
||||
|
||||
/* TODO: this will eventually replace gimp_ui_manager_add_ui().
|
||||
/* TODO GMenu: this will eventually replace gimp_ui_manager_add_ui().
|
||||
* Also we will need to support more than "<Image>" menu only.
|
||||
*/
|
||||
if (g_str_has_prefix (menu_path, "<Image>/"))
|
||||
gimp_ui_manager_add_ui2 (manager,
|
||||
menu_path + 7,
|
||||
gimp_object_get_name (proc),
|
||||
FALSE);
|
||||
NULL, FALSE);
|
||||
|
||||
g_free (action_path);
|
||||
}
|
||||
|
@ -486,6 +464,11 @@ plug_in_menus_build_path (GimpUIManager *manager,
|
|||
GIMP_LOG (MENUS, "adding menu '%s' at path '%s' for action '%s'",
|
||||
menu_item_name, action_path, menu_path);
|
||||
|
||||
/* TODO GMenu: I don't have the UI in the new API to add
|
||||
* placeholder's items, separators and submenus (and not sure how
|
||||
* much the later is needed as the main API should create submenus
|
||||
* for us anyway). Look at this more carefully later.
|
||||
*/
|
||||
gimp_ui_manager_add_ui (manager, merge_id,
|
||||
parent_action_path, menu_item_name,
|
||||
menu_path,
|
||||
|
|
|
@ -150,6 +150,9 @@ tool_options_menu_update_presets (GimpUIManager *manager,
|
|||
which_action, i);
|
||||
path = g_strdup_printf ("%s/%s", ui_path, menu_path);
|
||||
|
||||
/* TODO GMenu: this is for the "/tool-options-popup/" which doesn't use
|
||||
* our new infra with GAction/GMenu yet.
|
||||
*/
|
||||
gimp_ui_manager_add_ui (manager, merge_id,
|
||||
path, action_name, action_name,
|
||||
GTK_UI_MANAGER_MENUITEM,
|
||||
|
|
|
@ -124,6 +124,14 @@ window_menu_display_opened (GdkDisplayManager *disp_manager,
|
|||
GTK_UI_MANAGER_MENUITEM,
|
||||
FALSE);
|
||||
|
||||
/* TODO GMenu: there is also a case with the dockable menu, which is not yet
|
||||
* using our new GAction/GMenu-based code. In such case, the ui_path is
|
||||
* "/dockable-popup/Move to Screen".
|
||||
*/
|
||||
if (g_str_has_prefix (ui_path, "/image-menubar/"))
|
||||
gimp_ui_manager_add_ui2 (manager, "/View/Move to Screen",
|
||||
action_name, NULL, FALSE);
|
||||
|
||||
g_free (action_name);
|
||||
g_free (action_path);
|
||||
|
||||
|
|
|
@ -253,6 +253,8 @@ windows_menu_image_notify (GimpDisplay *display,
|
|||
action_path, action_name, action_name,
|
||||
GTK_UI_MANAGER_MENUITEM,
|
||||
FALSE);
|
||||
gimp_ui_manager_add_ui2 (manager, "/Windows",
|
||||
action_name, "Images", TRUE);
|
||||
|
||||
full_path = g_strconcat (action_path, "/", action_name, NULL);
|
||||
|
||||
|
@ -306,10 +308,13 @@ windows_menu_dock_window_added (GimpDialogFactory *factory,
|
|||
g_object_set_data (G_OBJECT (manager), merge_key,
|
||||
GUINT_TO_POINTER (merge_id));
|
||||
|
||||
/* TODO GMenu: doesn't look like it's working, neither will old or new API. */
|
||||
gimp_ui_manager_add_ui (manager, merge_id,
|
||||
action_path, action_name, action_name,
|
||||
GTK_UI_MANAGER_MENUITEM,
|
||||
FALSE);
|
||||
gimp_ui_manager_add_ui2 (manager, "/Windows",
|
||||
action_name, "Docks", FALSE);
|
||||
|
||||
g_free (merge_key);
|
||||
g_free (action_path);
|
||||
|
@ -365,10 +370,13 @@ windows_menu_recent_add (GimpContainer *container,
|
|||
g_object_set_data (G_OBJECT (manager), merge_key,
|
||||
GUINT_TO_POINTER (merge_id));
|
||||
|
||||
/* TODO GMenu: doesn't look like it's working, neither will old or new API. */
|
||||
gimp_ui_manager_add_ui (manager, merge_id,
|
||||
action_path, action_name, action_name,
|
||||
GTK_UI_MANAGER_MENUITEM,
|
||||
TRUE);
|
||||
gimp_ui_manager_add_ui2 (manager, "/Windows/Recently Closed Docks",
|
||||
action_name, NULL, TRUE);
|
||||
|
||||
g_free (merge_key);
|
||||
g_free (action_path);
|
||||
|
|
|
@ -5018,6 +5018,7 @@ gimp_dashboard_menu_setup (GimpUIManager *manager,
|
|||
action_name = g_strdup_printf ("dashboard-group-%s", group_info->name);
|
||||
action_path = g_strdup_printf ("%s/Groups/Groups", ui_path);
|
||||
|
||||
/* TODO GMenu: for the "/dashboard-popup/Groups/" apparently. */
|
||||
gimp_ui_manager_add_ui (manager, merge_id,
|
||||
action_path, action_name, action_name,
|
||||
GTK_UI_MANAGER_MENUITEM,
|
||||
|
|
|
@ -62,6 +62,7 @@ struct _GimpMenuPrivate
|
|||
GMenuModel *model;
|
||||
|
||||
GTree *submenus;
|
||||
GTree *placeholders;
|
||||
GRegex *menu_delimiter_regex;
|
||||
};
|
||||
|
||||
|
@ -87,6 +88,7 @@ static void gimp_menu_update (GimpMenu *menu,
|
|||
void gimp_menu_ui_added (GimpUIManager *manager,
|
||||
const gchar *path,
|
||||
const gchar *action_name,
|
||||
const gchar *placeholder,
|
||||
gboolean top,
|
||||
GimpMenu *menu);
|
||||
|
||||
|
@ -118,8 +120,15 @@ static GtkContainer * gimp_menu_add_submenu (GimpMenu *menu,
|
|||
const gchar **key);
|
||||
static void gimp_menu_add_action (GimpMenu *menu,
|
||||
GtkContainer *container,
|
||||
const gchar *container_key,
|
||||
const gchar *action_name,
|
||||
const gchar *placeholder,
|
||||
gboolean top,
|
||||
GtkRadioMenuItem **group);
|
||||
static void gimp_menu_add_placeholder (GimpMenu *menu,
|
||||
GtkContainer *container,
|
||||
const gchar *container_key,
|
||||
const gchar *label);
|
||||
|
||||
static gchar * gimp_menu_make_canonical_path (GimpMenu *menu,
|
||||
const gchar *path);
|
||||
|
@ -161,8 +170,10 @@ gimp_menu_init (GimpMenu *menu)
|
|||
{
|
||||
menu->priv = gimp_menu_get_instance_private (menu);
|
||||
|
||||
menu->priv->submenus = g_tree_new_full ((GCompareDataFunc) g_strcmp0, NULL,
|
||||
g_free, NULL);
|
||||
menu->priv->submenus = g_tree_new_full ((GCompareDataFunc) g_strcmp0, NULL,
|
||||
g_free, NULL);
|
||||
menu->priv->placeholders = g_tree_new_full ((GCompareDataFunc) g_strcmp0, NULL,
|
||||
g_free, NULL);
|
||||
menu->priv->menu_delimiter_regex = g_regex_new ("/+", 0, 0, NULL);
|
||||
}
|
||||
|
||||
|
@ -196,6 +207,11 @@ gimp_menu_dispose (GObject *object)
|
|||
g_tree_unref (menu->priv->submenus);
|
||||
menu->priv->submenus = NULL;
|
||||
}
|
||||
if (menu->priv->placeholders != NULL)
|
||||
{
|
||||
g_tree_unref (menu->priv->placeholders);
|
||||
menu->priv->placeholders = NULL;
|
||||
}
|
||||
if (menu->priv->manager != NULL)
|
||||
{
|
||||
/* The whole program may be quitting. */
|
||||
|
@ -325,9 +341,21 @@ gimp_menu_update (GimpMenu *menu,
|
|||
subcontainer = gimp_menu_add_submenu (menu, label, container, parent_key, &key);
|
||||
gimp_menu_update (menu, subcontainer, key, submenu);
|
||||
}
|
||||
else if (action_name == NULL)
|
||||
{
|
||||
/* Special case: we use items with no action and a label as
|
||||
* placeholder which allows us to specify a placement in menus, which
|
||||
* might not be only top or bottom.
|
||||
*/
|
||||
g_return_if_fail (label != NULL);
|
||||
|
||||
group = NULL;
|
||||
|
||||
gimp_menu_add_placeholder (menu, container, parent_key, label);
|
||||
}
|
||||
else
|
||||
{
|
||||
gimp_menu_add_action (menu, container, action_name, &group);
|
||||
gimp_menu_add_action (menu, container, parent_key, action_name, NULL, FALSE, &group);
|
||||
}
|
||||
g_free (label);
|
||||
g_free (action_name);
|
||||
|
@ -338,6 +366,7 @@ void
|
|||
gimp_menu_ui_added (GimpUIManager *manager,
|
||||
const gchar *path,
|
||||
const gchar *action_name,
|
||||
const gchar *placeholder,
|
||||
gboolean top,
|
||||
GimpMenu *menu)
|
||||
{
|
||||
|
@ -396,7 +425,7 @@ gimp_menu_ui_added (GimpUIManager *manager,
|
|||
g_strfreev (sub_labels);
|
||||
}
|
||||
|
||||
gimp_menu_add_action (menu, container, action_name, NULL);
|
||||
gimp_menu_add_action (menu, container, canonical_path, action_name, placeholder, top, NULL);
|
||||
|
||||
g_free (canonical_path);
|
||||
}
|
||||
|
@ -461,7 +490,46 @@ gimp_menu_action_notify_visible (GimpAction *action,
|
|||
const GParamSpec *pspec,
|
||||
GtkWidget *item)
|
||||
{
|
||||
GtkContainer *container;
|
||||
|
||||
gtk_widget_set_visible (item, gimp_action_is_visible (action));
|
||||
|
||||
container = gtk_widget_get_parent (item);
|
||||
if (gimp_action_is_visible (GIMP_ACTION (action)))
|
||||
{
|
||||
GtkWidget *widget = gtk_menu_get_attach_widget (GTK_MENU (container));
|
||||
|
||||
/* We must show the GtkMenuItem associated as submenu to the parent
|
||||
* container.
|
||||
*/
|
||||
if (G_TYPE_FROM_INSTANCE (widget) == GTK_TYPE_MENU_ITEM)
|
||||
gtk_widget_show (widget);
|
||||
}
|
||||
else
|
||||
{
|
||||
GList *children = gtk_container_get_children (container);
|
||||
gboolean all_invisible = TRUE;
|
||||
|
||||
for (GList *iter = children; iter; iter = iter->next)
|
||||
{
|
||||
if (gtk_widget_get_visible (iter->data))
|
||||
{
|
||||
all_invisible = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
g_list_free (children);
|
||||
|
||||
if (all_invisible)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
|
||||
/* No need to leave empty submenus. */
|
||||
widget = gtk_menu_get_attach_widget (GTK_MENU (container));
|
||||
if (G_TYPE_FROM_INSTANCE (widget) == GTK_TYPE_MENU_ITEM)
|
||||
gtk_widget_hide (widget);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -500,7 +568,6 @@ gimp_menu_add_submenu (GimpMenu *menu,
|
|||
|
||||
item = gtk_menu_item_new_with_mnemonic (label);
|
||||
gtk_container_add (parent, item);
|
||||
gtk_widget_show (item);
|
||||
|
||||
subcontainer = gtk_menu_new ();
|
||||
gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), subcontainer);
|
||||
|
@ -522,13 +589,17 @@ gimp_menu_add_submenu (GimpMenu *menu,
|
|||
static void
|
||||
gimp_menu_add_action (GimpMenu *menu,
|
||||
GtkContainer *container,
|
||||
const gchar *container_key,
|
||||
const gchar *action_name,
|
||||
const gchar *placeholder,
|
||||
gboolean top,
|
||||
GtkRadioMenuItem **group)
|
||||
{
|
||||
GApplication *app;
|
||||
GAction *action;
|
||||
const gchar *action_label;
|
||||
GtkWidget *item;
|
||||
GtkWidget *sibling = NULL;
|
||||
|
||||
app = menu->priv->manager->gimp->app;
|
||||
|
||||
|
@ -609,15 +680,85 @@ gimp_menu_add_action (GimpMenu *menu,
|
|||
G_CALLBACK (gimp_menu_action_notify_tooltip),
|
||||
item, 0);
|
||||
|
||||
gtk_container_add (container, item);
|
||||
if (placeholder)
|
||||
{
|
||||
gchar *key = g_strconcat (container_key, "/", placeholder, NULL);
|
||||
|
||||
sibling = g_tree_lookup (menu->priv->placeholders, key);
|
||||
|
||||
if (! sibling)
|
||||
g_warning ("%s: no placeholder item '%s'.", G_STRFUNC, key);
|
||||
|
||||
g_free (key);
|
||||
}
|
||||
|
||||
if (sibling)
|
||||
{
|
||||
GList *children;
|
||||
gint position = 0;
|
||||
|
||||
/* I am assuming that the order of the children list reflects the
|
||||
* position, though it is not clearly specified in the function docs. Yet
|
||||
* I could find no other function giving me the position of some child in
|
||||
* a container.
|
||||
*/
|
||||
children = gtk_container_get_children (container);
|
||||
|
||||
for (GList *iter = children; iter; iter = iter->next)
|
||||
{
|
||||
if (iter->data == sibling)
|
||||
break;
|
||||
position++;
|
||||
}
|
||||
if (! top)
|
||||
position++;
|
||||
|
||||
gtk_menu_shell_insert (GTK_MENU_SHELL (container), item, position);
|
||||
|
||||
g_list_free (children);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (top)
|
||||
gtk_menu_shell_prepend (GTK_MENU_SHELL (container), item);
|
||||
else
|
||||
gtk_menu_shell_append (GTK_MENU_SHELL (container), item);
|
||||
}
|
||||
|
||||
gtk_widget_set_visible (item,
|
||||
gimp_action_is_visible (GIMP_ACTION (action)));
|
||||
if (gimp_action_is_visible (GIMP_ACTION (action)))
|
||||
{
|
||||
GtkWidget *parent = gtk_menu_get_attach_widget (GTK_MENU (container));
|
||||
|
||||
/* Note that this is not the container we must show, but the menu item
|
||||
* attached to the parent, in order not to leave empty submenus.
|
||||
*/
|
||||
if (G_TYPE_FROM_INSTANCE (parent) == GTK_TYPE_MENU_ITEM)
|
||||
gtk_widget_show (parent);
|
||||
}
|
||||
g_signal_connect_object (action, "notify::visible",
|
||||
G_CALLBACK (gimp_menu_action_notify_visible),
|
||||
item, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_menu_add_placeholder (GimpMenu *menu,
|
||||
GtkContainer *container,
|
||||
const gchar *container_key,
|
||||
const gchar *label)
|
||||
{
|
||||
GtkWidget *item;
|
||||
|
||||
/* Placeholders are inserted yet never shown, on purpose. */
|
||||
item = gtk_menu_item_new_with_mnemonic (label);
|
||||
gtk_container_add (container, item);
|
||||
|
||||
g_tree_insert (menu->priv->placeholders,
|
||||
g_strconcat (container_key, "/", label, NULL),
|
||||
item);
|
||||
}
|
||||
|
||||
static gchar *
|
||||
gimp_menu_make_canonical_path (GimpMenu *menu,
|
||||
const gchar *path)
|
||||
|
|
|
@ -63,6 +63,7 @@ typedef struct
|
|||
{
|
||||
gchar *path;
|
||||
gchar *action_name;
|
||||
gchar *placeholder;
|
||||
gboolean top;
|
||||
} GimpUIManagerMenuItem;
|
||||
|
||||
|
@ -175,7 +176,8 @@ gimp_ui_manager_class_init (GimpUIManagerClass *klass)
|
|||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET (GimpUIManagerClass, ui_added),
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 3,
|
||||
G_TYPE_NONE, 4,
|
||||
G_TYPE_STRING,
|
||||
G_TYPE_STRING,
|
||||
G_TYPE_STRING,
|
||||
G_TYPE_BOOLEAN);
|
||||
|
@ -540,6 +542,7 @@ void
|
|||
gimp_ui_manager_add_ui2 (GimpUIManager *manager,
|
||||
const gchar *path,
|
||||
const gchar *action_name,
|
||||
const gchar *placeholder,
|
||||
gboolean top)
|
||||
{
|
||||
GimpUIManagerMenuItem *item;
|
||||
|
@ -551,10 +554,11 @@ gimp_ui_manager_add_ui2 (GimpUIManager *manager,
|
|||
item = g_slice_new0 (GimpUIManagerMenuItem);
|
||||
item->path = g_strdup (path);
|
||||
item->action_name = g_strdup (action_name);
|
||||
item->placeholder = placeholder ? g_strdup (placeholder) : NULL;
|
||||
item->top = top;
|
||||
manager->ui_items = g_list_prepend (manager->ui_items, item);
|
||||
|
||||
g_signal_emit (manager, manager_signals[UI_ADDED], 0, path, action_name, top);
|
||||
g_signal_emit (manager, manager_signals[UI_ADDED], 0, path, action_name, placeholder, top);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -566,7 +570,7 @@ gimp_ui_manager_foreach_ui (GimpUIManager *manager,
|
|||
{
|
||||
GimpUIManagerMenuItem *item = iter->data;
|
||||
|
||||
callback (manager, item->path, item->action_name, item->top, user_data);
|
||||
callback (manager, item->path, item->action_name, item->placeholder, item->top, user_data);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
typedef void (* GimpUIMenuCallback) (GimpUIManager *manager,
|
||||
const gchar *path,
|
||||
const gchar *action_name,
|
||||
const gchar *placeholder,
|
||||
gboolean top,
|
||||
gpointer user_data);
|
||||
|
||||
|
@ -80,6 +81,7 @@ struct _GimpUIManagerClass
|
|||
void (* ui_added) (GimpUIManager *manager,
|
||||
const gchar *path,
|
||||
const gchar *action_name,
|
||||
const gchar *placeholder,
|
||||
gboolean top);
|
||||
};
|
||||
|
||||
|
@ -121,6 +123,7 @@ void gimp_ui_manager_remove_ui (GimpUIManager *manager,
|
|||
void gimp_ui_manager_add_ui2 (GimpUIManager *manager,
|
||||
const gchar *path,
|
||||
const gchar *action_name,
|
||||
const gchar *placeholder,
|
||||
gboolean top);
|
||||
void gimp_ui_manager_foreach_ui (GimpUIManager *manager,
|
||||
GimpUIMenuCallback callback,
|
||||
|
|
|
@ -18,7 +18,9 @@
|
|||
<submenu>
|
||||
<attribute name="label" translatable="yes" context="file-action">Open _Recent</attribute>
|
||||
<section>
|
||||
<!-- TODO: in there the recent documents. -->
|
||||
<!-- Placeholder for recently opened files. -->
|
||||
<item><attribute name="label" translatable="no">Files</attribute></item>
|
||||
|
||||
</section>
|
||||
<item><attribute name="action">app.dialogs-document-history</attribute></item>
|
||||
</submenu>
|
||||
|
@ -621,7 +623,8 @@
|
|||
<item><attribute name="action">app.filters-reshow</attribute></item>
|
||||
<submenu>
|
||||
<attribute name="label" translatable="yes" context="filters-action">Recently Used</attribute>
|
||||
<!-- TODO: fill -->
|
||||
<!-- Placeholder for recently used filters and plug-ins. -->
|
||||
<item><attribute name="label" translatable="no">Filters</attribute></item>
|
||||
</submenu>
|
||||
<item><attribute name="action">app.plug-in-reset-all</attribute></item>
|
||||
</section>
|
||||
|
@ -833,7 +836,14 @@
|
|||
</submenu>
|
||||
<item><attribute name="action">app.dialogs-toolbox</attribute></item>
|
||||
</section>
|
||||
<!-- TODO: list opened images. -->
|
||||
<!-- Placeholder invisible item to know where to place opened images list -->
|
||||
<section>
|
||||
<item><attribute name="label" translatable="no">Images</attribute></item>
|
||||
</section>
|
||||
<!-- Placeholder invisible item - TODO GMenu: is this one actually working/used? -->
|
||||
<section>
|
||||
<item><attribute name="label" translatable="no">Docks</attribute></item>
|
||||
</section>
|
||||
<section>
|
||||
<item><attribute name="action">app.windows-hide-docks</attribute></item>
|
||||
<item><attribute name="action">app.windows-show-tabs</attribute></item>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue