From: William Morgan Date: Fri, 21 Dec 2007 18:13:41 +0000 (-0800) Subject: allow contacts without aliases and prompt for name changes in aliasing contacts X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=13f595f98ee055dcc84585a5f8d86a9fc1f68557;p=sup allow contacts without aliases and prompt for name changes in aliasing contacts based on a patch by pierre baillet --- diff --git a/lib/sup/contact.rb b/lib/sup/contact.rb index 16dc62e..8050c06 100644 --- a/lib/sup/contact.rb +++ b/lib/sup/contact.rb @@ -5,44 +5,54 @@ class ContactManager def initialize fn @fn = fn - @p2a = {} # person to alias map - @a2p = {} # alias to person map + + ## maintain the mapping between people and aliases. for contacts without + ## aliases, there will be no @a2p entry, so @p2a.keys should be treated + ## as the canonical list of contacts. + + @p2a = {} # person to alias + @a2p = {} # alias to person if File.exists? fn IO.foreach(fn) do |l| - l =~ /^([^:]+): (.*)$/ or raise "can't parse #{fn} line #{l.inspect}" + l =~ /^([^:]*): (.*)$/ or raise "can't parse #{fn} line #{l.inspect}" aalias, addr = $1, $2 p = PersonManager.person_for addr, :definitive => true @p2a[p] = aalias - @a2p[aalias] = p + @a2p[aalias] = p unless aalias.nil? || aalias.empty? end end self.class.i_am_the_instance self end - def contacts; @p2a.keys; end - def set_contact person, aalias - if(pold = @a2p[aalias]) && (pold != person) - drop_contact pold + def contacts; @p2a.keys end + def contacts_with_aliases; @a2p.values.uniq end + + def update_alias person, aalias=nil + if(old_aalias = @p2a[person]) # remove old alias + @a2p.delete old_aalias end @p2a[person] = aalias - @a2p[aalias] = person + @a2p[aalias] = person unless aalias.nil? || aalias.empty? end + + ## this may not actually be called anywhere, since we still keep contacts + ## around without aliases to override any fullname changes. def drop_contact person - if(aalias = @p2a[person]) - @p2a.delete person - @a2p.delete aalias - end - end - def contact_for aalias; @a2p[aalias]; end - def alias_for person; @p2a[person]; end - def is_contact? person; @p2a.member? person; end + aalias = @p2a[person] + @p2a.delete person + @a2p.delete aalias if aalias + end + + def contact_for aalias; @a2p[aalias] end + def alias_for person; @p2a[person] end + def is_aliased_contact? person; !@p2a[person].nil? end def save File.open(@fn, "w") do |f| @p2a.each do |p, a| - f.puts "#{a}: #{p.full_address}" + f.puts "#{a || ''}: #{p.full_address}" end end end diff --git a/lib/sup/modes/contact-list-mode.rb b/lib/sup/modes/contact-list-mode.rb index 399d48e..f7b3ccb 100644 --- a/lib/sup/modes/contact-list-mode.rb +++ b/lib/sup/modes/contact-list-mode.rb @@ -2,12 +2,16 @@ module Redwood module CanAliasContacts def alias_contact p - a = BufferManager.ask(:alias, "Nickname for #{p.longname}: ", ContactManager.alias_for(p)) or return - if a.empty? - ContactManager.drop_contact p - else - ContactManager.set_contact p, a - end + aalias = BufferManager.ask(:alias, "Alias for #{p.longname}: ", ContactManager.alias_for(p)) + return if aalias.nil? + aalias = nil if aalias.empty? # allow empty aliases + + name = BufferManager.ask(:name, "Name for #{p.longname}: ", p.name) + return if name.nil? || name.empty? # don't allow empty names + p.name = name + + ContactManager.update_alias p, aalias + BufferManager.flash "Contact updated!" end end @@ -17,7 +21,7 @@ class ContactListMode < LineCursorMode register_keymap do |k| k.add :load_more, "Load #{LOAD_MORE_CONTACTS_NUM} more contacts", 'M' k.add :reload, "Drop contact list and reload", 'D' - k.add :alias, "Edit nickname/alias for contact", 'a' + k.add :alias, "Edit alias/or name for contact", 'a', 'i' k.add :toggle_tagged, "Tag/untag current line", 't' k.add :apply_to_tagged, "Apply next command to all tagged items", ';' k.add :search, "Search for messages from particular people", 'S' @@ -103,7 +107,7 @@ class ContactListMode < LineCursorMode def load @num ||= buffer.content_height - @user_contacts = ContactManager.contacts + @user_contacts = ContactManager.contacts_with_aliases num = [@num - @user_contacts.length, 0].max BufferManager.say("Loading #{num} contacts from index...") do recentc = Index.load_contacts AccountManager.user_emails, :num => num diff --git a/lib/sup/modes/thread-view-mode.rb b/lib/sup/modes/thread-view-mode.rb index 8aef9b8..e4c72e5 100644 --- a/lib/sup/modes/thread-view-mode.rb +++ b/lib/sup/modes/thread-view-mode.rb @@ -547,7 +547,7 @@ private end def format_person p - p.longname + (ContactManager.is_contact?(p) ? " (#{ContactManager.alias_for p})" : "") + p.longname + (ContactManager.is_aliased_contact?(p) ? " (#{ContactManager.alias_for p})" : "") end ## todo: check arguments on this overly complex function