[gitg] Started with modularized panels
- From: Jesse van den Kieboom <jessevdk src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gitg] Started with modularized panels
- Date: Mon, 31 May 2010 22:17:24 +0000 (UTC)
commit afd4ca204647c15d1ba5753bfc7e519a03b3c661
Author: Jesse van den Kieboom <jessevdk gnome org>
Date: Mon May 31 02:27:48 2010 +0200
Started with modularized panels
gitg/Makefile.am | 84 ++--
gitg/gitg-revision-files-view-panel.c | 1040 +++++++++++++++++++++++++++++++++
gitg/gitg-revision-files-view-panel.h | 61 ++
gitg/gitg-revision-files-view.ui | 64 ++
gitg/gitg-revision-panel.c | 67 +++
gitg/gitg-revision-panel.h | 39 ++
gitg/gitg-revision-tree-store.c | 123 ----
gitg/gitg-revision-tree-store.h | 65 --
gitg/gitg-revision-tree-view.c | 731 -----------------------
gitg/gitg-revision-tree-view.h | 62 --
gitg/gitg-revision-view.ui | 241 ++++++++
gitg/gitg-utils.c | 18 +-
gitg/gitg-utils.h | 3 +-
gitg/gitg-window.c | 147 ++++--
gitg/gitg-window.ui | 331 +-----------
15 files changed, 1672 insertions(+), 1404 deletions(-)
---
diff --git a/gitg/Makefile.am b/gitg/Makefile.am
index a9db2fe..1a1e86d 100644
--- a/gitg/Makefile.am
+++ b/gitg/Makefile.am
@@ -11,48 +11,48 @@ AM_CPPFLAGS = \
-DGITG_DATADIR=\""$(datadir)/gitg"\" \
-DGITG_LOCALEDIR=\""$(datadir)/locale"\"
-NOINST_H_FILES = \
- gitg-branch-actions.h \
- gitg-cell-renderer-path.h \
- gitg-commit-view.h \
- gitg-data-binding.h \
- gitg-diff-line-renderer.h \
- gitg-diff-view.h \
- gitg-dirs.h \
- gitg-dnd.h \
- gitg-label-renderer.h \
- gitg-preferences-dialog.h \
- gitg-preferences.h \
- gitg-repository-dialog.h \
- gitg-revision-tree-store.h \
- gitg-revision-tree-view.h \
- gitg-revision-view.h \
- gitg-settings.h \
- gitg-utils.h \
- gitg-window.h \
+NOINST_H_FILES = \
+ gitg-branch-actions.h \
+ gitg-cell-renderer-path.h \
+ gitg-commit-view.h \
+ gitg-data-binding.h \
+ gitg-diff-line-renderer.h \
+ gitg-diff-view.h \
+ gitg-dirs.h \
+ gitg-dnd.h \
+ gitg-label-renderer.h \
+ gitg-preferences-dialog.h \
+ gitg-preferences.h \
+ gitg-repository-dialog.h \
+ gitg-revision-panel.h \
+ gitg-revision-files-view-panel.h \
+ gitg-revision-view.h \
+ gitg-settings.h \
+ gitg-utils.h \
+ gitg-window.h \
gseal-gtk-compat.h
-gitg_SOURCES = \
- $(BUILT_SOURCES) \
- gitg.c \
- gitg-branch-actions.c \
- gitg-cell-renderer-path.c \
- gitg-commit-view.c \
- gitg-data-binding.c \
- gitg-diff-line-renderer.c \
- gitg-diff-view.c \
- gitg-dirs.c \
- gitg-dnd.c \
- gitg-label-renderer.c \
- gitg-preferences.c \
- gitg-preferences-dialog.c \
- gitg-repository-dialog.c \
- gitg-revision-tree-store.c \
- gitg-revision-tree-view.c \
- gitg-revision-view.c \
- gitg-settings.c \
- gitg-utils.c \
- gitg-window.c \
+gitg_SOURCES = \
+ $(BUILT_SOURCES) \
+ gitg.c \
+ gitg-branch-actions.c \
+ gitg-cell-renderer-path.c \
+ gitg-commit-view.c \
+ gitg-data-binding.c \
+ gitg-diff-line-renderer.c \
+ gitg-diff-view.c \
+ gitg-dirs.c \
+ gitg-dnd.c \
+ gitg-label-renderer.c \
+ gitg-preferences.c \
+ gitg-preferences-dialog.c \
+ gitg-repository-dialog.c \
+ gitg-revision-panel.c \
+ gitg-revision-files-view-panel.c \
+ gitg-revision-view.c \
+ gitg-settings.c \
+ gitg-utils.c \
+ gitg-window.c \
$(NOINST_H_FILES)
gitg_LDADD = \
@@ -70,7 +70,9 @@ ui_DATA = \
gitg-menus.xml \
gitg-preferences.ui \
gitg-tag.ui \
- gitg-repository.ui
+ gitg-repository.ui \
+ gitg-revision-view.ui \
+ gitg-revision-files-view.ui
EXTRA_DIST = \
$(ui_DATA)
diff --git a/gitg/gitg-revision-files-view-panel.c b/gitg/gitg-revision-files-view-panel.c
new file mode 100644
index 0000000..1ccd5ea
--- /dev/null
+++ b/gitg/gitg-revision-files-view-panel.c
@@ -0,0 +1,1040 @@
+/*
+ * gitg-revision-tree-view.c
+ * This file is part of gitg - git repository viewer
+ *
+ * Copyright (C) 2009 - Jesse van den Kieboom
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gtksourceview/gtksourceview.h>
+#include <gtksourceview/gtksourcelanguagemanager.h>
+#include <string.h>
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+#include <stdlib.h>
+#include <libgitg/gitg-revision.h>
+#include <libgitg/gitg-runner.h>
+
+#include "gitg-revision-files-view-panel.h"
+#include "gitg-utils.h"
+#include "gitg-revision-panel.h"
+#include "gitg-dirs.h"
+
+#define GITG_REVISION_FILES_VIEW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), GITG_TYPE_REVISION_FILES_VIEW, GitgRevisionFilesViewPrivate))
+
+#define GITG_REVISION_FILES_VIEW_PANEL_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), GITG_TYPE_REVISION_FILES_VIEW_PANEL, GitgRevisionFilesViewPanelPrivate))
+
+enum
+{
+ ICON_COLUMN,
+ NAME_COLUMN,
+ CONTENT_TYPE_COLUMN,
+ N_COLUMNS
+};
+
+typedef struct _GitgRevisionFilesView GitgRevisionFilesView;
+typedef struct _GitgRevisionFilesViewClass GitgRevisionFilesViewClass;
+typedef struct _GitgRevisionFilesViewPrivate GitgRevisionFilesViewPrivate;
+
+struct _GitgRevisionFilesViewPrivate
+{
+ GtkTreeView *tree_view;
+ GtkSourceView *contents;
+ GitgRunner *content_runner;
+ GtkTreeStore *store;
+
+ gchar *drag_dir;
+ gchar **drag_files;
+
+ GitgRepository *repository;
+ GitgRevision *revision;
+ GitgRunner *loader;
+ GtkTreePath *load_path;
+
+ gboolean skipped_blank_line;
+};
+
+struct _GitgRevisionFilesView
+{
+ GtkHPaned parent;
+
+ GitgRevisionFilesViewPrivate *priv;
+};
+
+struct _GitgRevisionFilesViewClass
+{
+ GtkHPanedClass parent_class;
+};
+
+struct _GitgRevisionFilesViewPanelPrivate
+{
+ GitgRevisionFilesView *panel;
+};
+
+#define GITG_TYPE_REVISION_FILES_VIEW (gitg_revision_files_view_get_type ())
+#define GITG_REVISION_FILES_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GITG_TYPE_REVISION_FILES_VIEW, GitgRevisionFilesView))
+
+static void gitg_revision_files_view_buildable_iface_init (GtkBuildableIface *iface);
+static void gitg_revision_panel_iface_init (GitgRevisionPanelInterface *iface);
+
+static void load_node (GitgRevisionFilesView *view, GtkTreeIter *parent);
+static gchar *node_identity (GitgRevisionFilesView *view, GtkTreeIter *iter);
+
+G_DEFINE_TYPE_EXTENDED (GitgRevisionFilesViewPanel,
+ gitg_revision_files_view_panel,
+ G_TYPE_OBJECT,
+ 0,
+ G_IMPLEMENT_INTERFACE (GITG_TYPE_REVISION_PANEL,
+ gitg_revision_panel_iface_init));
+
+G_DEFINE_TYPE_EXTENDED (GitgRevisionFilesView,
+ gitg_revision_files_view,
+ GTK_TYPE_HPANED,
+ 0,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
+ gitg_revision_files_view_buildable_iface_init));
+
+static GtkBuildableIface parent_iface;
+
+static void
+gitg_revision_files_view_finalize (GObject *object)
+{
+ GitgRevisionFilesView *self = GITG_REVISION_FILES_VIEW (object);
+
+ if (self->priv->load_path)
+ {
+ gtk_tree_path_free (self->priv->load_path);
+ }
+
+ g_free (self->priv->drag_dir);
+
+ if (self->priv->drag_files)
+ {
+ g_strfreev (self->priv->drag_files);
+ }
+
+ gitg_runner_cancel (self->priv->loader);
+ g_object_unref (self->priv->loader);
+
+ G_OBJECT_CLASS (gitg_revision_files_view_parent_class)->finalize (object);
+}
+
+static void
+load_tree (GitgRevisionFilesView *files_view)
+{
+ load_node (files_view, NULL);
+}
+
+static void
+set_revision (GitgRevisionFilesView *files_view,
+ GitgRepository *repository,
+ GitgRevision *revision)
+{
+ gitg_runner_cancel (files_view->priv->loader);
+ gtk_tree_store_clear (files_view->priv->store);
+
+ if (files_view->priv->repository)
+ {
+ g_object_unref (files_view->priv->repository);
+ }
+
+ if (files_view->priv->revision)
+ {
+ gitg_revision_unref (files_view->priv->revision);
+ }
+
+ if (repository)
+ {
+ files_view->priv->repository = g_object_ref (repository);
+ }
+ else
+ {
+ files_view->priv->repository = NULL;
+ }
+
+ if (revision)
+ {
+ files_view->priv->revision = gitg_revision_ref (revision);
+ }
+ else
+ {
+ files_view->priv->revision = NULL;
+ }
+
+ if (files_view->priv->repository && files_view->priv->revision)
+ {
+ load_tree (files_view);
+ }
+
+}
+
+static void
+gitg_revision_files_view_dispose (GObject *object)
+{
+ set_revision (GITG_REVISION_FILES_VIEW (object), NULL, NULL);
+
+ G_OBJECT_CLASS (gitg_revision_files_view_parent_class)->dispose (object);
+}
+
+static gboolean
+loaded (GitgRevisionFilesView *view,
+ GtkTreeIter *iter)
+{
+ gint num;
+
+ num = gtk_tree_model_iter_n_children (GTK_TREE_MODEL(view->priv->store),
+ iter);
+
+ if (num != 1)
+ {
+ return TRUE;
+ }
+
+ gchar *content_type = NULL;
+ GtkTreeIter child;
+
+ if (!gtk_tree_model_iter_children (GTK_TREE_MODEL(view->priv->store),
+ &child,
+ iter))
+ {
+ return FALSE;
+ }
+
+ gtk_tree_model_get (GTK_TREE_MODEL(view->priv->store),
+ &child,
+ CONTENT_TYPE_COLUMN,
+ &content_type,
+ -1);
+
+ gboolean ret = content_type != NULL;
+ g_free (content_type);
+
+ return ret;
+}
+
+static void
+on_row_expanded (GtkTreeView *files_view,
+ GtkTreeIter *iter,
+ GtkTreePath *path,
+ GitgRevisionFilesView *view)
+{
+ if (loaded (view, iter))
+ {
+ return;
+ }
+
+ load_node (view, iter);
+}
+
+static void
+show_binary_information (GitgRevisionFilesView *tree)
+{
+ GtkTextBuffer *buffer;
+
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(tree->priv->contents));
+
+ gtk_text_buffer_set_text (buffer,
+ _ ("Cannot display file content as text"),
+ -1);
+
+ gtk_source_buffer_set_language (GTK_SOURCE_BUFFER(buffer), NULL);
+}
+
+static void
+on_selection_changed (GtkTreeSelection *selection,
+ GitgRevisionFilesView *tree)
+{
+ GtkTextBuffer *buffer;
+
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (tree->priv->contents));
+
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+ gitg_runner_cancel (tree->priv->content_runner);
+
+ gtk_text_buffer_set_text (buffer, "", -1);
+
+ if (!tree->priv->revision)
+ {
+ return;
+ }
+
+ GList *rows = gtk_tree_selection_get_selected_rows (selection, &model);
+ GtkTreePath *path = NULL;
+
+ if (g_list_length (rows) == 1)
+ {
+ path = gtk_tree_path_copy ((GtkTreePath *)rows->data);
+ }
+
+ g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL);
+ g_list_free (rows);
+
+ if (!path)
+ {
+ return;
+ }
+
+ gchar *name;
+ gchar *content_type;
+ gtk_tree_model_get_iter (model, &iter, path);
+ gtk_tree_path_free (path);
+ gtk_tree_model_get (model,
+ &iter,
+ NAME_COLUMN,
+ &name,
+ CONTENT_TYPE_COLUMN,
+ &content_type,
+ -1);
+
+ if (!content_type)
+ {
+ return;
+ }
+
+ if (!gitg_utils_can_display_content_type (content_type))
+ {
+ show_binary_information (tree);
+ }
+ else
+ {
+ GtkSourceLanguage *language;
+
+ language = gitg_utils_get_language (name, content_type);
+ gtk_source_buffer_set_language (GTK_SOURCE_BUFFER(buffer),
+ language);
+
+ gchar *id = node_identity (tree, &iter);
+
+ gitg_repository_run_commandv (tree->priv->repository,
+ tree->priv->content_runner,
+ NULL,
+ "show",
+ "--encoding=UTF-8",
+ id,
+ NULL);
+
+ g_free (id);
+ }
+
+ g_free (name);
+ g_free (content_type);
+}
+
+static gchar *
+node_path (GtkTreeModel *model,
+ GtkTreeIter *parent)
+{
+ if (!parent)
+ {
+ return NULL;
+ }
+
+ gchar *name;
+ gtk_tree_model_get (model,
+ parent,
+ NAME_COLUMN,
+ &name,
+ -1);
+
+ GtkTreeIter parent_iter;
+ gchar *ret;
+
+ if (gtk_tree_model_iter_parent (model, &parent_iter, parent))
+ {
+ gchar *path = node_path (model, &parent_iter);
+ ret = g_build_filename (path, name, NULL);
+ g_free (path);
+ g_free (name);
+ }
+ else
+ {
+ ret = name;
+ }
+
+ return ret;
+}
+
+static void
+export_drag_files (GitgRevisionFilesView *files_view)
+{
+ GtkTreeSelection *selection;
+ GtkTreeModel *model;
+
+ selection = gtk_tree_view_get_selection (files_view->priv->tree_view);
+
+ GList *rows = gtk_tree_selection_get_selected_rows (selection, &model);
+ gint num = g_list_length (rows);
+
+ if (num == 0)
+ {
+ g_list_free (rows);
+ return;
+ }
+
+ GList *item;
+
+ files_view->priv->drag_files = g_new (gchar *, num + 1);
+ gchar **ptr = files_view->priv->drag_files;
+
+ for (item = rows; item; item = item->next)
+ {
+ GtkTreePath *path = (GtkTreePath *)item->data;
+ GtkTreeIter iter;
+ gtk_tree_model_get_iter (model, &iter, path);
+
+ *ptr++ = node_path (model, &iter);
+ gtk_tree_path_free (path);
+ }
+
+ *ptr = NULL;
+ g_list_free (rows);
+
+ // Prepend temporary directory in uri list
+ g_free (files_view->priv->drag_dir);
+ gchar const *tmp = g_get_tmp_dir ();
+ files_view->priv->drag_dir = g_build_filename (tmp,
+ "gitg-export-XXXXXX",
+ NULL);
+
+ if (!mkdtemp (files_view->priv->drag_dir))
+ {
+ g_warning ("Could not create temporary directory for export");
+ return;
+ }
+
+ // Do the export
+ gitg_utils_export_files (files_view->priv->repository,
+ files_view->priv->revision,
+ files_view->priv->drag_dir,
+ files_view->priv->drag_files);
+
+ ptr = files_view->priv->drag_files;
+
+ while (*ptr)
+ {
+ gchar *tmp = g_build_filename (files_view->priv->drag_dir, *ptr, NULL);
+ g_free (*ptr);
+
+ GFile *file = g_file_new_for_path (tmp);
+ *ptr++ = g_file_get_uri (file);
+
+ g_free (tmp);
+ }
+}
+
+static void
+on_drag_data_get (GtkWidget *widget,
+ GdkDragContext *context,
+ GtkSelectionData *selection,
+ guint info,
+ guint time,
+ GitgRevisionFilesView *files_view)
+{
+ if (!files_view->priv->drag_files)
+ {
+ export_drag_files (files_view);
+ }
+
+ gtk_selection_data_set_uris (selection, files_view->priv->drag_files);
+}
+
+static gboolean
+test_selection (GtkTreeSelection *selection,
+ GtkTreeModel *model,
+ GtkTreePath *path,
+ gboolean path_currently_selected,
+ gpointer data)
+{
+ if (path_currently_selected)
+ {
+ return TRUE;
+ }
+
+ // Test for (Empty)
+ GtkTreeIter iter;
+
+ if (!gtk_tree_model_get_iter (model, &iter, path))
+ {
+ return FALSE;
+ }
+
+ gchar *content_type;
+ gtk_tree_model_get (model,
+ &iter,
+ CONTENT_TYPE_COLUMN,
+ &content_type,
+ -1);
+
+ if (!content_type)
+ {
+ return FALSE;
+ }
+
+ g_free (content_type);
+ return TRUE;
+}
+
+static void
+on_drag_end (GtkWidget *widget,
+ GdkDragContext *context,
+ GitgRevisionFilesView *files_view)
+{
+ if (files_view->priv->drag_files != NULL)
+ {
+ g_strfreev (files_view->priv->drag_files);
+ files_view->priv->drag_files = NULL;
+
+ g_free (files_view->priv->drag_dir);
+ files_view->priv->drag_dir = NULL;
+ }
+}
+
+static void
+gitg_revision_files_view_parser_finished (GtkBuildable *buildable,
+ GtkBuilder *builder)
+{
+ if (parent_iface.parser_finished)
+ {
+ parent_iface.parser_finished (buildable, builder);
+ }
+
+ // 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->contents = GTK_SOURCE_VIEW (gtk_builder_get_object (builder,
+ "revision_files_contents"));
+
+ gtk_text_view_set_buffer (GTK_TEXT_VIEW(files_view->priv->contents),
+ GTK_TEXT_BUFFER(gtk_source_buffer_new (NULL)));
+
+ gitg_utils_set_monospace_font (GTK_WIDGET(files_view->priv->contents));
+ 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,
+ test_selection,
+ NULL,
+ NULL);
+
+ // Setup drag source
+ GtkTargetEntry targets[] = {
+ {"text/uri-list", GTK_TARGET_OTHER_APP, 0}
+ };
+
+ // Set tree view as a drag source
+ gtk_drag_source_set (GTK_WIDGET(files_view->priv->tree_view),
+ GDK_BUTTON1_MASK,
+ targets,
+ 1,
+ GDK_ACTION_DEFAULT | GDK_ACTION_COPY);
+
+ // Connect signals
+ g_signal_connect_after (files_view->priv->tree_view,
+ "row-expanded",
+ G_CALLBACK(on_row_expanded),
+ files_view);
+
+ g_signal_connect (files_view->priv->tree_view,
+ "drag-data-get",
+ G_CALLBACK(on_drag_data_get),
+ files_view);
+
+ g_signal_connect (files_view->priv->tree_view,
+ "drag-end",
+ G_CALLBACK(on_drag_end),
+ files_view);
+
+ g_signal_connect (selection,
+ "changed",
+ G_CALLBACK(on_selection_changed),
+ files_view);
+}
+
+static void
+gitg_revision_panel_update_impl (GitgRevisionPanel *panel,
+ GitgRepository *repository,
+ GitgRevision *revision)
+{
+ GitgRevisionFilesViewPanel *files_view_panel;
+
+ files_view_panel = GITG_REVISION_FILES_VIEW_PANEL (panel);
+
+ set_revision (files_view_panel->priv->panel, repository, revision);
+}
+
+static gchar *
+gitg_revision_panel_get_label_impl (GitgRevisionPanel *panel)
+{
+ return g_strdup (_("Files"));
+}
+
+static GtkWidget *
+gitg_revision_panel_get_panel_impl (GitgRevisionPanel *panel)
+{
+ GtkBuilder *builder;
+ GtkWidget *ret;
+ GitgRevisionFilesViewPanel *files_view_panel;
+
+ files_view_panel = GITG_REVISION_FILES_VIEW_PANEL (panel);
+
+ if (files_view_panel->priv->panel)
+ {
+ return GTK_WIDGET (files_view_panel->priv->panel);
+ }
+
+ builder = gitg_utils_new_builder ("gitg-revision-files-view.ui");
+ ret = GTK_WIDGET (gtk_builder_get_object (builder, "revision_files_view"));
+ files_view_panel->priv->panel = g_object_ref (ret);
+
+ g_object_unref (builder);
+
+ return ret;
+}
+
+static void
+gitg_revision_panel_iface_init (GitgRevisionPanelInterface *iface)
+{
+ iface->update = gitg_revision_panel_update_impl;
+ iface->get_label = gitg_revision_panel_get_label_impl;
+ iface->get_panel = gitg_revision_panel_get_panel_impl;
+}
+
+static void
+gitg_revision_files_view_buildable_iface_init (GtkBuildableIface *iface)
+{
+ parent_iface = *iface;
+
+ iface->parser_finished = gitg_revision_files_view_parser_finished;
+}
+
+static void
+gitg_revision_files_view_class_init (GitgRevisionFilesViewClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS(klass);
+
+ object_class->finalize = gitg_revision_files_view_finalize;
+ object_class->dispose = gitg_revision_files_view_dispose;
+
+ g_type_class_add_private (object_class, sizeof (GitgRevisionFilesViewPrivate));
+}
+
+static void
+gitg_revision_files_view_panel_dispose (GObject *object)
+{
+ GitgRevisionFilesViewPanel *panel;
+
+ panel = GITG_REVISION_FILES_VIEW_PANEL (object);
+
+ if (panel->priv->panel)
+ {
+ g_object_unref (panel->priv->panel);
+ panel->priv->panel = NULL;
+ }
+
+ G_OBJECT_CLASS (gitg_revision_files_view_panel_parent_class)->dispose (object);
+}
+
+static void
+gitg_revision_files_view_panel_class_init (GitgRevisionFilesViewPanelClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->dispose = gitg_revision_files_view_panel_dispose;
+
+ g_type_class_add_private (object_class, sizeof (GitgRevisionFilesViewPanelPrivate));
+}
+
+static gchar *
+get_content_type (gchar *name,
+ gboolean dir)
+{
+ if (dir)
+ {
+ return g_strdup ("inode/directory");
+ }
+ else
+ {
+ return g_content_type_guess (name, NULL, 0, NULL);
+ }
+}
+
+static void
+remove_dummy (GitgRevisionFilesView *tree)
+{
+ if (!tree->priv->load_path)
+ {
+ return;
+ }
+
+ GtkTreeIter parent;
+ GtkTreeModel *model = GTK_TREE_MODEL(tree->priv->store);
+ gtk_tree_model_get_iter (model, &parent, tree->priv->load_path);
+
+ if (gtk_tree_model_iter_n_children (model, &parent) != 2)
+ {
+ return;
+ }
+
+ GtkTreeIter child;
+ gtk_tree_model_iter_children (model, &child, &parent);
+
+ do
+ {
+ gchar *content_type;
+ gtk_tree_model_get (model,
+ &child,
+ CONTENT_TYPE_COLUMN,
+ &content_type,
+ -1);
+
+ if (!content_type)
+ {
+ gtk_tree_store_remove (tree->priv->store, &child);
+ break;
+ }
+ g_free (content_type);
+ } while (gtk_tree_model_iter_next (model, &child));
+}
+
+static void
+append_node (GitgRevisionFilesView *tree,
+ gchar *line)
+{
+ GtkTreeIter parent;
+ GtkTreeIter iter;
+
+ if (tree->priv->load_path)
+ {
+ gtk_tree_model_get_iter (GTK_TREE_MODEL(tree->priv->store),
+ &parent,
+ tree->priv->load_path);
+ gtk_tree_store_append (tree->priv->store, &iter, &parent);
+ }
+ else
+ {
+ gtk_tree_store_append (tree->priv->store, &iter, NULL);
+ }
+
+ int len = strlen (line);
+ gboolean isdir = FALSE;
+
+ if (line[len - 1] == '/')
+ {
+ isdir = TRUE;
+ line[len - 1] = '\0';
+ }
+
+ GIcon *icon;
+
+ if (isdir)
+ {
+ GtkTreeIter empty;
+ gtk_tree_store_append (tree->priv->store, &empty, &iter);
+ gtk_tree_store_set (tree->priv->store,
+ &empty,
+ NAME_COLUMN,
+ _ ("(Empty)"),
+ -1);
+
+ gchar *content_type = get_content_type (line, TRUE);
+ gtk_tree_store_set (tree->priv->store,
+ &iter,
+ CONTENT_TYPE_COLUMN,
+ content_type,
+ -1);
+ icon = g_content_type_get_icon (content_type);
+ g_free (content_type);
+
+ if (icon && G_IS_THEMED_ICON(icon))
+ {
+ g_themed_icon_append_name (G_THEMED_ICON(icon), "folder");
+ }
+ }
+ else
+ {
+ gchar *content_type = get_content_type (line, FALSE);
+ icon = g_content_type_get_icon (content_type);
+ gtk_tree_store_set (tree->priv->store,
+ &iter,
+ CONTENT_TYPE_COLUMN,
+ content_type,
+ -1);
+ g_free (content_type);
+
+ if (icon && G_IS_THEMED_ICON(icon))
+ {
+ g_themed_icon_append_name (G_THEMED_ICON(icon),
+ "text-x-generic");
+ }
+ }
+
+ if (G_IS_THEMED_ICON(icon))
+ {
+ GtkIconTheme *theme = gtk_icon_theme_get_default ();
+
+ gchar **names;
+ g_object_get (icon, "names", &names, NULL);
+
+ GtkIconInfo *info;
+
+ info = gtk_icon_theme_choose_icon (theme,
+ (gchar const **)names,
+ 16,
+ 0);
+
+ if (info)
+ {
+ GError *error = NULL;
+ GdkPixbuf *pixbuf = gtk_icon_info_load_icon (info, &error);
+
+ if (!pixbuf)
+ {
+ g_warning ("Error loading icon: %s", error->message);
+ g_error_free (error);
+ }
+
+ gtk_tree_store_set (tree->priv->store,
+ &iter,
+ ICON_COLUMN,
+ pixbuf,
+ -1);
+
+ if (pixbuf)
+ {
+ g_object_unref (pixbuf);
+ }
+
+ gtk_icon_info_free (info);
+ }
+
+ g_strfreev (names);
+ }
+
+ if (icon)
+ {
+ g_object_unref (icon);
+ }
+
+ gtk_tree_store_set (tree->priv->store,
+ &iter,
+ NAME_COLUMN,
+ line,
+ -1);
+ remove_dummy (tree);
+}
+
+static void
+on_update (GitgRunner *runner,
+ gchar **buffer,
+ GitgRevisionFilesView *tree)
+{
+ gchar *line;
+
+ while ((line = *buffer++))
+ {
+ if (!tree->priv->skipped_blank_line)
+ {
+ if (*line == '\0')
+ {
+ tree->priv->skipped_blank_line = TRUE;
+ }
+
+ continue;
+ }
+
+ append_node (tree, line);
+ }
+}
+
+static gint
+compare_func (GtkTreeModel *model,
+ GtkTreeIter *a,
+ GtkTreeIter *b,
+ GitgRevisionFilesView *self)
+{
+ // First sort directories before files
+ gboolean da = gtk_tree_model_iter_has_child (model, a) != 0;
+ gboolean db = gtk_tree_model_iter_has_child (model, b) != 0;
+
+ if (da != db)
+ {
+ return da ? -1 : 1;
+ }
+
+ // Then sort on name
+ gchar *s1;
+ gchar *s2;
+
+ gtk_tree_model_get (model,
+ a,
+ NAME_COLUMN,
+ &s1,
+ -1);
+
+ gtk_tree_model_get (model,
+ b,
+ NAME_COLUMN,
+ &s2,
+ -1);
+
+ int ret = gitg_utils_sort_names (s1, s2);
+
+ g_free (s1);
+ g_free (s2);
+
+ return ret;
+}
+
+static void
+on_contents_update (GitgRunner *runner,
+ 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_runner_cancel (runner);
+ show_binary_information (tree);
+ }
+ 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);
+ }
+}
+
+static void
+gitg_revision_files_view_init (GitgRevisionFilesView *self)
+{
+ self->priv = GITG_REVISION_FILES_VIEW_GET_PRIVATE (self);
+ self->priv->store = gtk_tree_store_new (N_COLUMNS,
+ GDK_TYPE_PIXBUF,
+ G_TYPE_STRING,
+ G_TYPE_STRING);
+
+ gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (self->priv->store),
+ 1,
+ (GtkTreeIterCompareFunc)compare_func,
+ self,
+ NULL);
+
+ gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (self->priv->store),
+ NAME_COLUMN,
+ GTK_SORT_ASCENDING);
+
+ self->priv->loader = gitg_runner_new (1000);
+ g_signal_connect (self->priv->loader,
+ "update",
+ G_CALLBACK (on_update),
+ self);
+
+ self->priv->content_runner = gitg_runner_new (5000);
+ g_signal_connect (self->priv->content_runner,
+ "update",
+ G_CALLBACK (on_contents_update),
+ self);
+}
+
+static void
+gitg_revision_files_view_panel_init (GitgRevisionFilesViewPanel *self)
+{
+ self->priv = GITG_REVISION_FILES_VIEW_PANEL_GET_PRIVATE (self);
+}
+
+static gchar *
+node_identity (GitgRevisionFilesView *tree,
+ GtkTreeIter *parent)
+{
+ gchar *sha = gitg_revision_get_sha1 (tree->priv->revision);
+
+ // Path consists of the SHA1 of the revision and the actual file path
+ // from parent
+ gchar *par = node_path (GTK_TREE_MODEL (tree->priv->store), parent);
+ gchar *path = g_strconcat (sha, ":", par, NULL);
+ g_free (sha);
+ g_free (par);
+
+ return path;
+}
+
+static void
+load_node (GitgRevisionFilesView *tree,
+ GtkTreeIter *parent)
+{
+ if (gitg_runner_running (tree->priv->loader))
+ {
+ return;
+ }
+
+ if (tree->priv->load_path)
+ {
+ gtk_tree_path_free (tree->priv->load_path);
+ }
+
+ gchar *id = node_identity (tree, parent);
+
+ if (parent)
+ {
+ tree->priv->load_path =
+ gtk_tree_model_get_path (GTK_TREE_MODEL (tree->priv->store),
+ parent);
+ }
+ else
+ {
+ tree->priv->load_path = NULL;
+ }
+
+ tree->priv->skipped_blank_line = FALSE;
+ gitg_repository_run_commandv (tree->priv->repository,
+ tree->priv->loader,
+ NULL,
+ "show",
+ "--encoding=UTF-8",
+ id,
+ NULL);
+ g_free (id);
+}
diff --git a/gitg/gitg-revision-files-view-panel.h b/gitg/gitg-revision-files-view-panel.h
new file mode 100644
index 0000000..76cf132
--- /dev/null
+++ b/gitg/gitg-revision-files-view-panel.h
@@ -0,0 +1,61 @@
+/*
+ * gitg-revision-files-view_panel.h
+ * This file is part of gitg - git repository view_paneler
+ *
+ * Copyright (C) 2009 - Jesse van den Kieboom
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GITG_REVISION_FILES_VIEW_PANEL_H__
+#define __GITG_REVISION_FILES_VIEW_PANEL_H__
+
+#include <gtk/gtk.h>
+#include <libgitg/gitg-repository.h>
+#include <libgitg/gitg-revision.h>
+
+G_BEGIN_DECLS
+
+#define GITG_TYPE_REVISION_FILES_VIEW_PANEL (gitg_revision_files_view_panel_get_type ())
+#define GITG_REVISION_FILES_VIEW_PANEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GITG_TYPE_REVISION_FILES_VIEW_PANEL, GitgRevisionFilesViewPanel))
+#define GITG_REVISION_FILES_VIEW_PANEL_CONST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GITG_TYPE_REVISION_FILES_VIEW_PANEL, GitgRevisionFilesViewPanel const))
+#define GITG_REVISION_FILES_VIEW_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GITG_TYPE_REVISION_FILES_VIEW_PANEL, GitgRevisionFilesViewPanelClass))
+#define GITG_IS_REVISION_FILES_VIEW_PANEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GITG_TYPE_REVISION_FILES_VIEW_PANEL))
+#define GITG_IS_REVISION_FILES_VIEW_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GITG_TYPE_REVISION_FILES_VIEW_PANEL))
+#define GITG_REVISION_FILES_VIEW_PANEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GITG_TYPE_REVISION_FILES_VIEW_PANEL, GitgRevisionFilesViewPanelClass))
+
+typedef struct _GitgRevisionFilesViewPanel GitgRevisionFilesViewPanel;
+typedef struct _GitgRevisionFilesViewPanelClass GitgRevisionFilesViewPanelClass;
+typedef struct _GitgRevisionFilesViewPanelPrivate GitgRevisionFilesViewPanelPrivate;
+
+struct _GitgRevisionFilesViewPanel
+{
+ GObject parent;
+
+ GitgRevisionFilesViewPanelPrivate *priv;
+};
+
+struct _GitgRevisionFilesViewPanelClass
+{
+ GObjectClass parent_class;
+};
+
+GType gitg_revision_files_view_panel_get_type (void) G_GNUC_CONST;
+GType gitg_revision_files_view_get_type (void) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif /* __GITG_REVISION_FILES_VIEW_PANEL_H__ */
diff --git a/gitg/gitg-revision-files-view.ui b/gitg/gitg-revision-files-view.ui
new file mode 100644
index 0000000..4d490c8
--- /dev/null
+++ b/gitg/gitg-revision-files-view.ui
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<interface>
+ <object class="GitgRevisionFilesView" id="revision_files_view">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="position">200</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolled_window_revision_files">
+ <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="GtkTreeView" id="revision_files">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">False</property>
+ <child>
+ <object class="GtkTreeViewColumn" id="revision_files_column">
+ <property name="title">Filename</property>
+ <child>
+ <object class="GtkCellRendererPixbuf" id="renderer_icon"/>
+ <attributes>
+ <attribute name="pixbuf">0</attribute>
+ </attributes>
+ </child>
+ <child>
+ <object class="GtkCellRendererText" id="renderer_date"/>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">False</property>
+ <property name="shrink">True</property>
+ </packing>
+ </child>
+ <child>
+ <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_files_contents">
+ <property name="editable">False</property>
+ <property name="show_line_numbers">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">True</property>
+ <property name="shrink">True</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/gitg/gitg-revision-panel.c b/gitg/gitg-revision-panel.c
new file mode 100644
index 0000000..e575be2
--- /dev/null
+++ b/gitg/gitg-revision-panel.c
@@ -0,0 +1,67 @@
+#include "gitg-revision-panel.h"
+
+G_DEFINE_INTERFACE (GitgRevisionPanel, gitg_revision_panel, G_TYPE_INVALID)
+
+/* Default implementation */
+static gchar *
+gitg_revision_panel_get_label_default (GitgRevisionPanel *panel)
+{
+ g_return_val_if_reached (NULL);
+}
+
+static GtkWidget *
+gitg_revision_panel_get_panel_default (GitgRevisionPanel *panel)
+{
+ g_return_val_if_reached (NULL);
+}
+
+static void
+gitg_revision_panel_update_default (GitgRevisionPanel *panel,
+ GitgRepository *repository,
+ GitgRevision *revision)
+{
+ /* No default implementation */
+}
+
+static void
+gitg_revision_panel_default_init (GitgRevisionPanelInterface *iface)
+{
+ static gboolean initialized = FALSE;
+
+ iface->get_label = gitg_revision_panel_get_label_default;
+ iface->get_panel = gitg_revision_panel_get_panel_default;
+ iface->update = gitg_revision_panel_update_default;
+
+ if (!initialized)
+ {
+ initialized = TRUE;
+ }
+}
+
+gchar *
+gitg_revision_panel_get_label (GitgRevisionPanel *panel)
+{
+ g_return_val_if_fail (GITG_IS_REVISION_PANEL (panel), NULL);
+
+ return GITG_REVISION_PANEL_GET_INTERFACE (panel)->get_label (panel);
+}
+
+GtkWidget *
+gitg_revision_panel_get_panel (GitgRevisionPanel *panel)
+{
+ g_return_val_if_fail (GITG_IS_REVISION_PANEL (panel), NULL);
+
+ return GITG_REVISION_PANEL_GET_INTERFACE (panel)->get_panel (panel);
+}
+
+void
+gitg_revision_panel_update (GitgRevisionPanel *panel,
+ GitgRepository *repository,
+ GitgRevision *revision)
+{
+ g_return_if_fail (GITG_IS_REVISION_PANEL (panel));
+
+ GITG_REVISION_PANEL_GET_INTERFACE (panel)->update (panel,
+ repository,
+ revision);
+}
diff --git a/gitg/gitg-revision-panel.h b/gitg/gitg-revision-panel.h
new file mode 100644
index 0000000..d0a7c10
--- /dev/null
+++ b/gitg/gitg-revision-panel.h
@@ -0,0 +1,39 @@
+#ifndef __GITG_REVISION_PANEL_H__
+#define __GITG_REVISION_PANEL_H__
+
+#include <gtk/gtk.h>
+#include <libgitg/gitg-repository.h>
+
+G_BEGIN_DECLS
+
+#define GITG_TYPE_REVISION_PANEL (gitg_revision_panel_get_type ())
+#define GITG_REVISION_PANEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GITG_TYPE_REVISION_PANEL, GitgRevisionPanel))
+#define GITG_IS_REVISION_PANEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GITG_TYPE_REVISION_PANEL))
+#define GITG_REVISION_PANEL_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GITG_TYPE_REVISION_PANEL, GitgRevisionPanelInterface))
+
+typedef struct _GitgRevisionPanel GitgRevisionPanel;
+typedef struct _GitgRevisionPanelInterface GitgRevisionPanelInterface;
+
+struct _GitgRevisionPanelInterface
+{
+ GTypeInterface parent;
+
+ void (*update) ( GitgRevisionPanel *panel,
+ GitgRepository *repository,
+ GitgRevision *revision);
+
+ gchar *(*get_label) (GitgRevisionPanel *panel);
+ GtkWidget *(*get_panel) (GitgRevisionPanel *panel);
+};
+
+GType gitg_revision_panel_get_type (void) G_GNUC_CONST;
+
+GtkWidget *gitg_revision_panel_get_panel (GitgRevisionPanel *panel);
+gchar *gitg_revision_panel_get_label (GitgRevisionPanel *panel);
+void gitg_revision_panel_update (GitgRevisionPanel *panel,
+ GitgRepository *repository,
+ GitgRevision *revision);
+
+G_END_DECLS
+
+#endif /* __GITG_REVISION_PANEL_H__ */
diff --git a/gitg/gitg-revision-view.ui b/gitg/gitg-revision-view.ui
new file mode 100644
index 0000000..b106888
--- /dev/null
+++ b/gitg/gitg-revision-view.ui
@@ -0,0 +1,241 @@
+<?xml version="1.0"?>
+<interface>
+ <object class="GitgRevisionView" id="revision_view">
+ <property name="visible">True</property>
+ <property name="spacing">3</property>
+ <child>
+ <object class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="n_rows">5</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">6</property>
+ <property name="row_spacing">2</property>
+ <child>
+ <object class="GtkTable" id="table_parents">
+ <property name="visible">True</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">3</property>
+ <property name="row_spacing">2</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_subject">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="use_markup">True</property>
+ <property name="selectable">True</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_END</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_date">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="use_markup">True</property>
+ <property name="selectable">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_author">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="use_markup">True</property>
+ <property name="selectable">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_sha">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="use_markup">True</property>
+ <property name="selectable">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_parent_lbl">
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="yalign">0</property>
+ <property name="label" translatable="yes">Parent:</property>
+ </object>
+ <packing>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_subject_lbl">
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">Subject:</property>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_date_lbl">
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">Date:</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_author_lbl">
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">Author:</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_sha_lbl">
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">SHA:</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">3</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHSeparator" id="hseparator1">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHPaned" id="hpaned_revision_view">
+ <property name="visible">True</property>
+ <property name="position">200</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolled_window_revision_files">
+ <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="GtkTreeView" id="tree_view_revision_files">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">False</property>
+ <child>
+ <object class="GtkTreeViewColumn" id="revision_files_column_icon">
+ <property name="sizing">fixed</property>
+ <property name="fixed_width">20</property>
+ <property name="title">Icon</property>
+ <child>
+ <object class="GtkCellRendererPixbuf" id="revision_files_cell_renderer_icon"/>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="revision_files_column_name">
+ <property name="title">Filename</property>
+ <child>
+ <object class="GtkCellRendererText" id="revision_files_cell_renderer_name"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">False</property>
+ <property name="shrink">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolled_window_details">
+ <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="GitgDiffView" id="revision_diff">
+ <property name="editable">False</property>
+ <property name="cursor_visible">False</property>
+ <property name="show_line_numbers">False</property>
+ <property name="tab_width">4</property>
+ <property name="diff_enabled">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">True</property>
+ <property name="shrink">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/gitg/gitg-utils.c b/gitg/gitg-utils.c
index 570a9c1..61df5ac 100644
--- a/gitg/gitg-utils.c
+++ b/gitg/gitg-utils.c
@@ -164,23 +164,23 @@ gitg_utils_set_monospace_font(GtkWidget *widget)
}
GtkBuilder *
-gitg_utils_new_builder(gchar const *filename)
+gitg_utils_new_builder (gchar const *filename)
{
- GtkBuilder *b = gtk_builder_new();
+ GtkBuilder *b = gtk_builder_new ();
GError *error = NULL;
- gchar *path = gitg_dirs_get_data_filename("ui", filename, NULL);
+ gchar *path = gitg_dirs_get_data_filename ("ui", filename, NULL);
- if (!gtk_builder_add_from_file(b, path, &error))
+ if (!gtk_builder_add_from_file (b, path, &error))
{
- g_critical("Could not open UI file: %s (%s)", path, error->message);
- g_error_free(error);
+ g_critical ("Could not open UI file: %s (%s)", path, error->message);
+ g_error_free (error);
- g_free(path);
- exit(1);
+ g_free (path);
+ exit (1);
}
- g_free(path);
+ g_free (path);
return b;
}
diff --git a/gitg/gitg-utils.h b/gitg/gitg-utils.h
index e5f5e42..f202fb7 100644
--- a/gitg/gitg-utils.h
+++ b/gitg/gitg-utils.h
@@ -24,6 +24,7 @@
#define __GITG_UTILS_H__
#include <glib.h>
+#include <gio/gio.h>
#include <gtksourceview/gtksourcelanguagemanager.h>
#include <gtksourceview/gtksourcelanguage.h>
@@ -42,7 +43,7 @@ GtkSourceLanguage *gitg_utils_get_language(gchar const *filename, gchar const *c
gchar *gitg_utils_get_monospace_font_name(void);
void gitg_utils_set_monospace_font(GtkWidget *widget);
-GtkBuilder *gitg_utils_new_builder(gchar const *filename);
+GtkBuilder *gitg_utils_new_builder (gchar const *filename);
gint gitg_utils_sort_names(gchar const *s1, gchar const *s2);
diff --git a/gitg/gitg-window.c b/gitg/gitg-window.c
index a847ff2..e201059 100644
--- a/gitg/gitg-window.c
+++ b/gitg/gitg-window.c
@@ -34,8 +34,6 @@
#include "gitg-data-binding.h"
#include "gitg-dirs.h"
#include "gitg-window.h"
-#include "gitg-revision-view.h"
-#include "gitg-revision-tree-view.h"
#include "gitg-cell-renderer-path.h"
#include "gitg-commit-view.h"
#include "gitg-settings.h"
@@ -45,6 +43,8 @@
#include "gitg-branch-actions.h"
#include "gitg-preferences.h"
#include "gitg-utils.h"
+#include "gitg-revision-panel.h"
+#include "gitg-revision-files-view-panel.h"
#define DYNAMIC_ACTION_DATA_KEY "GitgDynamicActionDataKey"
#define DYNAMIC_ACTION_DATA_REMOTE_KEY "GitgDynamicActionDataRemoteKey"
@@ -70,8 +70,6 @@ struct _GitgWindowPrivate
GtkNotebook *notebook_main;
GtkTreeView *tree_view;
GtkStatusbar *statusbar;
- GitgRevisionView *revision_view;
- GitgRevisionTreeView *revision_tree_view;
GitgCommitView *commit_view;
GtkWidget *search_popup;
GtkComboBox *combo_branches;
@@ -82,6 +80,7 @@ struct _GitgWindowPrivate
GtkWidget *hpaned_commit1;
GtkWidget *hpaned_commit2;
GtkWidget *vpaned_commit;
+ GtkNotebook *notebook_revision;
GtkActionGroup *edit_group;
GtkActionGroup *repository_group;
@@ -102,6 +101,8 @@ struct _GitgWindowPrivate
GList *branch_actions;
GitgHash select_on_load;
+
+ GSList *revision_panels;
};
static gboolean on_tree_view_motion (GtkTreeView *treeview,
@@ -194,7 +195,77 @@ gitg_window_finalize (GObject *object)
g_list_free (copy);
- G_OBJECT_CLASS(gitg_window_parent_class)->finalize (object);
+ G_OBJECT_CLASS (gitg_window_parent_class)->finalize (object);
+}
+
+static void
+on_revision_panel_mapped (GtkWidget *page,
+ GitgWindow *window)
+{
+ gint nth;
+ GitgRevisionPanel *panel;
+ GitgRevision *revision = NULL;
+ GtkTreeModel *model;
+ GtkTreeSelection *selection;
+ GtkTreeIter iter;
+
+ selection = gtk_tree_view_get_selection (window->priv->tree_view);
+
+ if (gtk_tree_selection_get_selected (selection, &model, &iter))
+ {
+ gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, 0, &revision, -1);
+ }
+
+ if (!revision)
+ {
+ return;
+ }
+
+ nth = gtk_notebook_page_num (window->priv->notebook_revision,
+ page);
+
+ panel = g_slist_nth_data (window->priv->revision_panels, nth);
+
+ gitg_revision_panel_update (panel,
+ window->priv->repository,
+ revision);
+
+ gitg_revision_unref (revision);
+}
+
+static void
+add_revision_panel (GitgWindow *window,
+ GType panel_type)
+{
+ GitgRevisionPanel *panel;
+ gchar *label;
+ GtkWidget *label_widget;
+ GtkWidget *page;
+
+ g_return_if_fail (g_type_is_a (panel_type, GITG_TYPE_REVISION_PANEL));
+
+ panel = g_object_new (panel_type, NULL);
+
+ window->priv->revision_panels = g_slist_append (window->priv->revision_panels,
+ panel);
+
+ label = gitg_revision_panel_get_label (panel);
+ label_widget = gtk_label_new (label);
+ gtk_widget_show (label_widget);
+
+ g_free (label);
+
+ page = gitg_revision_panel_get_panel (panel);
+ gtk_widget_show (page);
+
+ g_signal_connect (page,
+ "map",
+ G_CALLBACK (on_revision_panel_mapped),
+ window);
+
+ gtk_notebook_append_page (window->priv->notebook_revision,
+ page,
+ label_widget);
}
static void
@@ -204,19 +275,29 @@ on_selection_changed (GtkTreeSelection *selection,
GtkTreeModel *model;
GtkTreeIter iter;
GitgRevision *revision = NULL;
+ GSList *item;
if (gtk_tree_selection_get_selected (selection, &model, &iter))
{
gtk_tree_model_get (GTK_TREE_MODEL(model), &iter, 0, &revision, -1);
}
- gitg_revision_view_update (window->priv->revision_view,
- window->priv->repository,
- revision);
+ gint i = 0;
+
+ for (item = window->priv->revision_panels; item; item = g_slist_next (item))
+ {
+ GtkWidget *page;
+
+ page = gtk_notebook_get_nth_page (window->priv->notebook_revision,
+ i++);
- gitg_revision_tree_view_update (window->priv->revision_tree_view,
- window->priv->repository,
- revision);
+ if (gtk_widget_get_mapped (page) || !revision)
+ {
+ gitg_revision_panel_update (item->data,
+ window->priv->repository,
+ revision);
+ }
+ }
if (revision)
{
@@ -423,14 +504,6 @@ goto_hash (GitgWindow *window,
}
static void
-on_parent_activated (GitgRevisionView *view,
- gchar *hash,
- GitgWindow *window)
-{
- goto_hash (window, hash);
-}
-
-static void
on_renderer_path (GtkTreeViewColumn *column,
GitgCellRendererPath *renderer,
GtkTreeModel *model,
@@ -605,10 +678,6 @@ restore_state (GitgWindow *window)
gitg_utils_restore_pane_position (GTK_PANED(window->priv->hpaned_commit2),
gitg_settings_get_hpaned_commit2_position (settings, 200),
TRUE);
-
- gitg_utils_restore_pane_position (GTK_PANED(window->priv->revision_tree_view),
- gitg_settings_get_revision_tree_view_position (settings, -1),
- FALSE);
}
static void
@@ -846,18 +915,15 @@ gitg_window_parser_finished (GtkBuildable *buildable,
window->priv->notebook_main = GTK_NOTEBOOK (gtk_builder_get_object (builder,
"notebook_main"));
+ window->priv->notebook_revision = GTK_NOTEBOOK (gtk_builder_get_object (builder,
+ "notebook_revision"));
+
window->priv->tree_view = GTK_TREE_VIEW (gtk_builder_get_object (builder,
"tree_view_rv"));
window->priv->statusbar = GTK_STATUSBAR (gtk_builder_get_object (builder,
"statusbar"));
- window->priv->revision_view = GITG_REVISION_VIEW (gtk_builder_get_object (builder,
- "revision_view"));
-
- window->priv->revision_tree_view = GITG_REVISION_TREE_VIEW (gtk_builder_get_object (builder,
- "revision_tree_view"));
-
window->priv->commit_view = GITG_COMMIT_VIEW (gtk_builder_get_object (builder,
"vpaned_commit"));
@@ -881,6 +947,9 @@ gitg_window_parser_finished (GtkBuildable *buildable,
gtk_builder_connect_signals (builder, window);
+ // Initialize revision panels
+ add_revision_panel (window, GITG_TYPE_REVISION_FILES_VIEW_PANEL);
+
// Connect signals
GtkTreeSelection *selection = gtk_tree_view_get_selection (window->priv->tree_view);
g_signal_connect (selection,
@@ -888,11 +957,6 @@ gitg_window_parser_finished (GtkBuildable *buildable,
G_CALLBACK(on_selection_changed),
window);
- g_signal_connect (window->priv->revision_view,
- "parent-activated",
- G_CALLBACK(on_parent_activated),
- window);
-
g_signal_connect (window->priv->tree_view,
"motion-notify-event",
G_CALLBACK(on_tree_view_motion),
@@ -968,10 +1032,6 @@ save_state (GitgWindow *window)
position);
}
- position = gtk_paned_get_position (GTK_PANED (window->priv->revision_tree_view));
- gitg_settings_set_revision_tree_view_position (settings,
- position);
-
gitg_settings_save (settings);
}
@@ -1000,6 +1060,11 @@ gitg_window_destroy (GtkObject *object)
if (!window->priv->destroy_has_run)
{
gtk_tree_view_set_model (window->priv->tree_view, NULL);
+
+ g_slist_foreach (window->priv->revision_panels, (GFunc)g_object_unref, NULL);
+ g_slist_free (window->priv->revision_panels);
+
+ window->priv->revision_panels = NULL;
window->priv->destroy_has_run = TRUE;
}
@@ -1740,9 +1805,6 @@ load_repository (GitgWindow *window,
gitg_commit_view_set_repository (window->priv->commit_view,
window->priv->repository);
- gitg_revision_view_set_repository (window->priv->revision_view,
- window->priv->repository);
-
add_recent_item (window);
}
else
@@ -1752,9 +1814,6 @@ load_repository (GitgWindow *window,
gitg_commit_view_set_repository (window->priv->commit_view,
NULL);
- gitg_revision_view_set_repository (window->priv->revision_view,
- NULL);
-
update_window_title (window);
}
diff --git a/gitg/gitg-window.ui b/gitg/gitg-window.ui
index 54173eb..76117df 100644
--- a/gitg/gitg-window.ui
+++ b/gitg/gitg-window.ui
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<interface>
- <!-- interface-requires gtk+ 2.16 -->
- <!-- interface-requires gitg 0.2 -->
+ <!-- interface-requires gtk+ 2.20 -->
+ <!-- interface-requires gitg 0.0.6 -->
<!-- interface-requires sourceview2 0.0 -->
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkAdjustment" id="adjustment_context">
@@ -147,335 +147,10 @@
</packing>
</child>
<child>
- <object class="GtkNotebook" id="notebook">
+ <object class="GtkNotebook" id="notebook_revision">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="border_width">6</property>
- <child>
- <object class="GitgRevisionView" id="revision_view">
- <property name="visible">True</property>
- <property name="spacing">3</property>
- <child>
- <object class="GtkTable" id="table1">
- <property name="visible">True</property>
- <property name="n_rows">5</property>
- <property name="n_columns">2</property>
- <property name="column_spacing">6</property>
- <property name="row_spacing">2</property>
- <child>
- <object class="GtkTable" id="table_parents">
- <property name="visible">True</property>
- <property name="n_columns">2</property>
- <property name="column_spacing">3</property>
- <property name="row_spacing">2</property>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label_subject">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="use_markup">True</property>
- <property name="selectable">True</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_END</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label_date">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="use_markup">True</property>
- <property name="selectable">True</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label_author">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="use_markup">True</property>
- <property name="selectable">True</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label_sha">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="use_markup">True</property>
- <property name="selectable">True</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label_parent_lbl">
- <property name="visible">True</property>
- <property name="xalign">1</property>
- <property name="yalign">0</property>
- <property name="label" translatable="yes">Parent:</property>
- </object>
- <packing>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label_subject_lbl">
- <property name="visible">True</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">Subject:</property>
- </object>
- <packing>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label_date_lbl">
- <property name="visible">True</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">Date:</property>
- </object>
- <packing>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label_author_lbl">
- <property name="visible">True</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">Author:</property>
- </object>
- <packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label_sha_lbl">
- <property name="visible">True</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">SHA:</property>
- <property name="use_markup">True</property>
- </object>
- <packing>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="padding">3</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkHSeparator" id="hseparator1">
- <property name="visible">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkHPaned" id="hpaned_revision_view">
- <property name="visible">True</property>
- <property name="position">200</property>
- <child>
- <object class="GtkScrolledWindow" id="scrolled_window_revision_files">
- <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="GtkTreeView" id="tree_view_revision_files">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="headers_visible">False</property>
- <child>
- <object class="GtkTreeViewColumn" id="revision_files_column_icon">
- <property name="sizing">fixed</property>
- <property name="fixed_width">20</property>
- <property name="title">Icon</property>
- <child>
- <object class="GtkCellRendererPixbuf" id="revision_files_cell_renderer_icon"/>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="revision_files_column_name">
- <property name="title">Filename</property>
- <child>
- <object class="GtkCellRendererText" id="revision_files_cell_renderer_name"/>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="resize">False</property>
- <property name="shrink">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkScrolledWindow" id="scrolled_window_details">
- <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="GitgDiffView" id="revision_diff">
- <property name="editable">False</property>
- <property name="cursor_visible">False</property>
- <property name="show_line_numbers">False</property>
- <property name="tab_width">4</property>
- <property name="diff_enabled">True</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="resize">True</property>
- <property name="shrink">True</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- </child>
- <child type="tab">
- <object class="GtkLabel" id="label_details">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Details</property>
- </object>
- <packing>
- <property name="tab_fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GitgRevisionTreeView" id="revision_tree_view">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="position">200</property>
- <child>
- <object class="GtkScrolledWindow" id="scrolled_window_revision_tree">
- <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="GtkTreeView" id="revision_tree">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="headers_visible">False</property>
- <child>
- <object class="GtkTreeViewColumn" id="revision_tree_column">
- <property name="title">Filename</property>
- <child>
- <object class="GtkCellRendererPixbuf" id="renderer_icon"/>
- <attributes>
- <attribute name="pixbuf">0</attribute>
- </attributes>
- </child>
- <child>
- <object class="GtkCellRendererText" id="renderer_date"/>
- <attributes>
- <attribute name="text">1</attribute>
- </attributes>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="resize">False</property>
- <property name="shrink">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkScrolledWindow" id="scrolled_window_tree_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_tree_contents">
- <property name="editable">False</property>
- <property name="show_line_numbers">True</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="resize">True</property>
- <property name="shrink">True</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child type="tab">
- <object class="GtkLabel" id="label_tree">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Tree</property>
- </object>
- <packing>
- <property name="position">1</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
</object>
<packing>
<property name="resize">False</property>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]