From 8ce5533a35df70c345ab80c2a86b15e76a94369a Mon Sep 17 00:00:00 2001 From: Marko Lindqvist Date: Fri, 21 Oct 2022 23:55:27 +0300 Subject: [PATCH 34/34] gtk4: Implement Battle Groups menu To make functionality more discoverable. See osdn #45923 Signed-off-by: Marko Lindqvist --- client/gui-gtk-4.0/gui_main.c | 48 -------------- client/gui-gtk-4.0/menu.c | 115 ++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 48 deletions(-) diff --git a/client/gui-gtk-4.0/gui_main.c b/client/gui-gtk-4.0/gui_main.c index 479fb01fb0..f6e46d789e 100644 --- a/client/gui-gtk-4.0/gui_main.c +++ b/client/gui-gtk-4.0/gui_main.c @@ -451,54 +451,6 @@ static gboolean key_press_map_canvas(guint keyval, GdkModifierType state) return FALSE; } - fc_assert(MAX_NUM_BATTLEGROUPS == 4); - - if ((state & GDK_CONTROL_MASK)) { - switch (keyval) { - - case GDK_KEY_F1: - key_unit_assign_battlegroup(0, (state & GDK_SHIFT_MASK)); - return TRUE; - - case GDK_KEY_F2: - key_unit_assign_battlegroup(1, (state & GDK_SHIFT_MASK)); - return TRUE; - - case GDK_KEY_F3: - key_unit_assign_battlegroup(2, (state & GDK_SHIFT_MASK)); - return TRUE; - - case GDK_KEY_F4: - key_unit_assign_battlegroup(3, (state & GDK_SHIFT_MASK)); - return TRUE; - - default: - break; - }; - } else if ((state & GDK_SHIFT_MASK)) { - switch (keyval) { - - case GDK_KEY_F1: - key_unit_select_battlegroup(0, FALSE); - return TRUE; - - case GDK_KEY_F2: - key_unit_select_battlegroup(1, FALSE); - return TRUE; - - case GDK_KEY_F3: - key_unit_select_battlegroup(2, FALSE); - return TRUE; - - case GDK_KEY_F4: - key_unit_select_battlegroup(3, FALSE); - return TRUE; - - default: - break; - }; - } - switch (keyval) { case GDK_KEY_KP_Up: diff --git a/client/gui-gtk-4.0/menu.c b/client/gui-gtk-4.0/menu.c index 4027d726de..845d830ad5 100644 --- a/client/gui-gtk-4.0/menu.c +++ b/client/gui-gtk-4.0/menu.c @@ -362,6 +362,16 @@ static void build_airbase_callback(GtkMenuItem *item, gpointer data); static void diplomat_action_callback(GtkMenuItem *item, gpointer data); #endif /* MENUS_GTK3 */ +static void bg_select_callback(GSimpleAction *action, + GVariant *parameter, + gpointer data); +static void bg_assign_callback(GSimpleAction *action, + GVariant *parameter, + gpointer data); +static void bg_append_callback(GSimpleAction *action, + GVariant *parameter, + gpointer data); + static struct menu_entry_info menu_entries[] = { /* Game menu */ @@ -447,6 +457,33 @@ static struct menu_entry_info menu_entries[] = { "REPORT_DEMOGRAPHIC", N_("_Demographics"), "report_demographics", "F11", MGROUP_SAFE }, + /* Battle Groups menu */ + /* Note that user view: 1 - 4, internal: 0 - 3 */ + { "BG_SELECT_1", N_("Select Battle Group 1"), + "bg_select_0", "F1", MGROUP_PLAYING }, + { "BG_ASSIGN_1", N_("Assign Battle Group 1"), + "bg_assign_0", "F1", MGROUP_PLAYING }, + { "BG_APPEND_1", N_("Append to Battle Group 1"), + "bg_append_0", "F1", MGROUP_PLAYING }, + { "BG_SELECT_2", N_("Select Battle Group 2"), + "bg_select_1", "F2", MGROUP_PLAYING }, + { "BG_ASSIGN_2", N_("Assign Battle Group 2"), + "bg_assign_1", "F2", MGROUP_PLAYING }, + { "BG_APPEND_2", N_("Append to Battle Group 2"), + "bg_append_1", "F2", MGROUP_PLAYING }, + { "BG_SELECT_3", N_("Select Battle Group 3"), + "bg_select_2", "F3", MGROUP_PLAYING }, + { "BG_ASSIGN_3", N_("Assign Battle Group 3"), + "bg_assign_2", "F3", MGROUP_PLAYING }, + { "BG_APPEND_3", N_("Append to Battle Group 3"), + "bg_append_2", "F3", MGROUP_PLAYING }, + { "BG_SELECT_4", N_("Select Battle Group 4"), + "bg_select_3", "F4", MGROUP_PLAYING }, + { "BG_ASSIGN_4", N_("Assign Battle Group 4"), + "bg_assign_3", "F4", MGROUP_PLAYING }, + { "BG_APPEND_4", N_("Append to Battle Group 4"), + "bg_append_3", "F4", MGROUP_PLAYING }, + /* Help menu */ { "HELP_COPYING", N_("Copying"), "help_copying", NULL, MGROUP_SAFE }, @@ -2213,6 +2250,36 @@ static void report_spaceship_callback(GtkMenuItem *action, gpointer data) } #endif /* MENUS_GTK3 */ +/************************************************************************//** + Select battle group +****************************************************************************/ +static void bg_select_callback(GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + key_unit_select_battlegroup(GPOINTER_TO_INT(data), FALSE); +} + +/************************************************************************//** + Assign units to battle group +****************************************************************************/ +static void bg_assign_callback(GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + key_unit_assign_battlegroup(GPOINTER_TO_INT(data), FALSE); +} + +/************************************************************************//** + Append units to battle group +****************************************************************************/ +static void bg_append_callback(GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + key_unit_assign_battlegroup(GPOINTER_TO_INT(data), TRUE); +} + /************************************************************************//** Set name of the menu item. ****************************************************************************/ @@ -2239,6 +2306,33 @@ void setup_app_actions(GApplication *fc_app) G_N_ELEMENTS(acts), fc_app); } +/************************************************************************//** + Registers menu actions for Battle Groups actions +****************************************************************************/ +static void register_bg_actions(GActionMap *map, int bg) +{ + GSimpleAction *act; + char actname[256]; + + fc_snprintf(actname, sizeof(actname), "bg_select_%d", bg); + act = g_simple_action_new(actname, NULL); + g_action_map_add_action(map, G_ACTION(act)); + g_signal_connect(act, "activate", + G_CALLBACK(bg_select_callback), GINT_TO_POINTER(bg)); + + fc_snprintf(actname, sizeof(actname), "bg_assign_%d", bg); + act = g_simple_action_new(actname, NULL); + g_action_map_add_action(map, G_ACTION(act)); + g_signal_connect(act, "activate", + G_CALLBACK(bg_assign_callback), GINT_TO_POINTER(bg)); + + fc_snprintf(actname, sizeof(actname), "bg_append_%d", bg); + act = g_simple_action_new(actname, NULL); + g_action_map_add_action(map, G_ACTION(act)); + g_signal_connect(act, "activate", + G_CALLBACK(bg_append_callback), GINT_TO_POINTER(bg)); +} + /************************************************************************//** Creates the menu bar. ****************************************************************************/ @@ -2347,6 +2441,27 @@ static GMenu *setup_menus(GtkApplication *app) topmenu = g_menu_new(); + /* Keys exist for 4 battle groups */ + FC_STATIC_ASSERT(MAX_NUM_BATTLEGROUPS == 4, incompatible_bg_count); + + for (i = 0; i < MAX_NUM_BATTLEGROUPS; i++) { + char key[128]; + + /* User side battle group numbers start from 1 */ + fc_snprintf(key, sizeof(key), "BG_SELECT_%d", i + 1); + menu_entry_init(topmenu, key); + fc_snprintf(key, sizeof(key), "BG_ASSIGN_%d", i + 1); + menu_entry_init(topmenu, key); + fc_snprintf(key, sizeof(key), "BG_APPEND_%d", i + 1); + menu_entry_init(topmenu, key); + + register_bg_actions(G_ACTION_MAP(app), i); + } + + g_menu_append_submenu(menubar, _("Battle Groups"), G_MENU_MODEL(topmenu)); + + topmenu = g_menu_new(); + menu_entry_init(topmenu, "HELP_COPYING"); menu_entry_init(topmenu, "HELP_ABOUT"); -- 2.35.1