[gitg] Use a checkbutton to switch the blame mode



commit 500dd0a371f84adc71a2e6f9839589c21728c228
Author: Ignacio Casal Quinteiro <icq gnome org>
Date:   Tue Jul 26 23:58:38 2011 +0200

    Use a checkbutton to switch the blame mode

 data/org.gnome.gitg.gschema.xml.in.in |    9 +
 gitg/gitg-revision-files-panel.c      |  273 ++++++++++++++++-----------------
 gitg/gitg-revision-files-panel.ui     |   50 +++---
 3 files changed, 169 insertions(+), 163 deletions(-)
---
diff --git a/data/org.gnome.gitg.gschema.xml.in.in b/data/org.gnome.gitg.gschema.xml.in.in
index aecbd79..7c01e7e 100644
--- a/data/org.gnome.gitg.gschema.xml.in.in
+++ b/data/org.gnome.gitg.gschema.xml.in.in
@@ -64,6 +64,15 @@
       </_description>
     </key>
   </schema>
+  <schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.gitg.preferences.view.files" path="/org/gnome/gitg/preferences/view/files/">
+    <key name="blame-mode" type="b">
+      <default>false</default>
+      <_summary>Show files view in blame mode</_summary>
+      <_description>
+        Setting that sets files view to blame mode.
+      </_description>
+    </key>
+  </schema>
   <schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.gitg.preferences.commit" path="/org/gnome/gitg/preferences/commit/">
     <child name="message" schema="org.gnome.gitg.preferences.commit.message" />
   </schema>
diff --git a/gitg/gitg-revision-files-panel.c b/gitg/gitg-revision-files-panel.c
index ec698a3..700362f 100644
--- a/gitg/gitg-revision-files-panel.c
+++ b/gitg/gitg-revision-files-panel.c
@@ -55,7 +55,7 @@ typedef struct _GitgRevisionFilesViewPrivate GitgRevisionFilesViewPrivate;
 
 struct _GitgRevisionFilesViewPrivate
 {
-	GtkNotebook *notebook_files;
+	GSettings *settings;
 
 	GtkTreeView *tree_view;
 
@@ -63,13 +63,11 @@ struct _GitgRevisionFilesViewPrivate
 	GitgShell *content_shell;
 	GtkTreeStore *store;
 
-	GtkSourceView *blame_view;
-	GitgShell *blame_shell;
+	GtkToggleButton *blame_checkbutton;
 	GHashTable *blames; /* hash : tag */
 	GitgBlameRenderer *blame_renderer;
 	gint blame_offset;
 	GtkTextTag *active_tag;
-	gboolean blame_active;
 
 	glong query_data_id;
 	glong query_tooltip_id;
@@ -85,6 +83,7 @@ struct _GitgRevisionFilesViewPrivate
 	GtkTreePath *load_path;
 
 	gboolean skipped_blank_line;
+	gboolean disposed;
 };
 
 struct _GitgRevisionFilesView
@@ -154,9 +153,6 @@ gitg_revision_files_view_finalize (GObject *object)
 
 	g_hash_table_unref (self->priv->blames);
 
-	gitg_io_cancel (GITG_IO (self->priv->blame_shell));
-	g_object_unref (self->priv->blame_shell);
-
 	G_OBJECT_CLASS (gitg_revision_files_view_parent_class)->finalize (object);
 }
 
@@ -348,10 +344,9 @@ remove_blames (GitgRevisionFilesView *tree)
 	GtkTextBuffer *buffer;
 	GList *tags, *tag;
 	GtkTextTagTable *table;
+	gboolean blame_mode;
 
-	tree->priv->blame_active = FALSE;
-
-	buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (tree->priv->blame_view));
+	buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (tree->priv->contents));
 	table = gtk_text_buffer_get_tag_table (buffer);
 
 	if (tree->priv->query_data_id != 0)
@@ -389,7 +384,12 @@ remove_blames (GitgRevisionFilesView *tree)
 	              "group-start", FALSE,
 	              NULL);
 
-	gitg_blame_renderer_set_max_line_count (tree->priv->blame_renderer, 0);
+	blame_mode = gtk_toggle_button_get_active (tree->priv->blame_checkbutton);
+
+	if (blame_mode)
+	{
+		gitg_blame_renderer_set_max_line_count (tree->priv->blame_renderer, 0);
+	}
 }
 
 static void
