SF.net SVN: geany-plugins:[1121] trunk/geany-plugins/addons

eht16 at users.sourceforge.net eht16 at xxxxx
Sun Jan 10 13:39:59 UTC 2010


Revision: 1121
          http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=1121&view=rev
Author:   eht16
Date:     2010-01-10 13:39:59 +0000 (Sun, 10 Jan 2010)

Log Message:
-----------
Restore the selected task when the list is updated (part of #2911086).

Modified Paths:
--------------
    trunk/geany-plugins/addons/ChangeLog
    trunk/geany-plugins/addons/src/ao_tasks.c

Modified: trunk/geany-plugins/addons/ChangeLog
===================================================================
--- trunk/geany-plugins/addons/ChangeLog	2010-01-10 13:39:08 UTC (rev 1120)
+++ trunk/geany-plugins/addons/ChangeLog	2010-01-10 13:39:59 UTC (rev 1121)
@@ -4,6 +4,9 @@
    src/Makefile.am, src/addons.c:
    Add new addon 'Strip trailing blank lines' by Eugene Arshinov,
    thanks.
+ * src/ao_tasks.c:
+   Restore the selected task when the list is updated
+   (part of #2911086).
 
 
 2010-01-03  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>

Modified: trunk/geany-plugins/addons/src/ao_tasks.c
===================================================================
--- trunk/geany-plugins/addons/src/ao_tasks.c	2010-01-10 13:39:08 UTC (rev 1120)
+++ trunk/geany-plugins/addons/src/ao_tasks.c	2010-01-10 13:39:59 UTC (rev 1121)
@@ -62,6 +62,11 @@
 	gchar **tokens;
 
 	gboolean scan_all_documents;
+
+	GHashTable *selected_tasks;
+	gint selected_task_line;
+	GeanyDocument *selected_task_doc;
+	gboolean ignore_selection_changed;
 };
 
 enum
@@ -180,13 +185,17 @@
 
 	ao_tasks_hide(AO_TASKS(object));
 
+	if (priv->selected_tasks != NULL)
+		g_hash_table_destroy(priv->selected_tasks);
+
 	G_OBJECT_CLASS(ao_tasks_parent_class)->finalize(object);
 }
 
 
-static gboolean ao_tasks_selection_changed_cb(gpointer widget)
+static gboolean ao_tasks_selection_changed_cb(gpointer t)
 {
-	GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+	AoTasksPrivate *priv = AO_TASKS_GET_PRIVATE(t);
+	GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->tree));
 	GtkTreeIter iter;
 	GtkTreeModel *model;
 
@@ -196,7 +205,10 @@
 		gchar *filename, *locale_filename;
 		GeanyDocument *doc;
 
-		gtk_tree_model_get(model, &iter, TLIST_COL_LINE, &line, TLIST_COL_FILENAME, &filename, -1);
+		gtk_tree_model_get(model, &iter,
+			TLIST_COL_LINE, &line,
+			TLIST_COL_FILENAME, &filename,
+			-1);
 		locale_filename = utils_get_locale_from_utf8(filename);
 		doc = document_open_file(locale_filename, FALSE, NULL, NULL);
 		if (doc != NULL)
@@ -204,6 +216,16 @@
 			sci_goto_line(doc->editor->sci, line - 1, TRUE);
 			gtk_widget_grab_focus(GTK_WIDGET(doc->editor->sci));
 		}
+
+		/* remember the selected line for this document to restore the selection after an update */
+		if (priv->scan_all_documents)
+		{
+			priv->selected_task_doc = doc;
+			priv->selected_task_line = line;
+		}
+		else
+			g_hash_table_insert(priv->selected_tasks, doc, GINT_TO_POINTER(line));
+
 		g_free(filename);
 		g_free(locale_filename);
 	}
@@ -215,7 +237,7 @@
 {
 	if (event->button == 1)
 	{	/* allow reclicking of a treeview item */
-		g_idle_add(ao_tasks_selection_changed_cb, widget);
+		g_idle_add(ao_tasks_selection_changed_cb, data);
 	}
 	else if (event->button == 3)
 	{
@@ -239,7 +261,7 @@
 		event->keyval == GDK_KP_Enter ||
 		event->keyval == GDK_space)
 	{
-		g_idle_add(ao_tasks_selection_changed_cb, widget);
+		g_idle_add(ao_tasks_selection_changed_cb, data);
 	}
 	if ((event->keyval == GDK_F10 && event->state & GDK_SHIFT_MASK) || event->keyval == GDK_Menu)
 	{
@@ -599,12 +621,49 @@
 
 	if (! priv->scan_all_documents)
 	{
+		/* update */
 		gtk_list_store_clear(priv->store);
 		ao_tasks_update(t, cur_doc);
 	}
 }
 
 
+static gboolean ao_tasks_select_task(GtkTreeModel *model, GtkTreePath *path,
+									 GtkTreeIter *iter, gpointer data)
+{
+	AoTasksPrivate *priv = AO_TASKS_GET_PRIVATE(data);
+	gint line, selected_line;
+	gchar *filename = NULL;
+	gchar *selected_filename = NULL;
+	gboolean ret = FALSE;
+
+	if (priv->scan_all_documents)
+	{
+		gtk_tree_model_get(model, iter, TLIST_COL_LINE, &line, TLIST_COL_FILENAME, &filename, -1);
+		selected_line = priv->selected_task_line;
+		selected_filename = DOC_FILENAME(priv->selected_task_doc);
+	}
+	else
+	{
+		gtk_tree_model_get(model, iter, TLIST_COL_LINE, &line, -1);
+		selected_line = GPOINTER_TO_INT(g_hash_table_lookup(
+							priv->selected_tasks, priv->selected_task_doc));
+	}
+
+	if (line == selected_line && utils_str_equal(filename, selected_filename))
+	{
+		GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->tree));
+
+		gtk_tree_selection_select_iter(selection, iter);
+		gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(priv->tree), path, NULL, FALSE, 0.0, 0.0);
+
+		ret = TRUE;
+	}
+	g_free(filename);
+	return ret;
+}
+
+
 void ao_tasks_update(AoTasks *t, GeanyDocument *cur_doc)
 {
 	AoTasksPrivate *priv = AO_TASKS_GET_PRIVATE(t);
@@ -637,6 +696,18 @@
 			update_tasks_for_doc(t, documents[i]);
 		}
 	}
+	/* restore selection */
+	priv->ignore_selection_changed = TRUE;
+	if (priv->scan_all_documents && priv->selected_task_doc != NULL)
+	{
+		gtk_tree_model_foreach(GTK_TREE_MODEL(priv->store), ao_tasks_select_task, t);
+	}
+	else if (cur_doc != NULL && g_hash_table_lookup(priv->selected_tasks, cur_doc) != NULL)
+	{
+		priv->selected_task_doc = cur_doc;
+		gtk_tree_model_foreach(GTK_TREE_MODEL(priv->store), ao_tasks_select_task, t);
+	}
+	priv->ignore_selection_changed = FALSE;
 }
 
 
@@ -648,6 +719,14 @@
 	priv->popup_menu = NULL;
 	priv->tokens = NULL;
 	priv->active = FALSE;
+	priv->ignore_selection_changed = FALSE;
+
+	priv->selected_task_line = 0;
+	priv->selected_task_doc = 0;
+	if (priv->scan_all_documents)
+		priv->selected_tasks = NULL;
+	else
+		priv->selected_tasks = g_hash_table_new(g_direct_hash, g_direct_equal);
 }
 
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Plugins-Commits mailing list