[gnome-documents] manager: split GtkTreeModel/GtkTreeView base classes for BaseManagers
- From: Cosimo Cecchi <cosimoc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-documents] manager: split GtkTreeModel/GtkTreeView base classes for BaseManagers
- Date: Wed, 2 Nov 2011 20:48:52 +0000 (UTC)
commit d5a28f5851faa4e1ee2ef6670bb63e7eea641efb
Author: Cosimo Cecchi <cosimoc gnome org>
Date: Fri Oct 28 17:45:15 2011 -0400
manager: split GtkTreeModel/GtkTreeView base classes for BaseManagers
This will be useful in the process of moving the Sources treeview away
from the sidebar and into a separate search entry dropdown.
src/lib/gd-utils.c | 18 +++---
src/lib/gd-utils.h | 12 ++--
src/manager.js | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 150 insertions(+), 18 deletions(-)
---
diff --git a/src/lib/gd-utils.c b/src/lib/gd-utils.c
index e9eedd8..9734843 100644
--- a/src/lib/gd-utils.c
+++ b/src/lib/gd-utils.c
@@ -65,30 +65,30 @@ gd_store_set (GtkListStore *store,
}
/**
- * gd_create_sources_store:
+ * gd_create_item_store:
*
* Returns: (transfer full):
*/
GtkListStore *
-gd_create_sources_store (void)
+gd_create_item_store (void)
{
return gtk_list_store_new (3,
G_TYPE_STRING, // ID
G_TYPE_STRING, // NAME
- G_TYPE_BOOLEAN); // HEADING
+ G_TYPE_STRING); // HEADING_TEXT
}
void
-gd_sources_store_set (GtkListStore *store,
- GtkTreeIter *iter,
- const gchar *id,
- const gchar *name,
- gboolean heading)
+gd_item_store_set (GtkListStore *store,
+ GtkTreeIter *iter,
+ const gchar *id,
+ const gchar *name,
+ const gchar *heading_text)
{
gtk_list_store_set (store, iter,
0, id,
1, name,
- 2, heading,
+ 2, heading_text,
-1);
}
diff --git a/src/lib/gd-utils.h b/src/lib/gd-utils.h
index fca249d..b7f9bd4 100644
--- a/src/lib/gd-utils.h
+++ b/src/lib/gd-utils.h
@@ -33,12 +33,12 @@ void gd_store_set (GtkListStore *store,
GdkPixbuf *icon,
glong mtime);
-GtkListStore* gd_create_sources_store (void);
-void gd_sources_store_set (GtkListStore *store,
- GtkTreeIter *iter,
- const gchar *id,
- const gchar *name,
- gboolean heading);
+GtkListStore* gd_create_item_store (void);
+void gd_item_store_set (GtkListStore *store,
+ GtkTreeIter *iter,
+ const gchar *id,
+ const gchar *name,
+ const gchar *heading_text);
GtkListStore * gd_create_sidebar_store (void);
void gd_sidebar_store_set (GtkListStore *store,
diff --git a/src/manager.js b/src/manager.js
index 3a4cad4..814bbb9 100644
--- a/src/manager.js
+++ b/src/manager.js
@@ -19,16 +19,31 @@
*
*/
+const Gd = imports.gi.Gd;
+const Gdk = imports.gi.Gdk;
+const Gtk = imports.gi.Gtk;
+const Pango = imports.gi.Pango;
+
+const Lang = imports.lang;
const Signals = imports.signals;
-function BaseManager() {
- this._init();
+function BaseManager(title) {
+ this._init(title);
};
BaseManager.prototype = {
- _init: function() {
+ _init: function(title) {
this._items = {};
this._activeItem = null;
+
+ if (title)
+ this._title = title;
+ else
+ this._title = '';
+ },
+
+ getTitle: function() {
+ return this._title;
},
getItemById: function(id) {
@@ -125,3 +140,120 @@ BaseManager.prototype = {
}
};
Signals.addSignalMethods(BaseManager.prototype);
+
+// GTK+ implementations
+
+const BaseModelColumns = {
+ ID: 0,
+ NAME: 1,
+ HEADING_TEXT: 2
+};
+
+function BaseModel(manager) {
+ this._init(manager);
+}
+
+BaseModel.prototype = {
+ _init: function(manager) {
+ this.model = Gd.create_item_store();
+ this._manager = manager;
+ this._manager.connect('item-added', Lang.bind(this, this._refreshModel));
+ this._manager.connect('item-removed', Lang.bind(this, this._refreshModel));
+
+ this._refreshModel();
+ },
+
+ _refreshModel: function() {
+ this.model.clear();
+
+ let iter = this.model.append();
+ Gd.item_store_set(this.model, iter,
+ 'heading', '', this._manager.getTitle());
+
+ let items = this._manager.getItems();
+ for (idx in items) {
+ let item = items[idx];
+ iter = this.model.append();
+ Gd.item_store_set(this.model, iter,
+ item.id, item.name, '');
+ }
+ }
+};
+
+function BaseView(manager) {
+ this._init(manager);
+}
+
+BaseView.prototype = {
+ _init: function(manager) {
+ this._model = new BaseModel(manager);
+ this._manager = manager;
+
+ this.widget = new Gtk.TreeView({ headers_visible: false });
+ this._treeView = this.widget;
+ Gd.gtk_tree_view_set_activate_on_single_click(this._treeView, true);
+ this._treeView.set_model(this._model.model);
+
+ let selection = this._treeView.get_selection();
+ selection.set_mode(Gtk.SelectionMode.SINGLE);
+
+ this._treeView.connect('row-activated', Lang.bind(this,
+ function(view, path) {
+ let iter = this._model.model.get_iter(path)[1];
+ let id = this._model.model.get_value(iter, BaseModelColumns.ID);
+
+ this._manager.setActiveItemById(id);
+ this.emit('item-clicked');
+ }));
+
+ let col = new Gtk.TreeViewColumn();
+ this._treeView.append_column(col);
+
+ // headings
+ this._rendererHeading = new Gtk.CellRendererText({ weight: Pango.Weight.BOLD,
+ weight_set: true });
+ col.pack_start(this._rendererHeading, false);
+ col.add_attribute(this._rendererHeading,
+ 'text', BaseModelColumns.HEADING_TEXT);
+ col.set_cell_data_func(this._rendererHeading,
+ Lang.bind(this, this._visibilityForHeading, true));
+
+ // radio selection
+ this._rendererRadio = new Gtk.CellRendererToggle({ radio: true,
+ mode: Gtk.CellRendererMode.INERT });
+ col.pack_start(this._rendererRadio, false);
+ col.set_cell_data_func(this._rendererRadio,
+ Lang.bind(this, this._visibilityForHeading, false,
+ Lang.bind(this,
+ function(col, cell, model, iter) {
+ let id = model.get_value(iter, BaseModelColumns.ID);
+ if (id == this._manager.getActiveItem().id)
+ cell.active = true;
+ else
+ cell.active = false;
+ })));
+
+ // item name
+ this._rendererText = new Gtk.CellRendererText();
+ col.pack_start(this._rendererText, true);
+ col.add_attribute(this._rendererText,
+ 'text', BaseModelColumns.NAME);
+ col.set_cell_data_func(this._rendererText,
+ Lang.bind(this, this._visibilityForHeading, false));
+
+ this.widget.show_all();
+ },
+
+ _visibilityForHeading: function(col, cell, model, iter, visible, additionalFunc) {
+ let heading = model.get_value(iter, BaseModelColumns.HEADING_TEXT);
+
+ if ((visible && heading.length) || (!visible && !heading.length))
+ cell.visible = true;
+ else
+ cell.visible = false;
+
+ if (additionalFunc)
+ additionalFunc(col, cell, model, iter);
+ }
+};
+Signals.addSignalMethods(BaseView.prototype);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]