@@ -397,11 +397,24 @@ gitg_revision_files_view_dispose (GObject *object)
 {
 	GitgRevisionFilesView* files_view = GITG_REVISION_FILES_VIEW (object);
 
-	set_revision (files_view, NULL, NULL);
-
-	if (files_view->priv->blame_active)
+	if (!files_view->priv->disposed)
 	{
+		set_revision (files_view, NULL, NULL);
 		remove_blames (files_view);
+
+		files_view->priv->disposed = TRUE;
+	}
+
+	if (files_view->priv->blame_renderer != NULL)
+	{
+		g_object_unref (files_view->priv->blame_renderer);
+		files_view->priv->blame_renderer = NULL;
+	}
+
+	if (files_view->priv->settings != NULL)
+	{
+		g_object_unref (files_view->priv->settings);
+		files_view->priv->settings = NULL;
 	}
 
 	G_OBJECT_CLASS (gitg_revision_files_view_parent_class)->dispose (object);
@@ -481,20 +494,12 @@ on_selection_changed (GtkTreeSelection      *selection,
 	gchar *name;
 	gchar *content_type;
 
-	if (tree->priv->active_view == GTK_WIDGET (tree->priv->contents))
-	{
-		buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (tree->priv->contents));
-		gitg_io_cancel (GITG_IO (tree->priv->content_shell));
-		blame_mode = FALSE;
-	}
-	else
-	{
-		buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (tree->priv->blame_view));
-		blame_mode = TRUE;
-		gitg_io_cancel (GITG_IO (tree->priv->blame_shell));
+	buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (tree->priv->contents));
+	gitg_io_cancel (GITG_IO (tree->priv->content_shell));
 
-		remove_blames (tree);
-	}
+	blame_mode = gtk_toggle_button_get_active (tree->priv->blame_checkbutton);
+
+	remove_blames (tree);
 
 	gtk_text_buffer_set_text (buffer, "", -1);
 
