diff --git a/weboob/applications/qboobmsg/messages_manager.py b/weboob/applications/qboobmsg/messages_manager.py index efd02034..c0353c68 100644 --- a/weboob/applications/qboobmsg/messages_manager.py +++ b/weboob/applications/qboobmsg/messages_manager.py @@ -16,11 +16,12 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import time +import logging -from PyQt4.QtGui import QWidget, QTreeWidgetItem, QListWidgetItem +from PyQt4.QtGui import QWidget, QTreeWidgetItem, QListWidgetItem, QMessageBox from PyQt4.QtCore import SIGNAL, Qt -from weboob.capabilities.messages import ICapMessages +from weboob.capabilities.messages import ICapMessages, Message from weboob.tools.application.qt import QtDo from .ui.messages_manager_ui import Ui_MessagesManager @@ -44,11 +45,18 @@ class MessagesManager(QWidget): self.ui.backendsList.setCurrentRow(0) self.backend = None + self.thread = None + self.message = None + + self.ui.replyButton.setEnabled(False) + self.ui.replyWidget.hide() self.connect(self.ui.backendsList, SIGNAL('itemSelectionChanged()'), self._backendChanged) self.connect(self.ui.threadsList, SIGNAL('itemSelectionChanged()'), self._threadChanged) self.connect(self.ui.messagesTree, SIGNAL('itemClicked(QTreeWidgetItem *, int)'), self._messageSelected) self.connect(self.ui.messagesTree, SIGNAL('itemActivated(QTreeWidgetItem *, int)'), self._messageSelected) + self.connect(self.ui.replyButton, SIGNAL('clicked()'), self._replyPressed) + self.connect(self.ui.sendButton, SIGNAL('clicked()'), self._sendPressed) def load(self): self.refreshThreads() @@ -66,12 +74,19 @@ class MessagesManager(QWidget): self.ui.messagesTree.clear() self.ui.threadsList.clear() + self.hideReply() + self.ui.replyButton.setEnabled(False) + self.ui.backendsList.setEnabled(False) + self.ui.threadsList.setEnabled(False) + self.process_threads = QtDo(self.weboob, self._gotThread) self.process_threads.do('iter_threads', backends=self.backend, caps=ICapMessages) def _gotThread(self, backend, thread): if not backend: self.process_threads = None + self.ui.backendsList.setEnabled(True) + self.ui.threadsList.setEnabled(True) return item = QListWidgetItem(thread.title) @@ -85,12 +100,14 @@ class MessagesManager(QWidget): return t = selection[0].data(Qt.UserRole).toPyObject() - print t self.refreshThreadMessages(*t) def refreshThreadMessages(self, backend, id): + self.ui.messagesTree.clear() self.ui.backendsList.setEnabled(False) self.ui.threadsList.setEnabled(False) + self.ui.replyButton.setEnabled(False) + self.hideReply() self.process = QtDo(self.weboob, self._gotThreadMessages) self.process.do('get_thread', id, backends=backend) @@ -102,11 +119,13 @@ class MessagesManager(QWidget): self.process = None return + self.thread = thread + self.showMessage(thread.root) self._insert_message(thread.root, self.ui.messagesTree.invisibleRootItem()) def _insert_message(self, message, top): - item = QTreeWidgetItem(None, [time.strftime('%Y-%m-%d %H:%M:%S', message.date.timetuple()), - message.sender, message.title]) + item = QTreeWidgetItem(None, [message.title, message.sender, + time.strftime('%Y-%m-%d %H:%M:%S', message.date.timetuple())]) item.setData(0, Qt.UserRole, message) top.addChild(item) @@ -116,12 +135,101 @@ class MessagesManager(QWidget): def _messageSelected(self, item, column): message = item.data(0, Qt.UserRole).toPyObject() + + self.showMessage(message) + + def showMessage(self, message): + self.ui.replyButton.setEnabled(True) + self.message = message + + if message.title.startswith('Re:'): + self.ui.titleEdit.setText(message.title) + else: + self.ui.titleEdit.setText('Re: %s' % message.title) + if message.flags & message.IS_HTML: content = message.content else: content = message.content.replace('&', '&').replace('<', '<').replace('>', '>') + + extra = u'' + if message.flags & message.IS_NOT_ACCUSED: + extra += u'Status: Unread
' + elif message.flags & message.IS_ACCUSED: + extra += u'Status: Read
' + elif message.flags & message.IS_UNREAD: + extra += u'Status: New
' + self.ui.messageBody.setText("

