[geany/geany-plugins] aee254: commander: Add support for navigating through open files

Colomban Wendling git-noreply at xxxxx
Sat Aug 4 15:08:39 UTC 2012


Branch:      refs/heads/master
Author:      Colomban Wendling <ban at herbesfolles.org>
Committer:   Colomban Wendling <ban at herbesfolles.org>
Date:        Sat, 04 Aug 2012 15:08:39
Commit:      aee2548095dd8821389329bbaedf22f17ee59abd
             https://github.com/geany/geany-plugins/commit/aee2548095dd8821389329bbaedf22f17ee59abd

Log Message:
-----------
commander: Add support for navigating through open files


Modified Paths:
--------------
    commander/src/commander-plugin.c

Modified: commander/src/commander-plugin.c
127 files changed, 108 insertions(+), 19 deletions(-)
===================================================================
@@ -40,7 +40,7 @@
 PLUGIN_SET_TRANSLATABLE_INFO (
   LOCALEDIR, GETTEXT_PACKAGE,
   _("Commander"),
-  _("Provides a command panel for quick access to actions"),
+  _("Provides a command panel for quick access to actions, files and more"),
   VERSION,
   "Colomban Wendling <ban at herbesfolles.org>"
 )
@@ -63,10 +63,17 @@ struct {
   NULL, NULL, NULL
 };
 
+typedef enum {
+  COL_TYPE_MENU_ITEM,
+  COL_TYPE_FILE
+} ColType;
+
 enum {
   COL_LABEL,
   COL_PATH,
+  COL_TYPE,
   COL_WIDGET,
+  COL_DOCUMENT,
   COL_COUNT
 };
 
@@ -182,12 +189,22 @@ enum {
                      GtkTreeIter   *iter,
                      gpointer       dummy)
 {
-  gboolean  visible = FALSE;
-  gchar    *text;
+  gboolean      visible = TRUE;
+  gchar        *text;
+  gint          type;
+  const gchar  *key = gtk_entry_get_text (GTK_ENTRY (plugin_data.entry));
   
-  gtk_tree_model_get (model, iter, COL_PATH, &text, -1);
-  visible = key_matches (gtk_entry_get_text (GTK_ENTRY (plugin_data.entry)),
-                         text);
+  gtk_tree_model_get (model, iter, COL_PATH, &text, COL_TYPE, &type, -1);
+  if (g_str_has_prefix (key, "f:")) {
+    key += 2;
+    visible = type == COL_TYPE_FILE;
+  } else if (g_str_has_prefix (key, "c:")) {
+    key += 2;
+    visible = type == COL_TYPE_MENU_ITEM;
+  }
+  if (visible) {
+    visible = key_matches (key, text);
+  }
   g_free (text);
   
   return visible;
@@ -221,22 +238,36 @@ enum {
       GtkTreeIter       iter;
       GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (plugin_data.view));
       GtkTreeModel     *model;
-      GtkMenuItem      *item = NULL;
       
       if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
-        gtk_tree_model_get (model, &iter, COL_WIDGET, &item, -1);
-      }
-      
-      if (! item || ! GTK_IS_MENU_ITEM (item)) {
-        g_warn_if_reached ();
-      } else {
-        gtk_menu_item_activate (item);
+        gint type;
+        
+        gtk_tree_model_get (model, &iter, COL_TYPE, &type, -1);
+        
+        switch (type) {
+          case COL_TYPE_FILE: {
+            GeanyDocument  *doc;
+            gint            page;
+            
+            gtk_tree_model_get (model, &iter, COL_DOCUMENT, &doc, -1);
+            page = document_get_notebook_page (doc);
+            gtk_notebook_set_current_page (GTK_NOTEBOOK (geany_data->main_widgets->notebook),
+                                           page);
+            break;
+          }
+          
+          case COL_TYPE_MENU_ITEM: {
+            GtkMenuItem *item;
+            
+            gtk_tree_model_get (model, &iter, COL_WIDGET, &item, -1);
+            gtk_menu_item_activate (item);
+            g_object_unref (item);
+            
+            break;
+          }
+        }
         gtk_widget_hide (widget);
       }
-       
-      if (item) {
-        g_object_unref (item);
-      }
       
       return TRUE;
     }
@@ -361,6 +392,7 @@ enum {
         gtk_list_store_insert_with_values (store, NULL, -1,
                                            COL_LABEL, label,
                                            COL_PATH, path,
+                                           COL_TYPE, COL_TYPE_MENU_ITEM,
                                            COL_WIDGET, node->data,
                                            -1);
         
@@ -406,6 +438,48 @@ enum {
   store_populate_menu_items (store, GTK_MENU_SHELL (menubar), NULL);
 }
 
+/* we reset all file items not to have to monitor the open/close/renames/etc */
+static void
+reset_file_items (GtkListStore *store)
+{
+  GtkTreeIter iter;
+  guint       i;
+  
+  /* remove old items */
+  if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)) {
+    gboolean has_next = TRUE;
+    
+    while (has_next) {
+      gint type;
+      
+      gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, COL_TYPE, &type, -1);
+      if (type == COL_TYPE_FILE) {
+        has_next = gtk_list_store_remove (store, &iter);
+      } else {
+        has_next = gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter);
+      }
+    }
+  }
+  
+  /* and add new ones */
+  foreach_document (i) {
+    gchar *basename = g_path_get_basename (DOC_FILENAME (documents[i]));
+    gchar *label = g_markup_printf_escaped ("<big>%s</big>\n"
+                                            "<small><i>%s</i></small>",
+                                            basename,
+                                            DOC_FILENAME (documents[i]));
+    
+    gtk_list_store_insert_with_values (store, NULL, -1,
+                                       COL_LABEL, label,
+                                       COL_PATH, DOC_FILENAME (documents[i]),
+                                       COL_TYPE, COL_TYPE_FILE,
+                                       COL_DOCUMENT, documents[i],
+                                       -1);
+    g_free (basename);
+    g_free (label);
+  }
+}
+
 static void
 create_panel (void)
 {
@@ -440,7 +514,9 @@ enum {
   plugin_data.store = gtk_list_store_new (COL_COUNT,
                                           G_TYPE_STRING,
                                           G_TYPE_STRING,
-                                          GTK_TYPE_WIDGET);
+                                          G_TYPE_INT,
+                                          GTK_TYPE_WIDGET,
+                                          G_TYPE_POINTER);
   fill_store (plugin_data.store);
   
   plugin_data.filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (plugin_data.store),
@@ -478,8 +554,21 @@ enum {
 static void
 on_kb_show_panel (guint key_id)
 {
+  GtkTreeView *view = GTK_TREE_VIEW (plugin_data.view);
+  
+  reset_file_items (plugin_data.store);
+  
   gtk_widget_show (plugin_data.panel);
   gtk_widget_grab_focus (plugin_data.entry);
+  
+  if (! gtk_tree_selection_get_selected (gtk_tree_view_get_selection (view),
+                                         NULL, NULL)) {
+    GtkTreeIter iter;
+    
+    if (gtk_tree_model_get_iter_first (plugin_data.sort, &iter)) {
+      tree_view_set_active_cell (GTK_TREE_VIEW (plugin_data.view), &iter);
+    }
+  }
 }
 
 static gboolean


@@ Diff output truncated at 100000 characters. @@


--------------
This E-Mail was brought to you by github_commit_mail.py (Source: TBD).



More information about the Plugins-Commits mailing list