From cc6ab3cd21b27c0fabd3b46bccf9b8ccd41cc885 Mon Sep 17 00:00:00 2001 From: Jakob Bornecrantz Date: Sun, 29 Nov 2009 15:01:28 +0000 Subject: Make the statusbar show what ever is in the treemodel Entities like textures set data in the treemodel and we later retrive that to show in the UI. This could be done a bit differently but we want to move towards a more ModelViewStore model. So we can easily add new UI elements without having to change the code that talks rbug to the driver. --- src/main.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/program.h | 4 ++++ 2 files changed, 67 insertions(+) diff --git a/src/main.c b/src/main.c index 85ec359..830b309 100644 --- a/src/main.c +++ b/src/main.c @@ -149,6 +149,61 @@ static void changed(GtkTreeSelection *s, gpointer data) } } +/** + * Update the statusbar. + * + * Called when the data of the currently view entity + * has change or a different entity is viewed. + */ +static void update_statusbar(struct program *p) +{ + GtkTreeModel *model = GTK_TREE_MODEL(p->main.treestore); + GValue string; + + gtk_statusbar_pop(p->main.statusbar, p->main.sb_id); + + if (!p->viewed.id) + return; + + memset(&string, 0, sizeof(string)); + gtk_tree_model_get_value(model, &p->viewed.iter, + COLUMN_INFO_LONG, &string); + + if (g_value_get_string(&string)) + gtk_statusbar_push(p->main.statusbar, p->main.sb_id, g_value_get_string(&string)); + + g_value_unset(&string); +} + +/** + * Update the UI on changes. + * + * When ever the database holding all the object infromation + * changes check if the currently selected item changed and + * update the UI. For now only the status bar. + */ +static void row_changed(GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + struct program *p) +{ + GValue id; + + (void)path; + + memset(&id, 0, sizeof(id)); + + gtk_tree_model_get_value(model, iter, COLUMN_ID, &id); + + g_assert(G_VALUE_HOLDS_UINT64(&id)); + + if (p->viewed.id == g_value_get_uint64(&id)) { + update_statusbar(p); + } + + g_value_unset(&id); +} + static void refresh(GtkWidget *widget, gpointer data) { struct program *p = (struct program *)data; @@ -331,6 +386,8 @@ void main_set_viewed(GtkTreeIter *iter, gboolean force_update, struct program *p memset(&p->viewed, 0, sizeof(p->viewed)); } + update_statusbar(p); + if (p->viewed.id != old_id || p->viewed.type != old_type) { if (old_id) { @@ -368,6 +425,7 @@ void main_window_create(struct program *p) GtkWidget *textview_scrolled; GtkTreeView *treeview; GtkTreeStore *treestore; + GtkStatusbar *statusbar; GObject *tool_quit; GObject *tool_refresh; @@ -400,6 +458,7 @@ void main_window_create(struct program *p) treeview = GTK_TREE_VIEW(gtk_builder_get_object(builder, "treeview")); treestore = GTK_TREE_STORE(gtk_builder_get_object(builder, "treestore")); selection = G_OBJECT(gtk_tree_view_get_selection(treeview)); + statusbar = GTK_STATUSBAR(gtk_builder_get_object(builder, "statusbar")); context_view = GTK_WIDGET(gtk_builder_get_object(builder, "context_view")); textview_scrolled = GTK_WIDGET(gtk_builder_get_object(builder, "textview_scrolled")); @@ -428,10 +487,13 @@ void main_window_create(struct program *p) /* manualy set up signals */ g_signal_connect(selection, "changed", G_CALLBACK(changed), p); + g_signal_connect(treestore, "row-changed", G_CALLBACK(row_changed), p); g_signal_connect(tool_quit, "clicked", G_CALLBACK(destroy), p); g_signal_connect(tool_refresh, "clicked", G_CALLBACK(refresh), p); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), p); + p->main.sb_id = gtk_statusbar_get_context_id(statusbar, "texture"); + p->context.ra[CTX_VIEW_FRAGMENT] = gtk_builder_get_object(builder, "ra_ctx_fragment"); p->context.ra[CTX_VIEW_VERTEX] = gtk_builder_get_object(builder, "ra_ctx_vertex"); p->context.ra[CTX_VIEW_GEOM] = gtk_builder_get_object(builder, "ra_ctx_geom"); @@ -469,6 +531,7 @@ void main_window_create(struct program *p) p->main.textview = textview; p->main.treeview = treeview; p->main.treestore = treestore; + p->main.statusbar = statusbar; p->main.context_view = context_view; p->main.textview_scrolled = textview_scrolled; diff --git a/src/program.h b/src/program.h index 462e714..a04b456 100644 --- a/src/program.h +++ b/src/program.h @@ -114,6 +114,10 @@ struct program GtkTreeView *treeview; GtkTreeStore *treestore; GtkDrawingArea *draw; + GtkStatusbar *statusbar; + + /* status bar context id */ + guint sb_id; GtkTreeIter top; } main; -- cgit v1.2.3