]> git.cworth.org Git - sup/commitdiff
allow contacts without aliases and prompt for name changes in aliasing contacts
authorWilliam Morgan <wmorgan-sup@masanjin.net>
Fri, 21 Dec 2007 18:13:41 +0000 (10:13 -0800)
committerWilliam Morgan <wmorgan-sup@masanjin.net>
Fri, 21 Dec 2007 18:13:41 +0000 (10:13 -0800)
based on a patch by pierre baillet

lib/sup/contact.rb
lib/sup/modes/contact-list-mode.rb
lib/sup/modes/thread-view-mode.rb

index 16dc62eb114cfbf4e45decc745ef172f0092f65d..8050c067235668821aabb053b413d83b4f5015b0 100644 (file)
@@ -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
index 399d48ee973e4fa9f991da01fbcd083f927a73b5..f7b3ccb567c3b3ec8be6e03dd56ed685c08d9215 100644 (file)
@@ -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
index 8aef9b800a4f2886afda95693540f8a9bfe51e04..e4c72e5cab1a4f476aa1ce466b416399300e42e0 100644 (file)
@@ -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