Merge branch 'master' of ssh://jessevdk@git.gnome.org/git/gitg

This commit is contained in:
Jesse van den Kieboom 2009-02-06 22:06:22 +01:00
commit 34bfbcc3b6
12 changed files with 184 additions and 32 deletions

View file

@ -49,6 +49,7 @@ PKG_CHECK_MODULES(PACKAGE, [
gtksourceview-2.0
gio-2.0
gmodule-2.0
gconf-2.0
])
AC_SUBST(PACKAGE_CFLAGS)

View file

@ -695,9 +695,7 @@ gitg_commit_view_parser_finished(GtkBuildable *buildable, GtkBuilder *builder)
g_object_unref(pixbuf);
}
PangoFontDescription *fd = pango_font_description_from_string("Monospace 10");
gtk_widget_modify_font(GTK_WIDGET(self->priv->changes_view), fd);
pango_font_description_free(fd);
gitg_utils_set_monospace_font(GTK_WIDGET(self->priv->changes_view));
GtkTextBuffer *buffer = initialize_buffer(self);
gtk_text_view_set_buffer(GTK_TEXT_VIEW(self->priv->changes_view), buffer);

View file

@ -108,8 +108,13 @@ gitg_commit_set_property(GObject *object, guint prop_id, const GValue *value, GP
switch (prop_id)
{
case PROP_REPOSITORY:
self->priv->repository = g_value_get_object(value);
{
if (self->priv->repository)
g_object_unref(self->priv->repository);
self->priv->repository = g_value_dup_object(value);
g_signal_connect_swapped(self->priv->repository, "load", G_CALLBACK(gitg_commit_refresh), self);
}
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);

View file

@ -360,12 +360,10 @@ expand_lane(GitgLanes *lanes, CollapsedLane *lane)
if (cnt == INACTIVE_COLLAPSE)
break;
next = ensure_correct_index(revision, index);
/* insert new lane at the index */
GitgLane *copy = gitg_lane_copy(ln);
GSList *lns = gitg_revision_get_lanes(revision);
GSList *lns = gitg_revision_get_lanes(revision);
if (!item->next || cnt + 1 == INACTIVE_COLLAPSE)
{
@ -377,6 +375,7 @@ expand_lane(GitgLanes *lanes, CollapsedLane *lane)
}
else
{
next = ensure_correct_index(GITG_REVISION(item->next->data), index);
copy->from = g_slist_prepend(NULL, GINT_TO_POINTER((gint)next));
/* update merge indices */

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

@ -355,10 +355,7 @@ gitg_revision_tree_view_parser_finished(GtkBuildable *buildable, GtkBuilder *bui
gtk_text_view_set_buffer(GTK_TEXT_VIEW(tree_view->priv->contents), GTK_TEXT_BUFFER(gtk_source_buffer_new(NULL)));
PangoFontDescription *fd = pango_font_description_from_string("Monospace 10");
gtk_widget_modify_font(GTK_WIDGET(tree_view->priv->contents), fd);
pango_font_description_free(fd);
gitg_utils_set_monospace_font(GTK_WIDGET(tree_view->priv->contents));
gtk_tree_view_set_model(tree_view->priv->tree_view, GTK_TREE_MODEL(tree_view->priv->store));
GtkTreeSelection *selection = gtk_tree_view_get_selection(tree_view->priv->tree_view);

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();
@ -73,10 +83,7 @@ gitg_revision_view_parser_finished(GtkBuildable *buildable, GtkBuilder *builder)
GtkSourceStyleScheme *scheme = gtk_source_style_scheme_manager_get_scheme(schememanager, "gitg");
gtk_source_buffer_set_style_scheme(buffer, scheme);
PangoFontDescription *fd = pango_font_description_from_string("Monospace 10");
gtk_widget_modify_font(GTK_WIDGET(rvv->priv->diff), fd);
pango_font_description_free(fd);
gitg_utils_set_monospace_font(GTK_WIDGET(rvv->priv->diff));
gtk_text_view_set_buffer(GTK_TEXT_VIEW(rvv->priv->diff), GTK_TEXT_BUFFER(buffer));
gchar const *lbls[] = {
@ -107,17 +114,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 +283,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 +409,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

@ -309,8 +309,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

@ -1,5 +1,6 @@
#include <string.h>
#include <glib.h>
#include <gconf/gconf-client.h>
#include "gitg-utils.h"
@ -417,3 +418,33 @@ gitg_utils_menu_position_under_tree_view (GtkMenu *menu,
tree);
}
}
gchar *
gitg_utils_get_monospace_font_name()
{
GConfClient *client = gconf_client_get_default();
gchar *name = gconf_client_get_string(client, "/desktop/gnome/interface/monospace_font_name", NULL);
g_object_unref(client);
return name;
}
void
gitg_utils_set_monospace_font(GtkWidget *widget)
{
gchar *name = gitg_utils_get_monospace_font_name();
if (name)
{
PangoFontDescription *description = pango_font_description_from_string(name);
if (description)
{
gtk_widget_modify_font(widget, description);
pango_font_description_free(description);
}
}
g_free(name);
}

View file

@ -35,5 +35,8 @@ gint gitg_utils_sort_names(gchar const *s1, gchar const *s2);
void gitg_utils_menu_position_under_widget(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data);
void gitg_utils_menu_position_under_tree_view(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data);
gchar *gitg_utils_get_monospace_font_name();
void gitg_utils_set_monospace_font(GtkWidget *widget);
#endif /* __GITG_UTILS_H__ */

View file

@ -712,6 +712,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);
@ -726,6 +727,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"));