%s

" "Date: %s
" "From: %s
" + "%s" "

%s

" - % (message.title, str(message.date), message.sender, content)) + % (message.title, str(message.date), message.sender, extra, content)) + + def displayReply(self): + self.ui.replyButton.setText(self.tr('Cancel')) + self.ui.replyWidget.show() + + def hideReply(self): + self.ui.replyButton.setText(self.tr('Reply')) + self.ui.replyWidget.hide() + self.ui.replyEdit.clear() + self.ui.titleEdit.clear() + + def _replyPressed(self): + if self.ui.replyWidget.isVisible(): + self.hideReply() + else: + self.displayReply() + + def _sendPressed(self): + if not self.ui.replyWidget.isVisible(): + return + + text = unicode(self.ui.replyEdit.toPlainText()) + title = unicode(self.ui.titleEdit.text()) + + self.ui.replyButton.setEnabled(False) + self.ui.titleEdit.setEnabled(False) + self.ui.replyEdit.setEnabled(False) + self.ui.sendButton.setEnabled(False) + self.ui.sendButton.setText(self.tr('Sending...')) + m = Message(thread=self.thread, + id=0, + title=title, + sender=None, + receiver=None, + content=text, + parent=self.message) + self.process_reply = QtDo(self.weboob, self._postReply_cb, self._postReply_eb) + self.process_reply.do('post_message', m, backends=self.thread.backend) + + def _postReply_cb(self, backend, ignored): + self.ui.replyButton.setEnabled(True) + self.ui.titleEdit.setEnabled(True) + self.ui.titleEdit.clear() + self.ui.replyEdit.setEnabled(True) + self.ui.replyEdit.clear() + self.ui.sendButton.setEnabled(True) + self.ui.sendButton.setText(self.tr('Send')) + self.hideReply() + self.process_reply = None + self.refreshThreadMessages(backend.name, self.thread.id) + + def _postReply_eb(self, backend, error, backtrace): + content = unicode(self.tr('Unable to send message:\n%s\n')) % error + if logging.root.level == logging.DEBUG: + content += '\n%s\n' % backtrace + QMessageBox.critical(self, self.tr('Error while posting reply'), + content, QMessageBox.Ok) + self.ui.replyButton.setEnabled(True) + self.ui.titleEdit.setEnabled(True) + self.ui.titleEdit.clear() + self.ui.replyEdit.setEnabled(True) + self.ui.replyEdit.clear() + self.ui.sendButton.setEnabled(True) + self.ui.sendButton.setText(self.tr('Send')) + self.process_reply = None + + diff --git a/weboob/applications/qboobmsg/ui/messages_manager.ui b/weboob/applications/qboobmsg/ui/messages_manager.ui index 7af558c2..1cbe3f60 100644 --- a/weboob/applications/qboobmsg/ui/messages_manager.ui +++ b/weboob/applications/qboobmsg/ui/messages_manager.ui @@ -13,29 +13,29 @@ - + - + Qt::Horizontal - + 0 0 - - - - - 10 - 0 - + + + 150 + 16777215 + + + - Qt::Vertical + Qt::Horizontal @@ -49,122 +49,187 @@ - - - QAbstractItemView::NoEditTriggers - - - true - - - true - - - true - - - false - - - 100 - - - true - - - true - - - 100 - - - true - - - true - - - - Date + + + + 5 - - AlignLeft|AlignVCenter + + 0 - - - - From - - - - - Title - - + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 9 + + + 2 + + + 9 + + + 2 + + + + + + 0 + 0 + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + QAbstractItemView::NoEditTriggers + + + true + + + true + + + true + + + true + + + 150 + + + true + + + 150 + + + true + + + + Title + + + + + From + + + + + Date + + + + + - - - true - - - Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + Qt::Vertical + + + + 0 + 5 + + + + true + + + Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + Reply + + + + + + + + 0 + + + + + + + + + + + Send + + + + + + + + - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - - 0 - 0 - - - - + - - - - - - - - 0 - 0 - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - -