diff --git a/weboob/applications/qhavesex/contacts.py b/weboob/applications/qhavesex/contacts.py index eb9e8549..c69bbf2e 100644 --- a/weboob/applications/qhavesex/contacts.py +++ b/weboob/applications/qhavesex/contacts.py @@ -474,6 +474,9 @@ class ContactsWidget(QWidget): if not contact or contact == self.contact: return + if not isinstance(contact, Contact): + return self.retrieveContact(contact) + self.ui.tabWidget.clear() self.contact = contact backend = self.weboob.get_backend(self.contact.backend) @@ -491,12 +494,15 @@ class ContactsWidget(QWidget): if not url: return + self.retrieveContact(url) + + def retrieveContact(self, url): backend_name = unicode(self.ui.backendsList.currentText()) self.ui.urlButton.setEnabled(False) - self.url_process = QtDo(self.weboob, self.urlClicked_cb, self.urlClicked_eb) + self.url_process = QtDo(self.weboob, self.retrieveContact_cb, self.retrieveContact_eb) self.url_process.do('get_contact', url, backends=backend_name) - def urlClicked_cb(self, backend, contact): + def retrieveContact_cb(self, backend, contact): if not backend: self.url_process = None self.ui.urlButton.setEnabled(True) @@ -505,7 +511,7 @@ class ContactsWidget(QWidget): self.ui.urlEdit.clear() self.setContact(contact) - def urlClicked_eb(self, backend, error, backtrace): + def retrieveContact_eb(self, backend, error, backtrace): content = unicode(self.tr('Unable to get contact:\n%s\n')) % to_unicode(error) if logging.root.level == logging.DEBUG: content += u'\n%s\n' % to_unicode(backtrace) diff --git a/weboob/applications/qhavesex/events.py b/weboob/applications/qhavesex/events.py new file mode 100644 index 00000000..408622c6 --- /dev/null +++ b/weboob/applications/qhavesex/events.py @@ -0,0 +1,137 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2010-2011 Romain Bignon +# +# This file is part of weboob. +# +# weboob is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# weboob is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + +from PyQt4.QtGui import QWidget, QTreeWidgetItem, QImage, QIcon, QPixmap +from PyQt4.QtCore import SIGNAL, Qt + +from weboob.capabilities.base import NotLoaded +from weboob.tools.application.qt import QtDo + +from .ui.events_ui import Ui_Events + +class EventsWidget(QWidget): + def __init__(self, weboob, parent=None): + QWidget.__init__(self, parent) + self.ui = Ui_Events() + self.ui.setupUi(self) + + self.weboob = weboob + self.photo_processes = {} + self.event_filter = None + + self.connect(self.ui.eventsList, SIGNAL('itemDoubleClicked(QTreeWidgetItem*, int)'), self.eventDoubleClicked) + self.connect(self.ui.typeBox, SIGNAL('currentIndexChanged(int)'), self.typeChanged) + self.connect(self.ui.refreshButton, SIGNAL('clicked()'), self.refreshEventsList) + + self.ui.eventsList.sortByColumn(1, Qt.DescendingOrder) + + def load(self): + self.refreshEventsList() + + def typeChanged(self, i): + if self.ui.refreshButton.isEnabled(): + self.refreshEventsList() + + def refreshEventsList(self): + self.ui.eventsList.clear() + self.ui.refreshButton.setEnabled(False) + if self.ui.typeBox.currentIndex() >= 0: + # XXX strangely, in gotEvent() in the loop to check if there is already the + # event type to try to introduce it in list, itemData() returns the right value. + # But, I don't know why, here, it will ALWAYS return None... + # So the filter does not work currently. + self.events_filter = self.ui.typeBox.itemData(self.ui.typeBox.currentIndex()) + else: + self.event_filter = None + self.ui.typeBox.setEnabled(False) + self.ui.typeBox.clear() + self.ui.typeBox.addItem('All', None) + self.process = QtDo(self.weboob, self.gotEvent) + self.process.do('iter_events') + + def setPhoto(self, contact, item): + if not contact: + return False + + try: + self.photo_processes.pop(contact.id, None) + except KeyError: + pass + + img = None + for photo in contact.photos.itervalues(): + if photo.thumbnail_data: + img = QImage.fromData(photo.thumbnail_data) + break + + if img: + item.setIcon(0, QIcon(QPixmap.fromImage(img))) + self.ui.eventsList.resizeColumnToContents(0) + return True + + return False + + def gotEvent(self, backend, event): + if not backend: + self.ui.refreshButton.setEnabled(True) + self.ui.typeBox.setEnabled(True) + return + + found = False + for i in xrange(self.ui.typeBox.count()): + s = self.ui.typeBox.itemData(i) + if s == event.type: + found = True + if not found: + print event.type + self.ui.typeBox.addItem(event.type.capitalize(), event.type) + if event.type == self.event_filter: + self.ui.typeBox.setCurrentIndex(self.ui.typeBox.count()-1) + + if self.event_filter and self.event_filter != event.type: + return + + date = event.date.strftime('%Y-%m-%d %H:%M') + type = event.type + name = event.contact.name if event.contact else '' + message = event.message + + item = QTreeWidgetItem(None, [name, date, type, message]) + item.setData(0, Qt.UserRole, event) + + contact = event.contact + contact.backend = event.backend + if contact.photos is NotLoaded: + process = QtDo(self.weboob, lambda b, c: self.setPhoto(c, item)) + process.do('fillobj', contact, ['photos'], backends=contact.backend) + self.photo_processes[contact.id] = process + elif len(contact.photos) > 0: + if not self.setPhoto(contact, item): + photo = contact.photos.values()[0] + process = QtDo(self.weboob, lambda b, p: self.setPhoto(contact, item)) + process.do('fillobj', photo, ['thumbnail_data'], backends=contact.backend) + self.photo_processes[contact.id] = process + + self.ui.eventsList.addTopLevelItem(item) + self.ui.eventsList.resizeColumnToContents(0) + self.ui.eventsList.resizeColumnToContents(1) + + def eventDoubleClicked(self, item, col): + event = item.data(0, Qt.UserRole).toPyObject() + self.emit(SIGNAL('display_contact'), event.contact) diff --git a/weboob/applications/qhavesex/main_window.py b/weboob/applications/qhavesex/main_window.py index 2a90166d..4bfec3ff 100644 --- a/weboob/applications/qhavesex/main_window.py +++ b/weboob/applications/qhavesex/main_window.py @@ -33,6 +33,7 @@ except ImportError: from .ui.main_window_ui import Ui_MainWindow from .status import AccountsStatus from .contacts import ContactsWidget +from .events import EventsWidget class MainWindow(QtMainWindow): def __init__(self, config, weboob, parent=None): @@ -48,12 +49,12 @@ class MainWindow(QtMainWindow): self.connect(self.ui.actionBackends, SIGNAL("triggered()"), self.backendsConfig) self.connect(self.ui.tabWidget, SIGNAL('currentChanged(int)'), self.tabChanged) - self.ui.tabWidget.addTab(AccountsStatus(self.weboob), self.tr('Status')) - if HAVE_BOOBMSG: - self.ui.tabWidget.addTab(MessagesManager(self.weboob), self.tr('Messages')) - self.ui.tabWidget.addTab(ContactsWidget(self.weboob), self.tr('Contacts')) - self.ui.tabWidget.addTab(QWidget(), self.tr('Calendar')) - self.ui.tabWidget.addTab(QWidget(), self.tr('Optimizations')) + self.addTab(AccountsStatus(self.weboob), self.tr('Status')) + self.addTab(MessagesManager(self.weboob) if HAVE_BOOBMSG else None, self.tr('Messages')) + self.addTab(ContactsWidget(self.weboob), self.tr('Contacts')) + self.addTab(EventsWidget(self.weboob), self.tr('Events')) + self.addTab(None, self.tr('Calendar')) + self.addTab(None, self.tr('Optimizations')) if self.weboob.count_backends() == 0: self.backendsConfig() @@ -65,9 +66,22 @@ class MainWindow(QtMainWindow): widget = self.ui.tabWidget.widget(self.ui.tabWidget.currentIndex()) widget.load() + def addTab(self, widget, title): + if widget: + self.connect(widget, SIGNAL('display_contact'), self.display_contact) + self.ui.tabWidget.addTab(widget, title) + else: + index = self.ui.tabWidget.addTab(QWidget(), title) + self.ui.tabWidget.setTabEnabled(index, False) + def tabChanged(self, i): widget = self.ui.tabWidget.currentWidget() if hasattr(widget, 'load') and not i in self.loaded_tabs: widget.load() self.loaded_tabs[i] = True + + def display_contact(self, contact): + self.ui.tabWidget.setCurrentIndex(2) + widget = self.ui.tabWidget.currentWidget() + widget.setContact(contact) diff --git a/weboob/applications/qhavesex/ui/events.ui b/weboob/applications/qhavesex/ui/events.ui new file mode 100644 index 00000000..ac10b585 --- /dev/null +++ b/weboob/applications/qhavesex/ui/events.ui @@ -0,0 +1,84 @@ + + + Events + + + + 0 + 0 + 497 + 318 + + + + Form + + + + + + + + + + + + + + + ../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../usr/share/icons/oxygen/16x16/actions/view-refresh.png../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../usr/share/icons/oxygen/16x16/actions/view-refresh.png + + + + + + + + + QAbstractItemView::NoEditTriggers + + + true + + + + 64 + 64 + + + + false + + + true + + + true + + + + Contact + + + + + Date + + + + + Type + + + + + Message + + + + + + + + +