Inbox messagelist in MV style, isolated on Messages tab (hope).

This commit is contained in:
Dmitri Bogomolov 2019-02-19 19:04:10 +02:00
parent efcbc651a3
commit 6cf0d07f1b
Signed by untrusted user: g1itch
GPG Key ID: 720A756F18DEED13
3 changed files with 150 additions and 81 deletions

View File

@ -372,7 +372,7 @@ class MainWindow(Window):
self.treeWidgetChans.keyPressEvent = self.treeWidgetKeyPressEvent self.treeWidgetChans.keyPressEvent = self.treeWidgetKeyPressEvent
# Key press in messagelist # Key press in messagelist
self.tableWidgetInbox.keyPressEvent = self.tableWidgetKeyPressEvent self.messagelistInbox.keyPressEvent = self.tableWidgetKeyPressEvent
self.tableWidgetInboxSubscriptions.keyPressEvent = self.tableWidgetKeyPressEvent self.tableWidgetInboxSubscriptions.keyPressEvent = self.tableWidgetKeyPressEvent
self.tableWidgetInboxChans.keyPressEvent = self.tableWidgetKeyPressEvent self.tableWidgetInboxChans.keyPressEvent = self.tableWidgetKeyPressEvent
@ -535,29 +535,6 @@ class MainWindow(Window):
) )
def updateUnreadStatus(self, widget, row, msgid, unread=True): def updateUnreadStatus(self, widget, row, msgid, unread=True):
"""
Switch unread for item of msgid and related items in
other STableWidgets "All Accounts" and "Chans"
"""
related = [self.tableWidgetInbox, self.tableWidgetInboxChans]
try:
related.remove(widget)
related = related.pop()
except ValueError:
rrow = None
related = []
else:
# maybe use instead:
# rrow = related.row(msgid), msgid should be QTableWidgetItem
# related = related.findItems(msgid, QtCore.Qt.MatchExactly),
# returns an empty list
for rrow in xrange(related.rowCount()):
if msgid == str(related.item(rrow, 3).data(
QtCore.Qt.UserRole).toPyObject()):
break
else:
rrow = None
status = widget.item(row, 0).unread status = widget.item(row, 0).unread
if status == unread: if status == unread:
font = QtGui.QFont() font = QtGui.QFont()
@ -566,14 +543,6 @@ class MainWindow(Window):
for col in (0, 1, 2): for col in (0, 1, 2):
widget.item(row, col).setUnread(not status) widget.item(row, col).setUnread(not status)
try:
related.item(rrow, 3).setFont(font)
except (TypeError, AttributeError):
pass
else:
for col in (0, 1, 2):
related.item(rrow, col).setUnread(not status)
def propagateUnreadCount(self, address = None, folder = "inbox", widget = None, type = 1): def propagateUnreadCount(self, address = None, folder = "inbox", widget = None, type = 1):
widgets = [self.treeWidgetYourIdentities, self.treeWidgetSubscriptions, self.treeWidgetChans] widgets = [self.treeWidgetYourIdentities, self.treeWidgetSubscriptions, self.treeWidgetChans]
queryReturn = sqlQuery("SELECT toaddress, folder, COUNT(msgid) AS cnt FROM inbox WHERE read = 0 GROUP BY toaddress, folder") queryReturn = sqlQuery("SELECT toaddress, folder, COUNT(msgid) AS cnt FROM inbox WHERE read = 0 GROUP BY toaddress, folder")
@ -1348,7 +1317,8 @@ class MainWindow(Window):
def updateSentItemStatusByAckdata(self, ackdata, textToDisplay): def updateSentItemStatusByAckdata(self, ackdata, textToDisplay):
if type(ackdata) is str: if type(ackdata) is str:
ackdata = QtCore.QByteArray(ackdata) ackdata = QtCore.QByteArray(ackdata)
for sent in [self.tableWidgetInbox, self.tableWidgetInboxSubscriptions, self.tableWidgetInboxChans]: for sent in (
self.tableWidgetInboxSubscriptions, self.tableWidgetInboxChans):
treeWidget = self.widgetConvert(sent) treeWidget = self.widgetConvert(sent)
if self.getCurrentFolder(treeWidget) != "sent": if self.getCurrentFolder(treeWidget) != "sent":
continue continue
@ -1372,10 +1342,10 @@ class MainWindow(Window):
sent.item(i, 3).setText(textToDisplay) sent.item(i, 3).setText(textToDisplay)
def removeInboxRowByMsgid(self, msgid): # msgid and inventoryHash are the same thing def removeInboxRowByMsgid(self, msgid): # msgid and inventoryHash are the same thing
for inbox in ([ for inbox in (
self.tableWidgetInbox,
self.tableWidgetInboxSubscriptions, self.tableWidgetInboxSubscriptions,
self.tableWidgetInboxChans]): self.tableWidgetInboxChans
):
for i in range(inbox.rowCount()): for i in range(inbox.rowCount()):
if msgid == str(inbox.item(i, 3).data(QtCore.Qt.UserRole).toPyObject()): if msgid == str(inbox.item(i, 3).data(QtCore.Qt.UserRole).toPyObject()):
self.updateStatusBar( self.updateStatusBar(
@ -1391,8 +1361,7 @@ class MainWindow(Window):
"MainWindow", "MainWindow",
"New version of PyBitmessage is available: %1. Download it" "New version of PyBitmessage is available: %1. Download it"
" from https://github.com/Bitmessage/PyBitmessage/releases/latest" " from https://github.com/Bitmessage/PyBitmessage/releases/latest"
).arg(self.notifiedNewVersion) ).arg(self.notifiedNewVersion))
)
def displayAlert(self, title, text, exitAfterUserClicksOk): def displayAlert(self, title, text, exitAfterUserClicksOk):
self.updateStatusBar(text) self.updateStatusBar(text)
@ -1401,12 +1370,12 @@ class MainWindow(Window):
os._exit(0) os._exit(0)
def rerenderMessagelistFromLabels(self): def rerenderMessagelistFromLabels(self):
for messagelist in (self.tableWidgetInbox, self.tableWidgetInboxChans, self.tableWidgetInboxSubscriptions): for messagelist in (self.tableWidgetInboxChans, self.tableWidgetInboxSubscriptions):
for i in range(messagelist.rowCount()): for i in range(messagelist.rowCount()):
messagelist.item(i, 1).setLabel() messagelist.item(i, 1).setLabel()
def rerenderMessagelistToLabels(self): def rerenderMessagelistToLabels(self):
for messagelist in (self.tableWidgetInbox, self.tableWidgetInboxChans, self.tableWidgetInboxSubscriptions): for messagelist in (self.tableWidgetInboxChans, self.tableWidgetInboxSubscriptions):
for i in range(messagelist.rowCount()): for i in range(messagelist.rowCount()):
messagelist.item(i, 0).setLabel() messagelist.item(i, 0).setLabel()
@ -2876,20 +2845,18 @@ class MainWindow(Window):
self.treeWidgetSubscriptions.mapToGlobal(point)) self.treeWidgetSubscriptions.mapToGlobal(point))
def widgetConvert(self, widget): def widgetConvert(self, widget):
if widget == self.tableWidgetInbox: # if widget == self.tableWidgetInbox:
return self.treeWidgetYourIdentities # return self.treeWidgetYourIdentities
elif widget == self.tableWidgetInboxSubscriptions: if widget == self.tableWidgetInboxSubscriptions:
return self.treeWidgetSubscriptions return self.treeWidgetSubscriptions
elif widget == self.tableWidgetInboxChans: elif widget == self.tableWidgetInboxChans:
return self.treeWidgetChans return self.treeWidgetChans
elif widget == self.treeWidgetYourIdentities: elif widget == self.treeWidgetYourIdentities:
return self.tableWidgetInbox return self.messagelistInbox
elif widget == self.treeWidgetSubscriptions: elif widget == self.treeWidgetSubscriptions:
return self.tableWidgetInboxSubscriptions return self.tableWidgetInboxSubscriptions
elif widget == self.treeWidgetChans: elif widget == self.treeWidgetChans:
return self.tableWidgetInboxChans return self.tableWidgetInboxChans
else:
return None
def getCurrentTreeWidget(self): def getCurrentTreeWidget(self):
currentIndex = self.tabWidget.currentIndex() currentIndex = self.tabWidget.currentIndex()
@ -2917,14 +2884,12 @@ class MainWindow(Window):
def getCurrentMessagelist(self): def getCurrentMessagelist(self):
currentIndex = self.tabWidget.currentIndex(); currentIndex = self.tabWidget.currentIndex();
messagelistList = [ messagelistList = (
self.tableWidgetInbox,
False,
self.tableWidgetInboxSubscriptions, self.tableWidgetInboxSubscriptions,
self.tableWidgetInboxChans, self.tableWidgetInboxChans,
] )
if currentIndex >= 0 and currentIndex < len(messagelistList): if currentIndex >= 2 and currentIndex - 2 < len(messagelistList):
return messagelistList[currentIndex] return messagelistList[currentIndex - 2]
else: else:
return False return False
@ -3494,6 +3459,12 @@ class MainWindow(Window):
messageTextedit.setTextColor(QtGui.QColor()) messageTextedit.setTextColor(QtGui.QColor())
messageTextedit.setContent(message) messageTextedit.setContent(message)
def messagelistSelect(self, msg):
messageTextedit = self.getCurrentMessageTextedit()
if not messageTextedit:
return
messageTextedit.setContent(msg)
def tableWidgetAddressBookItemChanged(self, item): def tableWidgetAddressBookItemChanged(self, item):
if item.type == AccountMixin.CHAN: if item.type == AccountMixin.CHAN:
self.rerenderComboBoxSendFrom() self.rerenderComboBoxSendFrom()

