[gnome-documents] manager: split GtkTreeModel/GtkTreeView base classes for BaseManagers



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]