3 module CanAliasContacts
5 a = BufferManager.ask(:alias, "Nickname for #{p.longname}: ", ContactManager.alias_for(p)) or return
7 ContactManager.drop_contact p
9 ContactManager.set_contact p, a
14 class ContactListMode < LineCursorMode
15 LOAD_MORE_CONTACTS_NUM = 10
17 register_keymap do |k|
18 k.add :load_more, "Load #{LOAD_MORE_CONTACTS_NUM} more contacts", 'M'
19 k.add :reload, "Drop contact list and reload", 'D'
20 k.add :alias, "Edit nickname/alias for contact", 'a'
21 k.add :toggle_tagged, "Tag/untag current line", 't'
22 k.add :apply_to_tagged, "Apply next command to all tagged items", ';'
23 k.add :search, "Search for messages from particular people", 'S'
26 def initialize mode=:regular
28 @tags = Tagger.new self
34 include CanAliasContacts
36 p = @contacts[curpos] or return
41 def lines; @text.length; end
42 def [] i; @text[i]; end
45 p = @contacts[curpos] or return
46 @tags.toggle_tag_for p
47 update_text_for_line curpos
51 def multi_toggle_tagged threads
56 def apply_to_tagged; @tags.apply_to_tagged; end
58 def load_more num=LOAD_MORE_CONTACTS_NUM
62 BufferManager.flash "Added #{num.pluralize 'contact'}."
65 def multi_select people
68 mode = ComposeMode.new :to => people
69 BufferManager.spawn "new message", mode
75 p = @contacts[curpos] or return
79 def multi_search people
80 mode = PersonSearchResultsMode.new people
81 BufferManager.spawn "search for #{people.map { |p| p.name }.join(', ')}", mode
82 mode.load_threads :num => mode.buffer.content_height
86 p = @contacts[curpos] or return
96 def load_in_background
97 Redwood::reporting_thread("contact manager load in bg") do
100 BufferManager.draw_screen
105 @num ||= buffer.content_height
106 @user_contacts = ContactManager.contacts
107 num = [@num - @user_contacts.length, 0].max
108 BufferManager.say("Loading #{num} contacts from index...") do
109 recentc = Index.load_contacts AccountManager.user_emails, :num => num
110 @contacts = (@user_contacts + recentc).sort_by { |p| p.sort_by_me }.uniq
118 buffer.mark_dirty if buffer
121 def update_text_for_line line
122 @text[line] = text_for_contact @contacts[line]
123 buffer.mark_dirty if buffer
126 def text_for_contact p
127 aalias = ContactManager.alias_for(p) || ""
128 [[:tagged_color, @tags.tagged?(p) ? ">" : " "],
129 [:none, sprintf("%-#{@awidth}s %-#{@nwidth}s %s", aalias, p.name, p.email)]]
133 @awidth, @nwidth = 0, 0
134 @contacts.each do |p|
135 aalias = ContactManager.alias_for(p)
136 @awidth = aalias.length if aalias && aalias.length > @awidth
137 @nwidth = p.name.length if p.name && p.name.length > @nwidth
140 @text = @contacts.map { |p| text_for_contact p }