View File

@ -178,7 +178,7 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<widget class="STableWidget" name="tableWidgetInbox"> <widget class="InboxMessagelist" name="messagelistInbox">
<property name="contextMenuPolicy"> <property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum> <enum>Qt::CustomContextMenu</enum>
</property> </property>
@ -224,26 +224,6 @@
<attribute name="verticalHeaderDefaultSectionSize"> <attribute name="verticalHeaderDefaultSectionSize">
<number>26</number> <number>26</number>
</attribute> </attribute>
<column>
<property name="text">
<string>To</string>
</property>
</column>
<column>
<property name="text">
<string>From</string>
</property>
</column>
<column>
<property name="text">
<string>Subject</string>
</property>
</column>
<column>
<property name="text">
<string>Received</string>
</property>
</column>
</widget> </widget>
<widget class="MessageView" name="textEditInboxMessage"> <widget class="MessageView" name="textEditInboxMessage">
<property name="baseSize"> <property name="baseSize">
@ -1604,6 +1584,11 @@ p, li { white-space: pre-wrap; }
<extends>QTableWidget</extends> <extends>QTableWidget</extends>
<header>bitmessageqt.settingsmixin</header> <header>bitmessageqt.settingsmixin</header>
</customwidget> </customwidget>
<customwidget>
<class>InboxMessagelist</class>
<extends>QTableView</extends>
<header>bitmessageqt.messagelist</header>
</customwidget>
<customwidget> <customwidget>
<class>SSplitter</class> <class>SSplitter</class>
<extends>QSplitter</extends> <extends>QSplitter</extends>
@ -1617,7 +1602,7 @@ p, li { white-space: pre-wrap; }
</customwidget> </customwidget>
</customwidgets> </customwidgets>
<tabstops> <tabstops>
<tabstop>tableWidgetInbox</tabstop> <tabstop>messagelistInbox</tabstop>
<tabstop>textEditInboxMessage</tabstop> <tabstop>textEditInboxMessage</tabstop>
<tabstop>comboBoxSendFrom</tabstop> <tabstop>comboBoxSendFrom</tabstop>
<tabstop>lineEditTo</tabstop> <tabstop>lineEditTo</tabstop>
@ -1919,7 +1904,7 @@ p, li { white-space: pre-wrap; }
</hints> </hints>
</connection> </connection>
<connection> <connection>
<sender>tableWidgetInbox</sender> <sender>messagelistInbox</sender>
<signal>customContextMenuRequested(QPoint)</signal> <signal>customContextMenuRequested(QPoint)</signal>
<receiver>MainWindow</receiver> <receiver>MainWindow</receiver>
<slot>on_context_menuInbox()</slot> <slot>on_context_menuInbox()</slot>
@ -2783,10 +2768,10 @@ p, li { white-space: pre-wrap; }
</hints> </hints>
</connection> </connection>
<connection> <connection>
<sender>tableWidgetInbox</sender> <sender>messagelistInbox</sender>
<signal>itemSelectionChanged()</signal> <signal>messageSelected(QString)</signal>
<receiver>MainWindow</receiver> <receiver>MainWindow</receiver>
<slot>tableWidgetInboxItemClicked</slot> <slot>messagelistSelect</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>20</x> <x>20</x>

View File

@ -0,0 +1,113 @@
from PyQt4 import QtCore, QtGui
from debug import logger
from helper_sql import sqlQuery, sqlExecute
from tr import _translate
class InboxFilter(dict):
def __init__(self, *args, **kwargs):
self.fields = kwargs.pop('fields')
super(InboxFilter, self).__init__(*args, **kwargs)
def __str__(self):
terms = ' AND '.join([
'%s = %r' % (key, val)
for key, val in self.iteritems()
if key in self.fields
])
return 'WHERE %s' % terms if terms else ''
class InboxTableItem(QtCore.QAbstractItemModel):
pass
class InboxTableModel(QtCore.QAbstractTableModel):
fields = (
'msgid', 'toaddress', 'fromaddress', 'subject', 'received', 'read')
header = (
{'field': 'fromaddress',
'label': _translate("MainWindow", "From")},
{'field': 'subject',
'label': _translate("MainWindow", "Subject")},
{'field': 'received',
'label': _translate("MainWindow", "Received")}
)
attributes = ('msgid', 'read')
table = 'inbox'
def __init__(self, parent=None):
super(InboxTableModel, self).__init__()
self.filter = InboxFilter(fields=self.fields)
self.fields = ','.join(self.fields)
self.query = 'SELECT %%s FROM %s ' % self.table
self.sort = ' ORDER BY received DESC'
self.column_count = len(self.header)
self.item = InboxTableItem()
def columnCount(self, parent=QtCore.QModelIndex()):
if parent.isValid():
return 0
return self.column_count
def rowCount(self, parent=QtCore.QModelIndex()):
if parent.isValid():
return 0
return sqlQuery('%s %s' % (self.query, self.filter) % 'COUNT(*)')[0][0]
def data(self, index, role=QtCore.Qt.DisplayRole):
if role == QtCore.Qt.FontRole:
font = QtGui.QFont()
font.setBold(
not sqlQuery(
'%s %s %s' % (self.query, self.filter, self.sort) % 'read'
)[index.row()][0]
)
return font
if not index.isValid() or role not in (
QtCore.Qt.DisplayRole, QtCore.Qt.ToolTipRole
):
return QtCore.QVariant()
try:
column = self.header[index.column()]['field']
except IndexError:
# virtual columns: 3 - msgid, 4 - read
column = self.attributes[index.column() - len(self.header)]
return sqlQuery(
'%s %s %s' % (self.query, self.filter, self.sort) % column
)[index.row()][0]
def headerData(self, column, orientation, role=QtCore.Qt.DisplayRole):
if orientation == QtCore.Qt.Vertical:
return
if role == QtCore.Qt.DisplayRole:
return self.header[column]['label']
def setRead(self, row, read=True):
msgid = self.data(self.createIndex(row, 3))
sqlExecute('UPDATE inbox SET read = ? WHERE msgid = ?', read, msgid)
def getMessage(self, row):
msgid = self.data(self.createIndex(row, 3))
logger.debug('Selected msgid: %r' % msgid)
return sqlQuery(
'SELECT message FROM inbox WHERE msgid = ?', msgid
)[0][0]
class InboxMessagelist(QtGui.QTableView):
def __init__(self, parent=None):
super(InboxMessagelist, self).__init__(parent)
self.setModel(InboxTableModel())
def currentChanged(self, cur_id, prev_id):
row = cur_id.row()
if row == prev_id.row():
return
self.model().setRead(row)
msg = self.model().getMessage(row)
self.emit(QtCore.SIGNAL("messageSelected(QString)"), msg)