Changes to window menu entries

Change the maximum number of windows from a macro to a 'constexpr'.

Also added an info dialogue to advise when limit reached, no new window
entries will be added to the Windows menu.
This commit is contained in:
Robert Fewell
2022-10-28 16:54:52 +01:00
parent 9ed102d461
commit c68dcccebb
2 changed files with 25 additions and 16 deletions

39
gnucash/gnome-utils/gnc-main-window.cpp Executable file → Normal file
View File

@@ -119,7 +119,6 @@ enum
#define GNC_PREF_TAB_OPEN_ADJACENT "tab-open-adjacent"
#define GNC_MAIN_WINDOW_NAME "GncMainWindow"
#define GNC_MAIN_WINDOW_MAX_NUMBER 10
#define DIALOG_BOOK_OPTIONS_CM_CLASS "dialog-book-options"
@@ -136,6 +135,9 @@ enum
**/
extern gboolean gnc_book_options_dialog_apply_helper(GncOptionDB * options);
/** Max number of windows allowed */
constexpr auto gnc_main_window_max_number {10};
/* Static Globals *******************************************************/
/** The debugging module that this .o belongs to. */
@@ -348,7 +350,7 @@ static GActionEntry gnc_menu_actions [] =
{ "WindowNewAction", gnc_main_window_cmd_window_new, nullptr, nullptr, nullptr },
{ "WindowMovePageAction", gnc_main_window_cmd_window_move_page, nullptr, nullptr, nullptr },
#ifndef MAC_INTEGRATION
{ "Window0Action", gnc_main_window_cmd_window_raise, "i", "@i 0", radio_change_state },
{ "WindowAction", gnc_main_window_cmd_window_raise, "i", "@i 0", radio_change_state },
#endif
{ "HelpTutorialAction", gnc_main_window_cmd_help_tutorial, nullptr, nullptr, nullptr },
{ "HelpContentsAction", gnc_main_window_cmd_help_contents, nullptr, nullptr, nullptr },
@@ -1804,8 +1806,9 @@ gnc_main_window_update_one_menu_action (GncMainWindow *window,
GMenuItem *item;
gint pos;
ENTER("window %p, action %s, label %s, visible %d", window,
data->action_name, data->label, data->visible);
ENTER("window %p, action %s, label %s, index %d, visible %d", window,
data->action_name, data->label, data->index, data->visible);
priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
gsm->search_action_label = nullptr;
@@ -1830,7 +1833,7 @@ gnc_main_window_update_one_menu_action (GncMainWindow *window,
return;
}
item = g_menu_item_new (data->label, "mainwin.Window0Action");
item = g_menu_item_new (data->label, "mainwin.WindowAction");
g_menu_item_set_attribute (item, "target", "i", data->index);
if (pos < g_menu_model_get_n_items (gsm->model))
@@ -1866,16 +1869,16 @@ gnc_main_window_update_radio_button (GncMainWindow *window)
/* Show the new entry in all windows. */
index = g_list_index (active_windows, window);
if (index >= GNC_MAIN_WINDOW_MAX_NUMBER)
if (index >= gnc_main_window_max_number)
{
LEAVE("window %" G_GSIZE_FORMAT ", only %d actions", index, GNC_MAIN_WINDOW_MAX_NUMBER);
LEAVE("window %" G_GSIZE_FORMAT ", only %d actions", index, gnc_main_window_max_number);
return;
}
priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
action = g_action_map_lookup_action (G_ACTION_MAP(priv->simple_action_group),
"Window0Action");
"WindowAction");
/* Block the signal so as not to affect window ordering (top to
* bottom) on the screen */
@@ -1915,9 +1918,9 @@ gnc_main_window_update_menu_item (GncMainWindow *window)
index = g_list_index (active_windows, window);
if (index >= GNC_MAIN_WINDOW_MAX_NUMBER)
if (index >= gnc_main_window_max_number)
{
LEAVE("skip window %" G_GSIZE_FORMAT " (only %d entries)", index, GNC_MAIN_WINDOW_MAX_NUMBER);
LEAVE("skip window %" G_GSIZE_FORMAT " (only %d entries)", index, gnc_main_window_max_number);
return;
}
@@ -1926,7 +1929,7 @@ gnc_main_window_update_menu_item (GncMainWindow *window)
strings = g_strsplit (title, "_", 0);
g_free (title);
expanded = g_strjoinv ("__", strings);
if (index < GNC_MAIN_WINDOW_MAX_NUMBER)
if (index < gnc_main_window_max_number)
{
data.label = g_strdup_printf ("_%" G_GSIZE_FORMAT " %s", (index + 1) % 10, expanded);
g_free (expanded);
@@ -1938,14 +1941,14 @@ gnc_main_window_update_menu_item (GncMainWindow *window)
g_strfreev (strings);
data.visible = TRUE;
data.action_name = g_strdup_printf ("Window%" G_GSIZE_FORMAT "Action", index);
// data.action_name = g_strdup_printf ("Window%" G_GSIZE_FORMAT "Action", index);
data.index = index;
g_list_foreach (active_windows,
(GFunc)gnc_main_window_update_one_menu_action,
&data);
g_free (data.action_name);
// g_free (data.action_name);
g_free (data.label);
LEAVE(" ");
@@ -1978,8 +1981,8 @@ gnc_main_window_update_all_menu_items (void)
/* Now hide any entries that aren't being used. */
data.visible = FALSE;
// need i to descend from GNC_MAIN_WINDOW_MAX_NUMBER
for (gsize i = GNC_MAIN_WINDOW_MAX_NUMBER - 1; i > 0 && i >= g_list_length (active_windows); i--)
// need i to descend from gnc_main_window_max_number
for (gsize i = gnc_main_window_max_number - 1; i > 0 && i >= g_list_length (active_windows); i--)
{
data.index = i;
data.action_name = g_strdup_printf ("Window%dAction", data.index);
@@ -4988,6 +4991,12 @@ gnc_main_window_cmd_window_move_page (GSimpleAction *simple,
return;
}
#ifndef MAC_INTEGRATION
if (gnc_list_length_cmp (active_windows, gnc_main_window_max_number) == 0)
gnc_info_dialog (GTK_WINDOW(window), "%s",
_("The maximum number of window menu entries reached, no more entries will be added."));
#endif /* !MAC_INTEGRATION */
notebook = GTK_NOTEBOOK (priv->notebook);
tab_widget = gtk_notebook_get_tab_label (notebook, page->notebook_page);
menu_widget = gtk_notebook_get_menu_label (notebook, page->notebook_page);

View File

@@ -482,7 +482,7 @@
</item>
<item>
<attribute name="label" translatable="no">Window0Action</attribute>
<attribute name="action">mainwin.Window0Action</attribute>
<attribute name="action">mainwin.WindowAction</attribute>
<attribute name="target" type="i">0</attribute>
<attribute name="hidden-when">action-disabled</attribute>
</item>