summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlouiz@4325f9fc-e183-4c21-96ce-0ab188b42d13 <louiz@4325f9fc-e183-4c21-96ce-0ab188b42d13>2010-09-27 01:40:34 +0000
committerlouiz@4325f9fc-e183-4c21-96ce-0ab188b42d13 <louiz@4325f9fc-e183-4c21-96ce-0ab188b42d13>2010-09-27 01:40:34 +0000
commit7453b87f30e00e70ae76dbf19e45de6aed79ab27 (patch)
tree7f4eebdf77e8865ebe7fee739e54e11fdcd1a7f0
parent27938ecf1eec28bbe8967e98e3c77698da18c33f (diff)
downloadpoezio-7453b87f30e00e70ae76dbf19e45de6aed79ab27.tar.gz
poezio-7453b87f30e00e70ae76dbf19e45de6aed79ab27.tar.bz2
poezio-7453b87f30e00e70ae76dbf19e45de6aed79ab27.tar.xz
poezio-7453b87f30e00e70ae76dbf19e45de6aed79ab27.zip
fold groups, display-name, focus the tab if user tries to open an already opened conversation (on /join too !), and nicer roster
-rw-r--r--src/contact.py8
-rw-r--r--src/gui.py37
-rw-r--r--src/roster.py18
-rw-r--r--src/tab.py11
-rw-r--r--src/window.py36
5 files changed, 56 insertions, 54 deletions
diff --git a/src/contact.py b/src/contact.py
index 510e208a..39ec9715 100644
--- a/src/contact.py
+++ b/src/contact.py
@@ -22,7 +22,7 @@ class Contact(object):
"""
def __init__(self, jid):
self._jid = JID(jid) # a SleekXMPP jid object
- self._display_name = ''
+ self._display_name = None
self._subscription = 'none'
self._ask = None
self._status = ''
@@ -51,3 +51,9 @@ class Contact(object):
def get_presence(self):
return self._presence
+
+ def set_name(self, name):
+ self._display_name = name
+
+ def get_name(self):
+ return self._display_name
diff --git a/src/gui.py b/src/gui.py
index 059e2465..37a53c6e 100644
--- a/src/gui.py
+++ b/src/gui.py
@@ -38,7 +38,7 @@ from config import config
from tab import MucTab, InfoTab, PrivateTab, RosterInfoTab, ConversationTab
from user import User
from room import Room
-from roster import Roster
+from roster import Roster, RosterGroup
from contact import Contact
from message import Message
from text_buffer import TextBuffer
@@ -427,6 +427,11 @@ class Gui(object):
self.refresh_window()
doupdate()
+ def focus_tab_named(self, tab_name):
+ for tab in self.tabs:
+ if tab.get_name() == tab_name:
+ self.command_win('%s' % (tab.nb,))
+
def on_normal_message(self, message):
"""
When receiving "normal" messages (from someone in our roster)
@@ -469,6 +474,10 @@ class Gui(object):
contact.set_ask(item.attrib['ask'])
else:
contact.set_ask(None)
+ if 'name' in item.attrib:
+ contact.set_name(item.attrib['name'])
+ else:
+ contact.set_name(None)
if item.attrib['subscription']:
contact.set_subscription(item.attrib['subscription'])
groups = item.findall('{jabber:iq:roster}group')
@@ -925,10 +934,9 @@ class Gui(object):
r = self.get_room_by_name(room)
if len(args) == 2: # a password is provided
password = args[1]
- # TODO
- # if r and r.joined: # if we are already in the room
- # self.command_win('%s' % (r.nb))
- # return
+ if r and r.joined: # if we are already in the room
+ self.focus_tab_named(r.name)
+ return
room = room.lower()
if r and not r.joined:
self.xmpp.plugin['xep_0045'].joinMUC(room, nick, password)
@@ -1262,7 +1270,7 @@ class Gui(object):
return
if key in ('^J', '\n') and isinstance(res, str):
self.execute(res)
- else:
+ else :
# we did "enter" with an empty input in the roster
self.on_roster_enter_key(res)
@@ -1271,18 +1279,13 @@ class Gui(object):
when enter is pressed on the roster window
"""
if isinstance(roster_row, Contact):
- r = Room(roster_row.get_jid().full, self.xmpp.fulljid)
- new_tab = ConversationTab(self.stdscr, r, self.information_win_size)
- debug('%s\n'% new_tab)
- # insert it in the tabs
- if self.current_tab().nb == 0:
- self.tabs.append(new_tab)
+ if not self.get_conversation_by_jid(roster_row.get_jid().bare):
+ self.open_conversation_window(roster_row.get_jid().bare)
else:
- for ta in self.tabs:
- if ta.nb == 0:
- self.tabs.insert(self.tabs.index(ta), new_tab)
- break
- self.refresh_window()
+ self.focus_tab_named(roster_row.get_jid().bare)
+ elif isinstance(roster_row, RosterGroup):
+ roster_row.folded = not roster_row.folded
+ self.refresh_window()
def execute(self,line):
"""
diff --git a/src/roster.py b/src/roster.py
index e739d81d..209f7134 100644
--- a/src/roster.py
+++ b/src/roster.py
@@ -84,24 +84,6 @@ class Roster(object):
self._roster_groups.append(new_group)
new_group.add_contact(contact)
- # def ordered_by_group(self, dic_roster, order):
- # # ordered by contact
- # for jid in dic_roster:
- # if not dic_roster[jid]['in_roster']:
- # continue
- # self.contact_number += 1
- # groups=dic_roster[jid]['groups']
- # if not groups:
- # groups = ['(none)']
- # new_contact = Contact(jid, name=dic_roster[jid]['name'],
- # groups=groups,
- # subscription=dic_roster[jid]['subscription'],
- # presence=dic_roster[jid]['presence'])
- # for group in groups:
- # self.add_contact_to_group(group, new_contact)
- # # debug('Jid:%s, (%s)\n' % (jid, dic_roster[jid]))
- # debug('\n')
-
def get_groups(self):
return self._roster_groups
diff --git a/src/tab.py b/src/tab.py
index 51707561..984facd1 100644
--- a/src/tab.py
+++ b/src/tab.py
@@ -27,6 +27,7 @@ MIN_HEIGHT = 16
import window
import theme
+from roster import RosterGroup
from common import debug
@@ -422,8 +423,8 @@ class RosterInfoTab(Tab):
pass
def on_enter(self):
- debug('%s\n' % (self.roster_win.get_selected_row()))
- return self.roster_win.get_selected_row()
+ selected_row = self.roster_win.get_selected_row()
+ return selected_row
class ConversationTab(Tab):
"""
@@ -447,9 +448,9 @@ class ConversationTab(Tab):
self.tab_win.resize(1, self.width, self.height-2, 0, stdscr, self.visible)
self.input.resize(1, self.width, self.height-1, 0, stdscr, self.visible)
- def refresh(self, tabs, informations, _):
+ def refresh(self, tabs, informations, roster):
self.text_win.refresh(self._room)
- self.info_header.refresh(self._room)
+ self.info_header.refresh(self._room, roster.get_contact_by_jid(self._room.name))
self.info_win.refresh(informations)
self.tab_win.refresh(tabs, tabs[0])
self.input.refresh()
@@ -485,7 +486,7 @@ class ConversationTab(Tab):
def on_info_win_size_changed(self, size, stdscr):
self.info_win_size = size
- self.text_win.resize(self.height-2, self.width, 0, 0, stdscr, self.visible)
+ self.text_win.resize(self.height-2-self.info_win_size, self.width, 0, 0, stdscr, self.visible)
self.info_header.resize(1, self.width, self.height-3-self.info_win_size, 0, stdscr, self.visible)
self.info_win.resize(self.info_win_size, (self.width//10)*9, self.height-2-self.info_win_size, 0, stdscr, self.visible)
diff --git a/src/window.py b/src/window.py
index 6e0ec174..bef3bc9c 100644
--- a/src/window.py
+++ b/src/window.py
@@ -254,21 +254,19 @@ class ConversationInfoWin(InfoWin):
def resize(self, height, width, y, x, stdscr, visible):
self._resize(height, width, y, x, stdscr, visible)
- def refresh(self, room):
+ def refresh(self, room, contact):
if not self.visible:
return
g_lock.acquire()
self.win.erase()
- self.write_room_name(room)
+ self.write_room_name(contact)
self.print_scroll_position(room)
self.finish_line(theme.COLOR_INFORMATION_BAR)
self.win.refresh()
g_lock.release()
- def write_room_name(self, room):
- # (room_name, nick) = room.name.split('/', 1)
- # self.addnstr(nick, len(nick), curses.color_pair(13))
- txt = '%s' % room.name
+ def write_room_name(self, contact):
+ txt = '%s' % contact.get_jid().bare
self.addnstr(txt, len(txt), curses.color_pair(theme.COLOR_INFORMATION_BAR))
class MucInfoWin(InfoWin):
@@ -951,7 +949,7 @@ class RosterWin(Win):
'chat':theme.COLOR_STATUS_CHAT,
'unavailable': theme.COLOR_STATUS_UNAVAILABLE
}
-
+ # subscription_char = {'both': '
def __init__(self, height, width, y, x, parent_win, visible):
self.visible = visible
Win.__init__(self, height, width, y, x, parent_win)
@@ -1000,6 +998,8 @@ class RosterWin(Win):
if y >= self.start_pos:
self.draw_group(y-self.start_pos+1, group, y-1==self.pos)
y += 1
+ if group.folded:
+ continue
for contact in group.get_contacts():
if y-1 == self.pos:
self.selected_row = contact
@@ -1022,7 +1022,7 @@ class RosterWin(Win):
Draw the indicator that shows that
the list is longer that what is displayed
"""
- self.win.addstr(y, self.width-4, '+++', curses.color_pair(42))
+ self.win.addstr(y, self.width-5, '++++', curses.color_pair(42))
def draw_roster_information(self, roster):
"""
@@ -1035,9 +1035,14 @@ class RosterWin(Win):
Draw a groupname on a line
"""
if colored:
- self.addstr(y, 0, group.name, curses.color_pair(34))
+ self.win.attron(curses.color_pair(14))
+ if group.folded:
+ self.addstr(y, 0, '[+] ')
else:
- self.addstr(y, 0, group.name)
+ self.addstr(y, 0, '[-] ')
+ self.addstr(y, 4, group.name)
+ if colored:
+ self.win.attroff(curses.color_pair(14))
def draw_contact_line(self, y, contact, colored):
"""
@@ -1046,11 +1051,16 @@ class RosterWin(Win):
is currently selected contact in the list
"""
color = RosterWin.color_show[contact.get_presence()]
- self.win.addstr(y, 1, "!", curses.color_pair(color))
+ if contact.get_name():
+ display_name = '%s (%s)' % (contact.get_name(),
+ contact.get_jid().bare)
+ else:
+ display_name = '%s' % (contact.get_jid().bare,)
+ self.win.addstr(y, 1, " ", curses.color_pair(color))
if colored:
- self.win.addstr(y, 2, contact.get_jid().bare, curses.color_pair(34))
+ self.win.addstr(y, 4, display_name, curses.color_pair(14))
else:
- self.win.addstr(y, 2, contact.get_jid().bare)
+ self.win.addstr(y, 4, display_name)
def get_selected_row(self):
return self.selected_row