Updating branch refs/heads/master to 81001743bcef4a5781fc1d2d115fe64b068efd63 (commit) from 8ed3c62f8b01d5fe75b4afc443ea3a43894a347e (commit)
commit 81001743bcef4a5781fc1d2d115fe64b068efd63 Author: Christian Dywan <christ...@twotoasts.de> Date: Thu May 26 23:18:00 2011 +0200 Move flag handling into Postler.Message And stop exposing bare filenames in the message treeview. postler/postler-bureau.vala | 16 ++-- postler/postler-message.vala | 13 +++- postler/postler-messages.vala | 152 +++++++++++++---------------------------- 3 files changed, 66 insertions(+), 115 deletions(-) diff --git a/postler/postler-bureau.vala b/postler/postler-bureau.vala index 9890ac3..8d623b2 100644 --- a/postler/postler-bureau.vala +++ b/postler/postler-bureau.vala @@ -547,7 +547,7 @@ public class Postler.Bureau : Gtk.Window { assert_not_reached (); } }); - messages.notify["selected-location"].connect ((object, pspec) => { + messages.notify["selected-message"].connect ((object, pspec) => { infobar.set_response_sensitive (1, messages.get_selection ().count_selected_rows () > 0); }); @@ -580,7 +580,7 @@ public class Postler.Bureau : Gtk.Window { infobar.response.connect_after ((response) => { infobar.destroy (); }); - messages.notify["selected-location"].connect ((object, pspec) => { + messages.notify["selected-message"].connect ((object, pspec) => { infobar.destroy (); }); client.progress.connect ((account_name, text, fraction) => { @@ -836,9 +836,9 @@ public class Postler.Bureau : Gtk.Window { actions.get_action ("MessageArchive").sensitive = false; actions.get_action ("MessageJunk").sensitive = false; actions.get_action ("MessageDelete").sensitive = false; - messages.notify["selected-location"].connect ((object, pspec) => { + messages.notify["selected-message"].connect ((object, pspec) => { Postler.Messages messages = object as Postler.Messages; - bool state = messages.selected_location != null; + bool state = messages.selected_message != null; actions.get_action ("MessageFlag").sensitive = state; actions.get_action ("MessageArchive").sensitive = state && messages.account_info.get_folder (FolderType.ARCHIVE) != null; @@ -912,9 +912,9 @@ public class Postler.Bureau : Gtk.Window { actions.get_action ("MessageReplyAll").sensitive = false; actions.get_action ("MessageForward").sensitive = false; actions.get_action ("ViewSource").sensitive = false; - messages.notify["selected-location"].connect ((object, pspec) => { + messages.notify["selected-message"].connect ((object, pspec) => { Postler.Messages messages = object as Postler.Messages; - bool state = messages.selected_location != null; + bool state = messages.selected_message != null; actions.get_action ("MessageReply").sensitive = state; actions.get_action ("MessageForward").sensitive = state; state = content.reply_to_all != null; @@ -938,8 +938,8 @@ public class Postler.Bureau : Gtk.Window { messages.notify["location"].connect ((object, pspec) => { viewer.hide (); }); - messages.notify["selected-location"].connect ((object, pspec) => { - if (messages.selected_location != null && !viewer.visible) { + messages.notify["selected-message"].connect ((object, pspec) => { + if (messages.selected_message != null && !viewer.visible) { content.clear (); viewer.show (); /* Ensure that the selection is visible, in case of resizing */ diff --git a/postler/postler-message.vala b/postler/postler-message.vala index 9d0985c..cb709d6 100644 --- a/postler/postler-message.vala +++ b/postler/postler-message.vala @@ -22,8 +22,8 @@ namespace Postler { public string? sender { public get; set; } public string? recipients { public get; set; } public string? reply_to { public get; set; } - public bool unread { public get; set; } /* TODO: should be writable */ - public bool flagged { public get; set; } /* TODO: should be writable */ + public bool unread { public get; set; } + public bool flagged { public get; set; } public bool priority { public get; set; } public string organization { public get; set; } public string application { public get; set; } @@ -90,6 +90,15 @@ namespace Postler { } } + public void toggle_flag (char flag) { + string old_path = get_path (); + return_if_fail (old_path != null); + string new_path = Postler.Messages.toggle_flag (old_path, flag); + if (FileUtils.rename (old_path, new_path) == 0) { + read_flags (new_path); + } + } + public Message.from_file (GLib.File file, GLib.Cancellable? cancellable = null) throws GLib.Error { diff --git a/postler/postler-messages.vala b/postler/postler-messages.vala index cc330bf..6dfe791 100644 --- a/postler/postler-messages.vala +++ b/postler/postler-messages.vala @@ -20,7 +20,7 @@ public class Postler.Messages : Gtk.TreeView { public string? location { get; private set; } public AccountInfo account_info { get; private set; } - public string? selected_location { get; private set; } + public Message? selected_message { get; private set; } string to_or_from; string[] headers = {}; @@ -29,8 +29,7 @@ public class Postler.Messages : Gtk.TreeView { FileMonitor[] folder_monitors = {}; enum Columns { - MESSAGE, - LOCATION + MESSAGE } bool search_inline (Gtk.TreeModel model, int column, string key, @@ -43,11 +42,11 @@ public class Postler.Messages : Gtk.TreeView { void selection_changed () { Gtk.TreeIter iter; if (get_selected_iter (out iter)) { - string location; - model.get (iter, Columns.LOCATION, out location); - selected_location = location; + Message message; + model.get (iter, Columns.MESSAGE, out message); + selected_message = message; } else - selected_location = null; + selected_message = null; } static string escape_text (string text) { @@ -163,9 +162,9 @@ public class Postler.Messages : Gtk.TreeView { if (!model.get_iter_from_string (out iter, path)) return; - string location; - model.get (iter, Columns.LOCATION, out location); - toggle_message_flag (iter, ref location, 'F'); + Message message; + model.get (iter, Columns.MESSAGE, out message); + message.toggle_flag ('F'); } void renderer_status_toggled (Gtk.CellRendererToggle renderer, @@ -174,9 +173,9 @@ public class Postler.Messages : Gtk.TreeView { if (!model.get_iter_from_string (out iter, path)) return; - string location; - model.get (iter, Columns.LOCATION, out location); - toggle_message_flag (iter, ref location, 'S'); + Message message; + model.get (iter, Columns.MESSAGE, out message); + message.toggle_flag ('S'); } void on_drag_data_get (Gdk.DragContext context, @@ -188,9 +187,9 @@ public class Postler.Messages : Gtk.TreeView { string[] uris = null; foreach (Gtk.TreePath path in rows) { model.get_iter_from_string (out iter, path.to_string ()); - string? location; - model.get (iter, Columns.LOCATION, out location); - uris += ("file://" + location); + Message message; + model.get (iter, Columns.MESSAGE, out message); + uris += message.uri; } if (uris != null) selection_data.set_uris (uris); @@ -204,7 +203,7 @@ public class Postler.Messages : Gtk.TreeView { this.accounts = accounts; set_fixed_height_mode (true); - store = new Gtk.TreeStore (2, typeof (Message), typeof (string)); + store = new Gtk.TreeStore (1, typeof (Message)); set_search_equal_func (search_inline); get_selection ().set_mode (Gtk.SelectionMode.MULTIPLE); get_selection ().changed.connect (selection_changed); @@ -287,10 +286,11 @@ public class Postler.Messages : Gtk.TreeView { void content_new_window () { Gtk.TreeIter iter; if (get_selected_iter (out iter)) { - string location; - model.get (iter, Columns.LOCATION, out location); - mark_message_read (iter, ref location); - Postler.App.spawn_module ("content", location); + Message message; + model.get (iter, Columns.MESSAGE, out message); + if (message.unread) + message.toggle_flag ('S'); + Postler.App.spawn_module ("content", message.get_path ()); } } [Signal (action=true)] @@ -421,41 +421,6 @@ public class Postler.Messages : Gtk.TreeView { return parts[1]; } - static string parse_flags (string name, out string flagged, out int weight) { - /* format "unique:2,DFPRST", ordered alphabetically */ - unowned string status = STOCK_MAIL_UNREAD; - string bare_filename; - string flags = flags_from_filename (name, out bare_filename); - if (flags == "") - return status; - - foreach (var character in flags.to_utf8 ()) { - switch (character) { - case 'D': - status = STOCK_EMBLEM_DRAFT; - break; - case 'F': - flagged = STOCK_EMBLEM_IMPORTANT; - break; - case 'P': - status = STOCK_MAIL_FORWARDED; - break; - case 'R': - status = STOCK_MAIL_REPLIED; - break; - case 'S': - weight = Pango.Weight.NORMAL; - if (status == STOCK_MAIL_UNREAD) - status = null; - break; - case 'T': - flagged = "T"; - break; - } - } - return status; - } - public void search (string filter, string header="subject") { headers = {}; filters = {}; @@ -513,8 +478,7 @@ public class Postler.Messages : Gtk.TreeView { foreach (var message in messages) { store.insert_with_values (null, null, 0, - Columns.MESSAGE, message, - Columns.LOCATION, message.get_path ()); + Columns.MESSAGE, message); } /* Show error for failed search, ie. no results */ @@ -580,23 +544,6 @@ public class Postler.Messages : Gtk.TreeView { return folder + "/" + Path.get_basename (bare_filename) + ":" + new_flags.str; } - void toggle_message_flag (Gtk.TreeIter iter, ref string location, char flag) { - return_if_fail (location != null); - string new_location = toggle_flag (location, flag); - /* TODO update message file */ - if (FileUtils.rename (location, new_location) == 0) { - location = new_location; - int font_weight = Pango.Weight.BOLD; - string? flagged = null; - string status = parse_flags (location, out flagged, out font_weight); - - store.set (iter, - Columns.LOCATION, new_location); - if (location == selected_location) - selected_location = new_location; - } - } - bool get_selected_iter (out Gtk.TreeIter iter) { GLib.List<Gtk.TreePath> paths = get_selection ().get_selected_rows (null); iter = Gtk.TreeIter (); @@ -611,9 +558,9 @@ public class Postler.Messages : Gtk.TreeView { if (!store.iter_children (out message_iter, null)) return false; do { - string existing_location; - store.get (message_iter, Columns.LOCATION, out existing_location); - if (existing_location == location) { + Message existing_message; + store.get (message_iter, Columns.MESSAGE, out existing_message); + if (existing_message.get_path () == location) { if (&iter != null) iter = message_iter; return true; @@ -658,8 +605,7 @@ public class Postler.Messages : Gtk.TreeView { var message = new Message.from_file (file); bool scroll = vadjustment.value == 0; store.insert_with_values (null, null, 0, - Columns.MESSAGE, message, - Columns.LOCATION, message.get_path ()); + Columns.MESSAGE, message); if (scroll) vadjustment.value = 0; } @@ -682,13 +628,6 @@ public class Postler.Messages : Gtk.TreeView { } } - void mark_message_read (Gtk.TreeIter iter, ref string location) { - return_if_fail (location != null); - string bare_filename; - if (!flags_from_filename (location, out bare_filename).contains ("S")) - toggle_message_flag (iter, ref location, 'S'); - } - public void toggle_selected_flag (char flag) { GLib.List<Gtk.TreePath> paths; var references = new GLib.List<Gtk.TreeRowReference> (); @@ -701,18 +640,19 @@ public class Postler.Messages : Gtk.TreeView { var path = reference.get_path (); Gtk.TreeIter iter; if (model.get_iter (out iter, path)) { - string location; - model.get (iter, Columns.LOCATION, out location); - toggle_message_flag (iter, ref location, flag); + Message message; + model.get (iter, Columns.MESSAGE, out message); + message.toggle_flag (flag); } } } void display_message (Gtk.TreeIter iter) { - string location; - model.get (iter, Columns.LOCATION, out location); - mark_message_read (iter, ref location); - content.display (location, account_info); + Message message; + model.get (iter, Columns.MESSAGE, out message); + if (message.unread) + message.toggle_flag ('S'); + content.display (message.get_path (), account_info); } public static bool ensure_folder (string folder) { @@ -813,15 +753,16 @@ public class Postler.Messages : Gtk.TreeView { var path = reference.get_path (); Gtk.TreeIter iter; if (model.get_iter (out iter, path)) { - string location; - model.get (iter, Columns.LOCATION, out location); - var file = File.new_for_path (location); + Message message; + model.get (iter, Columns.MESSAGE, out message); + var file = File.new_for_path (message.get_path ()); try { if (destination_path == null) file.delete (null); else { if (account_info.type == AccountType.SEARCH) { /* Look for the account belonging to the message */ + string location = file.get_path (); string inbox_folder = location.substring (0, location.pointer_to_offset (location.rstr ("/"))); return_if_fail (inbox_folder.has_suffix ("/INBOX/new") @@ -856,12 +797,12 @@ public class Postler.Messages : Gtk.TreeView { } } } catch (GLib.Error error) { - unowned string message; + unowned string warning; if (destination_path == null) - message = _("Failed to delete message \"%s\": %s"); + warning = _("Failed to delete message \"%s\": %s"); else - message = _("Failed to move message \"%s\": %s"); - GLib.critical (message, location, error.message); + warning = _("Failed to move message \"%s\": %s"); + GLib.critical (warning, location, error.message); } } } @@ -875,10 +816,11 @@ public class Postler.Messages : Gtk.TreeView { if (event.type == Gdk.EventType.2BUTTON_PRESS) { Gtk.TreeIter iter; if (get_selected_iter (out iter)) { - string location; - model.get (iter, Columns.LOCATION, out location); - mark_message_read (iter, ref location); - Postler.App.spawn_module ("content", location); + Message message; + model.get (iter, Columns.MESSAGE, out message); + if (message.unread) + message.toggle_flag ('S'); + Postler.App.spawn_module ("content", message.get_path ()); } } else if (event.type == Gdk.EventType.BUTTON_PRESS && get_selection ().count_selected_rows () > 1 _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits