Added showing parent subjects in detailed revision view

This commit is contained in:
Jesse van den Kieboom 2009-02-05 22:35:51 +01:00
parent 39de0a4fb6
commit 8629a40684
5 changed files with 137 additions and 16 deletions

View file

@ -307,11 +307,8 @@ do_clear(GitgRepository *repository, gboolean emit)
repository->priv->allocated = 0;
/* clear hash tables */
g_hash_table_ref(repository->priv->hashtable);
g_hash_table_ref(repository->priv->refs);
g_hash_table_destroy(repository->priv->hashtable);
g_hash_table_destroy(repository->priv->refs);
g_hash_table_remove_all(repository->priv->hashtable);
g_hash_table_remove_all(repository->priv->refs);
}
static void
@ -688,6 +685,19 @@ gitg_repository_clear(GitgRepository *repository)
do_clear(repository, TRUE);
}
GitgRevision *
gitg_repository_lookup(GitgRepository *store, gchar const *hash)
{
g_return_val_if_fail(GITG_IS_REPOSITORY(store), NULL);
gpointer result = g_hash_table_lookup(store->priv->hashtable, hash);
if (!result)
return NULL;
return store->priv->storage[GPOINTER_TO_UINT(result)];
}
gboolean
gitg_repository_find_by_hash(GitgRepository *store, gchar const *hash, GtkTreeIter *iter)
{

View file

@ -52,6 +52,7 @@ void gitg_repository_clear(GitgRepository *repository);
gboolean gitg_repository_find_by_hash(GitgRepository *self, gchar const *hash, GtkTreeIter *iter);
gboolean gitg_repository_find(GitgRepository *store, GitgRevision *revision, GtkTreeIter *iter);
GitgRevision *gitg_repository_lookup(GitgRepository *store, gchar const *hash);
GSList *gitg_repository_get_refs(GitgRepository *repository);
GSList *gitg_repository_get_refs_for_hash(GitgRepository *repository, gchar const *hash);

View file

@ -4,11 +4,19 @@
#include <string.h>
#include "gitg-revision-view.h"
#include "gitg-revision.h"
#include "gitg-runner.h"
#include "gitg-utils.h"
#define GITG_REVISION_VIEW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), GITG_TYPE_REVISION_VIEW, GitgRevisionViewPrivate))
/* Properties */
enum
{
PROP_0,
PROP_REPOSITORY
};
/* Signals */
enum
{
@ -24,10 +32,12 @@ struct _GitgRevisionViewPrivate
GtkLabel *author;
GtkLabel *date;
GtkLabel *subject;
GtkVBox *parents;
GtkTable *parents;
GtkSourceView *diff;
GitgRunner *diff_runner;
GitgRepository *repository;
};
static void gitg_revision_view_buildable_iface_init(GtkBuildableIface *iface);
@ -61,7 +71,7 @@ gitg_revision_view_parser_finished(GtkBuildable *buildable, GtkBuilder *builder)
rvv->priv->author = GTK_LABEL(gtk_builder_get_object(builder, "label_author"));
rvv->priv->date = GTK_LABEL(gtk_builder_get_object(builder, "label_date"));
rvv->priv->subject = GTK_LABEL(gtk_builder_get_object(builder, "label_subject"));
rvv->priv->parents = GTK_VBOX(gtk_builder_get_object(builder, "vbox_parents"));
rvv->priv->parents = GTK_TABLE(gtk_builder_get_object(builder, "table_parents"));
rvv->priv->diff = GTK_SOURCE_VIEW(gtk_builder_get_object(builder, "revision_diff"));
GtkSourceLanguageManager *manager = gtk_source_language_manager_get_default();
@ -107,17 +117,67 @@ gitg_revision_view_finalize(GObject *object)
gitg_runner_cancel(self->priv->diff_runner);
g_object_unref(self->priv->diff_runner);
g_object_unref(self->priv->repository);
G_OBJECT_CLASS(gitg_revision_view_parent_class)->finalize(object);
}
static void
gitg_revision_view_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
GitgRevisionView *self = GITG_REVISION_VIEW(object);
switch (prop_id)
{
case PROP_REPOSITORY:
g_value_set_object(value, self->priv->repository);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
gitg_revision_view_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
{
GitgRevisionView *self = GITG_REVISION_VIEW(object);
switch (prop_id)
{
case PROP_REPOSITORY:
{
if (self->priv->repository)
g_object_unref(self->priv->repository);
self->priv->repository = g_value_dup_object(value);
}
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
gitg_revision_view_class_init(GitgRevisionViewClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS(klass);
object_class->finalize = gitg_revision_view_finalize;
object_class->set_property = gitg_revision_view_set_property;
object_class->get_property = gitg_revision_view_get_property;
g_object_class_install_property(object_class, PROP_REPOSITORY,
g_param_spec_object("repository",
"REPOSITORY",
"Repository",
GITG_TYPE_REPOSITORY,
G_PARAM_READWRITE));
signals[PARENT_ACTIVATED] =
g_signal_new("parent-activated",
G_OBJECT_CLASS_TYPE (object_class),
@ -226,19 +286,45 @@ update_parents(GitgRevisionView *self, GitgRevision *revision)
return;
gchar **parents = gitg_revision_get_parents(revision);
gchar **ptr;
gint num = g_strv_length(parents);
gint i;
for (ptr = parents; *ptr; ++ptr)
gtk_table_resize(self->priv->parents, num, 2);
GdkCursor *cursor = gdk_cursor_new(GDK_HAND1);
Hash hash;
for (i = 0; i < num; ++i)
{
GtkWidget *widget = make_parent_label(self, *ptr);
gtk_box_pack_start(GTK_BOX(self->priv->parents), widget, FALSE, TRUE, 0);
GtkWidget *widget = make_parent_label(self, parents[i]);
gtk_table_attach(self->priv->parents, widget, 0, 1, i, i + 1, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 0, 0);
gtk_widget_realize(widget);
GdkCursor *cursor = gdk_cursor_new(GDK_HAND1);
gdk_window_set_cursor(widget->window, cursor);
gdk_cursor_unref(cursor);
/* find subject */
gitg_utils_sha1_to_hash(parents[i], hash);
GitgRevision *revision = gitg_repository_lookup(self->priv->repository, hash);
if (revision)
{
GtkWidget *subject = gtk_label_new(NULL);
gchar *text = g_strdup_printf("(<i>%s</i>)", gitg_revision_get_subject(revision));
gtk_label_set_markup(GTK_LABEL(subject), text);
g_free(text);
gtk_widget_show(subject);
gtk_misc_set_alignment(GTK_MISC(subject), 0.0, 0.5);
gtk_label_set_ellipsize(GTK_LABEL(subject), PANGO_ELLIPSIZE_MIDDLE);
gtk_label_set_single_line_mode(GTK_LABEL(subject), TRUE);
gtk_table_attach(self->priv->parents, subject, 1, 2, i, i + 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_SHRINK, 0, 0);
}
}
gdk_cursor_unref(cursor);
g_strfreev(parents);
}
@ -326,3 +412,21 @@ gitg_revision_view_update(GitgRevisionView *self, GitgRepository *repository, Gi
// Update diff
update_diff(self, repository, revision);
}
void
gitg_revision_view_set_repository(GitgRevisionView *view, GitgRepository *repository)
{
g_return_if_fail(GITG_IS_REVISION_VIEW(view));
g_return_if_fail(repository == NULL || GITG_IS_REPOSITORY(repository));
if (view->priv->repository)
{
g_object_unref(view->priv->repository);
view->priv->repository = NULL;
}
if (repository)
view->priv->repository = g_object_ref(repository);
g_object_notify(G_OBJECT(view), "repository");
}

View file

@ -306,8 +306,12 @@
<property name="column_spacing">6</property>
<property name="row_spacing">2</property>
<child>
<object class="GtkVBox" id="vbox_parents">
<object class="GtkTable" id="table_parents">
<property name="visible">True</property>
<property name="n_rows">1</property>
<property name="n_columns">2</property>
<property name="column_spacing">3</property>
<property name="row_spacing">2</property>
</object>
<packing>
<property name="left_attach">1</property>

View file

@ -644,6 +644,7 @@ load_repository(GitgWindow *window, gchar const *path, gint argc, gchar const **
g_free(ar);
gitg_commit_view_set_repository(window->priv->commit_view, window->priv->repository);
gitg_revision_view_set_repository(window->priv->revision_view, window->priv->repository);
gchar *basename = g_path_get_basename(gitg_repository_get_path(window->priv->repository));
gchar *title = g_strdup_printf("%s - %s", _("gitg"), basename);
@ -658,6 +659,7 @@ load_repository(GitgWindow *window, gchar const *path, gint argc, gchar const **
{
clear_branches_combo(window, FALSE);
gitg_commit_view_set_repository(window->priv->commit_view, window->priv->repository);
gitg_revision_view_set_repository(window->priv->revision_view, window->priv->repository);
handle_no_gitdir(window);
gtk_window_set_title(GTK_WINDOW(window), _("gitg"));