# HG changeset patch # User Goffi # Date 1296502285 -3600 # Node ID 0a7c685faa536c1a5e274e7718920fc66b842ee4 # Parent 140cec48224a8f62d420d5f072aefa4c6af24e91 ContactPanel: first draft diff -r 140cec48224a -r 0a7c685faa53 libervia.py --- a/libervia.py Sun Jan 30 21:50:22 2011 +0100 +++ b/libervia.py Mon Jan 31 20:31:25 2011 +0100 @@ -32,6 +32,7 @@ from pyjamas.ui.AutoComplete import AutoCompleteTextBox from pyjamas.JSONService import JSONProxy from register import RegisterPanel, RegisterBox +from pyjamas import DOM class LiberviaJsonProxy(JSONProxy): @@ -57,8 +58,6 @@ Window.alert("Error %s: %s" % (errobj['message']['faultCode'], errobj['message']['faultString'])) else: Window.alert("Error: %s" % errobj['message']) - import pdb - pdb.set_trace() class RegisterCall(LiberviaJsonProxy): def __init__(self): @@ -112,30 +111,127 @@ def __init__(self): AutoCompleteTextBox.__init__(self) - self.setCompletionItems(['@amis: ','@famille: ', '@collègues']) + + def addKey(self, key): + self.getCompletionItems().completions.append(key) + +class GroupLabel(Label): + def __init__(self, group): + Label.__init__(self, group) + self.group = group + self.setStyleName('group') + +class ContactLabel(Label): + def __init__(self, jid, name=None): + if not name: + name=jid + Label.__init__(self, name) + self.jid=jid + self.setStyleName('contact') + +class GroupList(VerticalPanel): + + def __init__(self, parent): + VerticalPanel.__init__(self) + self._parent = parent + + def add(self, group): + _item = GroupLabel(group) + _item.addMouseListener(self._parent) + DOM.setStyleAttribute(_item.getElement(), "cursor", "pointer") + VerticalPanel.add(self, _item) + +class ContactList(VerticalPanel): + + def __init__(self): + VerticalPanel.__init__(self) + self.contacts=[] + + def __iter__(self): + return self.contacts.__iter__() + + def add(self, jid, name=None): + _item = ContactLabel(jid, name) + DOM.setStyleAttribute(_item.getElement(), "cursor", "pointer") + VerticalPanel.add(self, _item) + self.contacts.append(_item) class ContactPanel(SimplePanel): + """Manage the contacts and groups""" - def __init__(self): + def __init__(self, host): SimplePanel.__init__(self) + self.host = host + self.groups={} + self.vPanel = VerticalPanel() + _title = Label('Contacts') + _title.setStyleName('contactTitle') + + self._contactList = ContactList() + self._contactList.setStyleName('contactList') + self._groupList = GroupList(self) + self._groupList.setStyleName('groupList') + + self.vPanel.add(_title) + self.vPanel.add(self._groupList) + self.vPanel.add(self._contactList) + self.add(self.vPanel) + self.setStyleName('contactBox') + + def addContact(self, jid, attributes, groups): + """Add a contact to the panel + @param jid: jid + @attributes: cf SàT Bridge API's newContact + @param groups: list of groups""" + for group in groups: + if not self.groups.has_key(group): + self.groups[group] = set() + self._groupList.add(group) + self.host.magicBox.addKey("@%s: " % group) + self.groups[group].add(jid) + self._contactList.add(jid) + + def onMouseMove(self, sender, x, y): + pass + + def onMouseDown(self, sender, x, y): + pass + + def onMouseUp(self, sender, x, y): + pass + + def onMouseEnter(self, sender): + if isinstance(sender, GroupLabel): + for contact in self._contactList: + if contact.jid in self.groups[sender.group]: + contact.addStyleName("selected") + + def onMouseLeave(self, sender): + if isinstance(sender, GroupLabel): + for contact in self._contactList: + if contact.jid in self.groups[sender.group]: + contact.removeStyleName("selected") class MiddlePannel(HorizontalPanel): - def __init__(self): + def __init__(self,host): + self.host=host HorizontalPanel.__init__(self) + self.add(self.host.contactPanel) class MainPanel(VerticalPanel): - def __init__(self): + def __init__(self, host): + self.host=host VerticalPanel.__init__(self) self.setHorizontalAlignment(HasAlignment.ALIGN_LEFT) self.setVerticalAlignment(HasAlignment.ALIGN_TOP) menu = Menu() - magic_box = MagicBox() - middle_panel = MiddlePannel() + magic_box = host.magicBox + middle_panel = MiddlePannel(self.host) self.add(menu) self.add(magic_box) @@ -152,20 +248,22 @@ class SatWebFrontend: def onModuleLoad(self): - self.panel = MainPanel() + self.magicBox = MagicBox() + self.contactPanel = ContactPanel(self) + self.panel = MainPanel(self) self._dialog = None RootPanel().add(self.panel) self._register = RegisterCall() - self._register.call('isRegistered',self.isRegistered) + self._register.call('isRegistered',self._isRegisteredCB) - def isRegistered(self, registered): + def _isRegisteredCB(self, registered): if not registered: self._dialog = RegisterBox(self.logged,centered=True) self._dialog.show() else: - self._register.call('isConnected', self.isConnected) + self._register.call('isConnected', self._isConnectedCB) - def isConnected(self, connected): + def _isConnectedCB(self, connected): if not connected: self._register.call('connect',self.logged) else: @@ -175,11 +273,19 @@ if self._dialog: self._dialog.hide() del self._dialog # don't work if self._dialog is None - Window.alert("Logged successfuly :o)") + + #it's time to fill the page + bridge = BrigeCall() + bridge.call('getContacts', self._getContactsCB) + + def _getContactsCB(self, contacts_data): + for contact in contacts_data: + jid, attributes, groups = contact + self.contactPanel.addContact(jid, attributes, groups) if __name__ == '__main__': - pyjd.setup("./public/Libervia.html") + pyjd.setup("http://localhost:8080/libervia.html") app = SatWebFrontend() app.onModuleLoad() pyjd.run() diff -r 140cec48224a -r 0a7c685faa53 libervia.tac --- a/libervia.tac Sun Jan 30 21:50:22 2011 +0100 +++ b/libervia.tac Mon Jan 31 20:31:25 2011 +0100 @@ -42,9 +42,9 @@ self.sat_host=sat_host def render(self, request): - _session = request.getSession() + self.session = request.getSession() try: - profile = _session.sat_profile + profile = self.session.sat_profile except AttributeError: #user is not identified, we return a jsonrpc fault parsed = jsonrpclib.loads(request.content.read()) @@ -55,9 +55,8 @@ def jsonrpc_getContacts(self): """Return all passed args.""" - d = defer.Deferred() - reactor.callLater(10, d.callback, [unicode(contact[0]) for contact in self.sat_host.bridge.getContacts()]) - return d + profile = self.session.sat_profile + return self.sat_host.bridge.getContacts(profile) class Register(jsonrpc.JSONRPC): """This class manage the registration procedure with SàT @@ -232,13 +231,11 @@ def startService(self): reactor.listenTCP(8080, self.site) - + def run(self): - debug(_("running app")) reactor.run() def stop(self): - debug(_("stopping app")) reactor.stop() diff -r 140cec48224a -r 0a7c685faa53 public/libervia.css --- a/public/libervia.css Sun Jan 30 21:50:22 2011 +0100 +++ b/public/libervia.css Mon Jan 31 20:31:25 2011 +0100 @@ -56,3 +56,26 @@ padding: 10px; } +/* Contact List */ + +.contactTitle { + font-style: italic; + border-bottom: 1px solid gray; + text-align: center; +} + +.group { + font-weight: bold; + font-size: small; +} + +div.group:hover { + text-decoration:underline; +} +.contact { + font-size: small; +} + +.selected { + background-color: yellow; +} diff -r 140cec48224a -r 0a7c685faa53 public/libervia.html --- a/public/libervia.html Sun Jan 30 21:50:22 2011 +0100 +++ b/public/libervia.html Mon Jan 31 20:31:25 2011 +0100 @@ -21,7 +21,7 @@ -Salut à Toi web interface test +Libervia