@@ -543,7 +548,7 @@ on_selection_changed (GtkTreeSelection      *selection,
 		gchar *id;
 
 		language = gitg_utils_get_language (name, content_type);
-		gtk_source_buffer_set_language (GTK_SOURCE_BUFFER(buffer),
+		gtk_source_buffer_set_language (GTK_SOURCE_BUFFER (buffer),
 		                                language);
 
 		id = node_identity (tree, &iter);
@@ -563,10 +568,9 @@ on_selection_changed (GtkTreeSelection      *selection,
 			gchar **hash_name;
 
 			gitg_blame_renderer_set_max_line_count (tree->priv->blame_renderer, 0);
-			tree->priv->blame_active = TRUE;
 
 			hash_name = g_strsplit (id, ":", 2);
-			gitg_shell_run (tree->priv->blame_shell,
+			gitg_shell_run (tree->priv->content_shell,
 			                gitg_command_new (tree->priv->repository,
 			                                  "blame",
 			                                  "--encoding=UTF-8",
@@ -758,24 +762,35 @@ on_drag_end (GtkWidget            *widget,
 }
 
 static void
-on_notebook_files_switch_page (GtkNotebook           *notebook,
-                               GtkWidget             *page,
-                               guint                  page_num,
-                               GitgRevisionFilesView *files_view)
+blame_mode_set_active (GitgRevisionFilesView *tree,
+                       gboolean               active)
 {
-	GtkTreeSelection *selection;
+	GtkSourceGutter *gutter;
 
-	files_view->priv->active_view = gtk_bin_get_child (GTK_BIN (page));
+	gutter = gtk_source_view_get_gutter (GTK_SOURCE_VIEW (tree->priv->contents),
+	                                     GTK_TEXT_WINDOW_LEFT);
 
-	selection = gtk_tree_view_get_selection (files_view->priv->tree_view);
-	on_selection_changed (selection, files_view);
+	gtk_source_view_set_show_line_numbers (tree->priv->contents, !active);
+
+	if (active)
+	{
+		gtk_source_gutter_insert (gutter,
+		                          GTK_SOURCE_GUTTER_RENDERER (tree->priv->blame_renderer),
+		                          0);
+	}
+	else
+	{
+		gtk_source_gutter_remove (gutter,
+		                          GTK_SOURCE_GUTTER_RENDERER (tree->priv->blame_renderer));
+	}
 }
 
 static void
 gitg_revision_files_view_parser_finished (GtkBuildable *buildable,
                                           GtkBuilder   *builder)
 {
-	GtkSourceGutter *gutter;
+	GitgRevisionFilesView *files_view = GITG_REVISION_FILES_VIEW (buildable);
+	GtkTreeSelection *selection;
 
 	if (parent_iface.parser_finished)
 	{
@@ -783,34 +798,19 @@ gitg_revision_files_view_parser_finished (GtkBuildable *buildable,
 	}
 
 	// Store widgets
-	GitgRevisionFilesView *files_view = GITG_REVISION_FILES_VIEW(buildable);
 	files_view->priv->tree_view = GTK_TREE_VIEW (gtk_builder_get_object (builder,
 	                                            "revision_files"));
-	files_view->priv->notebook_files = GTK_NOTEBOOK (gtk_builder_get_object (builder,
-	                                                 "notebook_files"));
 	files_view->priv->contents = GTK_SOURCE_VIEW (gtk_builder_get_object (builder,
 	                                             "revision_files_contents"));
-	files_view->priv->blame_view = GTK_SOURCE_VIEW (gtk_builder_get_object (builder,
-	                                                "revision_blame_view"));
+	files_view->priv->blame_checkbutton = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder,
+	                                                         "blame_mode_checkbutton"));
 	files_view->priv->blame_renderer = gitg_blame_renderer_new ();
-
-	gutter = gtk_source_view_get_gutter (GTK_SOURCE_VIEW (files_view->priv->blame_view),
-	                                     GTK_TEXT_WINDOW_LEFT);
-
-	gtk_source_gutter_insert (gutter,
-	                          GTK_SOURCE_GUTTER_RENDERER (files_view->priv->blame_renderer),
-	                          0);
-
-	/* set the active view */
-	files_view->priv->active_view = GTK_WIDGET (files_view->priv->contents);
+	g_object_ref (files_view->priv->blame_renderer);
 
 	gitg_utils_set_monospace_font (GTK_WIDGET(files_view->priv->contents));
-	gitg_utils_set_monospace_font (GTK_WIDGET(files_view->priv->blame_view));
 	gtk_tree_view_set_model (files_view->priv->tree_view,
 	                         GTK_TREE_MODEL(files_view->priv->store));
 
-	GtkTreeSelection *selection;
-
 	selection = gtk_tree_view_get_selection (files_view->priv->tree_view);
 	gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
 	gtk_tree_selection_set_select_function (selection,
@@ -851,10 +851,13 @@ gitg_revision_files_view_parser_finished (GtkBuildable *buildable,
 	                  G_CALLBACK(on_selection_changed),
 	                  files_view);
 
-	g_signal_connect (files_view->priv->notebook_files,
-	                  "switch-page",
-	                  G_CALLBACK (on_notebook_files_switch_page),
-	                  files_view);
+	g_settings_bind (files_view->priv->settings,
+	                 "blame-mode",
+	                 files_view->priv->blame_checkbutton,
+	                 "active",
+	                 G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
+	blame_mode_set_active (files_view,
+	                       gtk_toggle_button_get_active (files_view->priv->blame_checkbutton));
 }
 
 static void
@@ -1199,47 +1202,6 @@ compare_func (GtkTreeModel *model,
 	return ret;
 }
 
-static void
-on_contents_update (GitgShell              *shell,
-                    gchar                 **buffer,
-                    GitgRevisionFilesView  *tree)
-{
-	gchar *line;
-	GtkTextBuffer *buf;
-	GtkTextIter iter;
-
-	buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW(tree->priv->contents));
-
-	gtk_text_buffer_get_end_iter (buf, &iter);
-
-	while ((line = *buffer++))
-	{
-		gtk_text_buffer_insert (buf, &iter, line, -1);
-		gtk_text_buffer_insert (buf, &iter, "\n", -1);
-	}
-
-	if (gtk_source_buffer_get_language (GTK_SOURCE_BUFFER(buf)) == NULL)
-	{
-		gchar *content_type = gitg_utils_guess_content_type (buf);
-
-		if (content_type && !gitg_utils_can_display_content_type (content_type))
-		{
-			gitg_io_cancel (GITG_IO (shell));
-			show_binary_information (tree, buf);
-		}
-		else
-		{
-			GtkSourceLanguage *language;
-
-			language = gitg_utils_get_language (NULL, content_type);
-			gtk_source_buffer_set_language (GTK_SOURCE_BUFFER(buf),
-			                                language);
-		}
-
-		g_free (content_type);
-	}
-}
-
 /**
  * parse_blame:
  * @line: the line to be parsed
@@ -1352,25 +1314,38 @@ insert_blame_line (GitgRevisionFilesView  *tree,
 }
 
 static void
-on_blame_update (GitgShell              *shell,
-                 gchar                 **buffer,
-                 GitgRevisionFilesView  *tree)
+on_contents_update (GitgShell              *shell,
+                    gchar                 **buffer,
+                    GitgRevisionFilesView  *tree)
 {
 	GtkTextBuffer *buf;
 	GtkTextIter end;
 	gchar *line;
+	gboolean blame_mode;
 
-	buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (tree->priv->blame_view));
+	buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (tree->priv->contents));
 	gtk_text_buffer_get_end_iter (buf, &end);
+	blame_mode = gtk_toggle_button_get_active (tree->priv->blame_checkbutton);
 
-	while ((line = *buffer++))
+	if (blame_mode)
 	{
-		insert_blame_line (tree, buf, line, &end);
-	}
+		while ((line = *buffer++))
+		{
+			insert_blame_line (tree, buf, line, &end);
+		}
 
-	if (tree->priv->active_tag != NULL)
+		if (tree->priv->active_tag != NULL)
+		{
+			apply_active_blame_tag (tree, buf, &end);
+		}
+	}
+	else
 	{
-		apply_active_blame_tag (tree, buf, &end);
+		while ((line = *buffer++))
+		{
+			gtk_text_buffer_insert (buf, &end, line, -1);
+			gtk_text_buffer_insert (buf, &end, "\n", -1);
+		}
 	}
 
 	if (gtk_source_buffer_get_language (GTK_SOURCE_BUFFER (buf)) == NULL)
@@ -1396,33 +1371,61 @@ on_blame_update (GitgShell              *shell,
 }
 
 static void
-on_blame_end (GitgShell              *shell,
-              GError                 *error,
-              GitgRevisionFilesView  *tree)
+on_contents_end (GitgShell              *shell,
+                 GError                 *error,
+                 GitgRevisionFilesView  *tree)
 {
-	GtkSourceGutter *gutter;
+	gboolean blame_mode;
 
-	tree->priv->query_data_id =
-		g_signal_connect (tree->priv->blame_renderer,
-		                  "query-data",
-		                  G_CALLBACK (blame_renderer_query_data_cb),
-		                  tree);
+	blame_mode = gtk_toggle_button_get_active (tree->priv->blame_checkbutton);
 
-	tree->priv->query_tooltip_id =
-		g_signal_connect (tree->priv->blame_renderer,
-		                  "query-tooltip",
-		                  G_CALLBACK (blame_renderer_query_tooltip_cb),
-		                  tree);
+	if (blame_mode)
+	{
+		GtkSourceGutter *gutter;
 
-	gutter = gtk_source_view_get_gutter (GTK_SOURCE_VIEW (tree->priv->blame_view),
-	                                     GTK_TEXT_WINDOW_LEFT);
-	gtk_source_gutter_queue_draw (gutter);
+		tree->priv->query_data_id =
+			g_signal_connect (tree->priv->blame_renderer,
+			                  "query-data",
+			                  G_CALLBACK (blame_renderer_query_data_cb),
+			                  tree);
+
+		tree->priv->query_tooltip_id =
+			g_signal_connect (tree->priv->blame_renderer,
+			                  "query-tooltip",
+			                  G_CALLBACK (blame_renderer_query_tooltip_cb),
+			                  tree);
+
+		gutter = gtk_source_view_get_gutter (GTK_SOURCE_VIEW (tree->priv->contents),
+		                                     GTK_TEXT_WINDOW_LEFT);
+		gtk_source_gutter_queue_draw (gutter);
+	}
+}
+
+static void
+on_blame_mode_changed (GSettings             *settings,
+                       const gchar           *key,
+                       GitgRevisionFilesView *files_view)
+{
+	GtkTreeSelection *selection;
+
+	blame_mode_set_active (files_view, g_settings_get_boolean (settings, key));
+
+	selection = gtk_tree_view_get_selection (files_view->priv->tree_view);
+	on_selection_changed (selection, files_view);
 }
 
 static void
 gitg_revision_files_view_init (GitgRevisionFilesView *self)
 {
 	self->priv = GITG_REVISION_FILES_VIEW_GET_PRIVATE (self);
+
+	self->priv->settings = g_settings_new ("org.gnome.gitg.preferences.view.files");
+
+	g_signal_connect (self->priv->settings,
+	                  "changed::blame-mode",
+	                  G_CALLBACK (on_blame_mode_changed),
+	                  self);
+
 	self->priv->store = gtk_tree_store_new (N_COLUMNS,
 	                                        GDK_TYPE_PIXBUF,
 	                                        G_TYPE_STRING,
@@ -1449,21 +1452,15 @@ gitg_revision_files_view_init (GitgRevisionFilesView *self)
 	                  "update",
 	                  G_CALLBACK (on_contents_update),
 	                  self);
+	g_signal_connect (self->priv->content_shell,
+	                  "end",
+	                  G_CALLBACK (on_contents_end),
+	                  self);
 
 	self->priv->blames = g_hash_table_new_full (g_str_hash,
 	                                            g_str_equal,
 	                                            g_free,
 	                                            NULL);
-
-	self->priv->blame_shell = gitg_shell_new (5000);
-	g_signal_connect (self->priv->blame_shell,
-	                  "update",
-	                  G_CALLBACK (on_blame_update),
-	                  self);
-	g_signal_connect (self->priv->blame_shell,
-	                  "end",
-	                  G_CALLBACK (on_blame_end),
-	                  self);
 }
 
 static void
diff --git a/gitg/gitg-revision-files-panel.ui b/gitg/gitg-revision-files-panel.ui
index 57b6361..5f172eb 100644
--- a/gitg/gitg-revision-files-panel.ui
+++ b/gitg/gitg-revision-files-panel.ui
@@ -1,7 +1,6 @@
 <?xml version="1.0"?>
 <interface>
-  <object class="GtkSourceBuffer" id="source_buffer_source"></object>
-  <object class="GtkSourceBuffer" id="source_buffer_blame"></object>
+  <object class="GtkSourceBuffer" id="source_buffer"></object>
   <object class="GitgRevisionFilesView" id="revision_files_view">
     <property name="visible">True</property>
     <property name="can_focus">True</property>
@@ -44,48 +43,49 @@
       </packing>
     </child>
     <child>
-      <object class="GtkNotebook" id="notebook_files">
+      <object class="GtkBox" id="sourcebox">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
         <child>
-          <object class="GtkScrolledWindow" id="scrolled_window_files_contents">
+          <object class="GtkBox" id="hbox_top">
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="hscrollbar_policy">automatic</property>
-            <property name="vscrollbar_policy">automatic</property>
-            <property name="shadow_type">etched-in</property>
+            <property name="orientation">horizontal</property>
             <child>
-              <object class="GtkSourceView" id="revision_files_contents">
-                <property name="buffer">source_buffer_source</property>
-                <property name="editable">False</property>
-                <property name="show_line_numbers">True</property>
+              <object class="GtkCheckButton" id="blame_mode_checkbutton">
+                <property name="label" translatable="yes">Switch to Blame mode</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="use_action_appearance">False</property>
+                <property name="xalign">0</property>
+                <property name="draw_indicator">True</property>
               </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="pack_type">end</property>
+                <property name="position">0</property>
+              </packing>
             </child>
           </object>
         </child>
-        <child type="tab">
-          <object class="GtkLabel" id="label_source">
-            <property name="label">Source</property>
-          </object>
-        </child>
         <child>
-          <object class="GtkScrolledWindow" id="scrolled_window_blame">
+          <object class="GtkScrolledWindow" id="scrolled_window_files_contents">
             <property name="visible">True</property>
             <property name="can_focus">True</property>
             <property name="hscrollbar_policy">automatic</property>
             <property name="vscrollbar_policy">automatic</property>
             <property name="shadow_type">etched-in</property>
             <child>
-              <object class="GtkSourceView" id="revision_blame_view">
-                <property name="buffer">source_buffer_blame</property>
+              <object class="GtkSourceView" id="revision_files_contents">
+                <property name="buffer">source_buffer</property>
                 <property name="editable">False</property>
+                <property name="show_line_numbers">False</property>
+                <property name="expand">True</property>
               </object>
             </child>
           </object>
         </child>
-        <child type="tab">
-          <object class="GtkLabel" id="label_blame">
-            <property name="label">Blame</property>
-          </object>
-        </child>
       </object>
       <packing>
         <property name="resize">True</property>



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]