Inbox messagelist in MV style, isolated on Messages tab (hope).
This commit is contained in:
parent
efcbc651a3
commit
6cf0d07f1b
|
@ -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()
|
||||||
|
@ -565,15 +542,7 @@ class MainWindow(Window):
|
||||||
widget.item(row, 3).setFont(font)
|
widget.item(row, 3).setFont(font)
|
||||||
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,17 +1370,17 @@ 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()
|
||||||
|
|
||||||
def rerenderAddressBook(self):
|
def rerenderAddressBook(self):
|
||||||
def addRow (address, label, type):
|
def addRow(address, label, type):
|
||||||
self.tableWidgetAddressBook.insertRow(0)
|
self.tableWidgetAddressBook.insertRow(0)
|
||||||
newItem = Ui_AddressBookWidgetItemLabel(address, unicode(label, 'utf-8'), type)
|
newItem = Ui_AddressBookWidgetItemLabel(address, unicode(label, 'utf-8'), type)
|
||||||
self.tableWidgetAddressBook.setItem(0, 0, newItem)
|
self.tableWidgetAddressBook.setItem(0, 0, newItem)
|
||||||
|
@ -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,17 +2884,15 @@ 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
|
||||||
|
|
||||||
def getAccountMessagelist(self, account):
|
def getAccountMessagelist(self, account):
|
||||||
try:
|
try:
|
||||||
if account.type == AccountMixin.CHAN:
|
if account.type == AccountMixin.CHAN:
|
||||||
|
@ -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()
|
||||||
|
|
|
@ -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>
|
||||||
|
|
113
src/bitmessageqt/messagelist.py
Normal file
113
src/bitmessageqt/messagelist.py
Normal 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)
|
Reference in New Issue
Block a user