[Xfce4-commits] <postler:master> Display attachments as icon view and no paths

Christian Dywan noreply at xfce.org
Sat Jan 29 01:02:01 CET 2011


Updating branch refs/heads/master
         to 1e652fda4beb15ab3a245fda49ebdb19756c4734 (commit)
       from 3e99d11c46008b99026088dbe3e57f3dc74f9dfb (commit)

commit 1e652fda4beb15ab3a245fda49ebdb19756c4734
Author: Christian Dywan <christian at twotoasts.de>
Date:   Sat Jan 29 01:01:00 2011 +0100

    Display attachments as icon view and no paths

 postler/postler-composer.vala |   67 ++++++++++++++++++++++++++++++++--------
 postler/postler-viewer.vala   |    2 +-
 2 files changed, 54 insertions(+), 15 deletions(-)

diff --git a/postler/postler-composer.vala b/postler/postler-composer.vala
index 6b94689..e957fff 100644
--- a/postler/postler-composer.vala
+++ b/postler/postler-composer.vala
@@ -20,7 +20,7 @@ public class Postler.Composer : Gtk.Window {
     Gtk.VBox shelf;
     Gtk.Toolbar toolbar;
     Postler.Content content;
-    Gtk.TreeView att_view;
+    Gtk.IconView att_view;
     Gtk.ListStore attachments;
     Gtk.ComboBox combo_from;
     Gtk.Entry entry_to;
@@ -324,6 +324,41 @@ public class Postler.Composer : Gtk.Window {
             att_view.visible = false;
     }
 
+    static int attachment_icon_size = 0;
+    void render_pixbuf (Gtk.CellLayout layout, Gtk.CellRenderer cell,
+        Gtk.TreeModel model, Gtk.TreeIter iter) {
+
+        if (attachment_icon_size == 0)
+            attachment_icon_size = Gtk.icon_size_register ("attachment", 32, 32);
+
+       string filename;
+       model.get (iter, 0, out filename);
+
+        uchar[] data = {};
+        bool uncertain;
+        string mime_type = g_content_type_guess (filename, data, out uncertain);
+        string icon_name = Postler.Viewer.icon_name_for_mime_type (mime_type, this);
+        cell.set ("icon-name", icon_name,
+                  "stock-size", attachment_icon_size);
+    }
+
+    void render_filename (Gtk.CellLayout layout, Gtk.CellRenderer cell,
+        Gtk.TreeModel model, Gtk.TreeIter iter) {
+
+        string filename;
+        model.get (iter, 0, out filename);
+        cell.set ("text", Filename.display_basename (filename),
+                  "width-chars", 16,
+                  "ellipsize", Pango.EllipsizeMode.MIDDLE);
+    }
+
+    void render_delete (Gtk.CellLayout layout, Gtk.CellRenderer cell,
+        Gtk.TreeModel model, Gtk.TreeIter iter) {
+
+        cell.set ("stock-id", Gtk.STOCK_REMOVE,
+                  "width", 16, "height", 16);
+    }
+
     void drag_received (Gdk.DragContext context, int x, int y,
         Gtk.SelectionData data, uint info, uint timestamp) {
 
@@ -564,24 +599,28 @@ public class Postler.Composer : Gtk.Window {
         var scrolled = new Postler.ScrolledWindow (content);
         scrolled.shadow_type = Gtk.ShadowType.IN;
         shelf.pack_start (scrolled, true, true, 0);
-        att_view = new Gtk.TreeView ();
-        var attachment_del = new Postler.CellRendererToggle ();
-        attachment_del.stock_id = Gtk.STOCK_REMOVE;
-        attachment_del.prelight_stock_id = Gtk.STOCK_REMOVE;
-        attachment_del.width = 32;
-        attachments = new Gtk.ListStore (2, typeof (string), typeof (ulong));
-        att_view.insert_column_with_attributes (-1, "Attachments",
-            new Gtk.CellRendererText (), "text", 0);
-        att_view.insert_column_with_attributes (1, "", attachment_del, "stock-id", 0);
-        att_view.get_column (0).expand = true;
-        attachment_del.toggled.connect ((renderer, path) => {
+
+        att_view = new Gtk.IconView ();
+        att_view.columns = 3;
+        att_view.set ("item-orientation", Gtk.Orientation.HORIZONTAL);
+        var renderer_pixbuf = new Gtk.CellRendererPixbuf ();
+        att_view.pack_start (renderer_pixbuf, true);
+        att_view.set_cell_data_func (renderer_pixbuf, render_pixbuf);
+        var renderer_filename = new Gtk.CellRendererText ();
+        att_view.pack_start (renderer_filename, false);
+        att_view.set_cell_data_func (renderer_filename, render_filename);
+        var renderer_delete = new Postler.CellRendererToggle ();
+        att_view.pack_end (renderer_delete, false);
+        att_view.set_cell_data_func (renderer_delete, render_delete);
+        renderer_delete.toggled.connect ((renderer, path) => {
             remove_attachment (path);
         });
+        attachments = new Gtk.ListStore (1, typeof (string));
         att_view.set_model (attachments);
         att_view.set_no_show_all (true);
         att_view.key_press_event.connect ((event) => {
             if (event.keyval == Gdk.keyval_from_name ("Delete")) {
-                var paths = att_view.get_selection ().get_selected_rows (null);
+                var paths = att_view.get_selected_items ();
                 var path = paths.nth_data (0);
                 if (path != null)
                     remove_attachment (path.to_string ());
@@ -589,7 +628,7 @@ public class Postler.Composer : Gtk.Window {
             }
             return false;
         });
-        shelf.pack_start (att_view, true, true, 0);
+        shelf.pack_start (att_view, false, false, 0);
         shelf.show_all ();
 
         Gtk.drag_dest_set (content, Gtk.DestDefaults.ALL, {}, Gdk.DragAction.COPY);
diff --git a/postler/postler-viewer.vala b/postler/postler-viewer.vala
index 3f9b40b..37bf7a5 100644
--- a/postler/postler-viewer.vala
+++ b/postler/postler-viewer.vala
@@ -78,7 +78,7 @@ public class Postler.Viewer : Gtk.VBox {
         content.display_part (content.current_part);
     }
 
-    static string icon_name_for_mime_type (string mime_type, Gtk.Widget widget) {
+    internal static string icon_name_for_mime_type (string mime_type, Gtk.Widget widget) {
         var icon_theme = Gtk.IconTheme.get_for_screen (widget.get_screen ());
         var parts = mime_type.split ("/", 2);
         string icon_name = parts[0] + "-" + parts[1];



More information about the Xfce4-commits mailing list