[geany/geany-plugins] 618e5b: GeanyVC: Support multiple instances of current File menu
nomadbyte
git-noreply at xxxxx
Sat Aug 22 08:26:22 UTC 2020
Branch: refs/heads/master
Author: nomadbyte <nomadbyte at users.noreply.github.com>
Committer: nomadbyte <nomadbyte at users.noreply.github.com>
Date: Sun, 26 Apr 2020 21:53:35 UTC
Commit: 618e5b019f331cca600f5be47bdeee1afee2e63b
https://github.com/geany/geany-plugins/commit/618e5b019f331cca600f5be47bdeee1afee2e63b
Log Message:
-----------
GeanyVC: Support multiple instances of current File menu
Modified Paths:
--------------
geanyvc/src/geanyvc.c
Modified: geanyvc/src/geanyvc.c
140 lines changed, 110 insertions(+), 30 deletions(-)
===================================================================
@@ -5,6 +5,7 @@
* Copyright 2007-2009 Enrico Tröger <enrico.troeger at uvena.de>
* Copyright 2007 Nick Treleaven <nick.treleaven at btinternet.com>
* Copyright 2007-2009 Yura Siamashka <yurand2 at gmail.com>
+ * Copyright 2020 Artur Shepilko <nomadbyte at gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -1775,28 +1776,52 @@ vccommit_activated(G_GNUC_UNUSED GtkMenuItem * menuitem, G_GNUC_UNUSED gpointer
g_free(diff);
}
-static GtkWidget *menu_vc_diff_file = NULL;
+typedef struct _VCFileMenu
+{
+ GtkWidget *menu;
+ struct
+ {
+ GtkWidget *diff;
+ GtkWidget *blame;
+ GtkWidget *log;
+ GtkWidget *revert;
+ GtkWidget *add;
+ GtkWidget *remove;
+ GtkWidget *show;
+ } item;
+} VCFileMenu;
+
+static VCFileMenu *menu_vc_file_menu = NULL;
+static VCFileMenu *editor_menu_vc_file_menu = NULL;
+
static GtkWidget *menu_vc_diff_dir = NULL;
static GtkWidget *menu_vc_diff_basedir = NULL;
-static GtkWidget *menu_vc_blame = NULL;
-static GtkWidget *menu_vc_log_file = NULL;
static GtkWidget *menu_vc_log_dir = NULL;
static GtkWidget *menu_vc_log_basedir = NULL;
static GtkWidget *menu_vc_status = NULL;
-static GtkWidget *menu_vc_revert_file = NULL;
static GtkWidget *menu_vc_revert_dir = NULL;
static GtkWidget *menu_vc_revert_basedir = NULL;
-static GtkWidget *menu_vc_add_file = NULL;
-static GtkWidget *menu_vc_remove_file = NULL;
static GtkWidget *menu_vc_update = NULL;
static GtkWidget *menu_vc_commit = NULL;
-static GtkWidget *menu_vc_show_file = NULL;
+
+static VCFileMenu ***
+get_vc_file_menu_arrv(void)
+{
+ static VCFileMenu **arrv[] = {NULL, NULL, NULL};
+
+ arrv[0] = &menu_vc_file_menu;
+ if (set_editor_menu_entries == TRUE)
+ arrv[1] = &editor_menu_vc_file_menu;
+
+ return arrv;
+}
static void
update_menu_items(void)
{
GeanyDocument *doc;
+ VCFileMenu ***file_menu_arrv = get_vc_file_menu_arrv();
gboolean have_file;
gboolean d_have_vc = FALSE;
gboolean f_have_vc = FALSE;
@@ -1817,29 +1842,42 @@ update_menu_items(void)
g_free(dir);
}
- gtk_widget_set_sensitive(menu_vc_diff_file, f_have_vc);
+ /* update items for each of the file menu sets */
+ for ( ; file_menu_arrv[0] != NULL; ++file_menu_arrv)
+ {
+ VCFileMenu *fm = *(file_menu_arrv[0]);
+ if (fm == NULL) continue;
+
+ GtkWidget *menu_vc_diff_file = fm->item.diff;
+ GtkWidget *menu_vc_blame = fm->item.blame;
+ GtkWidget *menu_vc_log_file = fm->item.log;
+ GtkWidget *menu_vc_revert_file = fm->item.revert;
+ GtkWidget *menu_vc_add_file = fm->item.add;
+ GtkWidget *menu_vc_remove_file = fm->item.remove;
+ GtkWidget *menu_vc_show_file = fm->item.show;
+
+ gtk_widget_set_sensitive(menu_vc_diff_file, f_have_vc);
+ gtk_widget_set_sensitive(menu_vc_blame, f_have_vc);
+ gtk_widget_set_sensitive(menu_vc_log_file, f_have_vc);
+ gtk_widget_set_sensitive(menu_vc_revert_file, f_have_vc);
+ gtk_widget_set_sensitive(menu_vc_remove_file, f_have_vc);
+ gtk_widget_set_sensitive(menu_vc_add_file, d_have_vc && !f_have_vc);
+ gtk_widget_set_sensitive(menu_vc_show_file, f_have_vc);
+ }
+
gtk_widget_set_sensitive(menu_vc_diff_dir, d_have_vc);
gtk_widget_set_sensitive(menu_vc_diff_basedir, d_have_vc);
- gtk_widget_set_sensitive(menu_vc_blame, f_have_vc);
-
- gtk_widget_set_sensitive(menu_vc_log_file, f_have_vc);
gtk_widget_set_sensitive(menu_vc_log_dir, d_have_vc);
gtk_widget_set_sensitive(menu_vc_log_basedir, d_have_vc);
gtk_widget_set_sensitive(menu_vc_status, d_have_vc);
- gtk_widget_set_sensitive(menu_vc_revert_file, f_have_vc);
gtk_widget_set_sensitive(menu_vc_revert_dir, f_have_vc);
gtk_widget_set_sensitive(menu_vc_revert_basedir, f_have_vc);
- gtk_widget_set_sensitive(menu_vc_remove_file, f_have_vc);
- gtk_widget_set_sensitive(menu_vc_add_file, d_have_vc && !f_have_vc);
-
gtk_widget_set_sensitive(menu_vc_update, d_have_vc);
gtk_widget_set_sensitive(menu_vc_commit, d_have_vc);
-
- gtk_widget_set_sensitive(menu_vc_show_file, f_have_vc);
}
@@ -2227,18 +2265,28 @@ registrate(void)
}
static void
-do_current_file_menu(GtkWidget ** parent_menu, gboolean editor_menu)
+do_current_file_menu(GtkWidget ** parent_menu, const gchar * label, VCFileMenu ** file_menu)
{
+ /* Menu which will hold the items in the current file menu.
+ * This menu has the same structure in case of Main menu and Editor's context menu.
+ * We construct the menu, attach it to the parent menu, and save it so that
+ * the updates could be applied in both Main menu and Editor context scopes.
+ */
GtkWidget *cur_file_menu = NULL;
- /* Menu which will hold the items in the current file menu */
- cur_file_menu = gtk_menu_new();
-
- if (editor_menu == TRUE)
- *parent_menu = gtk_image_menu_item_new_with_mnemonic(_("_VC file Actions"));
- else
- *parent_menu = gtk_image_menu_item_new_with_mnemonic(_("_File"));
+ GtkWidget *menu_vc_diff_file = NULL;
+ GtkWidget *menu_vc_blame = NULL;
+ GtkWidget *menu_vc_log_file = NULL;
+ GtkWidget *menu_vc_revert_file = NULL;
+ GtkWidget *menu_vc_add_file = NULL;
+ GtkWidget *menu_vc_remove_file = NULL;
+ GtkWidget *menu_vc_show_file = NULL;
+
+ /* create the parent menu */
+ *parent_menu = gtk_image_menu_item_new_with_mnemonic(label);
g_signal_connect(* parent_menu, "activate", G_CALLBACK(update_menu_items), NULL);
+ cur_file_menu = gtk_menu_new();
+
/* Diff of current file */
menu_vc_diff_file = gtk_menu_item_new_with_mnemonic(_("_Diff"));
gtk_container_add(GTK_CONTAINER(cur_file_menu), menu_vc_diff_file);
@@ -2305,6 +2353,24 @@ do_current_file_menu(GtkWidget ** parent_menu, gboolean editor_menu)
/* connect to parent menu */
gtk_menu_item_set_submenu(GTK_MENU_ITEM(*parent_menu), cur_file_menu);
+
+ /* save the created file menu */
+ if (*file_menu == NULL)
+ *file_menu = g_new0(VCFileMenu, 1);
+
+ if (*file_menu)
+ {
+ VCFileMenu *fm = *file_menu;
+
+ fm->menu = cur_file_menu;
+ fm->item.diff = menu_vc_diff_file;
+ fm->item.blame = menu_vc_blame;
+ fm->item.log = menu_vc_log_file;
+ fm->item.revert = menu_vc_revert_file;
+ fm->item.add = menu_vc_add_file;
+ fm->item.remove = menu_vc_remove_file;
+ fm->item.show = menu_vc_show_file;
+ }
}
static void
@@ -2397,7 +2463,7 @@ add_menuitems_to_editor_menu(void)
{
menu_item_sep = gtk_separator_menu_item_new();
gtk_container_add(GTK_CONTAINER(geany->main_widgets->editor_menu), menu_item_sep);
- do_current_file_menu(&editor_menu_vc, TRUE);
+ do_current_file_menu(&editor_menu_vc, _("_VC file Actions"), &editor_menu_vc_file_menu);
gtk_container_add(GTK_CONTAINER(geany->main_widgets->editor_menu), editor_menu_vc);
gtk_widget_show_all(editor_menu_vc);
gtk_widget_show_all(menu_item_sep);
@@ -2422,6 +2488,11 @@ remove_menuitems_from_editor_menu(void)
gtk_widget_destroy(editor_menu_vc);
editor_menu_vc = NULL;
}
+ if (editor_menu_vc_file_menu)
+ {
+ g_free(editor_menu_vc_file_menu);
+ editor_menu_vc_file_menu = NULL;
+ }
if (editor_menu_commit != NULL)
{
gtk_widget_destroy(editor_menu_commit);
@@ -2437,9 +2508,13 @@ remove_menuitems_from_editor_menu(void)
static void
init_keybindings(void)
{
- /* init keybindins */
- GeanyKeyGroup *plugin_key_group;
- plugin_key_group = plugin_set_key_group(geany_plugin, "geanyvc", COUNT_KB, NULL);
+ GtkWidget *menu_vc_diff_file = menu_vc_file_menu->item.diff;
+ GtkWidget *menu_vc_revert_file = menu_vc_file_menu->item.revert;
+
+ /* init keybindings */
+ GeanyKeyGroup *plugin_key_group =
+ plugin_set_key_group(geany_plugin, "geanyvc", COUNT_KB, NULL);
+
keybindings_set_item(plugin_key_group, VC_DIFF_FILE, kbdiff_file, 0, 0,
"vc_show_diff_of_file", _("Show diff of file"), menu_vc_diff_file);
keybindings_set_item(plugin_key_group, VC_DIFF_DIR, kbdiff_dir, 0, 0,
@@ -2505,7 +2580,7 @@ plugin_init(G_GNUC_UNUSED GeanyData * data)
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_vc), menu_vc_menu);
/* Create the current file Submenu */
- do_current_file_menu(&menu_vc_file, FALSE);
+ do_current_file_menu(&menu_vc_file, _("_File"), &menu_vc_file_menu);
gtk_container_add(GTK_CONTAINER(menu_vc_menu), menu_vc_file);
/* Create the current directory Submenu */
@@ -2558,6 +2633,11 @@ plugin_cleanup(void)
external_diff_viewer_deinit();
remove_menuitems_from_editor_menu();
gtk_widget_destroy(menu_entry);
+ if (menu_vc_file_menu)
+ {
+ g_free(menu_vc_file_menu);
+ menu_vc_file_menu = NULL;
+ }
g_slist_free(VC);
VC = NULL;
g_slist_free_full(commit_message_history, g_free);
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Plugins-Commits
mailing list