Runnable with both Python3 and Python2, with both PyQt5 and PyQt4 by using Qt.py #2250
|
@ -72,6 +72,8 @@ function install_python(){
|
||||||
wine python -m pip install pytools==2020.2
|
wine python -m pip install pytools==2020.2
|
||||||
echo "Upgrading pip"
|
echo "Upgrading pip"
|
||||||
wine python -m pip install --upgrade pip
|
wine python -m pip install --upgrade pip
|
||||||
|
# install pypiwin32 for win32com
|
||||||
|
wine python -m pip install pypiwin32
|
||||||
}
|
}
|
||||||
|
|
||||||
function install_pyqt(){
|
function install_pyqt(){
|
||||||
|
@ -82,6 +84,8 @@ function install_pyqt(){
|
||||||
echo "Installing PyQt-${PYQT_VERSION} 32b"
|
echo "Installing PyQt-${PYQT_VERSION} 32b"
|
||||||
wine PyQt${PYQT_VERSION}-x32.exe /S /WX
|
wine PyQt${PYQT_VERSION}-x32.exe /S /WX
|
||||||
fi
|
fi
|
||||||
|
# and qtpy
|
||||||
|
wine python -m pip install qtpy
|
||||||
}
|
}
|
||||||
|
|
||||||
function install_openssl(){
|
function install_openssl(){
|
||||||
|
|
|
@ -216,8 +216,7 @@ autodoc_mock_imports = [
|
||||||
'pkg_resources',
|
'pkg_resources',
|
||||||
'pycanberra',
|
'pycanberra',
|
||||||
'pyopencl',
|
'pyopencl',
|
||||||
'PyQt4',
|
'qtpy',
|
||||||
'PyQt5',
|
|
||||||
'qrcode',
|
'qrcode',
|
||||||
'stem',
|
'stem',
|
||||||
'xdg',
|
'xdg',
|
||||||
|
|
|
@ -11,11 +11,13 @@ ingredients:
|
||||||
- python-msgpack
|
- python-msgpack
|
||||||
- python-qrcode
|
- python-qrcode
|
||||||
- python-qt4
|
- python-qt4
|
||||||
|
- python-qtpy
|
||||||
- python-setuptools
|
- python-setuptools
|
||||||
- python-sip
|
- python-sip
|
||||||
- python-six
|
- python-six
|
||||||
- python-xdg
|
- python-xdg
|
||||||
- sni-qt
|
- sni-qt
|
||||||
|
- xkb-data
|
||||||
exclude:
|
exclude:
|
||||||
- libdb5.3
|
- libdb5.3
|
||||||
- libglib2.0-0
|
- libglib2.0-0
|
||||||
|
|
|
@ -43,8 +43,16 @@ a = Analysis(
|
||||||
'setuptools.msvc', '_cffi_backend',
|
'setuptools.msvc', '_cffi_backend',
|
||||||
'plugins.menu_qrcode', 'plugins.proxyconfig_stem'
|
'plugins.menu_qrcode', 'plugins.proxyconfig_stem'
|
||||||
],
|
],
|
||||||
runtime_hooks=[os.path.join(hookspath, 'pyinstaller_rthook_plugins.py')],
|
# https://github.com/pyinstaller/pyinstaller/wiki/Recipe-PyQt4-API-Version
|
||||||
excludes=excludes
|
runtime_hooks = [
|
||||||
|
os.path.join(hookspath, hook) for hook in (
|
||||||
|
'pyinstaller_rthook_pyqt4.py',
|
||||||
|
'pyinstaller_rthook_plugins.py'
|
||||||
|
)],
|
||||||
|
excludes += [
|
||||||
|
'PyQt4.QtOpenGL','PyQt4.QtSql',
|
||||||
|
'PyQt4.QtSvg', 'PyQt4.QtTest', 'PyQt4.QtWebKit', 'PyQt4.QtXml',
|
||||||
|
'win32ui']
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -90,9 +98,8 @@ a.datas += addTranslations()
|
||||||
a.datas += [('default.ini', os.path.join(srcPath, 'default.ini'), 'DATA')]
|
a.datas += [('default.ini', os.path.join(srcPath, 'default.ini'), 'DATA')]
|
||||||
|
|
||||||
excluded_binaries = [
|
excluded_binaries = [
|
||||||
'QtOpenGL4.dll',
|
'QtOpenGL4.dll', 'QtSql4.dll', 'QtSvg4.dll', 'QtTest4.dll',
|
||||||
'QtSvg4.dll',
|
'QtWebKit4.dll', 'QtXml4.dll'
|
||||||
'QtXml4.dll',
|
|
||||||
]
|
]
|
||||||
a.binaries = TOC([x for x in a.binaries if x[0] not in excluded_binaries])
|
a.binaries = TOC([x for x in a.binaries if x[0] not in excluded_binaries])
|
||||||
|
|
||||||
|
|
10
packages/pyinstaller/hooks/pyinstaller_rthook_pyqt4.py
Normal file
10
packages/pyinstaller/hooks/pyinstaller_rthook_pyqt4.py
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# https://github.com/pyinstaller/pyinstaller/wiki/Recipe-PyQt4-API-Version
|
||||||
|
import sip
|
||||||
|
|
||||||
|
sip.setapi(u'QDate', 2)
|
||||||
|
sip.setapi(u'QDateTime', 2)
|
||||||
|
sip.setapi(u'QString', 2)
|
||||||
|
sip.setapi(u'QTextStream', 2)
|
||||||
|
sip.setapi(u'QTime', 2)
|
||||||
|
sip.setapi(u'QUrl', 2)
|
||||||
|
sip.setapi(u'QVariant', 2)
|
|
@ -4,6 +4,7 @@ PyQt based UI for bitmessage, the main module
|
||||||
|
|
||||||
import hashlib
|
import hashlib
|
||||||
import locale
|
import locale
|
||||||
|
import logging
|
||||||
import os
|
import os
|
||||||
import random
|
import random
|
||||||
import string
|
import string
|
||||||
|
@ -16,11 +17,12 @@ from datetime import datetime, timedelta
|
||||||
from sqlite3 import register_adapter
|
from sqlite3 import register_adapter
|
||||||
import six
|
import six
|
||||||
from six.moves import range as xrange
|
from six.moves import range as xrange
|
||||||
|
if six.PY3:
|
||||||
|
from codecs import escape_decode
|
||||||
|
|
||||||
from unqstr import ustr, unic
|
from unqstr import ustr, unic
|
||||||
from PyQt4 import QtCore, QtGui
|
|
||||||
from PyQt4.QtNetwork import QLocalSocket, QLocalServer
|
|
||||||
from dbcompat import dbstr
|
from dbcompat import dbstr
|
||||||
|
from qtpy import QtCore, QtGui, QtWidgets, QtNetwork
|
||||||
|
|
||||||
import shared
|
import shared
|
||||||
import state
|
import state
|
||||||
|
@ -65,6 +67,7 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
get_plugins = False
|
get_plugins = False
|
||||||
|
|
||||||
|
logger = logging.getLogger('default')
|
||||||
|
|
||||||
# TODO: rewrite
|
# TODO: rewrite
|
||||||
def powQueueSize():
|
def powQueueSize():
|
||||||
|
@ -103,12 +106,12 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
newlocale = l10n.getTranslationLanguage()
|
newlocale = l10n.getTranslationLanguage()
|
||||||
try:
|
try:
|
||||||
if not self.qmytranslator.isEmpty():
|
if not self.qmytranslator.isEmpty():
|
||||||
QtGui.QApplication.removeTranslator(self.qmytranslator)
|
QtWidgets.QApplication.removeTranslator(self.qmytranslator)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
try:
|
try:
|
||||||
if not self.qsystranslator.isEmpty():
|
if not self.qsystranslator.isEmpty():
|
||||||
QtGui.QApplication.removeTranslator(self.qsystranslator)
|
QtWidgets.QApplication.removeTranslator(self.qsystranslator)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -116,7 +119,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
translationpath = os.path.join(
|
translationpath = os.path.join(
|
||||||
paths.codePath(), 'translations', 'bitmessage_' + newlocale)
|
paths.codePath(), 'translations', 'bitmessage_' + newlocale)
|
||||||
self.qmytranslator.load(translationpath)
|
self.qmytranslator.load(translationpath)
|
||||||
QtGui.QApplication.installTranslator(self.qmytranslator)
|
QtWidgets.QApplication.installTranslator(self.qmytranslator)
|
||||||
|
|
||||||
self.qsystranslator = QtCore.QTranslator()
|
self.qsystranslator = QtCore.QTranslator()
|
||||||
if paths.frozen:
|
if paths.frozen:
|
||||||
|
@ -127,7 +130,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
ustr(QtCore.QLibraryInfo.location(
|
ustr(QtCore.QLibraryInfo.location(
|
||||||
QtCore.QLibraryInfo.TranslationsPath)), 'qt_' + newlocale)
|
QtCore.QLibraryInfo.TranslationsPath)), 'qt_' + newlocale)
|
||||||
self.qsystranslator.load(translationpath)
|
self.qsystranslator.load(translationpath)
|
||||||
QtGui.QApplication.installTranslator(self.qsystranslator)
|
QtWidgets.QApplication.installTranslator(self.qsystranslator)
|
||||||
|
|
||||||
# TODO: move this block into l10n
|
# TODO: move this block into l10n
|
||||||
# FIXME: shouldn't newlocale be used here?
|
# FIXME: shouldn't newlocale be used here?
|
||||||
|
@ -152,50 +155,35 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
logger.error("Failed to set locale to %s", lang, exc_info=True)
|
logger.error("Failed to set locale to %s", lang, exc_info=True)
|
||||||
|
|
||||||
def init_file_menu(self):
|
def init_file_menu(self):
|
||||||
QtCore.QObject.connect(self.ui.actionExit, QtCore.SIGNAL(
|
self.ui.actionExit.triggered.connect(self.quit)
|
||||||
"triggered()"), self.quit)
|
self.ui.actionNetworkSwitch.triggered.connect(self.network_switch)
|
||||||
QtCore.QObject.connect(self.ui.actionNetworkSwitch, QtCore.SIGNAL(
|
self.ui.actionManageKeys.triggered.connect(self.click_actionManageKeys)
|
||||||
"triggered()"), self.network_switch)
|
self.ui.actionDeleteAllTrashedMessages.triggered.connect(
|
||||||
QtCore.QObject.connect(self.ui.actionManageKeys, QtCore.SIGNAL(
|
self.click_actionDeleteAllTrashedMessages)
|
||||||
"triggered()"), self.click_actionManageKeys)
|
self.ui.actionRegenerateDeterministicAddresses.triggered.connect(
|
||||||
QtCore.QObject.connect(self.ui.actionDeleteAllTrashedMessages,
|
self.click_actionRegenerateDeterministicAddresses)
|
||||||
QtCore.SIGNAL(
|
self.ui.actionSettings.triggered.connect(self.click_actionSettings)
|
||||||
"triggered()"),
|
self.ui.actionAbout.triggered.connect(self.click_actionAbout)
|
||||||
self.click_actionDeleteAllTrashedMessages)
|
self.ui.actionSupport.triggered.connect(self.click_actionSupport)
|
||||||
QtCore.QObject.connect(self.ui.actionRegenerateDeterministicAddresses,
|
self.ui.actionHelp.triggered.connect(self.click_actionHelp)
|
||||||
QtCore.SIGNAL(
|
|
||||||
"triggered()"),
|
# also used for creating chans.
|
||||||
self.click_actionRegenerateDeterministicAddresses)
|
self.ui.pushButtonAddChan.clicked.connect(self.click_actionJoinChan)
|
||||||
QtCore.QObject.connect(
|
self.ui.pushButtonNewAddress.clicked.connect(
|
||||||
self.ui.pushButtonAddChan,
|
self.click_NewAddressDialog)
|
||||||
QtCore.SIGNAL("clicked()"),
|
self.ui.pushButtonAddAddressBook.clicked.connect(
|
||||||
self.click_actionJoinChan) # also used for creating chans.
|
self.click_pushButtonAddAddressBook)
|
||||||
QtCore.QObject.connect(self.ui.pushButtonNewAddress, QtCore.SIGNAL(
|
self.ui.pushButtonAddSubscription.clicked.connect(
|
||||||
"clicked()"), self.click_NewAddressDialog)
|
self.click_pushButtonAddSubscription)
|
||||||
QtCore.QObject.connect(self.ui.pushButtonAddAddressBook, QtCore.SIGNAL(
|
self.ui.pushButtonTTL.clicked.connect(self.click_pushButtonTTL)
|
||||||
"clicked()"), self.click_pushButtonAddAddressBook)
|
self.ui.pushButtonClear.clicked.connect(self.click_pushButtonClear)
|
||||||
QtCore.QObject.connect(self.ui.pushButtonAddSubscription, QtCore.SIGNAL(
|
self.ui.pushButtonSend.clicked.connect(self.click_pushButtonSend)
|
||||||
"clicked()"), self.click_pushButtonAddSubscription)
|
self.ui.pushButtonFetchNamecoinID.clicked.connect(
|
||||||
QtCore.QObject.connect(self.ui.pushButtonTTL, QtCore.SIGNAL(
|
self.click_pushButtonFetchNamecoinID)
|
||||||
"clicked()"), self.click_pushButtonTTL)
|
|
||||||
QtCore.QObject.connect(self.ui.pushButtonClear, QtCore.SIGNAL(
|
|
||||||
"clicked()"), self.click_pushButtonClear)
|
|
||||||
QtCore.QObject.connect(self.ui.pushButtonSend, QtCore.SIGNAL(
|
|
||||||
"clicked()"), self.click_pushButtonSend)
|
|
||||||
QtCore.QObject.connect(self.ui.pushButtonFetchNamecoinID, QtCore.SIGNAL(
|
|
||||||
"clicked()"), self.click_pushButtonFetchNamecoinID)
|
|
||||||
QtCore.QObject.connect(self.ui.actionSettings, QtCore.SIGNAL(
|
|
||||||
"triggered()"), self.click_actionSettings)
|
|
||||||
QtCore.QObject.connect(self.ui.actionAbout, QtCore.SIGNAL(
|
|
||||||
"triggered()"), self.click_actionAbout)
|
|
||||||
QtCore.QObject.connect(self.ui.actionSupport, QtCore.SIGNAL(
|
|
||||||
"triggered()"), self.click_actionSupport)
|
|
||||||
QtCore.QObject.connect(self.ui.actionHelp, QtCore.SIGNAL(
|
|
||||||
"triggered()"), self.click_actionHelp)
|
|
||||||
|
|
||||||
def init_inbox_popup_menu(self, connectSignal=True):
|
def init_inbox_popup_menu(self, connectSignal=True):
|
||||||
# Popup menu for the Inbox tab
|
# Popup menu for the Inbox tab
|
||||||
self.ui.inboxContextMenuToolbar = QtGui.QToolBar()
|
self.ui.inboxContextMenuToolbar = QtWidgets.QToolBar()
|
||||||
# Actions
|
# Actions
|
||||||
self.actionReply = self.ui.inboxContextMenuToolbar.addAction(_translate(
|
self.actionReply = self.ui.inboxContextMenuToolbar.addAction(_translate(
|
||||||
"MainWindow", "Reply to sender"), self.on_action_InboxReply)
|
"MainWindow", "Reply to sender"), self.on_action_InboxReply)
|
||||||
|
@ -231,25 +219,22 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
self.ui.tableWidgetInbox.setContextMenuPolicy(
|
self.ui.tableWidgetInbox.setContextMenuPolicy(
|
||||||
QtCore.Qt.CustomContextMenu)
|
QtCore.Qt.CustomContextMenu)
|
||||||
if connectSignal:
|
if connectSignal:
|
||||||
self.connect(self.ui.tableWidgetInbox, QtCore.SIGNAL(
|
self.ui.tableWidgetInbox.customContextMenuRequested.connect(
|
||||||
'customContextMenuRequested(const QPoint&)'),
|
|
||||||
self.on_context_menuInbox)
|
self.on_context_menuInbox)
|
||||||
self.ui.tableWidgetInboxSubscriptions.setContextMenuPolicy(
|
self.ui.tableWidgetInboxSubscriptions.setContextMenuPolicy(
|
||||||
QtCore.Qt.CustomContextMenu)
|
QtCore.Qt.CustomContextMenu)
|
||||||
if connectSignal:
|
if connectSignal:
|
||||||
self.connect(self.ui.tableWidgetInboxSubscriptions, QtCore.SIGNAL(
|
self.ui.tableWidgetInboxSubscriptions.customContextMenuRequested.connect(
|
||||||
'customContextMenuRequested(const QPoint&)'),
|
|
||||||
self.on_context_menuInbox)
|
self.on_context_menuInbox)
|
||||||
self.ui.tableWidgetInboxChans.setContextMenuPolicy(
|
self.ui.tableWidgetInboxChans.setContextMenuPolicy(
|
||||||
QtCore.Qt.CustomContextMenu)
|
QtCore.Qt.CustomContextMenu)
|
||||||
if connectSignal:
|
if connectSignal:
|
||||||
self.connect(self.ui.tableWidgetInboxChans, QtCore.SIGNAL(
|
self.ui.tableWidgetInboxChans.customContextMenuRequested.connect(
|
||||||
'customContextMenuRequested(const QPoint&)'),
|
|
||||||
self.on_context_menuInbox)
|
self.on_context_menuInbox)
|
||||||
|
|
||||||
def init_identities_popup_menu(self, connectSignal=True):
|
def init_identities_popup_menu(self, connectSignal=True):
|
||||||
# Popup menu for the Your Identities tab
|
# Popup menu for the Your Identities tab
|
||||||
self.ui.addressContextMenuToolbarYourIdentities = QtGui.QToolBar()
|
self.ui.addressContextMenuToolbarYourIdentities = QtWidgets.QToolBar()
|
||||||
# Actions
|
# Actions
|
||||||
self.actionNewYourIdentities = self.ui.addressContextMenuToolbarYourIdentities.addAction(_translate(
|
self.actionNewYourIdentities = self.ui.addressContextMenuToolbarYourIdentities.addAction(_translate(
|
||||||
"MainWindow", "New"), self.on_action_YourIdentitiesNew)
|
"MainWindow", "New"), self.on_action_YourIdentitiesNew)
|
||||||
|
@ -283,8 +268,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
self.ui.treeWidgetYourIdentities.setContextMenuPolicy(
|
self.ui.treeWidgetYourIdentities.setContextMenuPolicy(
|
||||||
QtCore.Qt.CustomContextMenu)
|
QtCore.Qt.CustomContextMenu)
|
||||||
if connectSignal:
|
if connectSignal:
|
||||||
self.connect(self.ui.treeWidgetYourIdentities, QtCore.SIGNAL(
|
self.ui.treeWidgetYourIdentities.customContextMenuRequested.connect(
|
||||||
'customContextMenuRequested(const QPoint&)'),
|
|
||||||
self.on_context_menuYourIdentities)
|
self.on_context_menuYourIdentities)
|
||||||
|
|
||||||
# load all gui.menu plugins with prefix 'address'
|
# load all gui.menu plugins with prefix 'address'
|
||||||
|
@ -333,13 +317,12 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
self.ui.treeWidgetChans.setContextMenuPolicy(
|
self.ui.treeWidgetChans.setContextMenuPolicy(
|
||||||
QtCore.Qt.CustomContextMenu)
|
QtCore.Qt.CustomContextMenu)
|
||||||
if connectSignal:
|
if connectSignal:
|
||||||
self.connect(self.ui.treeWidgetChans, QtCore.SIGNAL(
|
self.ui.treeWidgetChans.customContextMenuRequested.connect(
|
||||||
'customContextMenuRequested(const QPoint&)'),
|
|
||||||
self.on_context_menuChan)
|
self.on_context_menuChan)
|
||||||
|
|
||||||
def init_addressbook_popup_menu(self, connectSignal=True):
|
def init_addressbook_popup_menu(self, connectSignal=True):
|
||||||
# Popup menu for the Address Book page
|
# Popup menu for the Address Book page
|
||||||
self.ui.addressBookContextMenuToolbar = QtGui.QToolBar()
|
self.ui.addressBookContextMenuToolbar = QtWidgets.QToolBar()
|
||||||
# Actions
|
# Actions
|
||||||
self.actionAddressBookSend = self.ui.addressBookContextMenuToolbar.addAction(
|
self.actionAddressBookSend = self.ui.addressBookContextMenuToolbar.addAction(
|
||||||
_translate(
|
_translate(
|
||||||
|
@ -370,8 +353,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
self.ui.tableWidgetAddressBook.setContextMenuPolicy(
|
self.ui.tableWidgetAddressBook.setContextMenuPolicy(
|
||||||
QtCore.Qt.CustomContextMenu)
|
QtCore.Qt.CustomContextMenu)
|
||||||
if connectSignal:
|
if connectSignal:
|
||||||
self.connect(self.ui.tableWidgetAddressBook, QtCore.SIGNAL(
|
self.ui.tableWidgetAddressBook.customContextMenuRequested.connect(
|
||||||
'customContextMenuRequested(const QPoint&)'),
|
|
||||||
self.on_context_menuAddressBook)
|
self.on_context_menuAddressBook)
|
||||||
|
|
||||||
def init_subscriptions_popup_menu(self, connectSignal=True):
|
def init_subscriptions_popup_menu(self, connectSignal=True):
|
||||||
|
@ -399,8 +381,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
self.ui.treeWidgetSubscriptions.setContextMenuPolicy(
|
self.ui.treeWidgetSubscriptions.setContextMenuPolicy(
|
||||||
QtCore.Qt.CustomContextMenu)
|
QtCore.Qt.CustomContextMenu)
|
||||||
if connectSignal:
|
if connectSignal:
|
||||||
self.connect(self.ui.treeWidgetSubscriptions, QtCore.SIGNAL(
|
self.ui.treeWidgetSubscriptions.customContextMenuRequested.connect(
|
||||||
'customContextMenuRequested(const QPoint&)'),
|
|
||||||
self.on_context_menuSubscriptions)
|
self.on_context_menuSubscriptions)
|
||||||
|
|
||||||
def init_sent_popup_menu(self, connectSignal=True):
|
def init_sent_popup_menu(self, connectSignal=True):
|
||||||
|
@ -418,7 +399,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
self.actionSentReply = self.ui.sentContextMenuToolbar.addAction(
|
self.actionSentReply = self.ui.sentContextMenuToolbar.addAction(
|
||||||
_translate("MainWindow", "Send update"),
|
_translate("MainWindow", "Send update"),
|
||||||
self.on_action_SentReply)
|
self.on_action_SentReply)
|
||||||
# self.popMenuSent = QtGui.QMenu( self )
|
# self.popMenuSent = QtWidgets.QMenu( self )
|
||||||
# self.popMenuSent.addAction( self.actionSentClipboard )
|
# self.popMenuSent.addAction( self.actionSentClipboard )
|
||||||
# self.popMenuSent.addAction( self.actionTrashSentMessage )
|
# self.popMenuSent.addAction( self.actionTrashSentMessage )
|
||||||
|
|
||||||
|
@ -442,7 +423,6 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
if treeWidget.isSortingEnabled():
|
if treeWidget.isSortingEnabled():
|
||||||
treeWidget.setSortingEnabled(False)
|
treeWidget.setSortingEnabled(False)
|
||||||
|
|
||||||
widgets = {}
|
|
||||||
i = 0
|
i = 0
|
||||||
while i < treeWidget.topLevelItemCount():
|
while i < treeWidget.topLevelItemCount():
|
||||||
widget = treeWidget.topLevelItem(i)
|
widget = treeWidget.topLevelItem(i)
|
||||||
|
@ -460,7 +440,8 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
while j < widget.childCount():
|
while j < widget.childCount():
|
||||||
subwidget = widget.child(j)
|
subwidget = widget.child(j)
|
||||||
try:
|
try:
|
||||||
subwidget.setUnreadCount(db[toAddress][subwidget.folderName]['count'])
|
subwidget.setUnreadCount(
|
||||||
|
db[toAddress][subwidget.folderName]['count'])
|
||||||
unread += db[toAddress][subwidget.folderName]['count']
|
unread += db[toAddress][subwidget.folderName]['count']
|
||||||
db[toAddress].pop(subwidget.folderName, None)
|
db[toAddress].pop(subwidget.folderName, None)
|
||||||
except:
|
except:
|
||||||
|
@ -474,7 +455,8 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
j = 0
|
j = 0
|
||||||
for f, c in six.iteritems(db[toAddress]):
|
for f, c in six.iteritems(db[toAddress]):
|
||||||
try:
|
try:
|
||||||
subwidget = Ui_FolderWidget(widget, j, toAddress, f, c['count'])
|
subwidget = Ui_FolderWidget(
|
||||||
|
widget, j, toAddress, f, c['count'])
|
||||||
except KeyError:
|
except KeyError:
|
||||||
subwidget = Ui_FolderWidget(widget, j, toAddress, f, 0)
|
subwidget = Ui_FolderWidget(widget, j, toAddress, f, 0)
|
||||||
j += 1
|
j += 1
|
||||||
|
@ -485,20 +467,20 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
i = 0
|
i = 0
|
||||||
for toAddress in db:
|
for toAddress in db:
|
||||||
widget = Ui_SubscriptionWidget(
|
widget = Ui_SubscriptionWidget(
|
||||||
treeWidget,
|
treeWidget, i, toAddress, db[toAddress]["inbox"]['count'],
|
||||||
i,
|
|
||||||
toAddress,
|
|
||||||
db[toAddress]["inbox"]['count'],
|
|
||||||
db[toAddress]["inbox"]['label'],
|
db[toAddress]["inbox"]['label'],
|
||||||
db[toAddress]["inbox"]['enabled'])
|
db[toAddress]["inbox"]['enabled'])
|
||||||
j = 0
|
j = 0
|
||||||
unread = 0
|
unread = 0
|
||||||
for folder in folders:
|
for folder in folders:
|
||||||
try:
|
try:
|
||||||
subwidget = Ui_FolderWidget(widget, j, toAddress, folder, db[toAddress][folder]['count'])
|
subwidget = Ui_FolderWidget(
|
||||||
|
widget, j, toAddress, folder,
|
||||||
|
db[toAddress][folder]['count'])
|
||||||
unread += db[toAddress][folder]['count']
|
unread += db[toAddress][folder]['count']
|
||||||
except KeyError:
|
except KeyError:
|
||||||
subwidget = Ui_FolderWidget(widget, j, toAddress, folder, 0)
|
subwidget = Ui_FolderWidget(
|
||||||
|
widget, j, toAddress, folder, 0)
|
||||||
j += 1
|
j += 1
|
||||||
widget.setUnreadCount(unread)
|
widget.setUnreadCount(unread)
|
||||||
i += 1
|
i += 1
|
||||||
|
@ -531,8 +513,8 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
toAddress, 'enabled')
|
toAddress, 'enabled')
|
||||||
isChan = config.safeGetBoolean(
|
isChan = config.safeGetBoolean(
|
||||||
toAddress, 'chan')
|
toAddress, 'chan')
|
||||||
isMaillinglist = config.safeGetBoolean(
|
# isMaillinglist = config.safeGetBoolean(
|
||||||
toAddress, 'mailinglist')
|
# toAddress, 'mailinglist')
|
||||||
|
|
||||||
if treeWidget == self.ui.treeWidgetYourIdentities:
|
if treeWidget == self.ui.treeWidgetYourIdentities:
|
||||||
if isChan:
|
if isChan:
|
||||||
|
@ -572,7 +554,6 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
if treeWidget.isSortingEnabled():
|
if treeWidget.isSortingEnabled():
|
||||||
treeWidget.setSortingEnabled(False)
|
treeWidget.setSortingEnabled(False)
|
||||||
|
|
||||||
widgets = {}
|
|
||||||
i = 0
|
i = 0
|
||||||
while i < treeWidget.topLevelItemCount():
|
while i < treeWidget.topLevelItemCount():
|
||||||
widget = treeWidget.topLevelItem(i)
|
widget = treeWidget.topLevelItem(i)
|
||||||
|
@ -633,7 +614,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
treeWidget.setSortingEnabled(True)
|
treeWidget.setSortingEnabled(True)
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
QtGui.QWidget.__init__(self, parent)
|
super(MyForm, self).__init__(parent)
|
||||||
self.ui = Ui_MainWindow()
|
self.ui = Ui_MainWindow()
|
||||||
self.ui.setupUi(self)
|
self.ui.setupUi(self)
|
||||||
|
|
||||||
|
@ -652,12 +633,12 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
if addressVersionNumber == 1:
|
if addressVersionNumber == 1:
|
||||||
displayMsg = _translate(
|
displayMsg = _translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"One of your addresses, {0}, is an old version 1 address. "
|
"One of your addresses, {0}, is an old version 1"
|
||||||
"Version 1 addresses are no longer supported. "
|
" address. Version 1 addresses are no longer supported."
|
||||||
"May we delete it now?").format(addressInKeysFile)
|
" May we delete it now?").format(addressInKeysFile)
|
||||||
reply = QtGui.QMessageBox.question(
|
reply = QtWidgets.QMessageBox.question(
|
||||||
self, 'Message', displayMsg, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
|
self, 'Message', displayMsg, QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
|
||||||
if reply == QtGui.QMessageBox.Yes:
|
if reply == QtWidgets.QMessageBox.Yes:
|
||||||
config.remove_section(addressInKeysFile)
|
config.remove_section(addressInKeysFile)
|
||||||
config.save()
|
config.save()
|
||||||
|
|
||||||
|
@ -701,111 +682,97 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
self.rerenderSubscriptions()
|
self.rerenderSubscriptions()
|
||||||
|
|
||||||
# Initialize the inbox search
|
# Initialize the inbox search
|
||||||
QtCore.QObject.connect(self.ui.inboxSearchLineEdit, QtCore.SIGNAL(
|
for line_edit in (
|
||||||
"returnPressed()"), self.inboxSearchLineEditReturnPressed)
|
self.ui.inboxSearchLineEdit,
|
||||||
QtCore.QObject.connect(self.ui.inboxSearchLineEditSubscriptions, QtCore.SIGNAL(
|
self.ui.inboxSearchLineEditSubscriptions,
|
||||||
"returnPressed()"), self.inboxSearchLineEditReturnPressed)
|
self.ui.inboxSearchLineEditChans,
|
||||||
QtCore.QObject.connect(self.ui.inboxSearchLineEditChans, QtCore.SIGNAL(
|
):
|
||||||
"returnPressed()"), self.inboxSearchLineEditReturnPressed)
|
line_edit.returnPressed.connect(
|
||||||
QtCore.QObject.connect(self.ui.inboxSearchLineEdit, QtCore.SIGNAL(
|
self.inboxSearchLineEditReturnPressed)
|
||||||
"textChanged(QString)"), self.inboxSearchLineEditUpdated)
|
line_edit.textChanged.connect(
|
||||||
QtCore.QObject.connect(self.ui.inboxSearchLineEditSubscriptions, QtCore.SIGNAL(
|
self.inboxSearchLineEditUpdated)
|
||||||
"textChanged(QString)"), self.inboxSearchLineEditUpdated)
|
|
||||||
QtCore.QObject.connect(self.ui.inboxSearchLineEditChans, QtCore.SIGNAL(
|
|
||||||
"textChanged(QString)"), self.inboxSearchLineEditUpdated)
|
|
||||||
|
|
||||||
# Initialize addressbook
|
# Initialize addressbook
|
||||||
QtCore.QObject.connect(self.ui.tableWidgetAddressBook, QtCore.SIGNAL(
|
self.ui.tableWidgetAddressBook.itemChanged.connect(
|
||||||
"itemChanged(QTableWidgetItem *)"), self.tableWidgetAddressBookItemChanged)
|
self.tableWidgetAddressBookItemChanged)
|
||||||
|
|
||||||
# This is necessary for the completer to work if multiple recipients
|
# This is necessary for the completer to work if multiple recipients
|
||||||
QtCore.QObject.connect(self.ui.lineEditTo, QtCore.SIGNAL(
|
self.ui.lineEditTo.cursorPositionChanged.connect(
|
||||||
"cursorPositionChanged(int, int)"), self.ui.lineEditTo.completer().onCursorPositionChanged)
|
self.ui.lineEditTo.completer().onCursorPositionChanged)
|
||||||
|
|
||||||
# show messages from message list
|
# show messages from message list
|
||||||
QtCore.QObject.connect(self.ui.tableWidgetInbox, QtCore.SIGNAL(
|
for table_widget in (
|
||||||
"itemSelectionChanged ()"), self.tableWidgetInboxItemClicked)
|
self.ui.tableWidgetInbox,
|
||||||
QtCore.QObject.connect(self.ui.tableWidgetInboxSubscriptions, QtCore.SIGNAL(
|
self.ui.tableWidgetInboxSubscriptions,
|
||||||
"itemSelectionChanged ()"), self.tableWidgetInboxItemClicked)
|
self.ui.tableWidgetInboxChans
|
||||||
QtCore.QObject.connect(self.ui.tableWidgetInboxChans, QtCore.SIGNAL(
|
):
|
||||||
"itemSelectionChanged ()"), self.tableWidgetInboxItemClicked)
|
table_widget.itemSelectionChanged.connect(
|
||||||
|
self.tableWidgetInboxItemClicked)
|
||||||
|
|
||||||
# tree address lists
|
# tree address lists
|
||||||
QtCore.QObject.connect(self.ui.treeWidgetYourIdentities, QtCore.SIGNAL(
|
for tree_widget in (
|
||||||
"itemSelectionChanged ()"), self.treeWidgetItemClicked)
|
self.ui.treeWidgetYourIdentities,
|
||||||
QtCore.QObject.connect(self.ui.treeWidgetYourIdentities, QtCore.SIGNAL(
|
self.ui.treeWidgetSubscriptions,
|
||||||
"itemChanged (QTreeWidgetItem *, int)"), self.treeWidgetItemChanged)
|
self.ui.treeWidgetChans
|
||||||
QtCore.QObject.connect(self.ui.treeWidgetSubscriptions, QtCore.SIGNAL(
|
):
|
||||||
"itemSelectionChanged ()"), self.treeWidgetItemClicked)
|
tree_widget.itemSelectionChanged.connect(
|
||||||
QtCore.QObject.connect(self.ui.treeWidgetSubscriptions, QtCore.SIGNAL(
|
self.treeWidgetItemClicked)
|
||||||
"itemChanged (QTreeWidgetItem *, int)"), self.treeWidgetItemChanged)
|
tree_widget.itemChanged.connect(self.treeWidgetItemChanged)
|
||||||
QtCore.QObject.connect(self.ui.treeWidgetChans, QtCore.SIGNAL(
|
|
||||||
"itemSelectionChanged ()"), self.treeWidgetItemClicked)
|
self.ui.tabWidget.currentChanged.connect(self.tabWidgetCurrentChanged)
|
||||||
QtCore.QObject.connect(self.ui.treeWidgetChans, QtCore.SIGNAL(
|
|
||||||
"itemChanged (QTreeWidgetItem *, int)"), self.treeWidgetItemChanged)
|
|
||||||
QtCore.QObject.connect(
|
|
||||||
self.ui.tabWidget, QtCore.SIGNAL("currentChanged(int)"),
|
|
||||||
self.tabWidgetCurrentChanged
|
|
||||||
)
|
|
||||||
|
|
||||||
# Put the colored icon on the status bar
|
# Put the colored icon on the status bar
|
||||||
# self.pushButtonStatusIcon.setIcon(QIcon(":/newPrefix/images/yellowicon.png"))
|
# self.pushButtonStatusIcon.setIcon(QIcon(":/newPrefix/images/yellowicon.png"))
|
||||||
self.setStatusBar(BMStatusBar())
|
self.setStatusBar(BMStatusBar())
|
||||||
self.statusbar = self.statusBar()
|
self.statusbar = self.statusBar()
|
||||||
|
|
||||||
self.pushButtonStatusIcon = QtGui.QPushButton(self)
|
self.pushButtonStatusIcon = QtWidgets.QPushButton(self)
|
||||||
self.pushButtonStatusIcon.setText('')
|
self.pushButtonStatusIcon.setText('')
|
||||||
self.pushButtonStatusIcon.setIcon(
|
self.pushButtonStatusIcon.setIcon(
|
||||||
QtGui.QIcon(':/newPrefix/images/redicon.png'))
|
QtGui.QIcon(':/newPrefix/images/redicon.png'))
|
||||||
self.pushButtonStatusIcon.setFlat(True)
|
self.pushButtonStatusIcon.setFlat(True)
|
||||||
self.statusbar.insertPermanentWidget(0, self.pushButtonStatusIcon)
|
self.statusbar.insertPermanentWidget(0, self.pushButtonStatusIcon)
|
||||||
QtCore.QObject.connect(self.pushButtonStatusIcon, QtCore.SIGNAL(
|
self.pushButtonStatusIcon.clicked.connect(
|
||||||
"clicked()"), self.click_pushButtonStatusIcon)
|
self.click_pushButtonStatusIcon)
|
||||||
|
|
||||||
self.unreadCount = 0
|
self.unreadCount = 0
|
||||||
|
|
||||||
# Set the icon sizes for the identicons
|
# Set the icon sizes for the identicons
|
||||||
identicon_size = 3 * 7
|
identicon_size = 3 * 7
|
||||||
self.ui.tableWidgetInbox.setIconSize(QtCore.QSize(identicon_size, identicon_size))
|
for widget in (
|
||||||
self.ui.treeWidgetChans.setIconSize(QtCore.QSize(identicon_size, identicon_size))
|
self.ui.tableWidgetInbox, self.ui.treeWidgetChans,
|
||||||
self.ui.treeWidgetYourIdentities.setIconSize(QtCore.QSize(identicon_size, identicon_size))
|
self.ui.treeWidgetYourIdentities, self.ui.treeWidgetSubscriptions,
|
||||||
self.ui.treeWidgetSubscriptions.setIconSize(QtCore.QSize(identicon_size, identicon_size))
|
self.ui.tableWidgetAddressBook
|
||||||
self.ui.tableWidgetAddressBook.setIconSize(QtCore.QSize(identicon_size, identicon_size))
|
):
|
||||||
|
widget.setIconSize(QtCore.QSize(identicon_size, identicon_size))
|
||||||
|
|
||||||
self.UISignalThread = UISignaler.get()
|
self.UISignalThread = UISignaler.get()
|
||||||
|
self.UISignalThread.writeNewAddressToTable.connect(
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
self.writeNewAddressToTable)
|
||||||
"writeNewAddressToTable(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), self.writeNewAddressToTable)
|
self.UISignalThread.updateStatusBar.connect(self.updateStatusBar)
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
self.UISignalThread.updateSentItemStatusByToAddress.connect(
|
||||||
"updateStatusBar(PyQt_PyObject)"), self.updateStatusBar)
|
self.updateSentItemStatusByToAddress)
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
self.UISignalThread.updateSentItemStatusByAckdata.connect(
|
||||||
"updateSentItemStatusByToAddress(PyQt_PyObject,PyQt_PyObject)"), self.updateSentItemStatusByToAddress)
|
self.updateSentItemStatusByAckdata)
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
self.UISignalThread.displayNewInboxMessage.connect(
|
||||||
"updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"), self.updateSentItemStatusByAckdata)
|
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
|
||||||
"displayNewInboxMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"),
|
|
||||||
self.displayNewInboxMessage)
|
self.displayNewInboxMessage)
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
self.UISignalThread.displayNewSentMessage.connect(
|
||||||
"displayNewSentMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,"
|
|
||||||
"PyQt_PyObject,PyQt_PyObject)"),
|
|
||||||
self.displayNewSentMessage)
|
self.displayNewSentMessage)
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
self.UISignalThread.setStatusIcon.connect(self.setStatusIcon)
|
||||||
"setStatusIcon(PyQt_PyObject)"), self.setStatusIcon)
|
self.UISignalThread.changedInboxUnread.connect(self.changedInboxUnread)
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
self.UISignalThread.rerenderMessagelistFromLabels.connect(
|
||||||
"changedInboxUnread(PyQt_PyObject)"), self.changedInboxUnread)
|
self.rerenderMessagelistFromLabels)
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
self.UISignalThread.rerenderMessagelistToLabels.connect(
|
||||||
"rerenderMessagelistFromLabels()"), self.rerenderMessagelistFromLabels)
|
self.rerenderMessagelistToLabels)
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
self.UISignalThread.rerenderAddressBook.connect(
|
||||||
"rerenderMessgelistToLabels()"), self.rerenderMessagelistToLabels)
|
self.rerenderAddressBook)
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
self.UISignalThread.rerenderSubscriptions.connect(
|
||||||
"rerenderAddressBook()"), self.rerenderAddressBook)
|
self.rerenderSubscriptions)
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
self.UISignalThread.removeInboxRowByMsgid.connect(
|
||||||
"rerenderSubscriptions()"), self.rerenderSubscriptions)
|
self.removeInboxRowByMsgid)
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
self.UISignalThread.newVersionAvailable.connect(
|
||||||
"removeInboxRowByMsgid(PyQt_PyObject)"), self.removeInboxRowByMsgid)
|
self.newVersionAvailable)
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
self.UISignalThread.displayAlert.connect(self.displayAlert)
|
||||||
"newVersionAvailable(PyQt_PyObject)"), self.newVersionAvailable)
|
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
|
||||||
"displayAlert(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), self.displayAlert)
|
|
||||||
self.UISignalThread.start()
|
self.UISignalThread.start()
|
||||||
|
|
||||||
# Key press in tree view
|
# Key press in tree view
|
||||||
|
@ -834,16 +801,15 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
|
|
||||||
# Put the TTL slider in the correct spot
|
# Put the TTL slider in the correct spot
|
||||||
TTL = config.getint('bitmessagesettings', 'ttl')
|
TTL = config.getint('bitmessagesettings', 'ttl')
|
||||||
if TTL < 3600: # an hour
|
if TTL < 3600: # an hour
|
||||||
TTL = 3600
|
TTL = 3600
|
||||||
elif TTL > 28*24*60*60: # 28 days
|
elif TTL > 28 * 24 * 60 * 60: # 28 days
|
||||||
TTL = 28*24*60*60
|
TTL = 28 * 24 * 60 * 60
|
||||||
self.ui.horizontalSliderTTL.setSliderPosition((TTL - 3600) ** (1/3.199))
|
self.ui.horizontalSliderTTL.setSliderPosition(
|
||||||
|
(TTL - 3600) ** (1 / 3.199))
|
||||||
self.updateHumanFriendlyTTLDescription(TTL)
|
self.updateHumanFriendlyTTLDescription(TTL)
|
||||||
|
|
||||||
QtCore.QObject.connect(self.ui.horizontalSliderTTL, QtCore.SIGNAL(
|
self.ui.horizontalSliderTTL.valueChanged.connect(self.updateTTL)
|
||||||
"valueChanged(int)"), self.updateTTL)
|
|
||||||
|
|
||||||
self.initSettings()
|
self.initSettings()
|
||||||
self.resetNamecoinConnection()
|
self.resetNamecoinConnection()
|
||||||
self.sqlInit()
|
self.sqlInit()
|
||||||
|
@ -898,27 +864,25 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
config.save()
|
config.save()
|
||||||
|
|
||||||
def updateHumanFriendlyTTLDescription(self, TTL):
|
def updateHumanFriendlyTTLDescription(self, TTL):
|
||||||
numberOfHours = int(round(TTL / (60*60)))
|
numberOfHours = int(round(TTL / (60 * 60)))
|
||||||
font = QtGui.QFont()
|
font = QtGui.QFont()
|
||||||
stylesheet = ""
|
stylesheet = ""
|
||||||
|
|
||||||
if numberOfHours < 48:
|
if numberOfHours < 48:
|
||||||
self.ui.labelHumanFriendlyTTLDescription.setText(
|
self.ui.labelHumanFriendlyTTLDescription.setText(
|
||||||
_translate("MainWindow", "%n hour(s)", None, QtCore.QCoreApplication.CodecForTr, numberOfHours) +
|
_translate(
|
||||||
", " +
|
"MainWindow", "%n hour(s)", None, numberOfHours
|
||||||
_translate("MainWindow", "not recommended for chans", None, QtCore.QCoreApplication.CodecForTr)
|
) + ",\n" +
|
||||||
)
|
_translate("MainWindow", "not recommended for chans")
|
||||||
|
)
|
||||||
stylesheet = "QLabel { color : red; }"
|
stylesheet = "QLabel { color : red; }"
|
||||||
font.setBold(True)
|
font.setBold(True)
|
||||||
else:
|
else:
|
||||||
numberOfDays = int(round(TTL / (24*60*60)))
|
numberOfDays = int(round(TTL / (24 * 60 * 60)))
|
||||||
self.ui.labelHumanFriendlyTTLDescription.setText(
|
self.ui.labelHumanFriendlyTTLDescription.setText(
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow", "%n day(s)", None, numberOfDays)
|
||||||
"%n day(s)",
|
)
|
||||||
None,
|
|
||||||
QtCore.QCoreApplication.CodecForTr,
|
|
||||||
numberOfDays))
|
|
||||||
font.setBold(False)
|
font.setBold(False)
|
||||||
self.ui.labelHumanFriendlyTTLDescription.setStyleSheet(stylesheet)
|
self.ui.labelHumanFriendlyTTLDescription.setStyleSheet(stylesheet)
|
||||||
self.ui.labelHumanFriendlyTTLDescription.setFont(font)
|
self.ui.labelHumanFriendlyTTLDescription.setFont(font)
|
||||||
|
@ -1161,8 +1125,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
"MainWindow", "Doing work necessary to send message.")
|
"MainWindow", "Doing work necessary to send message.")
|
||||||
elif status == 'ackreceived':
|
elif status == 'ackreceived':
|
||||||
statusText = _translate(
|
statusText = _translate(
|
||||||
"MainWindow",
|
"MainWindow", "Acknowledgement of the message received {0}"
|
||||||
"Acknowledgement of the message received {0}"
|
|
||||||
).format(l10n.formatTimestamp(lastactiontime))
|
).format(l10n.formatTimestamp(lastactiontime))
|
||||||
elif status == 'broadcastqueued':
|
elif status == 'broadcastqueued':
|
||||||
statusText = _translate(
|
statusText = _translate(
|
||||||
|
@ -1320,23 +1283,21 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
# create application indicator
|
# create application indicator
|
||||||
def appIndicatorInit(self, app):
|
def appIndicatorInit(self, app):
|
||||||
self.initTrayIcon("can-icon-24px-red.png", app)
|
self.initTrayIcon("can-icon-24px-red.png", app)
|
||||||
traySignal = "activated(QSystemTrayIcon::ActivationReason)"
|
self.tray.activated.connect(self.__icon_activated)
|
||||||
QtCore.QObject.connect(self.tray, QtCore.SIGNAL(
|
|
||||||
traySignal), self.__icon_activated)
|
|
||||||
|
|
||||||
m = QtGui.QMenu()
|
m = QtWidgets.QMenu()
|
||||||
|
|
||||||
self.actionStatus = QtGui.QAction(_translate(
|
self.actionStatus = QtWidgets.QAction(_translate(
|
||||||
"MainWindow", "Not Connected"), m, checkable=False)
|
"MainWindow", "Not Connected"), m, checkable=False)
|
||||||
m.addAction(self.actionStatus)
|
m.addAction(self.actionStatus)
|
||||||
|
|
||||||
# separator
|
# separator
|
||||||
actionSeparator = QtGui.QAction('', m, checkable=False)
|
actionSeparator = QtWidgets.QAction('', m, checkable=False)
|
||||||
actionSeparator.setSeparator(True)
|
actionSeparator.setSeparator(True)
|
||||||
m.addAction(actionSeparator)
|
m.addAction(actionSeparator)
|
||||||
|
|
||||||
# show bitmessage
|
# show bitmessage
|
||||||
self.actionShow = QtGui.QAction(_translate(
|
self.actionShow = QtWidgets.QAction(_translate(
|
||||||
"MainWindow", "Show Bitmessage"), m, checkable=True)
|
"MainWindow", "Show Bitmessage"), m, checkable=True)
|
||||||
self.actionShow.setChecked(not config.getboolean(
|
self.actionShow.setChecked(not config.getboolean(
|
||||||
'bitmessagesettings', 'startintray'))
|
'bitmessagesettings', 'startintray'))
|
||||||
|
@ -1345,7 +1306,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
m.addAction(self.actionShow)
|
m.addAction(self.actionShow)
|
||||||
|
|
||||||
# quiet mode
|
# quiet mode
|
||||||
self.actionQuiet = QtGui.QAction(_translate(
|
self.actionQuiet = QtWidgets.QAction(_translate(
|
||||||
"MainWindow", "Quiet Mode"), m, checkable=True)
|
"MainWindow", "Quiet Mode"), m, checkable=True)
|
||||||
self.actionQuiet.setChecked(not config.getboolean(
|
self.actionQuiet.setChecked(not config.getboolean(
|
||||||
'bitmessagesettings', 'showtraynotifications'))
|
'bitmessagesettings', 'showtraynotifications'))
|
||||||
|
@ -1353,25 +1314,25 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
m.addAction(self.actionQuiet)
|
m.addAction(self.actionQuiet)
|
||||||
|
|
||||||
# Send
|
# Send
|
||||||
actionSend = QtGui.QAction(_translate(
|
actionSend = QtWidgets.QAction(_translate(
|
||||||
"MainWindow", "Send"), m, checkable=False)
|
"MainWindow", "Send"), m, checkable=False)
|
||||||
actionSend.triggered.connect(self.appIndicatorSend)
|
actionSend.triggered.connect(self.appIndicatorSend)
|
||||||
m.addAction(actionSend)
|
m.addAction(actionSend)
|
||||||
|
|
||||||
# Subscribe
|
# Subscribe
|
||||||
actionSubscribe = QtGui.QAction(_translate(
|
actionSubscribe = QtWidgets.QAction(_translate(
|
||||||
"MainWindow", "Subscribe"), m, checkable=False)
|
"MainWindow", "Subscribe"), m, checkable=False)
|
||||||
actionSubscribe.triggered.connect(self.appIndicatorSubscribe)
|
actionSubscribe.triggered.connect(self.appIndicatorSubscribe)
|
||||||
m.addAction(actionSubscribe)
|
m.addAction(actionSubscribe)
|
||||||
|
|
||||||
# Channels
|
# Channels
|
||||||
actionSubscribe = QtGui.QAction(_translate(
|
actionSubscribe = QtWidgets.QAction(_translate(
|
||||||
"MainWindow", "Channel"), m, checkable=False)
|
"MainWindow", "Channel"), m, checkable=False)
|
||||||
actionSubscribe.triggered.connect(self.appIndicatorChannel)
|
actionSubscribe.triggered.connect(self.appIndicatorChannel)
|
||||||
m.addAction(actionSubscribe)
|
m.addAction(actionSubscribe)
|
||||||
|
|
||||||
# separator
|
# separator
|
||||||
actionSeparator = QtGui.QAction('', m, checkable=False)
|
actionSeparator = QtWidgets.QAction('', m, checkable=False)
|
||||||
actionSeparator.setSeparator(True)
|
actionSeparator.setSeparator(True)
|
||||||
m.addAction(actionSeparator)
|
m.addAction(actionSeparator)
|
||||||
|
|
||||||
|
@ -1489,11 +1450,10 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
def notifierInit(self):
|
def notifierInit(self):
|
||||||
def _simple_notify(
|
def _simple_notify(
|
||||||
title, subtitle, category, label=None, icon=None):
|
title, subtitle, category, label=None, icon=None):
|
||||||
self.tray.showMessage(title, subtitle, 1, 2000)
|
self.tray.showMessage(
|
||||||
|
title, subtitle, self.tray.NoIcon, msecs=2000)
|
||||||
|
|
||||||
self._notifier = _simple_notify
|
self._notifier = _simple_notify
|
||||||
# does nothing if isAvailable returns false
|
|
||||||
self._player = QtGui.QSound.play
|
|
||||||
|
|
||||||
if not get_plugins:
|
if not get_plugins:
|
||||||
return
|
return
|
||||||
|
@ -1506,7 +1466,10 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
|
|
||||||
self._theme_player = get_plugin('notification.sound', 'theme')
|
self._theme_player = get_plugin('notification.sound', 'theme')
|
||||||
|
|
||||||
if not QtGui.QSound.isAvailable():
|
try:
|
||||||
|
from qtpy import QtMultimedia
|
||||||
|
self._player = QtMultimedia.QSound.play
|
||||||
|
except ImportError:
|
||||||
_plugin = get_plugin(
|
_plugin = get_plugin(
|
||||||
'notification.sound', 'file', fallback='file.fallback')
|
'notification.sound', 'file', fallback='file.fallback')
|
||||||
if _plugin:
|
if _plugin:
|
||||||
|
@ -1530,7 +1493,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
if event.key() == QtCore.Qt.Key_Delete:
|
if event.key() == QtCore.Qt.Key_Delete:
|
||||||
self.on_action_AddressBookDelete()
|
self.on_action_AddressBookDelete()
|
||||||
else:
|
else:
|
||||||
return QtGui.QTableWidget.keyPressEvent(
|
return QtWidgets.QTableWidget.keyPressEvent(
|
||||||
self.ui.tableWidgetAddressBook, event)
|
self.ui.tableWidgetAddressBook, event)
|
||||||
|
|
||||||
# inbox / sent
|
# inbox / sent
|
||||||
|
@ -1545,14 +1508,14 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
"""This method handles keypress events for all widgets on MyForm"""
|
"""This method handles keypress events for all widgets on MyForm"""
|
||||||
messagelist = self.getCurrentMessagelist()
|
messagelist = self.getCurrentMessagelist()
|
||||||
if event.key() == QtCore.Qt.Key_Delete:
|
if event.key() == QtCore.Qt.Key_Delete:
|
||||||
if isinstance(focus, (MessageView, QtGui.QTableWidget)):
|
if isinstance(focus, (MessageView, QtWidgets.QTableWidget)):
|
||||||
folder = self.getCurrentFolder()
|
folder = self.getCurrentFolder()
|
||||||
if folder == "sent":
|
if folder == "sent":
|
||||||
self.on_action_SentTrash()
|
self.on_action_SentTrash()
|
||||||
else:
|
else:
|
||||||
self.on_action_InboxTrash()
|
self.on_action_InboxTrash()
|
||||||
event.ignore()
|
event.ignore()
|
||||||
elif QtGui.QApplication.queryKeyboardModifiers() == QtCore.Qt.NoModifier:
|
elif QtWidgets.QApplication.queryKeyboardModifiers() == QtCore.Qt.NoModifier:
|
||||||
if event.key() == QtCore.Qt.Key_N:
|
if event.key() == QtCore.Qt.Key_N:
|
||||||
currentRow = messagelist.currentRow()
|
currentRow = messagelist.currentRow()
|
||||||
if currentRow < messagelist.rowCount() - 1:
|
if currentRow < messagelist.rowCount() - 1:
|
||||||
|
@ -1591,74 +1554,77 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
return
|
return
|
||||||
if isinstance(focus, MessageView):
|
if isinstance(focus, MessageView):
|
||||||
return MessageView.keyPressEvent(focus, event)
|
return MessageView.keyPressEvent(focus, event)
|
||||||
if isinstance(focus, QtGui.QTableWidget):
|
elif isinstance(focus, QtWidgets.QTableWidget):
|
||||||
return QtGui.QTableWidget.keyPressEvent(focus, event)
|
return QtWidgets.QTableWidget.keyPressEvent(focus, event)
|
||||||
if isinstance(focus, QtGui.QTreeWidget):
|
elif isinstance(focus, QtWidgets.QTreeWidget):
|
||||||
return QtGui.QTreeWidget.keyPressEvent(focus, event)
|
return QtWidgets.QTreeWidget.keyPressEvent(focus, event)
|
||||||
|
|
||||||
# menu button 'manage keys'
|
# menu button 'manage keys'
|
||||||
def click_actionManageKeys(self):
|
def click_actionManageKeys(self):
|
||||||
if 'darwin' in sys.platform or 'linux' in sys.platform:
|
if 'darwin' in sys.platform or 'linux' in sys.platform:
|
||||||
if state.appdata == '':
|
if state.appdata == '':
|
||||||
# reply = QtGui.QMessageBox.information(self, 'keys.dat?','You
|
# reply = QtWidgets.QMessageBox.information(self, 'keys.dat?','You
|
||||||
# may manage your keys by editing the keys.dat file stored in
|
# may manage your keys by editing the keys.dat file stored in
|
||||||
# the same directory as this program. It is important that you
|
# the same directory as this program. It is important that you
|
||||||
# back up this file.', QMessageBox.Ok)
|
# back up this file.', QMessageBox.Ok)
|
||||||
reply = QtGui.QMessageBox.information(
|
reply = QtWidgets.QMessageBox.information(
|
||||||
self,
|
self, 'keys.dat?', _translate(
|
||||||
'keys.dat?',
|
|
||||||
_translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"You may manage your keys by editing the keys.dat file stored in the same directory"
|
"You may manage your keys by editing the keys.dat"
|
||||||
"as this program. It is important that you back up this file."
|
" file stored in the same directory as this"
|
||||||
),
|
" program. It is important that you back up this"
|
||||||
QtGui.QMessageBox.Ok)
|
" file."), QtWidgets.QMessageBox.Ok)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
QtGui.QMessageBox.information(
|
QtWidgets.QMessageBox.information(
|
||||||
self,
|
self, 'keys.dat?',
|
||||||
'keys.dat?',
|
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"You may manage your keys by editing the keys.dat file stored in"
|
"You may manage your keys by editing the keys.dat"
|
||||||
"\n {0} \n"
|
" file stored in\n {0} \nIt is important that you"
|
||||||
"It is important that you back up this file."
|
" back up this file."
|
||||||
).format(state.appdata),
|
).format(state.appdata),
|
||||||
QtGui.QMessageBox.Ok)
|
QtWidgets.QMessageBox.Ok
|
||||||
|
)
|
||||||
elif sys.platform == 'win32' or sys.platform == 'win64':
|
elif sys.platform == 'win32' or sys.platform == 'win64':
|
||||||
if state.appdata == '':
|
if state.appdata == '':
|
||||||
reply = QtGui.QMessageBox.question(
|
reply = QtWidgets.QMessageBox.question(
|
||||||
self,
|
self, _translate("MainWindow", "Open keys.dat?"),
|
||||||
_translate("MainWindow", "Open keys.dat?"),
|
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"You may manage your keys by editing the keys.dat file stored in the same directory as "
|
"You may manage your keys by editing the keys.dat"
|
||||||
"this program. It is important that you back up this file. "
|
" file stored in the same directory as this"
|
||||||
"Would you like to open the file now? "
|
" program. It is important that you back up this"
|
||||||
"(Be sure to close Bitmessage before making any changes.)"),
|
" file. Would you like to open the file now?"
|
||||||
QtGui.QMessageBox.Yes,
|
" (Be sure to close Bitmessage before making any"
|
||||||
QtGui.QMessageBox.No)
|
" changes.)"
|
||||||
|
), QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
|
||||||
else:
|
else:
|
||||||
reply = QtGui.QMessageBox.question(
|
reply = QtWidgets.QMessageBox.question(
|
||||||
self,
|
self,
|
||||||
_translate("MainWindow", "Open keys.dat?"),
|
_translate("MainWindow", "Open keys.dat?"),
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"You may manage your keys by editing the keys.dat file stored in\n {0} \n"
|
"You may manage your keys by editing the keys.dat"
|
||||||
"It is important that you back up this file. Would you like to open the file now?"
|
" file stored in\n {0} \nIt is important that you"
|
||||||
"(Be sure to close Bitmessage before making any changes.)").format(state.appdata),
|
" back up this file. Would you like to open the"
|
||||||
QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
|
" file now? (Be sure to close Bitmessage before"
|
||||||
if reply == QtGui.QMessageBox.Yes:
|
" making any changes.)"
|
||||||
|
).format(state.appdata),
|
||||||
|
QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No
|
||||||
|
)
|
||||||
|
if reply == QtWidgets.QMessageBox.Yes:
|
||||||
openKeysFile()
|
openKeysFile()
|
||||||
|
|
||||||
# menu button 'delete all treshed messages'
|
# menu button 'delete all treshed messages'
|
||||||
def click_actionDeleteAllTrashedMessages(self):
|
def click_actionDeleteAllTrashedMessages(self):
|
||||||
if QtGui.QMessageBox.question(
|
if QtWidgets.QMessageBox.question(
|
||||||
self,
|
self, _translate("MainWindow", "Delete trash?"),
|
||||||
_translate("MainWindow", "Delete trash?"),
|
_translate(
|
||||||
_translate("MainWindow", "Are you sure you want to delete all trashed messages?"),
|
"MainWindow",
|
||||||
QtGui.QMessageBox.Yes,
|
"Are you sure you want to delete all trashed messages?"
|
||||||
QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
|
), QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No
|
||||||
|
) == QtWidgets.QMessageBox.No:
|
||||||
return
|
return
|
||||||
sqlStoredProcedure('deleteandvacuume')
|
sqlStoredProcedure('deleteandvacuume')
|
||||||
self.rerenderTabTreeMessages()
|
self.rerenderTabTreeMessages()
|
||||||
|
@ -1685,7 +1651,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
dialog = dialogs.RegenerateAddressesDialog(self)
|
dialog = dialogs.RegenerateAddressesDialog(self)
|
||||||
if dialog.exec_():
|
if dialog.exec_():
|
||||||
if dialog.lineEditPassphrase.text() == "":
|
if dialog.lineEditPassphrase.text() == "":
|
||||||
QtGui.QMessageBox.about(
|
QtWidgets.QMessageBox.about(
|
||||||
self, _translate("MainWindow", "bad passphrase"),
|
self, _translate("MainWindow", "bad passphrase"),
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
|
@ -1698,7 +1664,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
addressVersionNumber = int(
|
addressVersionNumber = int(
|
||||||
dialog.lineEditAddressVersionNumber.text())
|
dialog.lineEditAddressVersionNumber.text())
|
||||||
except:
|
except:
|
||||||
QtGui.QMessageBox.about(
|
QtWidgets.QMessageBox.about(
|
||||||
self,
|
self,
|
||||||
_translate("MainWindow", "Bad address version number"),
|
_translate("MainWindow", "Bad address version number"),
|
||||||
_translate(
|
_translate(
|
||||||
|
@ -1708,7 +1674,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
))
|
))
|
||||||
return
|
return
|
||||||
if addressVersionNumber < 3 or addressVersionNumber > 4:
|
if addressVersionNumber < 3 or addressVersionNumber > 4:
|
||||||
QtGui.QMessageBox.about(
|
QtWidgets.QMessageBox.about(
|
||||||
self,
|
self,
|
||||||
_translate("MainWindow", "Bad address version number"),
|
_translate("MainWindow", "Bad address version number"),
|
||||||
_translate(
|
_translate(
|
||||||
|
@ -1772,7 +1738,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def __icon_activated(self, reason):
|
def __icon_activated(self, reason):
|
||||||
if reason == QtGui.QSystemTrayIcon.Trigger:
|
if reason == QtWidgets.QSystemTrayIcon.Trigger:
|
||||||
self.actionShow.setChecked(not self.actionShow.isChecked())
|
self.actionShow.setChecked(not self.actionShow.isChecked())
|
||||||
self.appIndicatorShowOrHideWindow()
|
self.appIndicatorShowOrHideWindow()
|
||||||
|
|
||||||
|
@ -1842,7 +1808,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
|
|
||||||
def initTrayIcon(self, iconFileName, app):
|
def initTrayIcon(self, iconFileName, app):
|
||||||
self.currentTrayIconFileName = iconFileName
|
self.currentTrayIconFileName = iconFileName
|
||||||
self.tray = QtGui.QSystemTrayIcon(
|
self.tray = QtWidgets.QSystemTrayIcon(
|
||||||
self.calcTrayIcon(iconFileName, self.findInboxUnreadCount()), app)
|
self.calcTrayIcon(iconFileName, self.findInboxUnreadCount()), app)
|
||||||
|
|
||||||
def setTrayIconFile(self, iconFileName):
|
def setTrayIconFile(self, iconFileName):
|
||||||
|
@ -1874,8 +1840,8 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
# draw text
|
# draw text
|
||||||
painter = QtGui.QPainter()
|
painter = QtGui.QPainter()
|
||||||
painter.begin(pixmap)
|
painter.begin(pixmap)
|
||||||
painter.setPen(
|
painter.setPen(QtGui.QPen(QtGui.QColor(255, 0, 0)))
|
||||||
QtGui.QPen(QtGui.QColor(255, 0, 0), QtCore.Qt.SolidPattern))
|
painter.setBrush(QtCore.Qt.SolidPattern)
|
||||||
painter.setFont(font)
|
painter.setFont(font)
|
||||||
painter.drawText(24-rect.right()-marginX, -rect.top()+marginY, txt)
|
painter.drawText(24-rect.right()-marginX, -rect.top()+marginY, txt)
|
||||||
painter.end()
|
painter.end()
|
||||||
|
@ -1922,10 +1888,11 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
if toAddress == rowAddress:
|
if toAddress == rowAddress:
|
||||||
sent.item(i, 3).setToolTip(textToDisplay)
|
sent.item(i, 3).setToolTip(textToDisplay)
|
||||||
try:
|
try:
|
||||||
newlinePosition = textToDisplay.indexOf('\n')
|
newlinePosition = textToDisplay.find('\n')
|
||||||
except:
|
# If someone misses adding a "_translate" to a string
|
||||||
# If someone misses adding a "_translate" to a string before passing it to this function,
|
# before passing it to this function
|
||||||
# this function won't receive a qstring which will cause an exception.
|
# ? why textToDisplay isn't unicode
|
||||||
|
except AttributeError:
|
||||||
newlinePosition = 0
|
newlinePosition = 0
|
||||||
if newlinePosition > 1:
|
if newlinePosition > 1:
|
||||||
sent.item(i, 3).setText(
|
sent.item(i, 3).setText(
|
||||||
|
@ -1934,8 +1901,6 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
sent.item(i, 3).setText(textToDisplay)
|
sent.item(i, 3).setText(textToDisplay)
|
||||||
|
|
||||||
def updateSentItemStatusByAckdata(self, ackdata, textToDisplay):
|
def updateSentItemStatusByAckdata(self, ackdata, textToDisplay):
|
||||||
if type(ackdata) is str:
|
|
||||||
ackdata = QtCore.QByteArray(ackdata)
|
|
||||||
for sent in (
|
for sent in (
|
||||||
self.ui.tableWidgetInbox,
|
self.ui.tableWidgetInbox,
|
||||||
self.ui.tableWidgetInboxSubscriptions,
|
self.ui.tableWidgetInboxSubscriptions,
|
||||||
|
@ -1945,23 +1910,22 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
if self.getCurrentFolder(treeWidget) != "sent":
|
if self.getCurrentFolder(treeWidget) != "sent":
|
||||||
continue
|
continue
|
||||||
for i in range(sent.rowCount()):
|
for i in range(sent.rowCount()):
|
||||||
toAddress = sent.item(i, 0).data(QtCore.Qt.UserRole)
|
# toAddress = sent.item(i, 0).data(QtCore.Qt.UserRole)
|
||||||
tableAckdata = sent.item(i, 3).data()
|
# decodeAddress(toAddress)
|
||||||
status, addressVersionNumber, streamNumber, ripe = decodeAddress(
|
|
||||||
toAddress)
|
if sent.item(i, 3).data() == ackdata:
|
||||||
if ackdata == tableAckdata:
|
|
||||||
sent.item(i, 3).setToolTip(textToDisplay)
|
sent.item(i, 3).setToolTip(textToDisplay)
|
||||||
try:
|
try:
|
||||||
newlinePosition = textToDisplay.indexOf('\n')
|
newlinePosition = textToDisplay.find('\n')
|
||||||
except:
|
# If someone misses adding a "_translate" to a string
|
||||||
# If someone misses adding a "_translate" to a string before passing it to this function,
|
# before passing it to this function
|
||||||
# this function won't receive a qstring which will cause an exception.
|
# ? why textToDisplay isn't unicode
|
||||||
|
except AttributeError:
|
||||||
newlinePosition = 0
|
newlinePosition = 0
|
||||||
if newlinePosition > 1:
|
if newlinePosition > 1:
|
||||||
sent.item(i, 3).setText(
|
textToDisplay = textToDisplay[:newlinePosition]
|
||||||
textToDisplay[:newlinePosition])
|
|
||||||
else:
|
sent.item(i, 3).setText(textToDisplay)
|
||||||
sent.item(i, 3).setText(textToDisplay)
|
|
||||||
|
|
||||||
def removeInboxRowByMsgid(self, msgid):
|
def removeInboxRowByMsgid(self, msgid):
|
||||||
# msgid and inventoryHash are the same thing
|
# msgid and inventoryHash are the same thing
|
||||||
|
@ -1996,7 +1960,8 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
|
|
||||||
def displayAlert(self, title, text, exitAfterUserClicksOk):
|
def displayAlert(self, title, text, exitAfterUserClicksOk):
|
||||||
self.updateStatusBar(text)
|
self.updateStatusBar(text)
|
||||||
QtGui.QMessageBox.critical(self, title, text, QtGui.QMessageBox.Ok)
|
QtWidgets.QMessageBox.critical(
|
||||||
|
self, title, text, QtWidgets.QMessageBox.Ok)
|
||||||
if exitAfterUserClicksOk:
|
if exitAfterUserClicksOk:
|
||||||
os._exit(0)
|
os._exit(0)
|
||||||
|
|
||||||
|
@ -2015,7 +1980,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
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.ui.tableWidgetAddressBook.insertRow(0)
|
self.ui.tableWidgetAddressBook.insertRow(0)
|
||||||
newItem = Ui_AddressBookWidgetItemLabel(address, unic(ustr(label)), type)
|
newItem = Ui_AddressBookWidgetItemLabel(address, unic(ustr(label)), type)
|
||||||
self.ui.tableWidgetAddressBook.setItem(0, 0, newItem)
|
self.ui.tableWidgetAddressBook.setItem(0, 0, newItem)
|
||||||
|
@ -2028,7 +1993,8 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
oldRows[item.address] = [item.label, item.type, i]
|
oldRows[item.address] = [item.label, item.type, i]
|
||||||
|
|
||||||
if self.ui.tableWidgetAddressBook.rowCount() == 0:
|
if self.ui.tableWidgetAddressBook.rowCount() == 0:
|
||||||
self.ui.tableWidgetAddressBook.horizontalHeader().setSortIndicator(0, QtCore.Qt.AscendingOrder)
|
self.ui.tableWidgetAddressBook.horizontalHeader(
|
||||||
|
).setSortIndicator(0, QtCore.Qt.AscendingOrder)
|
||||||
if self.ui.tableWidgetAddressBook.isSortingEnabled():
|
if self.ui.tableWidgetAddressBook.isSortingEnabled():
|
||||||
self.ui.tableWidgetAddressBook.setSortingEnabled(False)
|
self.ui.tableWidgetAddressBook.setSortingEnabled(False)
|
||||||
|
|
||||||
|
@ -2043,10 +2009,13 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
# chans
|
# chans
|
||||||
for address in config.addresses(True):
|
for address in config.addresses(True):
|
||||||
account = accountClass(address)
|
account = accountClass(address)
|
||||||
if (account.type == AccountMixin.CHAN and config.safeGetBoolean(address, 'enabled')):
|
if (
|
||||||
|
account.type == AccountMixin.CHAN
|
||||||
|
and config.safeGetBoolean(address, 'enabled')
|
||||||
|
):
|
||||||
newRows[address] = [account.getLabel(), AccountMixin.CHAN]
|
newRows[address] = [account.getLabel(), AccountMixin.CHAN]
|
||||||
# normal accounts
|
# normal accounts
|
||||||
queryreturn = sqlQuery('SELECT * FROM addressbook')
|
queryreturn = sqlQuery('SELECT label, address FROM addressbook')
|
||||||
for row in queryreturn:
|
for row in queryreturn:
|
||||||
label, address = row
|
label, address = row
|
||||||
label = label.decode("utf-8", "replace")
|
label = label.decode("utf-8", "replace")
|
||||||
|
@ -2076,16 +2045,17 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
self.rerenderTabTreeSubscriptions()
|
self.rerenderTabTreeSubscriptions()
|
||||||
|
|
||||||
def click_pushButtonTTL(self):
|
def click_pushButtonTTL(self):
|
||||||
QtGui.QMessageBox.information(
|
QtWidgets.QMessageBox.information(
|
||||||
self,
|
self, 'Time To Live', _translate(
|
||||||
'Time To Live',
|
"MainWindow",
|
||||||
_translate(
|
"The TTL, or Time-To-Live is the length of time that"
|
||||||
"MainWindow", """The TTL, or Time-To-Live is the length of time that the network will hold the message.
|
" the network will hold the message. The recipient must"
|
||||||
The recipient must get it during this time. If your Bitmessage client does not hear an acknowledgement
|
" get it during this time. If your Bitmessage client does"
|
||||||
,it will resend the message automatically. The longer the Time-To-Live, the
|
" not hear an acknowledgement, it will resend the message"
|
||||||
more work your computer must do to send the message.
|
" automatically. The longer the Time-To-Live, the more"
|
||||||
A Time-To-Live of four or five days is often appropriate."""),
|
" work your computer must do to send the message. A"
|
||||||
QtGui.QMessageBox.Ok)
|
" Time-To-Live of four or five days is often appropriate."
|
||||||
|
), QtWidgets.QMessageBox.Ok)
|
||||||
|
|
||||||
def click_pushButtonClear(self):
|
def click_pushButtonClear(self):
|
||||||
self.ui.lineEditSubject.setText("")
|
self.ui.lineEditSubject.setText("")
|
||||||
|
@ -2094,7 +2064,10 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
self.ui.comboBoxSendFrom.setCurrentIndex(0)
|
self.ui.comboBoxSendFrom.setCurrentIndex(0)
|
||||||
|
|
||||||
def click_pushButtonSend(self):
|
def click_pushButtonSend(self):
|
||||||
encoding = 3 if QtGui.QApplication.queryKeyboardModifiers() & QtCore.Qt.ShiftModifier else 2
|
# pylint: disable=too-many-locals
|
||||||
|
encoding = (
|
||||||
|
3 if QtWidgets.QApplication.queryKeyboardModifiers()
|
||||||
|
& QtCore.Qt.ShiftModifier else 2)
|
||||||
|
|
||||||
self.statusbar.clearMessage()
|
self.statusbar.clearMessage()
|
||||||
|
|
||||||
|
@ -2126,7 +2099,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
users can send messages of any length.
|
users can send messages of any length.
|
||||||
"""
|
"""
|
||||||
if len(message) > (2 ** 18 - 500):
|
if len(message) > (2 ** 18 - 500):
|
||||||
QtGui.QMessageBox.about(
|
QtWidgets.QMessageBox.about(
|
||||||
self, _translate("MainWindow", "Message too long"),
|
self, _translate("MainWindow", "Message too long"),
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
|
@ -2154,25 +2127,32 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
# email address
|
# email address
|
||||||
if toAddress.find("@") >= 0:
|
if toAddress.find("@") >= 0:
|
||||||
if isinstance(acct, GatewayAccount):
|
if isinstance(acct, GatewayAccount):
|
||||||
acct.createMessage(toAddress, fromAddress, subject, message)
|
acct.createMessage(
|
||||||
|
toAddress, fromAddress, subject, message)
|
||||||
subject = acct.subject
|
subject = acct.subject
|
||||||
toAddress = acct.toAddress
|
toAddress = acct.toAddress
|
||||||
else:
|
else:
|
||||||
if QtGui.QMessageBox.question(
|
if QtWidgets.QMessageBox.question(
|
||||||
self,
|
self, "Sending an email?",
|
||||||
"Sending an email?",
|
_translate(
|
||||||
_translate(
|
"MainWindow",
|
||||||
"MainWindow",
|
"You are trying to send an email"
|
||||||
"You are trying to send an email instead of a bitmessage. "
|
" instead of a bitmessage. This"
|
||||||
"This requires registering with a gateway. Attempt to register?"),
|
" requires registering with a"
|
||||||
QtGui.QMessageBox.Yes|QtGui.QMessageBox.No) != QtGui.QMessageBox.Yes:
|
" gateway. Attempt to register?"
|
||||||
|
), QtWidgets.QMessageBox.Yes
|
||||||
|
| QtWidgets.QMessageBox.No
|
||||||
|
) != QtWidgets.QMessageBox.Yes:
|
||||||
continue
|
continue
|
||||||
email = acct.getLabel()
|
email = acct.getLabel()
|
||||||
if email[-14:] != "@mailchuck.com": # attempt register
|
# attempt register
|
||||||
|
if email[-14:] != "@mailchuck.com":
|
||||||
# 12 character random email address
|
# 12 character random email address
|
||||||
email = ''.join(
|
email = u''.join(
|
||||||
random.SystemRandom().choice(string.ascii_lowercase) for _ in range(12)
|
random.SystemRandom().choice(
|
||||||
) + "@mailchuck.com"
|
string.ascii_lowercase
|
||||||
|
) for _ in range(12)
|
||||||
|
) + "@mailchuck.com"
|
||||||
acct = MailchuckAccount(fromAddress)
|
acct = MailchuckAccount(fromAddress)
|
||||||
acct.register(email)
|
acct.register(email)
|
||||||
config.set(fromAddress, 'label', email)
|
config.set(fromAddress, 'label', email)
|
||||||
|
@ -2184,10 +2164,10 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
" an email gateway. Sending registration"
|
" an email gateway. Sending registration"
|
||||||
" now as {0}, please wait for the registration"
|
" now as {0}, please wait for the registration"
|
||||||
" to be processed before retrying sending."
|
" to be processed before retrying sending."
|
||||||
).format(email)
|
).format(email))
|
||||||
)
|
|
||||||
return
|
return
|
||||||
status, addressVersionNumber, streamNumber = decodeAddress(toAddress)[:3]
|
status, addressVersionNumber, streamNumber = \
|
||||||
|
decodeAddress(toAddress)[:3]
|
||||||
if status != 'success':
|
if status != 'success':
|
||||||
try:
|
try:
|
||||||
toAddress = unic(ustr(toAddress))
|
toAddress = unic(ustr(toAddress))
|
||||||
|
@ -2262,24 +2242,31 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
toAddress = addBMIfNotPresent(toAddress)
|
toAddress = addBMIfNotPresent(toAddress)
|
||||||
|
|
||||||
if addressVersionNumber > 4 or addressVersionNumber <= 1:
|
if addressVersionNumber > 4 or addressVersionNumber <= 1:
|
||||||
QtGui.QMessageBox.about(
|
QtWidgets.QMessageBox.about(
|
||||||
self,
|
self,
|
||||||
_translate("MainWindow", "Address version number"),
|
_translate(
|
||||||
|
"MainWindow", "Address version number"),
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Concerning the address {0}, Bitmessage cannot understand address version numbers"
|
"Concerning the address {0}, Bitmessage"
|
||||||
" of {1}. Perhaps upgrade Bitmessage to the latest version."
|
" cannot understand address version"
|
||||||
).format(toAddress, str(addressVersionNumber)))
|
" numbers of {1}. Perhaps upgrade"
|
||||||
|
" Bitmessage to the latest version."
|
||||||
|
).format(toAddress, addressVersionNumber)
|
||||||
|
)
|
||||||
continue
|
continue
|
||||||
if streamNumber > 1 or streamNumber == 0:
|
if streamNumber > 1 or streamNumber == 0:
|
||||||
QtGui.QMessageBox.about(
|
QtWidgets.QMessageBox.about(
|
||||||
self,
|
self,
|
||||||
_translate("MainWindow", "Stream number"),
|
_translate("MainWindow", "Stream number"),
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Concerning the address {0}, Bitmessage cannot handle stream numbers of {1}."
|
"Concerning the address {0}, Bitmessage"
|
||||||
" Perhaps upgrade Bitmessage to the latest version."
|
" cannot handle stream numbers of {1}."
|
||||||
).format(toAddress, str(streamNumber)))
|
" Perhaps upgrade Bitmessage to the"
|
||||||
|
" latest version."
|
||||||
|
).format(toAddress, streamNumber)
|
||||||
|
)
|
||||||
continue
|
continue
|
||||||
self.statusbar.clearMessage()
|
self.statusbar.clearMessage()
|
||||||
if state.statusIconColor == 'red':
|
if state.statusIconColor == 'red':
|
||||||
|
@ -2393,9 +2380,10 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
# It's easier for others to read.
|
# It's easier for others to read.
|
||||||
isEnabled = config.getboolean(
|
isEnabled = config.getboolean(
|
||||||
addressInKeysFile, 'enabled')
|
addressInKeysFile, 'enabled')
|
||||||
isMaillinglist = config.safeGetBoolean(addressInKeysFile, 'mailinglist')
|
isMaillinglist = config.safeGetBoolean(
|
||||||
|
addressInKeysFile, 'mailinglist')
|
||||||
if isEnabled and not isMaillinglist:
|
if isEnabled and not isMaillinglist:
|
||||||
label = unic(ustr(config.get(addressInKeysFile, 'label')).strip())
|
label = unic(ustr(config.get(addressInKeysFile, 'label')).strip()) or addressInKeysFile
|
||||||
if label == "":
|
if label == "":
|
||||||
label = addressInKeysFile
|
label = addressInKeysFile
|
||||||
self.ui.comboBoxSendFrom.addItem(avatarize(addressInKeysFile), label, addressInKeysFile)
|
self.ui.comboBoxSendFrom.addItem(avatarize(addressInKeysFile), label, addressInKeysFile)
|
||||||
|
@ -2407,7 +2395,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
i, AccountColor(address).accountColor(),
|
i, AccountColor(address).accountColor(),
|
||||||
QtCore.Qt.ForegroundRole)
|
QtCore.Qt.ForegroundRole)
|
||||||
self.ui.comboBoxSendFrom.insertItem(0, '', '')
|
self.ui.comboBoxSendFrom.insertItem(0, '', '')
|
||||||
if(self.ui.comboBoxSendFrom.count() == 2):
|
if self.ui.comboBoxSendFrom.count() == 2:
|
||||||
self.ui.comboBoxSendFrom.setCurrentIndex(1)
|
self.ui.comboBoxSendFrom.setCurrentIndex(1)
|
||||||
else:
|
else:
|
||||||
self.ui.comboBoxSendFrom.setCurrentIndex(0)
|
self.ui.comboBoxSendFrom.setCurrentIndex(0)
|
||||||
|
@ -2419,9 +2407,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
addressInKeysFile, 'enabled')
|
addressInKeysFile, 'enabled')
|
||||||
isChan = config.safeGetBoolean(addressInKeysFile, 'chan')
|
isChan = config.safeGetBoolean(addressInKeysFile, 'chan')
|
||||||
if isEnabled and not isChan:
|
if isEnabled and not isChan:
|
||||||
label = unic(ustr(config.get(addressInKeysFile, 'label')).strip())
|
label = unic(ustr(config.get(addressInKeysFile, 'label')).strip()) or addressInKeyFile
|
||||||
if label == "":
|
|
||||||
label = addressInKeysFile
|
|
||||||
self.ui.comboBoxSendFromBroadcast.addItem(avatarize(addressInKeysFile), label, addressInKeysFile)
|
self.ui.comboBoxSendFromBroadcast.addItem(avatarize(addressInKeysFile), label, addressInKeysFile)
|
||||||
for i in range(self.ui.comboBoxSendFromBroadcast.count()):
|
for i in range(self.ui.comboBoxSendFromBroadcast.count()):
|
||||||
address = ustr(self.ui.comboBoxSendFromBroadcast.itemData(
|
address = ustr(self.ui.comboBoxSendFromBroadcast.itemData(
|
||||||
|
@ -2430,7 +2416,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
i, AccountColor(address).accountColor(),
|
i, AccountColor(address).accountColor(),
|
||||||
QtCore.Qt.ForegroundRole)
|
QtCore.Qt.ForegroundRole)
|
||||||
self.ui.comboBoxSendFromBroadcast.insertItem(0, '', '')
|
self.ui.comboBoxSendFromBroadcast.insertItem(0, '', '')
|
||||||
if(self.ui.comboBoxSendFromBroadcast.count() == 2):
|
if self.ui.comboBoxSendFromBroadcast.count() == 2:
|
||||||
self.ui.comboBoxSendFromBroadcast.setCurrentIndex(1)
|
self.ui.comboBoxSendFromBroadcast.setCurrentIndex(1)
|
||||||
else:
|
else:
|
||||||
self.ui.comboBoxSendFromBroadcast.setCurrentIndex(0)
|
self.ui.comboBoxSendFromBroadcast.setCurrentIndex(0)
|
||||||
|
@ -2504,6 +2490,8 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
tableWidget = self.widgetConvert(treeWidget)
|
tableWidget = self.widgetConvert(treeWidget)
|
||||||
current_account = self.getCurrentAccount(treeWidget)
|
current_account = self.getCurrentAccount(treeWidget)
|
||||||
current_folder = self.getCurrentFolder(treeWidget)
|
current_folder = self.getCurrentFolder(treeWidget)
|
||||||
|
# inventoryHash surprisingly is of type unicode
|
||||||
|
# inventoryHash = inventoryHash.encode('utf-8')
|
||||||
# pylint: disable=too-many-boolean-expressions
|
# pylint: disable=too-many-boolean-expressions
|
||||||
if ((tableWidget == inbox
|
if ((tableWidget == inbox
|
||||||
and current_account == acct.address
|
and current_account == acct.address
|
||||||
|
@ -2529,8 +2517,8 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
sound.SOUND_UNKNOWN
|
sound.SOUND_UNKNOWN
|
||||||
)
|
)
|
||||||
if self.getCurrentAccount() is not None and (
|
if self.getCurrentAccount() is not None and (
|
||||||
(self.getCurrentFolder(treeWidget) != "inbox"
|
(self.getCurrentFolder(treeWidget) != "inbox"
|
||||||
and self.getCurrentFolder(treeWidget) is not None)
|
and self.getCurrentFolder(treeWidget) is not None)
|
||||||
or self.getCurrentAccount(treeWidget) != acct.address):
|
or self.getCurrentAccount(treeWidget) != acct.address):
|
||||||
# Ubuntu should notify of new message irrespective of
|
# Ubuntu should notify of new message irrespective of
|
||||||
# whether it's in current message list or not
|
# whether it's in current message list or not
|
||||||
|
@ -2551,7 +2539,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
dialog.exec_()
|
dialog.exec_()
|
||||||
try:
|
try:
|
||||||
address, label = dialog.data
|
address, label = dialog.data
|
||||||
except AttributeError:
|
except (AttributeError, TypeError):
|
||||||
return
|
return
|
||||||
|
|
||||||
# First we must check to see if the address is already in the
|
# First we must check to see if the address is already in the
|
||||||
|
@ -2596,7 +2584,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
dialog.exec_()
|
dialog.exec_()
|
||||||
try:
|
try:
|
||||||
address, label = dialog.data
|
address, label = dialog.data
|
||||||
except AttributeError:
|
except (AttributeError, TypeError):
|
||||||
return
|
return
|
||||||
|
|
||||||
# We must check to see if the address is already in the
|
# We must check to see if the address is already in the
|
||||||
|
@ -2655,9 +2643,8 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
dialog = dialogs.EmailGatewayDialog(self, config=config)
|
dialog = dialogs.EmailGatewayDialog(self, config=config)
|
||||||
# For Modal dialogs
|
# For Modal dialogs
|
||||||
dialog.exec_()
|
dialog.exec_()
|
||||||
try:
|
acct = dialog.data
|
||||||
acct = dialog.data
|
if not acct:
|
||||||
except AttributeError:
|
|
||||||
return
|
return
|
||||||
|
|
||||||
# Only settings remain here
|
# Only settings remain here
|
||||||
|
@ -2682,13 +2669,13 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
self.ui.textEditMessage.setFocus()
|
self.ui.textEditMessage.setFocus()
|
||||||
|
|
||||||
def on_action_MarkAllRead(self):
|
def on_action_MarkAllRead(self):
|
||||||
if QtGui.QMessageBox.question(
|
if QtWidgets.QMessageBox.question(
|
||||||
self, "Marking all messages as read?",
|
self, "Marking all messages as read?",
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Are you sure you would like to mark all messages read?"
|
"Are you sure you would like to mark all messages read?"
|
||||||
), QtGui.QMessageBox.Yes | QtGui.QMessageBox.No
|
), QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No
|
||||||
) != QtGui.QMessageBox.Yes:
|
) != QtWidgets.QMessageBox.Yes:
|
||||||
return
|
return
|
||||||
tableWidget = self.getCurrentMessagelist()
|
tableWidget = self.getCurrentMessagelist()
|
||||||
|
|
||||||
|
@ -2716,7 +2703,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
def network_switch(self):
|
def network_switch(self):
|
||||||
dontconnect_option = not config.safeGetBoolean(
|
dontconnect_option = not config.safeGetBoolean(
|
||||||
'bitmessagesettings', 'dontconnect')
|
'bitmessagesettings', 'dontconnect')
|
||||||
reply = QtGui.QMessageBox.question(
|
reply = QtWidgets.QMessageBox.question(
|
||||||
self, _translate("MainWindow", "Disconnecting")
|
self, _translate("MainWindow", "Disconnecting")
|
||||||
if dontconnect_option else _translate("MainWindow", "Connecting"),
|
if dontconnect_option else _translate("MainWindow", "Connecting"),
|
||||||
_translate(
|
_translate(
|
||||||
|
@ -2725,9 +2712,9 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
) if dontconnect_option else _translate(
|
) if dontconnect_option else _translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Bitmessage will now start connecting to network. Are you sure?"
|
"Bitmessage will now start connecting to network. Are you sure?"
|
||||||
), QtGui.QMessageBox.Yes | QtGui.QMessageBox.Cancel,
|
), QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.Cancel,
|
||||||
QtGui.QMessageBox.Cancel)
|
QtWidgets.QMessageBox.Cancel)
|
||||||
if reply != QtGui.QMessageBox.Yes:
|
if reply != QtWidgets.QMessageBox.Yes:
|
||||||
return
|
return
|
||||||
config.set(
|
config.set(
|
||||||
'bitmessagesettings', 'dontconnect', ustr(dontconnect_option))
|
'bitmessagesettings', 'dontconnect', ustr(dontconnect_option))
|
||||||
|
@ -2753,62 +2740,60 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
waitForSync = False
|
waitForSync = False
|
||||||
|
|
||||||
# C PoW currently doesn't support interrupting and OpenCL is untested
|
# C PoW currently doesn't support interrupting and OpenCL is untested
|
||||||
if getPowType() == "python" and (powQueueSize() > 0 or pendingUpload() > 0):
|
if getPowType() == "python" and (
|
||||||
reply = QtGui.QMessageBox.question(
|
powQueueSize() > 0 or pendingUpload() > 0):
|
||||||
|
reply = QtWidgets.QMessageBox.question(
|
||||||
self, _translate("MainWindow", "Proof of work pending"),
|
self, _translate("MainWindow", "Proof of work pending"),
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"%n object(s) pending proof of work", None,
|
"%n object(s) pending proof of work", None, powQueueSize()
|
||||||
QtCore.QCoreApplication.CodecForTr, powQueueSize()
|
) + ", "
|
||||||
) + ", " +
|
+ _translate(
|
||||||
_translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"%n object(s) waiting to be distributed", None,
|
"%n object(s) waiting to be distributed",
|
||||||
QtCore.QCoreApplication.CodecForTr, pendingUpload()
|
None, pendingUpload()
|
||||||
) + "\n\n" +
|
) + "\n\n"
|
||||||
_translate(
|
+ _translate("MainWindow", "Wait until these tasks finish?"),
|
||||||
"MainWindow", "Wait until these tasks finish?"),
|
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No
|
||||||
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No
|
| QtWidgets.QMessageBox.Cancel, QtWidgets.QMessageBox.Cancel
|
||||||
| QtGui.QMessageBox.Cancel, QtGui.QMessageBox.Cancel)
|
)
|
||||||
if reply == QtGui.QMessageBox.No:
|
if reply == QtWidgets.QMessageBox.No:
|
||||||
waitForPow = False
|
waitForPow = False
|
||||||
elif reply == QtGui.QMessageBox.Cancel:
|
elif reply == QtWidgets.QMessageBox.Cancel:
|
||||||
return
|
return
|
||||||
|
|
||||||
if pendingDownload() > 0:
|
if pendingDownload() > 0:
|
||||||
reply = QtGui.QMessageBox.question(
|
reply = QtWidgets.QMessageBox.question(
|
||||||
self, _translate("MainWindow", "Synchronisation pending"),
|
self, _translate("MainWindow", "Synchronisation pending"),
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Bitmessage hasn't synchronised with the network,"
|
"Bitmessage hasn't synchronised with the network,"
|
||||||
" %n object(s) to be downloaded. If you quit now,"
|
" %n object(s) to be downloaded. If you quit now,"
|
||||||
" it may cause delivery delays. Wait until the"
|
" it may cause delivery delays. Wait until the"
|
||||||
" synchronisation finishes?", None,
|
" synchronisation finishes?",
|
||||||
QtCore.QCoreApplication.CodecForTr, pendingDownload()
|
None, pendingDownload()
|
||||||
),
|
), QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No
|
||||||
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No
|
| QtWidgets.QMessageBox.Cancel, QtWidgets.QMessageBox.Cancel)
|
||||||
| QtGui.QMessageBox.Cancel, QtGui.QMessageBox.Cancel)
|
if reply == QtWidgets.QMessageBox.Yes:
|
||||||
if reply == QtGui.QMessageBox.Yes:
|
|
||||||
self.wait = waitForSync = True
|
self.wait = waitForSync = True
|
||||||
elif reply == QtGui.QMessageBox.Cancel:
|
elif reply == QtWidgets.QMessageBox.Cancel:
|
||||||
return
|
return
|
||||||
|
|
||||||
if state.statusIconColor == 'red' and not config.safeGetBoolean(
|
if state.statusIconColor == 'red' and not config.safeGetBoolean(
|
||||||
'bitmessagesettings', 'dontconnect'):
|
'bitmessagesettings', 'dontconnect'):
|
||||||
reply = QtGui.QMessageBox.question(
|
reply = QtWidgets.QMessageBox.question(
|
||||||
self, _translate("MainWindow", "Not connected"),
|
self, _translate("MainWindow", "Not connected"),
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Bitmessage isn't connected to the network. If you"
|
"Bitmessage isn't connected to the network. If you"
|
||||||
" quit now, it may cause delivery delays. Wait until"
|
" quit now, it may cause delivery delays. Wait until"
|
||||||
" connected and the synchronisation finishes?"
|
" connected and the synchronisation finishes?"
|
||||||
),
|
), QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No
|
||||||
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No
|
| QtWidgets.QMessageBox.Cancel, QtWidgets.QMessageBox.Cancel)
|
||||||
| QtGui.QMessageBox.Cancel, QtGui.QMessageBox.Cancel)
|
if reply == QtWidgets.QMessageBox.Yes:
|
||||||
if reply == QtGui.QMessageBox.Yes:
|
|
||||||
waitForConnection = True
|
waitForConnection = True
|
||||||
self.wait = waitForSync = True
|
self.wait = waitForSync = True
|
||||||
elif reply == QtGui.QMessageBox.Cancel:
|
elif reply == QtWidgets.QMessageBox.Cancel:
|
||||||
return
|
return
|
||||||
|
|
||||||
self.quitAccepted = True
|
self.quitAccepted = True
|
||||||
|
@ -2871,22 +2856,20 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
|
|
||||||
# check if upload (of objects created locally) pending
|
# check if upload (of objects created locally) pending
|
||||||
self.updateStatusBar(_translate(
|
self.updateStatusBar(_translate(
|
||||||
"MainWindow", "Waiting for objects to be sent... {0}%").format(50))
|
"MainWindow", "Waiting for objects to be sent... {0}%"
|
||||||
|
).format(50))
|
||||||
maxPendingUpload = max(1, pendingUpload())
|
maxPendingUpload = max(1, pendingUpload())
|
||||||
|
|
||||||
while pendingUpload() > 1:
|
while pendingUpload() > 1:
|
||||||
self.updateStatusBar(_translate(
|
self.updateStatusBar(_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Waiting for objects to be sent... {0}%"
|
"Waiting for objects to be sent... {0}%"
|
||||||
).format(int(50 + 20 * (pendingUpload() / maxPendingUpload))))
|
).format(int(50 + 20 * pendingUpload() / maxPendingUpload)))
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
QtCore.QCoreApplication.processEvents(
|
QtCore.QCoreApplication.processEvents(
|
||||||
QtCore.QEventLoop.AllEvents, 1000
|
QtCore.QEventLoop.AllEvents, 1000
|
||||||
)
|
)
|
||||||
|
|
||||||
QtCore.QCoreApplication.processEvents(
|
|
||||||
QtCore.QEventLoop.AllEvents, 1000
|
|
||||||
)
|
|
||||||
QtCore.QCoreApplication.processEvents(
|
QtCore.QCoreApplication.processEvents(
|
||||||
QtCore.QEventLoop.AllEvents, 1000
|
QtCore.QEventLoop.AllEvents, 1000
|
||||||
)
|
)
|
||||||
|
@ -2943,24 +2926,33 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
if not msgid:
|
if not msgid:
|
||||||
return
|
return
|
||||||
queryreturn = sqlQuery(
|
queryreturn = sqlQuery(
|
||||||
'''select message from inbox where msgid=?''', msgid)
|
'SELECT message FROM inbox WHERE msgid=?', msgid)
|
||||||
if queryreturn != []:
|
try:
|
||||||
for row in queryreturn:
|
lines_raw = queryreturn[-1][0].split('\n')
|
||||||
messageText, = row
|
lines = []
|
||||||
messageText = messageText.decode("utf-8", "replace")
|
for line in lines_raw:
|
||||||
|
lines.append(line.decode("utf-8", "replace"))
|
||||||
|
except IndexError:
|
||||||
|
lines = ''
|
||||||
|
|
||||||
lines = messageText.split('\n')
|
|
||||||
totalLines = len(lines)
|
totalLines = len(lines)
|
||||||
for i in xrange(totalLines):
|
for i in xrange(totalLines):
|
||||||
if 'Message ostensibly from ' in lines[i]:
|
if 'Message ostensibly from ' in lines[i]:
|
||||||
lines[i] = '<p style="font-size: 12px; color: grey;">%s</span></p>' % (
|
lines[i] = (
|
||||||
lines[i])
|
'<p style="font-size: 12px; color: grey;">%s</span></p>' %
|
||||||
elif lines[i] == '------------------------------------------------------':
|
lines[i]
|
||||||
|
)
|
||||||
|
elif (
|
||||||
|
lines[i]
|
||||||
|
== '------------------------------------------------------'
|
||||||
|
):
|
||||||
lines[i] = '<hr>'
|
lines[i] = '<hr>'
|
||||||
elif lines[i] == '' and (i+1) < totalLines and \
|
elif (
|
||||||
lines[i+1] != '------------------------------------------------------':
|
lines[i] == '' and (i + 1) < totalLines and lines[i + 1]
|
||||||
|
!= '------------------------------------------------------'
|
||||||
|
):
|
||||||
lines[i] = '<br><br>'
|
lines[i] = '<br><br>'
|
||||||
content = ' '.join(lines) # To keep the whitespace between lines
|
content = ' '.join(lines) # To keep the whitespace between lines
|
||||||
content = shared.fixPotentiallyInvalidUTF8Data(content)
|
content = shared.fixPotentiallyInvalidUTF8Data(content)
|
||||||
content = unic(ustr(content))
|
content = unic(ustr(content))
|
||||||
textEdit.setHtml(content)
|
textEdit.setHtml(content)
|
||||||
|
@ -2989,18 +2981,14 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
)
|
)
|
||||||
|
|
||||||
self.propagateUnreadCount()
|
self.propagateUnreadCount()
|
||||||
# tableWidget.selectRow(currentRow + 1)
|
|
||||||
# This doesn't de-select the last message if you try to mark it
|
|
||||||
# unread, but that doesn't interfere. Might not be necessary.
|
|
||||||
# We could also select upwards, but then our problem would be
|
|
||||||
# with the topmost message.
|
|
||||||
# tableWidget.clearSelection() manages to mark the message
|
|
||||||
# as read again.
|
|
||||||
|
|
||||||
# Format predefined text on message reply.
|
# Format predefined text on message reply.
|
||||||
def quoted_text(self, message):
|
def quoted_text(self, message):
|
||||||
if not config.safeGetBoolean('bitmessagesettings', 'replybelow'):
|
if not config.safeGetBoolean('bitmessagesettings', 'replybelow'):
|
||||||
return '\n\n------------------------------------------------------\n' + message
|
return (
|
||||||
|
'\n\n------------------------------------------------------\n' +
|
||||||
|
message
|
||||||
|
)
|
||||||
|
|
||||||
quoteWrapper = textwrap.TextWrapper(
|
quoteWrapper = textwrap.TextWrapper(
|
||||||
replace_whitespace=False, initial_indent='> ',
|
replace_whitespace=False, initial_indent='> ',
|
||||||
|
@ -3075,7 +3063,8 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
acct.parseMessage(
|
acct.parseMessage(
|
||||||
toAddressAtCurrentInboxRow, fromAddressAtCurrentInboxRow,
|
toAddressAtCurrentInboxRow, fromAddressAtCurrentInboxRow,
|
||||||
tableWidget.item(currentInboxRow, 2).subject,
|
tableWidget.item(currentInboxRow, 2).subject,
|
||||||
messageAtCurrentInboxRow)
|
messageAtCurrentInboxRow
|
||||||
|
)
|
||||||
widget = {
|
widget = {
|
||||||
'subject': self.ui.lineEditSubject,
|
'subject': self.ui.lineEditSubject,
|
||||||
'from': self.ui.comboBoxSendFrom,
|
'from': self.ui.comboBoxSendFrom,
|
||||||
|
@ -3088,23 +3077,26 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
)
|
)
|
||||||
# toAddressAtCurrentInboxRow = fromAddressAtCurrentInboxRow
|
# toAddressAtCurrentInboxRow = fromAddressAtCurrentInboxRow
|
||||||
elif not config.has_section(toAddressAtCurrentInboxRow):
|
elif not config.has_section(toAddressAtCurrentInboxRow):
|
||||||
QtGui.QMessageBox.information(
|
QtWidgets.QMessageBox.information(
|
||||||
self, _translate("MainWindow", "Address is gone"),
|
self,
|
||||||
|
_translate("MainWindow", "Address is gone"),
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Bitmessage cannot find your address {0}. Perhaps you"
|
"Bitmessage cannot find your address {0}. Perhaps you"
|
||||||
" removed it?"
|
" removed it?"
|
||||||
).format(toAddressAtCurrentInboxRow), QtGui.QMessageBox.Ok)
|
).format(toAddressAtCurrentInboxRow),
|
||||||
|
QtWidgets.QMessageBox.Ok)
|
||||||
elif not config.getboolean(
|
elif not config.getboolean(
|
||||||
toAddressAtCurrentInboxRow, 'enabled'):
|
toAddressAtCurrentInboxRow, 'enabled'):
|
||||||
QtGui.QMessageBox.information(
|
QtWidgets.QMessageBox.information(
|
||||||
self, _translate("MainWindow", "Address disabled"),
|
self,
|
||||||
|
_translate("MainWindow", "Address disabled"),
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Error: The address from which you are trying to send"
|
"Error: The address from which you are trying to send"
|
||||||
" is disabled. You\'ll have to enable it on the"
|
" is disabled. You\'ll have to enable it on the \'Your"
|
||||||
" \'Your Identities\' tab before using it."
|
" Identities\' tab before using it."
|
||||||
), QtGui.QMessageBox.Ok)
|
), QtWidgets.QMessageBox.Ok)
|
||||||
else:
|
else:
|
||||||
self.setBroadcastEnablementDependingOnWhetherThisIsAMailingListAddress(toAddressAtCurrentInboxRow)
|
self.setBroadcastEnablementDependingOnWhetherThisIsAMailingListAddress(toAddressAtCurrentInboxRow)
|
||||||
broadcast_tab_index = self.ui.tabWidgetSend.indexOf(
|
broadcast_tab_index = self.ui.tabWidgetSend.indexOf(
|
||||||
|
@ -3182,8 +3174,9 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
recipientAddress = tableWidget.item(
|
recipientAddress = tableWidget.item(
|
||||||
currentInboxRow, 0).data(QtCore.Qt.UserRole)
|
currentInboxRow, 0).data(QtCore.Qt.UserRole)
|
||||||
# Let's make sure that it isn't already in the address book
|
# Let's make sure that it isn't already in the address book
|
||||||
queryreturn = sqlQuery('''select * from blacklist where address=?''',
|
queryreturn = sqlQuery(
|
||||||
dbstr(addressAtCurrentInboxRow))
|
'SELECT * FROM blacklist WHERE address=?',
|
||||||
|
dbstr(addressAtCurrentInboxRow))
|
||||||
if queryreturn == []:
|
if queryreturn == []:
|
||||||
label = "\"" + tableWidget.item(currentInboxRow, 2).subject + "\" in " + config.get(
|
label = "\"" + tableWidget.item(currentInboxRow, 2).subject + "\" in " + config.get(
|
||||||
recipientAddress, "label")
|
recipientAddress, "label")
|
||||||
|
@ -3232,8 +3225,8 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
return
|
return
|
||||||
currentRow = 0
|
currentRow = 0
|
||||||
folder = self.getCurrentFolder()
|
folder = self.getCurrentFolder()
|
||||||
shifted = QtGui.QApplication.queryKeyboardModifiers() \
|
shifted = (QtWidgets.QApplication.queryKeyboardModifiers() &
|
||||||
& QtCore.Qt.ShiftModifier
|
QtCore.Qt.ShiftModifier)
|
||||||
tableWidget.setUpdatesEnabled(False)
|
tableWidget.setUpdatesEnabled(False)
|
||||||
inventoryHashesToTrash = set()
|
inventoryHashesToTrash = set()
|
||||||
# ranges in reversed order
|
# ranges in reversed order
|
||||||
|
@ -3250,8 +3243,8 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
idCount = len(inventoryHashesToTrash)
|
idCount = len(inventoryHashesToTrash)
|
||||||
sqlExecuteChunked(
|
sqlExecuteChunked(
|
||||||
("DELETE FROM inbox" if folder == "trash" or shifted else
|
("DELETE FROM inbox" if folder == "trash" or shifted else
|
||||||
"UPDATE inbox SET folder='trash', read=1") +
|
"UPDATE inbox SET folder='trash', read=1")
|
||||||
" WHERE msgid IN ({0})", idCount, *inventoryHashesToTrash)
|
+ " WHERE msgid IN ({0})", idCount, *inventoryHashesToTrash)
|
||||||
tableWidget.selectRow(0 if currentRow == 0 else currentRow - 1)
|
tableWidget.selectRow(0 if currentRow == 0 else currentRow - 1)
|
||||||
tableWidget.setUpdatesEnabled(True)
|
tableWidget.setUpdatesEnabled(True)
|
||||||
self.propagateUnreadCount(folder)
|
self.propagateUnreadCount(folder)
|
||||||
|
@ -3299,19 +3292,18 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
# Retrieve the message data out of the SQL database
|
# Retrieve the message data out of the SQL database
|
||||||
msgid = tableWidget.item(currentInboxRow, 3).data()
|
msgid = tableWidget.item(currentInboxRow, 3).data()
|
||||||
queryreturn = sqlQuery(
|
queryreturn = sqlQuery(
|
||||||
'''select message from inbox where msgid=?''', msgid)
|
'SELECT message FROM inbox WHERE msgid=?', msgid)
|
||||||
if queryreturn != []:
|
if queryreturn != []:
|
||||||
for row in queryreturn:
|
for row in queryreturn:
|
||||||
message, = row
|
message, = row
|
||||||
message = message.decode("utf-8", "replace")
|
message = message.decode("utf-8", "replace")
|
||||||
|
|
||||||
defaultFilename = "".join(x for x in subjectAtCurrentInboxRow if x.isalnum()) + '.txt'
|
defaultFilename = "".join(
|
||||||
filename = QtGui.QFileDialog.getSaveFileName(
|
x for x in subjectAtCurrentInboxRow if x.isalnum()) + '.txt'
|
||||||
self,
|
filename = QtWidgets.QFileDialog.getSaveFileName(
|
||||||
_translate("MainWindow","Save As..."),
|
self, _translate("MainWindow", "Save As..."), defaultFilename,
|
||||||
defaultFilename,
|
"Text files (*.txt);;All files (*.*)")[0]
|
||||||
"Text files (*.txt);;All files (*.*)")
|
if not filename:
|
||||||
if filename == '':
|
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
f = open(filename, 'w')
|
f = open(filename, 'w')
|
||||||
|
@ -3323,11 +3315,13 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
|
|
||||||
# Send item on the Sent tab to trash
|
# Send item on the Sent tab to trash
|
||||||
def on_action_SentTrash(self):
|
def on_action_SentTrash(self):
|
||||||
|
currentRow = 0
|
||||||
tableWidget = self.getCurrentMessagelist()
|
tableWidget = self.getCurrentMessagelist()
|
||||||
if not tableWidget:
|
if not tableWidget:
|
||||||
return
|
return
|
||||||
folder = self.getCurrentFolder()
|
folder = self.getCurrentFolder()
|
||||||
shifted = QtGui.QApplication.queryKeyboardModifiers() & QtCore.Qt.ShiftModifier
|
shifted = (QtWidgets.QApplication.queryKeyboardModifiers() &
|
||||||
|
QtCore.Qt.ShiftModifier)
|
||||||
while tableWidget.selectedIndexes() != []:
|
while tableWidget.selectedIndexes() != []:
|
||||||
currentRow = tableWidget.selectedIndexes()[0].row()
|
currentRow = tableWidget.selectedIndexes()[0].row()
|
||||||
ackdataToTrash = tableWidget.item(currentRow, 3).data()
|
ackdataToTrash = tableWidget.item(currentRow, 3).data()
|
||||||
|
@ -3355,15 +3349,18 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
queryreturn = sqlQuery('''select ackdata FROM sent WHERE status='forcepow' ''')
|
queryreturn = sqlQuery('''select ackdata FROM sent WHERE status='forcepow' ''')
|
||||||
for row in queryreturn:
|
for row in queryreturn:
|
||||||
ackdata, = row
|
ackdata, = row
|
||||||
queues.UISignalQueue.put(('updateSentItemStatusByAckdata', (
|
queues.UISignalQueue.put((
|
||||||
ackdata, 'Overriding maximum-difficulty setting. Work queued.')))
|
'updateSentItemStatusByAckdata',
|
||||||
|
(ackdata, 'Overriding maximum-difficulty setting.'
|
||||||
|
' Work queued.')
|
||||||
|
))
|
||||||
queues.workerQueue.put(('sendmessage', ''))
|
queues.workerQueue.put(('sendmessage', ''))
|
||||||
|
|
||||||
def on_action_SentClipboard(self):
|
def on_action_SentClipboard(self):
|
||||||
currentRow = self.ui.tableWidgetInbox.currentRow()
|
currentRow = self.ui.tableWidgetInbox.currentRow()
|
||||||
addressAtCurrentRow = self.ui.tableWidgetInbox.item(
|
addressAtCurrentRow = self.ui.tableWidgetInbox.item(
|
||||||
currentRow, 0).data(QtCore.Qt.UserRole)
|
currentRow, 0).data(QtCore.Qt.UserRole)
|
||||||
clipboard = QtGui.QApplication.clipboard()
|
clipboard = QtWidgets.QApplication.clipboard()
|
||||||
clipboard.setText(ustr(addressAtCurrentRow))
|
clipboard.setText(ustr(addressAtCurrentRow))
|
||||||
|
|
||||||
# Group of functions for the Address Book dialog box
|
# Group of functions for the Address Book dialog box
|
||||||
|
@ -3388,7 +3385,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
addresses_string = item.address
|
addresses_string = item.address
|
||||||
else:
|
else:
|
||||||
addresses_string += ', ' + item.address
|
addresses_string += ', ' + item.address
|
||||||
clipboard = QtGui.QApplication.clipboard()
|
clipboard = QtWidgets.QApplication.clipboard()
|
||||||
clipboard.setText(addresses_string)
|
clipboard.setText(addresses_string)
|
||||||
|
|
||||||
def on_action_AddressBookSend(self):
|
def on_action_AddressBookSend(self):
|
||||||
|
@ -3398,8 +3395,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
return self.updateStatusBar(_translate(
|
return self.updateStatusBar(_translate(
|
||||||
"MainWindow", "No addresses selected."))
|
"MainWindow", "No addresses selected."))
|
||||||
|
|
||||||
addresses_string = unic(ustr(
|
addresses_string = unic(ustr(self.ui.lineEditTo.text()))
|
||||||
self.ui.lineEditTo.text()))
|
|
||||||
for item in selected_items:
|
for item in selected_items:
|
||||||
address_string = item.accountString()
|
address_string = item.accountString()
|
||||||
if not addresses_string:
|
if not addresses_string:
|
||||||
|
@ -3430,7 +3426,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
)
|
)
|
||||||
|
|
||||||
def on_context_menuAddressBook(self, point):
|
def on_context_menuAddressBook(self, point):
|
||||||
self.popMenuAddressBook = QtGui.QMenu(self)
|
self.popMenuAddressBook = QtWidgets.QMenu(self)
|
||||||
self.popMenuAddressBook.addAction(self.actionAddressBookSend)
|
self.popMenuAddressBook.addAction(self.actionAddressBookSend)
|
||||||
self.popMenuAddressBook.addAction(self.actionAddressBookClipboard)
|
self.popMenuAddressBook.addAction(self.actionAddressBookClipboard)
|
||||||
self.popMenuAddressBook.addAction(self.actionAddressBookSubscribe)
|
self.popMenuAddressBook.addAction(self.actionAddressBookSubscribe)
|
||||||
|
@ -3460,7 +3456,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
self.click_pushButtonAddSubscription()
|
self.click_pushButtonAddSubscription()
|
||||||
|
|
||||||
def on_action_SubscriptionsDelete(self):
|
def on_action_SubscriptionsDelete(self):
|
||||||
if QtGui.QMessageBox.question(
|
if QtWidgets.QMessageBox.question(
|
||||||
self, "Delete subscription?",
|
self, "Delete subscription?",
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
|
@ -3471,8 +3467,8 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
" messages, but you can still view messages you"
|
" messages, but you can still view messages you"
|
||||||
" already received.\n\nAre you sure you want to"
|
" already received.\n\nAre you sure you want to"
|
||||||
" delete the subscription?"
|
" delete the subscription?"
|
||||||
), QtGui.QMessageBox.Yes | QtGui.QMessageBox.No
|
), QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No
|
||||||
) != QtGui.QMessageBox.Yes:
|
) != QtWidgets.QMessageBox.Yes:
|
||||||
return
|
return
|
||||||
address = self.getCurrentAccount()
|
address = self.getCurrentAccount()
|
||||||
sqlExecute('''DELETE FROM subscriptions WHERE address=?''',
|
sqlExecute('''DELETE FROM subscriptions WHERE address=?''',
|
||||||
|
@ -3484,7 +3480,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
|
|
||||||
def on_action_SubscriptionsClipboard(self):
|
def on_action_SubscriptionsClipboard(self):
|
||||||
address = self.getCurrentAccount()
|
address = self.getCurrentAccount()
|
||||||
clipboard = QtGui.QApplication.clipboard()
|
clipboard = QtWidgets.QApplication.clipboard()
|
||||||
clipboard.setText(ustr(address))
|
clipboard.setText(ustr(address))
|
||||||
|
|
||||||
def on_action_SubscriptionsEnable(self):
|
def on_action_SubscriptionsEnable(self):
|
||||||
|
@ -3509,7 +3505,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
|
|
||||||
def on_context_menuSubscriptions(self, point):
|
def on_context_menuSubscriptions(self, point):
|
||||||
currentItem = self.getCurrentItem()
|
currentItem = self.getCurrentItem()
|
||||||
self.popMenuSubscriptions = QtGui.QMenu(self)
|
self.popMenuSubscriptions = QtWidgets.QMenu(self)
|
||||||
if isinstance(currentItem, Ui_AddressWidget):
|
if isinstance(currentItem, Ui_AddressWidget):
|
||||||
self.popMenuSubscriptions.addAction(self.actionsubscriptionsNew)
|
self.popMenuSubscriptions.addAction(self.actionsubscriptionsNew)
|
||||||
self.popMenuSubscriptions.addAction(self.actionsubscriptionsDelete)
|
self.popMenuSubscriptions.addAction(self.actionsubscriptionsDelete)
|
||||||
|
@ -3549,8 +3545,6 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
return self.ui.tableWidgetInboxSubscriptions
|
return self.ui.tableWidgetInboxSubscriptions
|
||||||
elif widget == self.ui.treeWidgetChans:
|
elif widget == self.ui.treeWidgetChans:
|
||||||
return self.ui.tableWidgetInboxChans
|
return self.ui.tableWidgetInboxChans
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
def getCurrentTreeWidget(self):
|
def getCurrentTreeWidget(self):
|
||||||
currentIndex = self.ui.tabWidget.currentIndex()
|
currentIndex = self.ui.tabWidget.currentIndex()
|
||||||
|
@ -3603,7 +3597,11 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
if messagelist:
|
if messagelist:
|
||||||
currentRow = messagelist.currentRow()
|
currentRow = messagelist.currentRow()
|
||||||
if currentRow >= 0:
|
if currentRow >= 0:
|
||||||
return messagelist.item(currentRow, 3).data()
|
msgid_str = messagelist.item(currentRow, 3).data()
|
||||||
|
if six.PY3:
|
||||||
|
return escape_decode(msgid_str)[0][2:-1]
|
||||||
|
else: # assume six.PY2
|
||||||
|
return msgid_str
|
||||||
|
|
||||||
def getCurrentMessageTextedit(self):
|
def getCurrentMessageTextedit(self):
|
||||||
currentIndex = self.ui.tabWidget.currentIndex()
|
currentIndex = self.ui.tabWidget.currentIndex()
|
||||||
|
@ -3695,7 +3693,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
if account.type == AccountMixin.NORMAL:
|
if account.type == AccountMixin.NORMAL:
|
||||||
return # maybe in the future
|
return # maybe in the future
|
||||||
elif account.type == AccountMixin.CHAN:
|
elif account.type == AccountMixin.CHAN:
|
||||||
if QtGui.QMessageBox.question(
|
if QtWidgets.QMessageBox.question(
|
||||||
self, "Delete channel?",
|
self, "Delete channel?",
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
|
@ -3706,8 +3704,8 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
" messages, but you can still view messages you"
|
" messages, but you can still view messages you"
|
||||||
" already received.\n\nAre you sure you want to"
|
" already received.\n\nAre you sure you want to"
|
||||||
" delete the channel?"
|
" delete the channel?"
|
||||||
), QtGui.QMessageBox.Yes | QtGui.QMessageBox.No
|
), QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No
|
||||||
) == QtGui.QMessageBox.Yes:
|
) == QtWidgets.QMessageBox.Yes:
|
||||||
config.remove_section(ustr(account.address))
|
config.remove_section(ustr(account.address))
|
||||||
else:
|
else:
|
||||||
return
|
return
|
||||||
|
@ -3748,7 +3746,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
|
|
||||||
def on_action_Clipboard(self):
|
def on_action_Clipboard(self):
|
||||||
address = self.getCurrentAccount()
|
address = self.getCurrentAccount()
|
||||||
clipboard = QtGui.QApplication.clipboard()
|
clipboard = QtWidgets.QApplication.clipboard()
|
||||||
clipboard.setText(ustr(address))
|
clipboard.setText(ustr(address))
|
||||||
|
|
||||||
def on_action_ClipboardMessagelist(self):
|
def on_action_ClipboardMessagelist(self):
|
||||||
|
@ -3766,14 +3764,14 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
myAddress = tableWidget.item(currentRow, 0).data(QtCore.Qt.UserRole)
|
myAddress = tableWidget.item(currentRow, 0).data(QtCore.Qt.UserRole)
|
||||||
otherAddress = tableWidget.item(currentRow, 1).data(QtCore.Qt.UserRole)
|
otherAddress = tableWidget.item(currentRow, 1).data(QtCore.Qt.UserRole)
|
||||||
account = accountClass(myAddress)
|
account = accountClass(myAddress)
|
||||||
if isinstance(account, GatewayAccount) and otherAddress == account.relayAddress and (
|
if isinstance(account, GatewayAccount) \
|
||||||
(currentColumn in [0, 2] and self.getCurrentFolder() == "sent") or
|
and otherAddress == account.relayAddress and (
|
||||||
(currentColumn in [1, 2] and self.getCurrentFolder() != "sent")):
|
(currentColumn in (0, 2) and currentFolder == "sent") or
|
||||||
|
(currentColumn in (1, 2) and currentFolder != "sent")):
|
||||||
text = ustr(tableWidget.item(currentRow, currentColumn).label)
|
text = ustr(tableWidget.item(currentRow, currentColumn).label)
|
||||||
else:
|
else:
|
||||||
text = tableWidget.item(currentRow, currentColumn).data(QtCore.Qt.UserRole)
|
text = ustr(tableWidget.item(currentRow, currentColumn).data(QtCore.Qt.UserRole))
|
||||||
|
clipboard = QtWidgets.QApplication.clipboard()
|
||||||
clipboard = QtGui.QApplication.clipboard()
|
|
||||||
clipboard.setText(text)
|
clipboard.setText(text)
|
||||||
|
|
||||||
# set avatar functions
|
# set avatar functions
|
||||||
|
@ -3798,10 +3796,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
if not os.path.exists(state.appdata + 'avatars/'):
|
if not os.path.exists(state.appdata + 'avatars/'):
|
||||||
os.makedirs(state.appdata + 'avatars/')
|
os.makedirs(state.appdata + 'avatars/')
|
||||||
hash = hashlib.md5(addBMIfNotPresent(addressAtCurrentRow).encode("utf-8", "replace")).hexdigest()
|
hash = hashlib.md5(addBMIfNotPresent(addressAtCurrentRow).encode("utf-8", "replace")).hexdigest()
|
||||||
extensions = [
|
# http://pyqt.sourceforge.net/Docs/PyQt4/qimagereader.html#supportedImageFormats
|
||||||
'PNG', 'GIF', 'JPG', 'JPEG', 'SVG', 'BMP', 'MNG', 'PBM',
|
|
||||||
'PGM', 'PPM', 'TIFF', 'XBM', 'XPM', 'TGA']
|
|
||||||
|
|
||||||
names = {
|
names = {
|
||||||
'BMP': 'Windows Bitmap',
|
'BMP': 'Windows Bitmap',
|
||||||
'GIF': 'Graphic Interchange Format',
|
'GIF': 'Graphic Interchange Format',
|
||||||
|
@ -3816,11 +3811,12 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
'XBM': 'X11 Bitmap',
|
'XBM': 'X11 Bitmap',
|
||||||
'XPM': 'X11 Pixmap',
|
'XPM': 'X11 Pixmap',
|
||||||
'SVG': 'Scalable Vector Graphics',
|
'SVG': 'Scalable Vector Graphics',
|
||||||
'TGA': 'Targa Image Format'}
|
'TGA': 'Targa Image Format'
|
||||||
|
}
|
||||||
filters = []
|
filters = []
|
||||||
all_images_filter = []
|
all_images_filter = []
|
||||||
current_files = []
|
current_files = []
|
||||||
for ext in extensions:
|
for ext in names:
|
||||||
filters += [names[ext] + ' (*.' + ext.lower() + ')']
|
filters += [names[ext] + ' (*.' + ext.lower() + ')']
|
||||||
all_images_filter += ['*.' + ext.lower()]
|
all_images_filter += ['*.' + ext.lower()]
|
||||||
upper = state.appdata + 'avatars/' + hash + '.' + ext.upper()
|
upper = state.appdata + 'avatars/' + hash + '.' + ext.upper()
|
||||||
|
@ -3831,10 +3827,9 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
current_files += [upper]
|
current_files += [upper]
|
||||||
filters[0:0] = ['Image files (' + ' '.join(all_images_filter) + ')']
|
filters[0:0] = ['Image files (' + ' '.join(all_images_filter) + ')']
|
||||||
filters[1:1] = ['All files (*.*)']
|
filters[1:1] = ['All files (*.*)']
|
||||||
sourcefile = QtGui.QFileDialog.getOpenFileName(
|
sourcefile = QtWidgets.QFileDialog.getOpenFileName(
|
||||||
self, _translate("MainWindow", "Set avatar..."),
|
self, _translate("MainWindow", "Set avatar..."),
|
||||||
filter=';;'.join(filters)
|
filter=';;'.join(filters))[0]
|
||||||
)
|
|
||||||
# determine the correct filename (note that avatars don't use the suffix)
|
# determine the correct filename (note that avatars don't use the suffix)
|
||||||
destination = state.appdata + 'avatars/' + hash + '.' + sourcefile.split('.')[-1]
|
destination = state.appdata + 'avatars/' + hash + '.' + sourcefile.split('.')[-1]
|
||||||
exists = QtCore.QFile.exists(destination)
|
exists = QtCore.QFile.exists(destination)
|
||||||
|
@ -3843,11 +3838,11 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
if exists | (len(current_files) > 0):
|
if exists | (len(current_files) > 0):
|
||||||
displayMsg = _translate(
|
displayMsg = _translate(
|
||||||
"MainWindow", "Do you really want to remove this avatar?")
|
"MainWindow", "Do you really want to remove this avatar?")
|
||||||
overwrite = QtGui.QMessageBox.question(
|
overwrite = QtWidgets.QMessageBox.question(
|
||||||
self, 'Message', displayMsg,
|
self, 'Message', displayMsg,
|
||||||
QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
|
QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
|
||||||
else:
|
else:
|
||||||
overwrite = QtGui.QMessageBox.No
|
overwrite = QtWidgets.QMessageBox.No
|
||||||
else:
|
else:
|
||||||
# ask whether to overwrite old avatar
|
# ask whether to overwrite old avatar
|
||||||
if exists | (len(current_files) > 0):
|
if exists | (len(current_files) > 0):
|
||||||
|
@ -3855,15 +3850,15 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"You have already set an avatar for this address."
|
"You have already set an avatar for this address."
|
||||||
" Do you really want to overwrite it?")
|
" Do you really want to overwrite it?")
|
||||||
overwrite = QtGui.QMessageBox.question(
|
overwrite = QtWidgets.QMessageBox.question(
|
||||||
self, 'Message', displayMsg,
|
self, 'Message', displayMsg,
|
||||||
QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
|
QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
|
||||||
else:
|
else:
|
||||||
overwrite = QtGui.QMessageBox.No
|
overwrite = QtWidgets.QMessageBox.No
|
||||||
|
|
||||||
# copy the image file to the appdata folder
|
# copy the image file to the appdata folder
|
||||||
if (not exists) | (overwrite == QtGui.QMessageBox.Yes):
|
if (not exists) | (overwrite == QtWidgets.QMessageBox.Yes):
|
||||||
if overwrite == QtGui.QMessageBox.Yes:
|
if overwrite == QtWidgets.QMessageBox.Yes:
|
||||||
for file in current_files:
|
for file in current_files:
|
||||||
QtCore.QFile.remove(file)
|
QtCore.QFile.remove(file)
|
||||||
QtCore.QFile.remove(destination)
|
QtCore.QFile.remove(destination)
|
||||||
|
@ -3895,10 +3890,10 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
"MainWindow", "Sound files (%s)" %
|
"MainWindow", "Sound files (%s)" %
|
||||||
' '.join(['*%s%s' % (os.extsep, ext) for ext in sound.extensions])
|
' '.join(['*%s%s' % (os.extsep, ext) for ext in sound.extensions])
|
||||||
))]
|
))]
|
||||||
sourcefile = unic(ustr(QtGui.QFileDialog.getOpenFileName(
|
sourcefile = unic(ustr(QtWidgets.QFileDialog.getOpenFileName(
|
||||||
self, _translate("MainWindow", "Set notification sound..."),
|
self, _translate("MainWindow", "Set notification sound..."),
|
||||||
filter=';;'.join(filters)
|
filter=';;'.join(filters)
|
||||||
)))
|
)))[0]
|
||||||
|
|
||||||
if not sourcefile:
|
if not sourcefile:
|
||||||
return
|
return
|
||||||
|
@ -3913,15 +3908,15 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
pattern = destfile.lower()
|
pattern = destfile.lower()
|
||||||
for item in os.listdir(destdir):
|
for item in os.listdir(destdir):
|
||||||
if item.lower() == pattern:
|
if item.lower() == pattern:
|
||||||
overwrite = QtGui.QMessageBox.question(
|
overwrite = QtWidgets.QMessageBox.question(
|
||||||
self, _translate("MainWindow", "Message"),
|
self, _translate("MainWindow", "Message"),
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"You have already set a notification sound"
|
"You have already set a notification sound"
|
||||||
" for this address book entry."
|
" for this address book entry."
|
||||||
" Do you really want to overwrite it?"),
|
" Do you really want to overwrite it?"),
|
||||||
QtGui.QMessageBox.Yes, QtGui.QMessageBox.No
|
QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No
|
||||||
) == QtGui.QMessageBox.Yes
|
) == QtWidgets.QMessageBox.Yes
|
||||||
if overwrite:
|
if overwrite:
|
||||||
QtCore.QFile.remove(os.path.join(destdir, item))
|
QtCore.QFile.remove(os.path.join(destdir, item))
|
||||||
break
|
break
|
||||||
|
@ -3932,18 +3927,23 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
|
|
||||||
def on_context_menuYourIdentities(self, point):
|
def on_context_menuYourIdentities(self, point):
|
||||||
currentItem = self.getCurrentItem()
|
currentItem = self.getCurrentItem()
|
||||||
self.popMenuYourIdentities = QtGui.QMenu(self)
|
self.popMenuYourIdentities = QtWidgets.QMenu(self)
|
||||||
if isinstance(currentItem, Ui_AddressWidget):
|
if isinstance(currentItem, Ui_AddressWidget):
|
||||||
self.popMenuYourIdentities.addAction(self.actionNewYourIdentities)
|
self.popMenuYourIdentities.addAction(self.actionNewYourIdentities)
|
||||||
self.popMenuYourIdentities.addSeparator()
|
self.popMenuYourIdentities.addSeparator()
|
||||||
self.popMenuYourIdentities.addAction(self.actionClipboardYourIdentities)
|
self.popMenuYourIdentities.addAction(
|
||||||
|
self.actionClipboardYourIdentities)
|
||||||
self.popMenuYourIdentities.addSeparator()
|
self.popMenuYourIdentities.addSeparator()
|
||||||
if currentItem.isEnabled:
|
if currentItem.isEnabled:
|
||||||
self.popMenuYourIdentities.addAction(self.actionDisableYourIdentities)
|
self.popMenuYourIdentities.addAction(
|
||||||
|
self.actionDisableYourIdentities)
|
||||||
else:
|
else:
|
||||||
self.popMenuYourIdentities.addAction(self.actionEnableYourIdentities)
|
self.popMenuYourIdentities.addAction(
|
||||||
self.popMenuYourIdentities.addAction(self.actionSetAvatarYourIdentities)
|
self.actionEnableYourIdentities)
|
||||||
self.popMenuYourIdentities.addAction(self.actionSpecialAddressBehaviorYourIdentities)
|
self.popMenuYourIdentities.addAction(
|
||||||
|
self.actionSetAvatarYourIdentities)
|
||||||
|
self.popMenuYourIdentities.addAction(
|
||||||
|
self.actionSpecialAddressBehaviorYourIdentities)
|
||||||
self.popMenuYourIdentities.addAction(self.actionEmailGateway)
|
self.popMenuYourIdentities.addAction(self.actionEmailGateway)
|
||||||
self.popMenuYourIdentities.addSeparator()
|
self.popMenuYourIdentities.addSeparator()
|
||||||
if currentItem.type != AccountMixin.ALL:
|
if currentItem.type != AccountMixin.ALL:
|
||||||
|
@ -3962,7 +3962,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
# TODO make one popMenu
|
# TODO make one popMenu
|
||||||
def on_context_menuChan(self, point):
|
def on_context_menuChan(self, point):
|
||||||
currentItem = self.getCurrentItem()
|
currentItem = self.getCurrentItem()
|
||||||
self.popMenu = QtGui.QMenu(self)
|
self.popMenu = QtWidgets.QMenu(self)
|
||||||
if isinstance(currentItem, Ui_AddressWidget):
|
if isinstance(currentItem, Ui_AddressWidget):
|
||||||
self.popMenu.addAction(self.actionNew)
|
self.popMenu.addAction(self.actionNew)
|
||||||
self.popMenu.addAction(self.actionDelete)
|
self.popMenu.addAction(self.actionDelete)
|
||||||
|
@ -3998,7 +3998,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
self.on_context_menuSent(point)
|
self.on_context_menuSent(point)
|
||||||
return
|
return
|
||||||
|
|
||||||
self.popMenuInbox = QtGui.QMenu(self)
|
self.popMenuInbox = QtWidgets.QMenu(self)
|
||||||
self.popMenuInbox.addAction(self.actionForceHtml)
|
self.popMenuInbox.addAction(self.actionForceHtml)
|
||||||
self.popMenuInbox.addAction(self.actionMarkUnread)
|
self.popMenuInbox.addAction(self.actionMarkUnread)
|
||||||
self.popMenuInbox.addSeparator()
|
self.popMenuInbox.addSeparator()
|
||||||
|
@ -4033,7 +4033,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
|
|
||||||
def on_context_menuSent(self, point):
|
def on_context_menuSent(self, point):
|
||||||
currentRow = self.ui.tableWidgetInbox.currentRow()
|
currentRow = self.ui.tableWidgetInbox.currentRow()
|
||||||
self.popMenuSent = QtGui.QMenu(self)
|
self.popMenuSent = QtWidgets.QMenu(self)
|
||||||
self.popMenuSent.addAction(self.actionSentClipboard)
|
self.popMenuSent.addAction(self.actionSentClipboard)
|
||||||
self._contact_selected = self.ui.tableWidgetInbox.item(currentRow, 0)
|
self._contact_selected = self.ui.tableWidgetInbox.item(currentRow, 0)
|
||||||
# preloaded gui.menu plugins with prefix 'address'
|
# preloaded gui.menu plugins with prefix 'address'
|
||||||
|
@ -4071,7 +4071,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
|
|
||||||
def inboxSearchLineEditReturnPressed(self):
|
def inboxSearchLineEditReturnPressed(self):
|
||||||
logger.debug("Search return pressed")
|
logger.debug("Search return pressed")
|
||||||
searchLine = self.getCurrentSearchLine()
|
searchLine = self.getCurrentSearchLine().encode('utf-8')
|
||||||
messagelist = self.getCurrentMessagelist()
|
messagelist = self.getCurrentMessagelist()
|
||||||
if messagelist and len(ustr(searchLine)) < 3:
|
if messagelist and len(ustr(searchLine)) < 3:
|
||||||
searchOption = self.getCurrentSearchOption()
|
searchOption = self.getCurrentSearchOption()
|
||||||
|
@ -4134,7 +4134,9 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
self.rerenderMessagelistFromLabels()
|
self.rerenderMessagelistFromLabels()
|
||||||
if item.type != AccountMixin.SUBSCRIPTION:
|
if item.type != AccountMixin.SUBSCRIPTION:
|
||||||
self.rerenderMessagelistToLabels()
|
self.rerenderMessagelistToLabels()
|
||||||
if item.type in (AccountMixin.NORMAL, AccountMixin.CHAN, AccountMixin.SUBSCRIPTION):
|
if item.type in (
|
||||||
|
AccountMixin.NORMAL, AccountMixin.CHAN, AccountMixin.SUBSCRIPTION
|
||||||
|
):
|
||||||
self.rerenderAddressBook()
|
self.rerenderAddressBook()
|
||||||
self.recurDepth -= 1
|
self.recurDepth -= 1
|
||||||
|
|
||||||
|
@ -4147,18 +4149,19 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
folder = self.getCurrentFolder()
|
folder = self.getCurrentFolder()
|
||||||
if msgid:
|
if msgid:
|
||||||
queryreturn = sqlQuery(
|
queryreturn = sqlQuery(
|
||||||
'''SELECT message FROM %s WHERE %s=?''' % (
|
'SELECT message FROM %s WHERE %s=?' % (
|
||||||
('sent', 'ackdata') if folder == 'sent'
|
('sent', 'ackdata') if folder == 'sent'
|
||||||
else ('inbox', 'msgid')
|
else ('inbox', 'msgid')
|
||||||
), msgid
|
), msgid
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
message = queryreturn[-1][0]
|
message = queryreturn[-1][0].decode("utf-8", "replace")
|
||||||
message = message.decode("utf-8", "replace")
|
|
||||||
except NameError:
|
except NameError:
|
||||||
message = ""
|
message = u''
|
||||||
except IndexError:
|
except IndexError:
|
||||||
|
# _translate() often returns unicode, no redefinition here!
|
||||||
|
# pylint: disable=redefined-variable-type
|
||||||
message = _translate(
|
message = _translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Error occurred: could not load message from disk."
|
"Error occurred: could not load message from disk."
|
||||||
|
@ -4171,7 +4174,7 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
self.updateUnreadStatus(tableWidget, currentRow, msgid)
|
self.updateUnreadStatus(tableWidget, currentRow, msgid)
|
||||||
# propagate
|
# propagate
|
||||||
if folder != 'sent' and sqlExecute(
|
if folder != 'sent' and sqlExecute(
|
||||||
'''UPDATE inbox SET read=1 WHERE msgid=? AND read=0''',
|
'UPDATE inbox SET read=1 WHERE msgid=? AND read=0',
|
||||||
msgid
|
msgid
|
||||||
) > 0:
|
) > 0:
|
||||||
self.propagateUnreadCount()
|
self.propagateUnreadCount()
|
||||||
|
@ -4187,8 +4190,9 @@ class MyForm(settingsmixin.SMainWindow):
|
||||||
self.rerenderMessagelistToLabels()
|
self.rerenderMessagelistToLabels()
|
||||||
completerList = self.ui.lineEditTo.completer().model().stringList()
|
completerList = self.ui.lineEditTo.completer().model().stringList()
|
||||||
for i in range(len(completerList)):
|
for i in range(len(completerList)):
|
||||||
if unic(ustr(completerList[i])).endswith(" <" + ustr(item.address) + ">"):
|
address_block = " <" + ustr(item.address) + ">"
|
||||||
completerList[i] = ustr(item.label) + " <" + ustr(item.address) + ">"
|
if unic(ustr(completerList[i])).endswith(unic(address_block)):
|
||||||
|
completerList[i] = ustr(item.label) + address_block
|
||||||
self.ui.lineEditTo.completer().model().setStringList(completerList)
|
self.ui.lineEditTo.completer().model().setStringList(completerList)
|
||||||
|
|
||||||
def tabWidgetCurrentChanged(self, n):
|
def tabWidgetCurrentChanged(self, n):
|
||||||
|
@ -4253,7 +4257,7 @@ app = None
|
||||||
myapp = None
|
myapp = None
|
||||||
|
|
||||||
|
|
||||||
class BitmessageQtApplication(QtGui.QApplication):
|
class BitmessageQtApplication(QtWidgets.QApplication):
|
||||||
"""
|
"""
|
||||||
Listener to allow our Qt form to get focus when another instance of the
|
Listener to allow our Qt form to get focus when another instance of the
|
||||||
application is open.
|
application is open.
|
||||||
|
@ -4276,15 +4280,15 @@ class BitmessageQtApplication(QtGui.QApplication):
|
||||||
self.server = None
|
self.server = None
|
||||||
self.is_running = False
|
self.is_running = False
|
||||||
|
|
||||||
socket = QLocalSocket()
|
socket = QtNetwork.QLocalSocket()
|
||||||
socket.connectToServer(id)
|
socket.connectToServer(id)
|
||||||
self.is_running = socket.waitForConnected()
|
self.is_running = socket.waitForConnected()
|
||||||
|
|
||||||
# Cleanup past crashed servers
|
# Cleanup past crashed servers
|
||||||
if not self.is_running:
|
if not self.is_running:
|
||||||
if socket.error() == QLocalSocket.ConnectionRefusedError:
|
if socket.error() == QtNetwork.QLocalSocket.ConnectionRefusedError:
|
||||||
socket.disconnectFromServer()
|
socket.disconnectFromServer()
|
||||||
QLocalServer.removeServer(id)
|
QtNetwork.QLocalServer.removeServer(id)
|
||||||
|
|
||||||
socket.abort()
|
socket.abort()
|
||||||
|
|
||||||
|
@ -4295,16 +4299,12 @@ class BitmessageQtApplication(QtGui.QApplication):
|
||||||
else:
|
else:
|
||||||
# Nope, create a local server with this id and assign on_new_connection
|
# Nope, create a local server with this id and assign on_new_connection
|
||||||
# for whenever a second instance tries to run focus the application.
|
# for whenever a second instance tries to run focus the application.
|
||||||
self.server = QLocalServer()
|
self.server = QtNetwork.QLocalServer()
|
||||||
self.server.listen(id)
|
self.server.listen(id)
|
||||||
self.server.newConnection.connect(self.on_new_connection)
|
self.server.newConnection.connect(self.on_new_connection)
|
||||||
|
|
||||||
self.setStyleSheet("QStatusBar::item { border: 0px solid black }")
|
self.setStyleSheet("QStatusBar::item { border: 0px solid black }")
|
||||||
|
|
||||||
def __del__(self):
|
|
||||||
if self.server:
|
|
||||||
self.server.close()
|
|
||||||
|
|
||||||
def on_new_connection(self):
|
def on_new_connection(self):
|
||||||
if myapp:
|
if myapp:
|
||||||
myapp.appIndicatorShow()
|
myapp.appIndicatorShow()
|
||||||
|
|
|
@ -1,21 +1,14 @@
|
||||||
# pylint: disable=too-many-instance-attributes,attribute-defined-outside-init
|
|
||||||
"""
|
"""
|
||||||
account.py
|
|
||||||
==========
|
|
||||||
|
|
||||||
Account related functions.
|
Account related functions.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import absolute_import
|
|
||||||
|
|
||||||
import inspect
|
import inspect
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from unqstr import ustr
|
from unqstr import ustr, unic
|
||||||
from PyQt4 import QtGui
|
|
||||||
from dbcompat import dbstr
|
from dbcompat import dbstr
|
||||||
|
|
||||||
import queues
|
import queues
|
||||||
|
@ -25,6 +18,7 @@ from helper_ackPayload import genAckPayload
|
||||||
from helper_sql import sqlQuery, sqlExecute
|
from helper_sql import sqlQuery, sqlExecute
|
||||||
from .foldertree import AccountMixin
|
from .foldertree import AccountMixin
|
||||||
from .utils import str_broadcast_subscribers
|
from .utils import str_broadcast_subscribers
|
||||||
|
from tr import _translate
|
||||||
|
|
||||||
|
|
||||||
def getSortedSubscriptions(count=False):
|
def getSortedSubscriptions(count=False):
|
||||||
|
@ -36,24 +30,23 @@ def getSortedSubscriptions(count=False):
|
||||||
:retuns: dict keys are addresses, values are dicts containing settings
|
:retuns: dict keys are addresses, values are dicts containing settings
|
||||||
:rtype: dict, default {}
|
:rtype: dict, default {}
|
||||||
"""
|
"""
|
||||||
queryreturn = sqlQuery('SELECT label, address, enabled FROM subscriptions ORDER BY label COLLATE NOCASE ASC')
|
queryreturn = sqlQuery(
|
||||||
|
'SELECT label, address, enabled FROM subscriptions'
|
||||||
|
' ORDER BY label COLLATE NOCASE ASC')
|
||||||
ret = {}
|
ret = {}
|
||||||
for row in queryreturn:
|
for label, address, enabled in queryreturn:
|
||||||
label, address, enabled = row
|
|
||||||
label = label.decode("utf-8", "replace")
|
label = label.decode("utf-8", "replace")
|
||||||
address = address.decode("utf-8", "replace")
|
address = address.decode("utf-8", "replace")
|
||||||
ret[address] = {}
|
ret[address] = {'inbox': {}}
|
||||||
ret[address]["inbox"] = {}
|
ret[address]['inbox'].update(label=label, enabled=enabled, count=0)
|
||||||
ret[address]["inbox"]['label'] = label
|
|
||||||
ret[address]["inbox"]['enabled'] = enabled
|
|
||||||
ret[address]["inbox"]['count'] = 0
|
|
||||||
if count:
|
if count:
|
||||||
queryreturn = sqlQuery('''SELECT fromaddress, folder, count(msgid) as cnt
|
queryreturn = sqlQuery(
|
||||||
FROM inbox, subscriptions ON subscriptions.address = inbox.fromaddress
|
'SELECT fromaddress, folder, count(msgid) AS cnt'
|
||||||
WHERE read = 0 AND toaddress = ?
|
' FROM inbox, subscriptions'
|
||||||
GROUP BY inbox.fromaddress, folder''', dbstr(str_broadcast_subscribers))
|
' ON subscriptions.address = inbox.fromaddress WHERE read = 0'
|
||||||
for row in queryreturn:
|
' AND toaddress = ? GROUP BY inbox.fromaddress, folder',
|
||||||
address, folder, cnt = row
|
dbstr(str_broadcast_subscribers))
|
||||||
|
for address, folder, cnt in queryreturn:
|
||||||
address = address.decode("utf-8", "replace")
|
address = address.decode("utf-8", "replace")
|
||||||
folder = folder.decode("utf-8", "replace")
|
folder = folder.decode("utf-8", "replace")
|
||||||
if folder not in ret[address]:
|
if folder not in ret[address]:
|
||||||
|
@ -81,7 +74,8 @@ def accountClass(address):
|
||||||
return subscription
|
return subscription
|
||||||
try:
|
try:
|
||||||
gateway = config.get(address, "gateway")
|
gateway = config.get(address, "gateway")
|
||||||
for _, cls in inspect.getmembers(sys.modules[__name__], inspect.isclass):
|
for _, cls in inspect.getmembers(
|
||||||
|
sys.modules[__name__], inspect.isclass):
|
||||||
if issubclass(cls, GatewayAccount) and cls.gatewayName == gateway:
|
if issubclass(cls, GatewayAccount) and cls.gatewayName == gateway:
|
||||||
return cls(address)
|
return cls(address)
|
||||||
# general gateway
|
# general gateway
|
||||||
|
@ -92,7 +86,7 @@ def accountClass(address):
|
||||||
return BMAccount(address)
|
return BMAccount(address)
|
||||||
|
|
||||||
|
|
||||||
class AccountColor(AccountMixin): # pylint: disable=too-few-public-methods
|
class AccountColor(AccountMixin):
|
||||||
"""Set the type of account"""
|
"""Set the type of account"""
|
||||||
|
|
||||||
def __init__(self, address, address_type=None):
|
def __init__(self, address, address_type=None):
|
||||||
|
@ -106,7 +100,9 @@ class AccountColor(AccountMixin): # pylint: disable=too-few-public-methods
|
||||||
elif config.safeGetBoolean(self.address, 'chan'):
|
elif config.safeGetBoolean(self.address, 'chan'):
|
||||||
self.type = AccountMixin.CHAN
|
self.type = AccountMixin.CHAN
|
||||||
elif sqlQuery(
|
elif sqlQuery(
|
||||||
'''select label from subscriptions where address=?''', dbstr(self.address)):
|
'SELECT label FROM subscriptions WHERE address=?',
|
||||||
|
dbstr(self.address)
|
||||||
|
):
|
||||||
self.type = AccountMixin.SUBSCRIPTION
|
self.type = AccountMixin.SUBSCRIPTION
|
||||||
else:
|
else:
|
||||||
self.type = AccountMixin.NORMAL
|
self.type = AccountMixin.NORMAL
|
||||||
|
@ -114,50 +110,22 @@ class AccountColor(AccountMixin): # pylint: disable=too-few-public-methods
|
||||||
self.type = address_type
|
self.type = address_type
|
||||||
|
|
||||||
|
|
||||||
class BMAccount(object):
|
class NoAccount(object):
|
||||||
"""Encapsulate a Bitmessage account"""
|
"""Minimal account like object (All accounts)"""
|
||||||
|
# pylint: disable=too-many-instance-attributes
|
||||||
def __init__(self, address=None):
|
def __init__(self, address=None):
|
||||||
self.address = address
|
self.address = address
|
||||||
self.type = AccountMixin.NORMAL
|
self.type = AccountMixin.NORMAL
|
||||||
if config.has_section(address):
|
self.toAddress = self.fromAddress = ''
|
||||||
if config.safeGetBoolean(self.address, 'chan'):
|
self.subject = self.message = ''
|
||||||
self.type = AccountMixin.CHAN
|
self.fromLabel = self.toLabel = ''
|
||||||
elif config.safeGetBoolean(self.address, 'mailinglist'):
|
|
||||||
self.type = AccountMixin.MAILINGLIST
|
|
||||||
elif self.address == str_broadcast_subscribers:
|
|
||||||
self.type = AccountMixin.BROADCAST
|
|
||||||
else:
|
|
||||||
queryreturn = sqlQuery(
|
|
||||||
'''select label from subscriptions where address=?''', dbstr(self.address))
|
|
||||||
if queryreturn:
|
|
||||||
self.type = AccountMixin.SUBSCRIPTION
|
|
||||||
|
|
||||||
def getLabel(self, address=None):
|
def getLabel(self, address=None):
|
||||||
"""Get a label for this bitmessage account"""
|
"""Get a label for this bitmessage account"""
|
||||||
if address is None:
|
return address or self.address
|
||||||
address = self.address
|
|
||||||
else:
|
|
||||||
address = ustr(address)
|
|
||||||
label = config.safeGet(address, 'label', address)
|
|
||||||
queryreturn = sqlQuery(
|
|
||||||
'''select label from addressbook where address=?''', dbstr(address))
|
|
||||||
if queryreturn != []:
|
|
||||||
for row in queryreturn:
|
|
||||||
label, = row
|
|
||||||
label = label.decode("utf-8", "replace")
|
|
||||||
else:
|
|
||||||
queryreturn = sqlQuery(
|
|
||||||
'''select label from subscriptions where address=?''', dbstr(address))
|
|
||||||
if queryreturn != []:
|
|
||||||
for row in queryreturn:
|
|
||||||
label, = row
|
|
||||||
label = label.decode("utf-8", "replace")
|
|
||||||
return label
|
|
||||||
|
|
||||||
def parseMessage(self, toAddress, fromAddress, subject, message):
|
def parseMessage(self, toAddress, fromAddress, subject, message):
|
||||||
"""Set metadata and address labels on self"""
|
"""Set metadata and address labels on self"""
|
||||||
|
|
||||||
self.toAddress = ustr(toAddress)
|
self.toAddress = ustr(toAddress)
|
||||||
self.fromAddress = ustr(fromAddress)
|
self.fromAddress = ustr(fromAddress)
|
||||||
self.subject = ustr(subject)
|
self.subject = ustr(subject)
|
||||||
|
@ -166,17 +134,37 @@ class BMAccount(object):
|
||||||
self.toLabel = ustr(self.getLabel(toAddress))
|
self.toLabel = ustr(self.getLabel(toAddress))
|
||||||
|
|
||||||
|
|
||||||
class NoAccount(BMAccount):
|
class BMAccount(NoAccount):
|
||||||
"""Override the __init__ method on a BMAccount"""
|
"""Encapsulate a Bitmessage account"""
|
||||||
|
|
||||||
def __init__(self, address=None): # pylint: disable=super-init-not-called
|
def __init__(self, address=None):
|
||||||
self.address = address
|
super(BMAccount, self).__init__(address)
|
||||||
self.type = AccountMixin.NORMAL
|
if config.has_section(address):
|
||||||
|
if config.safeGetBoolean(self.address, 'chan'):
|
||||||
|
self.type = AccountMixin.CHAN
|
||||||
|
elif config.safeGetBoolean(self.address, 'mailinglist'):
|
||||||
|
self.type = AccountMixin.MAILINGLIST
|
||||||
|
elif self.address == str_broadcast_subscribers:
|
||||||
|
self.type = AccountMixin.BROADCAST
|
||||||
|
elif sqlQuery(
|
||||||
|
'SELECT label FROM subscriptions WHERE address=?', dbstr(self.address)
|
||||||
|
):
|
||||||
|
self.type = AccountMixin.SUBSCRIPTION
|
||||||
|
|
||||||
def getLabel(self, address=None):
|
def getLabel(self, address=None):
|
||||||
if address is None:
|
"""Get a label for this bitmessage account"""
|
||||||
address = self.address
|
address = super(BMAccount, self).getLabel(address)
|
||||||
return address
|
label = config.safeGet(address, 'label', address)
|
||||||
|
queryreturn = sqlQuery(
|
||||||
|
'SELECT label FROM addressbook WHERE address=?', dbstr(address))
|
||||||
|
if queryreturn:
|
||||||
|
label = queryreturn[-1][0]
|
||||||
|
else:
|
||||||
|
queryreturn = sqlQuery(
|
||||||
|
'SELECT label FROM subscriptions WHERE address=?', dbstr(address))
|
||||||
|
if queryreturn:
|
||||||
|
label = queryreturn[-1][0]
|
||||||
|
return unic(ustr(label))
|
||||||
|
|
||||||
|
|
||||||
class SubscriptionAccount(BMAccount):
|
class SubscriptionAccount(BMAccount):
|
||||||
|
@ -196,15 +184,11 @@ class GatewayAccount(BMAccount):
|
||||||
ALL_OK = 0
|
ALL_OK = 0
|
||||||
REGISTRATION_DENIED = 1
|
REGISTRATION_DENIED = 1
|
||||||
|
|
||||||
def __init__(self, address):
|
|
||||||
super(GatewayAccount, self).__init__(address)
|
|
||||||
|
|
||||||
def send(self):
|
def send(self):
|
||||||
"""Override the send method for gateway accounts"""
|
"""The send method for gateway accounts"""
|
||||||
|
streamNumber, ripe = decodeAddress(self.toAddress)[2:]
|
||||||
# pylint: disable=unused-variable
|
stealthLevel = config.safeGetInt(
|
||||||
status, addressVersionNumber, streamNumber, ripe = decodeAddress(self.toAddress)
|
'bitmessagesettings', 'ackstealthlevel')
|
||||||
stealthLevel = config.safeGetInt('bitmessagesettings', 'ackstealthlevel')
|
|
||||||
ackdata = genAckPayload(streamNumber, stealthLevel)
|
ackdata = genAckPayload(streamNumber, stealthLevel)
|
||||||
sqlExecute(
|
sqlExecute(
|
||||||
'''INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''',
|
'''INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''',
|
||||||
|
@ -277,10 +261,9 @@ class MailchuckAccount(GatewayAccount):
|
||||||
|
|
||||||
def settings(self):
|
def settings(self):
|
||||||
"""settings specific to a MailchuckAccount"""
|
"""settings specific to a MailchuckAccount"""
|
||||||
|
|
||||||
self.toAddress = self.registrationAddress
|
self.toAddress = self.registrationAddress
|
||||||
self.subject = "config"
|
self.subject = "config"
|
||||||
self.message = QtGui.QApplication.translate(
|
self.message = _translate(
|
||||||
"Mailchuck",
|
"Mailchuck",
|
||||||
"""# You can use this to configure your email gateway account
|
"""# You can use this to configure your email gateway account
|
||||||
# Uncomment the setting you want to use
|
# Uncomment the setting you want to use
|
||||||
|
@ -326,8 +309,9 @@ class MailchuckAccount(GatewayAccount):
|
||||||
|
|
||||||
def parseMessage(self, toAddress, fromAddress, subject, message):
|
def parseMessage(self, toAddress, fromAddress, subject, message):
|
||||||
"""parseMessage specific to a MailchuckAccount"""
|
"""parseMessage specific to a MailchuckAccount"""
|
||||||
|
super(MailchuckAccount, self).parseMessage(
|
||||||
super(MailchuckAccount, self).parseMessage(toAddress, fromAddress, subject, message)
|
toAddress, fromAddress, subject, message
|
||||||
|
)
|
||||||
if fromAddress == self.relayAddress:
|
if fromAddress == self.relayAddress:
|
||||||
matches = self.regExpIncoming.search(subject)
|
matches = self.regExpIncoming.search(subject)
|
||||||
if matches is not None:
|
if matches is not None:
|
||||||
|
@ -348,6 +332,7 @@ class MailchuckAccount(GatewayAccount):
|
||||||
self.toLabel = matches.group(1)
|
self.toLabel = matches.group(1)
|
||||||
self.toAddress = matches.group(1)
|
self.toAddress = matches.group(1)
|
||||||
self.feedback = self.ALL_OK
|
self.feedback = self.ALL_OK
|
||||||
if fromAddress == self.registrationAddress and self.subject == "Registration Request Denied":
|
if fromAddress == self.registrationAddress \
|
||||||
|
and self.subject == "Registration Request Denied":
|
||||||
self.feedback = self.REGISTRATION_DENIED
|
self.feedback = self.REGISTRATION_DENIED
|
||||||
return self.feedback
|
return self.feedback
|
||||||
|
|
|
@ -1,41 +1,40 @@
|
||||||
"""
|
"""
|
||||||
Dialogs that work with BM address.
|
Dialogs that work with BM address.
|
||||||
"""
|
"""
|
||||||
# pylint: disable=attribute-defined-outside-init,too-few-public-methods,relative-import
|
# pylint: disable=too-few-public-methods
|
||||||
|
# https://github.com/PyCQA/pylint/issues/471
|
||||||
|
|
||||||
import hashlib
|
import hashlib
|
||||||
|
|
||||||
from unqstr import ustr, unic
|
from unqstr import ustr, unic
|
||||||
from PyQt4 import QtCore, QtGui
|
from qtpy import QtGui, QtWidgets
|
||||||
|
|
||||||
import queues
|
import queues
|
||||||
from bitmessageqt import widgets
|
from bitmessageqt import widgets
|
||||||
import state
|
import state
|
||||||
from .account import AccountMixin, GatewayAccount, MailchuckAccount, accountClass
|
from .account import (
|
||||||
|
GatewayAccount, MailchuckAccount, AccountMixin, accountClass
|
||||||
|
)
|
||||||
from addresses import addBMIfNotPresent, decodeAddress, encodeVarint
|
from addresses import addBMIfNotPresent, decodeAddress, encodeVarint
|
||||||
from bmconfigparser import config as global_config
|
from bmconfigparser import config as global_config
|
||||||
from tr import _translate
|
from tr import _translate
|
||||||
|
|
||||||
|
|
||||||
class AddressCheckMixin(object):
|
class AddressCheckMixin(object):
|
||||||
"""Base address validation class for QT UI"""
|
"""Base address validation class for Qt UI"""
|
||||||
|
|
||||||
def __init__(self):
|
def _setup(self):
|
||||||
self.valid = False
|
self.valid = False
|
||||||
QtCore.QObject.connect( # pylint: disable=no-member
|
self.lineEditAddress.textChanged.connect(self.addressChanged)
|
||||||
self.lineEditAddress,
|
|
||||||
QtCore.SIGNAL("textChanged(QString)"),
|
|
||||||
self.addressChanged)
|
|
||||||
|
|
||||||
def _onSuccess(self, addressVersion, streamNumber, ripe):
|
def _onSuccess(self, addressVersion, streamNumber, ripe):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def addressChanged(self, addr):
|
def addressChanged(self, address):
|
||||||
"""
|
"""
|
||||||
Address validation callback, performs validation and gives feedback
|
Address validation callback, performs validation and gives feedback
|
||||||
"""
|
"""
|
||||||
status, addressVersion, streamNumber, ripe = decodeAddress(
|
status, addressVersion, streamNumber, ripe = decodeAddress(ustr(address))
|
||||||
ustr(addr))
|
|
||||||
self.valid = status == 'success'
|
self.valid = status == 'success'
|
||||||
if self.valid:
|
if self.valid:
|
||||||
self.labelAddressCheck.setText(
|
self.labelAddressCheck.setText(
|
||||||
|
@ -80,15 +79,23 @@ class AddressCheckMixin(object):
|
||||||
))
|
))
|
||||||
|
|
||||||
|
|
||||||
class AddressDataDialog(QtGui.QDialog, AddressCheckMixin):
|
class AddressDataDialog(QtWidgets.QDialog, AddressCheckMixin):
|
||||||
"""QDialog with Bitmessage address validation"""
|
"""
|
||||||
|
Base class for a dialog getting BM-address data.
|
||||||
|
Corresponding ui-file should define two fields:
|
||||||
|
lineEditAddress - for the address
|
||||||
|
lineEditLabel - for it's label
|
||||||
|
After address validation the values of that fields are put into
|
||||||
|
the data field of the dialog.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
super(AddressDataDialog, self).__init__(parent)
|
super(AddressDataDialog, self).__init__(parent)
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
|
self.data = None
|
||||||
|
|
||||||
def accept(self):
|
def accept(self):
|
||||||
"""Callback for QDIalog accepting value"""
|
"""Callback for QDialog accepting value"""
|
||||||
if self.valid:
|
if self.valid:
|
||||||
self.data = (
|
self.data = (
|
||||||
addBMIfNotPresent(ustr(self.lineEditAddress.text())),
|
addBMIfNotPresent(ustr(self.lineEditAddress.text())),
|
||||||
|
@ -108,12 +115,12 @@ class AddAddressDialog(AddressDataDialog):
|
||||||
def __init__(self, parent=None, address=None):
|
def __init__(self, parent=None, address=None):
|
||||||
super(AddAddressDialog, self).__init__(parent)
|
super(AddAddressDialog, self).__init__(parent)
|
||||||
widgets.load('addaddressdialog.ui', self)
|
widgets.load('addaddressdialog.ui', self)
|
||||||
AddressCheckMixin.__init__(self)
|
self._setup()
|
||||||
if address:
|
if address:
|
||||||
self.lineEditAddress.setText(address)
|
self.lineEditAddress.setText(address)
|
||||||
|
|
||||||
|
|
||||||
class NewAddressDialog(QtGui.QDialog):
|
class NewAddressDialog(QtWidgets.QDialog):
|
||||||
"""QDialog for generating a new address"""
|
"""QDialog for generating a new address"""
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
|
@ -126,7 +133,7 @@ class NewAddressDialog(QtGui.QDialog):
|
||||||
self.radioButtonExisting.click()
|
self.radioButtonExisting.click()
|
||||||
self.comboBoxExisting.addItem(address)
|
self.comboBoxExisting.addItem(address)
|
||||||
self.groupBoxDeterministic.setHidden(True)
|
self.groupBoxDeterministic.setHidden(True)
|
||||||
QtGui.QWidget.resize(self, QtGui.QWidget.sizeHint(self))
|
QtWidgets.QWidget.resize(self, QtWidgets.QWidget.sizeHint(self))
|
||||||
self.show()
|
self.show()
|
||||||
|
|
||||||
def accept(self):
|
def accept(self):
|
||||||
|
@ -149,7 +156,7 @@ class NewAddressDialog(QtGui.QDialog):
|
||||||
else:
|
else:
|
||||||
if ustr(self.lineEditPassphrase.text()) != \
|
if ustr(self.lineEditPassphrase.text()) != \
|
||||||
ustr(self.lineEditPassphraseAgain.text()):
|
ustr(self.lineEditPassphraseAgain.text()):
|
||||||
QtGui.QMessageBox.about(
|
QtWidgets.QMessageBox.about(
|
||||||
self, _translate("MainWindow", "Passphrase mismatch"),
|
self, _translate("MainWindow", "Passphrase mismatch"),
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
|
@ -157,7 +164,7 @@ class NewAddressDialog(QtGui.QDialog):
|
||||||
" match. Try again.")
|
" match. Try again.")
|
||||||
)
|
)
|
||||||
elif self.lineEditPassphrase.text() == "":
|
elif self.lineEditPassphrase.text() == "":
|
||||||
QtGui.QMessageBox.about(
|
QtWidgets.QMessageBox.about(
|
||||||
self, _translate("MainWindow", "Choose a passphrase"),
|
self, _translate("MainWindow", "Choose a passphrase"),
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow", "You really do need a passphrase.")
|
"MainWindow", "You really do need a passphrase.")
|
||||||
|
@ -181,7 +188,8 @@ class NewSubscriptionDialog(AddressDataDialog):
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super(NewSubscriptionDialog, self).__init__(parent)
|
super(NewSubscriptionDialog, self).__init__(parent)
|
||||||
widgets.load('newsubscriptiondialog.ui', self)
|
widgets.load('newsubscriptiondialog.ui', self)
|
||||||
AddressCheckMixin.__init__(self)
|
self.recent = []
|
||||||
|
self._setup()
|
||||||
|
|
||||||
def _onSuccess(self, addressVersion, streamNumber, ripe):
|
def _onSuccess(self, addressVersion, streamNumber, ripe):
|
||||||
if addressVersion <= 3:
|
if addressVersion <= 3:
|
||||||
|
@ -212,22 +220,21 @@ class NewSubscriptionDialog(AddressDataDialog):
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Display the %n recent broadcast(s) from this address.",
|
"Display the %n recent broadcast(s) from this address.",
|
||||||
None,
|
None, count
|
||||||
QtCore.QCoreApplication.CodecForTr,
|
|
||||||
count
|
|
||||||
))
|
))
|
||||||
|
|
||||||
|
|
||||||
class RegenerateAddressesDialog(QtGui.QDialog):
|
class RegenerateAddressesDialog(QtWidgets.QDialog):
|
||||||
"""QDialog for regenerating deterministic addresses"""
|
"""QDialog for regenerating deterministic addresses"""
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super(RegenerateAddressesDialog, self).__init__(parent)
|
super(RegenerateAddressesDialog, self).__init__(parent)
|
||||||
widgets.load('regenerateaddresses.ui', self)
|
widgets.load('regenerateaddresses.ui', self)
|
||||||
self.groupBox.setTitle('')
|
self.groupBox.setTitle('')
|
||||||
QtGui.QWidget.resize(self, QtGui.QWidget.sizeHint(self))
|
QtWidgets.QWidget.resize(self, QtWidgets.QWidget.sizeHint(self))
|
||||||
|
|
||||||
|
|
||||||
class SpecialAddressBehaviorDialog(QtGui.QDialog):
|
class SpecialAddressBehaviorDialog(QtWidgets.QDialog):
|
||||||
"""
|
"""
|
||||||
QDialog for special address behaviour (e.g. mailing list functionality)
|
QDialog for special address behaviour (e.g. mailing list functionality)
|
||||||
"""
|
"""
|
||||||
|
@ -258,12 +265,12 @@ class SpecialAddressBehaviorDialog(QtGui.QDialog):
|
||||||
self.radioButtonBehaviorMailingList.click()
|
self.radioButtonBehaviorMailingList.click()
|
||||||
else:
|
else:
|
||||||
self.radioButtonBehaveNormalAddress.click()
|
self.radioButtonBehaveNormalAddress.click()
|
||||||
mailingListName = config.safeGet(self.address, 'mailinglistname', '')
|
mailingListName = config.safeGet(
|
||||||
|
self.address, 'mailinglistname', '')
|
||||||
self.lineEditMailingListName.setText(
|
self.lineEditMailingListName.setText(
|
||||||
unic(ustr(mailingListName))
|
unic(ustr(mailingListName)))
|
||||||
)
|
|
||||||
|
|
||||||
QtGui.QWidget.resize(self, QtGui.QWidget.sizeHint(self))
|
QtWidgets.QWidget.resize(self, QtWidgets.QWidget.sizeHint(self))
|
||||||
self.show()
|
self.show()
|
||||||
|
|
||||||
def accept(self):
|
def accept(self):
|
||||||
|
@ -276,7 +283,7 @@ class SpecialAddressBehaviorDialog(QtGui.QDialog):
|
||||||
# Set the color to either black or grey
|
# Set the color to either black or grey
|
||||||
if self.config.getboolean(self.address, 'enabled'):
|
if self.config.getboolean(self.address, 'enabled'):
|
||||||
self.parent.setCurrentItemColor(
|
self.parent.setCurrentItemColor(
|
||||||
QtGui.QApplication.palette().text().color()
|
QtWidgets.QApplication.palette().text().color()
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
self.parent.setCurrentItemColor(QtGui.QColor(128, 128, 128))
|
self.parent.setCurrentItemColor(QtGui.QColor(128, 128, 128))
|
||||||
|
@ -292,13 +299,15 @@ class SpecialAddressBehaviorDialog(QtGui.QDialog):
|
||||||
self.parent.rerenderMessagelistToLabels()
|
self.parent.rerenderMessagelistToLabels()
|
||||||
|
|
||||||
|
|
||||||
class EmailGatewayDialog(QtGui.QDialog):
|
class EmailGatewayDialog(QtWidgets.QDialog):
|
||||||
"""QDialog for email gateway control"""
|
"""QDialog for email gateway control"""
|
||||||
|
|
||||||
def __init__(self, parent, config=global_config, account=None):
|
def __init__(self, parent, config=global_config, account=None):
|
||||||
super(EmailGatewayDialog, self).__init__(parent)
|
super(EmailGatewayDialog, self).__init__(parent)
|
||||||
widgets.load('emailgateway.ui', self)
|
widgets.load('emailgateway.ui', self)
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.config = config
|
self.config = config
|
||||||
|
self.data = None
|
||||||
if account:
|
if account:
|
||||||
self.acct = account
|
self.acct = account
|
||||||
self.setWindowTitle(_translate(
|
self.setWindowTitle(_translate(
|
||||||
|
@ -331,7 +340,7 @@ class EmailGatewayDialog(QtGui.QDialog):
|
||||||
else:
|
else:
|
||||||
self.acct = MailchuckAccount(address)
|
self.acct = MailchuckAccount(address)
|
||||||
self.lineEditEmail.setFocus()
|
self.lineEditEmail.setFocus()
|
||||||
QtGui.QWidget.resize(self, QtGui.QWidget.sizeHint(self))
|
QtWidgets.QWidget.resize(self, QtWidgets.QWidget.sizeHint(self))
|
||||||
|
|
||||||
def accept(self):
|
def accept(self):
|
||||||
"""Accept callback"""
|
"""Accept callback"""
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
"""
|
"""
|
||||||
Address validator module.
|
The validator for address and passphrase QLineEdits
|
||||||
|
used in `.dialogs.NewChanDialog`.
|
||||||
"""
|
"""
|
||||||
# pylint: disable=too-many-branches,too-many-arguments
|
# pylint: disable=too-many-arguments
|
||||||
|
|
||||||
from six.moves.queue import Empty
|
from six.moves.queue import Empty
|
||||||
|
|
||||||
from unqstr import ustr
|
from unqstr import ustr
|
||||||
from PyQt4 import QtGui
|
from qtpy import QtGui
|
||||||
|
|
||||||
from addresses import decodeAddress, addBMIfNotPresent
|
from addresses import decodeAddress, addBMIfNotPresent
|
||||||
from bmconfigparser import config
|
from bmconfigparser import config
|
||||||
|
@ -18,22 +19,18 @@ from .utils import str_chan
|
||||||
class AddressPassPhraseValidatorMixin(object):
|
class AddressPassPhraseValidatorMixin(object):
|
||||||
"""Bitmessage address or passphrase validator class for Qt UI"""
|
"""Bitmessage address or passphrase validator class for Qt UI"""
|
||||||
def setParams(
|
def setParams(
|
||||||
self,
|
self, passPhraseObject=None, addressObject=None,
|
||||||
passPhraseObject=None,
|
feedBackObject=None, button=None, addressMandatory=True
|
||||||
addressObject=None,
|
|
||||||
feedBackObject=None,
|
|
||||||
buttonBox=None,
|
|
||||||
addressMandatory=True,
|
|
||||||
):
|
):
|
||||||
"""Initialisation"""
|
"""Initialization"""
|
||||||
self.addressObject = addressObject
|
self.addressObject = addressObject
|
||||||
self.passPhraseObject = passPhraseObject
|
self.passPhraseObject = passPhraseObject
|
||||||
self.feedBackObject = feedBackObject
|
self.feedBackObject = feedBackObject
|
||||||
self.buttonBox = buttonBox
|
|
||||||
self.addressMandatory = addressMandatory
|
self.addressMandatory = addressMandatory
|
||||||
self.isValid = False
|
self.isValid = False
|
||||||
# save default text
|
# save default text
|
||||||
self.okButtonLabel = self.buttonBox.button(QtGui.QDialogButtonBox.Ok).text()
|
self.okButton = button
|
||||||
|
self.okButtonLabel = button.text()
|
||||||
|
|
||||||
def setError(self, string):
|
def setError(self, string):
|
||||||
"""Indicate that the validation is pending or failed"""
|
"""Indicate that the validation is pending or failed"""
|
||||||
|
@ -44,13 +41,13 @@ class AddressPassPhraseValidatorMixin(object):
|
||||||
self.feedBackObject.setStyleSheet("QLabel { color : red; }")
|
self.feedBackObject.setStyleSheet("QLabel { color : red; }")
|
||||||
self.feedBackObject.setText(string)
|
self.feedBackObject.setText(string)
|
||||||
self.isValid = False
|
self.isValid = False
|
||||||
if self.buttonBox:
|
if self.okButton:
|
||||||
self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(False)
|
self.okButton.setEnabled(False)
|
||||||
if string is not None and self.feedBackObject is not None:
|
if string is not None and self.feedBackObject is not None:
|
||||||
self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText(
|
self.okButton.setText(
|
||||||
_translate("AddressValidator", "Invalid"))
|
_translate("AddressValidator", "Invalid"))
|
||||||
else:
|
else:
|
||||||
self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText(
|
self.okButton.setText(
|
||||||
_translate("AddressValidator", "Validating..."))
|
_translate("AddressValidator", "Validating..."))
|
||||||
|
|
||||||
def setOK(self, string):
|
def setOK(self, string):
|
||||||
|
@ -62,9 +59,9 @@ class AddressPassPhraseValidatorMixin(object):
|
||||||
self.feedBackObject.setStyleSheet("QLabel { }")
|
self.feedBackObject.setStyleSheet("QLabel { }")
|
||||||
self.feedBackObject.setText(string)
|
self.feedBackObject.setText(string)
|
||||||
self.isValid = True
|
self.isValid = True
|
||||||
if self.buttonBox:
|
if self.okButton:
|
||||||
self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(True)
|
self.okButton.setEnabled(True)
|
||||||
self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText(self.okButtonLabel)
|
self.okButton.setText(self.okButtonLabel)
|
||||||
|
|
||||||
def checkQueue(self):
|
def checkQueue(self):
|
||||||
"""Validator queue loop"""
|
"""Validator queue loop"""
|
||||||
|
@ -77,7 +74,8 @@ class AddressPassPhraseValidatorMixin(object):
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
addressGeneratorReturnValue = apiAddressGeneratorReturnQueue.get(False)
|
addressGeneratorReturnValue = \
|
||||||
|
apiAddressGeneratorReturnQueue.get(False)
|
||||||
except Empty:
|
except Empty:
|
||||||
if gotOne:
|
if gotOne:
|
||||||
break
|
break
|
||||||
|
@ -87,96 +85,120 @@ class AddressPassPhraseValidatorMixin(object):
|
||||||
gotOne = True
|
gotOne = True
|
||||||
|
|
||||||
if not addressGeneratorReturnValue:
|
if not addressGeneratorReturnValue:
|
||||||
self.setError(_translate("AddressValidator", "Address already present as one of your identities."))
|
self.setError(_translate(
|
||||||
return (QtGui.QValidator.Intermediate, 0)
|
"AddressValidator",
|
||||||
if addressGeneratorReturnValue[0] == 'chan name does not match address':
|
"Address already present as one of your identities."
|
||||||
self.setError(
|
))
|
||||||
_translate(
|
return
|
||||||
"AddressValidator",
|
if addressGeneratorReturnValue[0] == \
|
||||||
"Although the Bitmessage address you "
|
'chan name does not match address':
|
||||||
"entered was valid, it doesn't match the chan name."))
|
self.setError(_translate(
|
||||||
return (QtGui.QValidator.Intermediate, 0)
|
"AddressValidator",
|
||||||
self.setOK(_translate("MainWindow", "Passphrase and address appear to be valid."))
|
"Although the Bitmessage address you entered was valid,"
|
||||||
|
" it doesn\'t match the chan name."
|
||||||
|
))
|
||||||
|
return
|
||||||
|
self.setOK(_translate(
|
||||||
|
"MainWindow", "Passphrase and address appear to be valid."))
|
||||||
|
|
||||||
def returnValid(self):
|
def returnValid(self):
|
||||||
"""Return the value of whether the validation was successful"""
|
"""Return the value of whether the validation was successful"""
|
||||||
if self.isValid:
|
return QtGui.QValidator.Acceptable if self.isValid \
|
||||||
return QtGui.QValidator.Acceptable
|
else QtGui.QValidator.Intermediate
|
||||||
return QtGui.QValidator.Intermediate
|
|
||||||
|
|
||||||
def validate(self, s, pos):
|
def validate(self, s, pos):
|
||||||
"""Top level validator method"""
|
"""Top level validator method"""
|
||||||
if self.addressObject is None:
|
try:
|
||||||
address = None
|
|
||||||
else:
|
|
||||||
address = ustr(self.addressObject.text())
|
address = ustr(self.addressObject.text())
|
||||||
if address == "":
|
except AttributeError:
|
||||||
address = None
|
address = None
|
||||||
if self.passPhraseObject is None:
|
try:
|
||||||
passPhrase = ""
|
|
||||||
else:
|
|
||||||
passPhrase = ustr(self.passPhraseObject.text())
|
passPhrase = ustr(self.passPhraseObject.text())
|
||||||
if passPhrase == "":
|
except AttributeError:
|
||||||
passPhrase = None
|
passPhrase = ""
|
||||||
|
|
||||||
# no chan name
|
# no chan name
|
||||||
if passPhrase is None:
|
if not passPhrase:
|
||||||
self.setError(_translate("AddressValidator", "Chan name/passphrase needed. You didn't enter a chan name."))
|
self.setError(_translate(
|
||||||
|
"AddressValidator",
|
||||||
|
"Chan name/passphrase needed. You didn't enter a chan name."
|
||||||
|
))
|
||||||
return (QtGui.QValidator.Intermediate, s, pos)
|
return (QtGui.QValidator.Intermediate, s, pos)
|
||||||
|
|
||||||
if self.addressMandatory or address is not None:
|
if self.addressMandatory or address:
|
||||||
# check if address already exists:
|
# check if address already exists:
|
||||||
if address in config.addresses():
|
if address in config.addresses(True):
|
||||||
self.setError(_translate("AddressValidator", "Address already present as one of your identities."))
|
self.setError(_translate(
|
||||||
|
"AddressValidator",
|
||||||
|
"Address already present as one of your identities."
|
||||||
|
))
|
||||||
return (QtGui.QValidator.Intermediate, s, pos)
|
return (QtGui.QValidator.Intermediate, s, pos)
|
||||||
|
|
||||||
|
status = decodeAddress(address)[0]
|
||||||
# version too high
|
# version too high
|
||||||
if decodeAddress(address)[0] == 'versiontoohigh':
|
if status == 'versiontoohigh':
|
||||||
self.setError(
|
self.setError(_translate(
|
||||||
_translate(
|
"AddressValidator",
|
||||||
"AddressValidator",
|
"Address too new. Although that Bitmessage address"
|
||||||
"Address too new. Although that Bitmessage"
|
" might be valid, its version number is too new"
|
||||||
" address might be valid, its version number"
|
" for us to handle. Perhaps you need to upgrade"
|
||||||
" is too new for us to handle. Perhaps you need"
|
" Bitmessage."
|
||||||
" to upgrade Bitmessage."))
|
))
|
||||||
return (QtGui.QValidator.Intermediate, s, pos)
|
return (QtGui.QValidator.Intermediate, s, pos)
|
||||||
|
|
||||||
# invalid
|
# invalid
|
||||||
if decodeAddress(address)[0] != 'success':
|
if status != 'success':
|
||||||
self.setError(_translate("AddressValidator", "The Bitmessage address is not valid."))
|
self.setError(_translate(
|
||||||
|
"AddressValidator",
|
||||||
|
"The Bitmessage address is not valid."
|
||||||
|
))
|
||||||
return (QtGui.QValidator.Intermediate, s, pos)
|
return (QtGui.QValidator.Intermediate, s, pos)
|
||||||
|
|
||||||
# this just disables the OK button without changing the feedback text
|
# this just disables the OK button without changing the feedback text
|
||||||
# but only if triggered by textEdited, not by clicking the Ok button
|
# but only if triggered by textEdited, not by clicking the Ok button
|
||||||
if not self.buttonBox.button(QtGui.QDialogButtonBox.Ok).hasFocus():
|
if not self.okButton.hasFocus():
|
||||||
self.setError(None)
|
self.setError(None)
|
||||||
|
|
||||||
# check through generator
|
# check through generator
|
||||||
if address is None:
|
if not address:
|
||||||
addressGeneratorQueue.put(('createChan', 4, 1, str_chan + ' ' + ustr(passPhrase), passPhrase.encode("utf-8", "replace"), False))
|
addressGeneratorQueue.put((
|
||||||
|
'createChan', 4, 1,
|
||||||
|
str_chan + ' ' + passPhrase, passPhrase.encode("utf-8", "replace"), False
|
||||||
|
))
|
||||||
else:
|
else:
|
||||||
addressGeneratorQueue.put(
|
addressGeneratorQueue.put((
|
||||||
('joinChan', addBMIfNotPresent(address),
|
'joinChan', addBMIfNotPresent(address),
|
||||||
"{} {}".format(str_chan, passPhrase), passPhrase.encode("utf-8", "replace"), False))
|
"{} {}".format(str_chan, passPhrase), passPhrase.encode("utf-8", "replace"), False
|
||||||
|
))
|
||||||
|
|
||||||
if self.buttonBox.button(QtGui.QDialogButtonBox.Ok).hasFocus():
|
if self.okButton.hasFocus():
|
||||||
return (self.returnValid(), s, pos)
|
return (self.returnValid(), s, pos)
|
||||||
return (QtGui.QValidator.Intermediate, s, pos)
|
else:
|
||||||
|
return (QtGui.QValidator.Intermediate, s, pos)
|
||||||
|
|
||||||
def checkData(self):
|
def checkData(self):
|
||||||
"""Validator Qt signal interface"""
|
"""Validator Qt signal interface"""
|
||||||
return self.validate("", 0)
|
return self.validate(u"", 0)
|
||||||
|
|
||||||
|
|
||||||
class AddressValidator(QtGui.QValidator, AddressPassPhraseValidatorMixin):
|
class AddressValidator(QtGui.QValidator, AddressPassPhraseValidatorMixin):
|
||||||
"""AddressValidator class for Qt UI"""
|
"""AddressValidator class for Qt UI"""
|
||||||
def __init__(self, parent=None, passPhraseObject=None, feedBackObject=None, buttonBox=None, addressMandatory=True):
|
def __init__(
|
||||||
|
self, parent=None, passPhraseObject=None, feedBackObject=None,
|
||||||
|
button=None, addressMandatory=True
|
||||||
|
):
|
||||||
super(AddressValidator, self).__init__(parent)
|
super(AddressValidator, self).__init__(parent)
|
||||||
self.setParams(passPhraseObject, parent, feedBackObject, buttonBox, addressMandatory)
|
self.setParams(
|
||||||
|
passPhraseObject, parent, feedBackObject, button,
|
||||||
|
addressMandatory)
|
||||||
|
|
||||||
|
|
||||||
class PassPhraseValidator(QtGui.QValidator, AddressPassPhraseValidatorMixin):
|
class PassPhraseValidator(QtGui.QValidator, AddressPassPhraseValidatorMixin):
|
||||||
"""PassPhraseValidator class for Qt UI"""
|
"""PassPhraseValidator class for Qt UI"""
|
||||||
def __init__(self, parent=None, addressObject=None, feedBackObject=None, buttonBox=None, addressMandatory=False):
|
def __init__(
|
||||||
|
self, parent=None, addressObject=None, feedBackObject=None,
|
||||||
|
button=None, addressMandatory=False
|
||||||
|
):
|
||||||
super(PassPhraseValidator, self).__init__(parent)
|
super(PassPhraseValidator, self).__init__(parent)
|
||||||
self.setParams(parent, addressObject, feedBackObject, buttonBox, addressMandatory)
|
self.setParams(
|
||||||
|
parent, addressObject, feedBackObject, button,
|
||||||
|
addressMandatory)
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#
|
#
|
||||||
# WARNING! All changes made in this file will be lost!
|
# WARNING! All changes made in this file will be lost!
|
||||||
|
|
||||||
from PyQt4 import QtCore
|
from qtpy import QtCore
|
||||||
|
|
||||||
qt_resource_data = b"\
|
qt_resource_data = b"\
|
||||||
\x00\x00\x03\x66\
|
\x00\x00\x03\x66\
|
||||||
|
@ -1666,10 +1666,15 @@ qt_resource_struct = b"\
|
||||||
\x00\x00\x01\xe6\x00\x00\x00\x00\x00\x01\x00\x00\x34\xdf\
|
\x00\x00\x01\xe6\x00\x00\x00\x00\x00\x01\x00\x00\x34\xdf\
|
||||||
"
|
"
|
||||||
|
|
||||||
|
|
||||||
def qInitResources():
|
def qInitResources():
|
||||||
QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
|
QtCore.qRegisterResourceData(
|
||||||
|
0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
|
||||||
|
|
||||||
|
|
||||||
def qCleanupResources():
|
def qCleanupResources():
|
||||||
QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
|
QtCore.qUnregisterResourceData(
|
||||||
|
0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
|
||||||
|
|
||||||
|
|
||||||
qInitResources()
|
qInitResources()
|
||||||
|
|
|
@ -1,13 +1,8 @@
|
||||||
# -*- coding: utf-8 -*-
|
# pylint: skip-file
|
||||||
|
# flake8: noqa
|
||||||
|
|
||||||
# Form implementation generated from reading ui file 'bitmessageui.ui'
|
from qtpy import QtCore, QtGui, QtWidgets
|
||||||
#
|
from tr import _translate
|
||||||
# Created: Mon Mar 23 22:18:07 2015
|
|
||||||
# by: PyQt4 UI code generator 4.10.4
|
|
||||||
#
|
|
||||||
# WARNING! All changes made in this file will be lost!
|
|
||||||
|
|
||||||
from PyQt4 import QtCore, QtGui
|
|
||||||
from bmconfigparser import config
|
from bmconfigparser import config
|
||||||
from .foldertree import AddressBookCompleter
|
from .foldertree import AddressBookCompleter
|
||||||
from .messageview import MessageView
|
from .messageview import MessageView
|
||||||
|
@ -15,45 +10,23 @@ from .messagecompose import MessageCompose
|
||||||
from bitmessageqt import settingsmixin
|
from bitmessageqt import settingsmixin
|
||||||
from .networkstatus import NetworkStatus
|
from .networkstatus import NetworkStatus
|
||||||
from .blacklist import Blacklist
|
from .blacklist import Blacklist
|
||||||
|
from bitmessageqt import bitmessage_icons_rc
|
||||||
try:
|
|
||||||
_fromUtf8 = QtCore.QString.fromUtf8
|
|
||||||
except AttributeError:
|
|
||||||
def _fromUtf8(s):
|
|
||||||
return s
|
|
||||||
|
|
||||||
try:
|
|
||||||
_encoding = QtGui.QApplication.UnicodeUTF8
|
|
||||||
|
|
||||||
def _translate(context, text, disambig, encoding=QtCore.QCoreApplication.CodecForTr, n=None):
|
|
||||||
if n is None:
|
|
||||||
return QtGui.QApplication.translate(context, text, disambig, _encoding)
|
|
||||||
else:
|
|
||||||
return QtGui.QApplication.translate(context, text, disambig, _encoding, n)
|
|
||||||
except AttributeError:
|
|
||||||
def _translate(context, text, disambig, encoding=QtCore.QCoreApplication.CodecForTr, n=None):
|
|
||||||
if n is None:
|
|
||||||
return QtGui.QApplication.translate(context, text, disambig)
|
|
||||||
else:
|
|
||||||
return QtGui.QApplication.translate(context, text, disambig, QtCore.QCoreApplication.CodecForTr, n)
|
|
||||||
|
|
||||||
|
|
||||||
class Ui_MainWindow(object):
|
class Ui_MainWindow(object):
|
||||||
def setupUi(self, MainWindow):
|
def setupUi(self, MainWindow):
|
||||||
MainWindow.setObjectName(_fromUtf8("MainWindow"))
|
MainWindow.setObjectName("MainWindow")
|
||||||
MainWindow.resize(885, 580)
|
MainWindow.resize(885, 580)
|
||||||
icon = QtGui.QIcon()
|
icon = QtGui.QIcon()
|
||||||
icon.addPixmap(
|
icon.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-24px.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
||||||
QtGui.QPixmap(_fromUtf8(":/newPrefix/images/can-icon-24px.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off
|
|
||||||
)
|
|
||||||
MainWindow.setWindowIcon(icon)
|
MainWindow.setWindowIcon(icon)
|
||||||
MainWindow.setTabShape(QtGui.QTabWidget.Rounded)
|
MainWindow.setTabShape(QtWidgets.QTabWidget.Rounded)
|
||||||
self.centralwidget = QtGui.QWidget(MainWindow)
|
self.centralwidget = QtWidgets.QWidget(MainWindow)
|
||||||
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
|
self.centralwidget.setObjectName("centralwidget")
|
||||||
self.gridLayout_10 = QtGui.QGridLayout(self.centralwidget)
|
self.gridLayout_10 = QtWidgets.QGridLayout(self.centralwidget)
|
||||||
self.gridLayout_10.setObjectName(_fromUtf8("gridLayout_10"))
|
self.gridLayout_10.setObjectName("gridLayout_10")
|
||||||
self.tabWidget = QtGui.QTabWidget(self.centralwidget)
|
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
|
||||||
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
|
||||||
sizePolicy.setHorizontalStretch(0)
|
sizePolicy.setHorizontalStretch(0)
|
||||||
sizePolicy.setVerticalStretch(0)
|
sizePolicy.setVerticalStretch(0)
|
||||||
sizePolicy.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth())
|
sizePolicy.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth())
|
||||||
|
@ -63,29 +36,27 @@ class Ui_MainWindow(object):
|
||||||
font = QtGui.QFont()
|
font = QtGui.QFont()
|
||||||
font.setPointSize(9)
|
font.setPointSize(9)
|
||||||
self.tabWidget.setFont(font)
|
self.tabWidget.setFont(font)
|
||||||
self.tabWidget.setTabPosition(QtGui.QTabWidget.North)
|
self.tabWidget.setTabPosition(QtWidgets.QTabWidget.North)
|
||||||
self.tabWidget.setTabShape(QtGui.QTabWidget.Rounded)
|
self.tabWidget.setTabShape(QtWidgets.QTabWidget.Rounded)
|
||||||
self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
|
self.tabWidget.setObjectName("tabWidget")
|
||||||
self.inbox = QtGui.QWidget()
|
self.inbox = QtWidgets.QWidget()
|
||||||
self.inbox.setObjectName(_fromUtf8("inbox"))
|
self.inbox.setObjectName("inbox")
|
||||||
self.gridLayout = QtGui.QGridLayout(self.inbox)
|
self.gridLayout = QtWidgets.QGridLayout(self.inbox)
|
||||||
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
|
self.gridLayout.setObjectName("gridLayout")
|
||||||
self.horizontalSplitter_3 = settingsmixin.SSplitter()
|
self.horizontalSplitter_3 = settingsmixin.SSplitter()
|
||||||
self.horizontalSplitter_3.setObjectName(_fromUtf8("horizontalSplitter_3"))
|
self.horizontalSplitter_3.setObjectName("horizontalSplitter_3")
|
||||||
self.verticalSplitter_12 = settingsmixin.SSplitter()
|
self.verticalSplitter_12 = settingsmixin.SSplitter()
|
||||||
self.verticalSplitter_12.setObjectName(_fromUtf8("verticalSplitter_12"))
|
self.verticalSplitter_12.setObjectName("verticalSplitter_12")
|
||||||
self.verticalSplitter_12.setOrientation(QtCore.Qt.Vertical)
|
self.verticalSplitter_12.setOrientation(QtCore.Qt.Vertical)
|
||||||
self.treeWidgetYourIdentities = settingsmixin.STreeWidget(self.inbox)
|
self.treeWidgetYourIdentities = settingsmixin.STreeWidget(self.inbox)
|
||||||
self.treeWidgetYourIdentities.setObjectName(_fromUtf8("treeWidgetYourIdentities"))
|
self.treeWidgetYourIdentities.setObjectName("treeWidgetYourIdentities")
|
||||||
self.treeWidgetYourIdentities.resize(200, self.treeWidgetYourIdentities.height())
|
self.treeWidgetYourIdentities.resize(200, self.treeWidgetYourIdentities.height())
|
||||||
icon1 = QtGui.QIcon()
|
icon1 = QtGui.QIcon()
|
||||||
icon1.addPixmap(
|
icon1.addPixmap(QtGui.QPixmap(":/newPrefix/images/identities.png"), QtGui.QIcon.Selected, QtGui.QIcon.Off)
|
||||||
QtGui.QPixmap(_fromUtf8(":/newPrefix/images/identities.png")), QtGui.QIcon.Selected, QtGui.QIcon.Off
|
|
||||||
)
|
|
||||||
self.treeWidgetYourIdentities.headerItem().setIcon(0, icon1)
|
self.treeWidgetYourIdentities.headerItem().setIcon(0, icon1)
|
||||||
self.verticalSplitter_12.addWidget(self.treeWidgetYourIdentities)
|
self.verticalSplitter_12.addWidget(self.treeWidgetYourIdentities)
|
||||||
self.pushButtonNewAddress = QtGui.QPushButton(self.inbox)
|
self.pushButtonNewAddress = QtWidgets.QPushButton(self.inbox)
|
||||||
self.pushButtonNewAddress.setObjectName(_fromUtf8("pushButtonNewAddress"))
|
self.pushButtonNewAddress.setObjectName("pushButtonNewAddress")
|
||||||
self.pushButtonNewAddress.resize(200, self.pushButtonNewAddress.height())
|
self.pushButtonNewAddress.resize(200, self.pushButtonNewAddress.height())
|
||||||
self.verticalSplitter_12.addWidget(self.pushButtonNewAddress)
|
self.verticalSplitter_12.addWidget(self.pushButtonNewAddress)
|
||||||
self.verticalSplitter_12.setStretchFactor(0, 1)
|
self.verticalSplitter_12.setStretchFactor(0, 1)
|
||||||
|
@ -95,21 +66,21 @@ class Ui_MainWindow(object):
|
||||||
self.verticalSplitter_12.handle(1).setEnabled(False)
|
self.verticalSplitter_12.handle(1).setEnabled(False)
|
||||||
self.horizontalSplitter_3.addWidget(self.verticalSplitter_12)
|
self.horizontalSplitter_3.addWidget(self.verticalSplitter_12)
|
||||||
self.verticalSplitter_7 = settingsmixin.SSplitter()
|
self.verticalSplitter_7 = settingsmixin.SSplitter()
|
||||||
self.verticalSplitter_7.setObjectName(_fromUtf8("verticalSplitter_7"))
|
self.verticalSplitter_7.setObjectName("verticalSplitter_7")
|
||||||
self.verticalSplitter_7.setOrientation(QtCore.Qt.Vertical)
|
self.verticalSplitter_7.setOrientation(QtCore.Qt.Vertical)
|
||||||
self.horizontalSplitterSearch = QtGui.QSplitter()
|
self.horizontalSplitterSearch = QtWidgets.QSplitter()
|
||||||
self.horizontalSplitterSearch.setObjectName(_fromUtf8("horizontalSplitterSearch"))
|
self.horizontalSplitterSearch.setObjectName("horizontalSplitterSearch")
|
||||||
self.inboxSearchLineEdit = QtGui.QLineEdit(self.inbox)
|
self.inboxSearchLineEdit = QtWidgets.QLineEdit(self.inbox)
|
||||||
self.inboxSearchLineEdit.setObjectName(_fromUtf8("inboxSearchLineEdit"))
|
self.inboxSearchLineEdit.setObjectName("inboxSearchLineEdit")
|
||||||
self.horizontalSplitterSearch.addWidget(self.inboxSearchLineEdit)
|
self.horizontalSplitterSearch.addWidget(self.inboxSearchLineEdit)
|
||||||
self.inboxSearchOption = QtGui.QComboBox(self.inbox)
|
self.inboxSearchOption = QtWidgets.QComboBox(self.inbox)
|
||||||
self.inboxSearchOption.setObjectName(_fromUtf8("inboxSearchOption"))
|
self.inboxSearchOption.setObjectName("inboxSearchOption")
|
||||||
self.inboxSearchOption.addItem(_fromUtf8(""))
|
self.inboxSearchOption.addItem("")
|
||||||
self.inboxSearchOption.addItem(_fromUtf8(""))
|
self.inboxSearchOption.addItem("")
|
||||||
self.inboxSearchOption.addItem(_fromUtf8(""))
|
self.inboxSearchOption.addItem("")
|
||||||
self.inboxSearchOption.addItem(_fromUtf8(""))
|
self.inboxSearchOption.addItem("")
|
||||||
self.inboxSearchOption.addItem(_fromUtf8(""))
|
self.inboxSearchOption.addItem("")
|
||||||
self.inboxSearchOption.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
|
self.inboxSearchOption.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToContents)
|
||||||
self.inboxSearchOption.setCurrentIndex(3)
|
self.inboxSearchOption.setCurrentIndex(3)
|
||||||
self.horizontalSplitterSearch.addWidget(self.inboxSearchOption)
|
self.horizontalSplitterSearch.addWidget(self.inboxSearchOption)
|
||||||
self.horizontalSplitterSearch.handle(1).setEnabled(False)
|
self.horizontalSplitterSearch.handle(1).setEnabled(False)
|
||||||
|
@ -117,21 +88,21 @@ class Ui_MainWindow(object):
|
||||||
self.horizontalSplitterSearch.setStretchFactor(1, 0)
|
self.horizontalSplitterSearch.setStretchFactor(1, 0)
|
||||||
self.verticalSplitter_7.addWidget(self.horizontalSplitterSearch)
|
self.verticalSplitter_7.addWidget(self.horizontalSplitterSearch)
|
||||||
self.tableWidgetInbox = settingsmixin.STableWidget(self.inbox)
|
self.tableWidgetInbox = settingsmixin.STableWidget(self.inbox)
|
||||||
self.tableWidgetInbox.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
|
self.tableWidgetInbox.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
|
||||||
self.tableWidgetInbox.setAlternatingRowColors(True)
|
self.tableWidgetInbox.setAlternatingRowColors(True)
|
||||||
self.tableWidgetInbox.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
|
self.tableWidgetInbox.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
|
||||||
self.tableWidgetInbox.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
|
self.tableWidgetInbox.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
|
||||||
self.tableWidgetInbox.setWordWrap(False)
|
self.tableWidgetInbox.setWordWrap(False)
|
||||||
self.tableWidgetInbox.setObjectName(_fromUtf8("tableWidgetInbox"))
|
self.tableWidgetInbox.setObjectName("tableWidgetInbox")
|
||||||
self.tableWidgetInbox.setColumnCount(4)
|
self.tableWidgetInbox.setColumnCount(4)
|
||||||
self.tableWidgetInbox.setRowCount(0)
|
self.tableWidgetInbox.setRowCount(0)
|
||||||
item = QtGui.QTableWidgetItem()
|
item = QtWidgets.QTableWidgetItem()
|
||||||
self.tableWidgetInbox.setHorizontalHeaderItem(0, item)
|
self.tableWidgetInbox.setHorizontalHeaderItem(0, item)
|
||||||
item = QtGui.QTableWidgetItem()
|
item = QtWidgets.QTableWidgetItem()
|
||||||
self.tableWidgetInbox.setHorizontalHeaderItem(1, item)
|
self.tableWidgetInbox.setHorizontalHeaderItem(1, item)
|
||||||
item = QtGui.QTableWidgetItem()
|
item = QtWidgets.QTableWidgetItem()
|
||||||
self.tableWidgetInbox.setHorizontalHeaderItem(2, item)
|
self.tableWidgetInbox.setHorizontalHeaderItem(2, item)
|
||||||
item = QtGui.QTableWidgetItem()
|
item = QtWidgets.QTableWidgetItem()
|
||||||
self.tableWidgetInbox.setHorizontalHeaderItem(3, item)
|
self.tableWidgetInbox.setHorizontalHeaderItem(3, item)
|
||||||
self.tableWidgetInbox.horizontalHeader().setCascadingSectionResizes(True)
|
self.tableWidgetInbox.horizontalHeader().setCascadingSectionResizes(True)
|
||||||
self.tableWidgetInbox.horizontalHeader().setDefaultSectionSize(200)
|
self.tableWidgetInbox.horizontalHeader().setDefaultSectionSize(200)
|
||||||
|
@ -145,7 +116,7 @@ class Ui_MainWindow(object):
|
||||||
self.textEditInboxMessage = MessageView(self.inbox)
|
self.textEditInboxMessage = MessageView(self.inbox)
|
||||||
self.textEditInboxMessage.setBaseSize(QtCore.QSize(0, 500))
|
self.textEditInboxMessage.setBaseSize(QtCore.QSize(0, 500))
|
||||||
self.textEditInboxMessage.setReadOnly(True)
|
self.textEditInboxMessage.setReadOnly(True)
|
||||||
self.textEditInboxMessage.setObjectName(_fromUtf8("textEditInboxMessage"))
|
self.textEditInboxMessage.setObjectName("textEditInboxMessage")
|
||||||
self.verticalSplitter_7.addWidget(self.textEditInboxMessage)
|
self.verticalSplitter_7.addWidget(self.textEditInboxMessage)
|
||||||
self.verticalSplitter_7.setStretchFactor(0, 0)
|
self.verticalSplitter_7.setStretchFactor(0, 0)
|
||||||
self.verticalSplitter_7.setStretchFactor(1, 1)
|
self.verticalSplitter_7.setStretchFactor(1, 1)
|
||||||
|
@ -161,52 +132,51 @@ class Ui_MainWindow(object):
|
||||||
self.horizontalSplitter_3.setCollapsible(1, False)
|
self.horizontalSplitter_3.setCollapsible(1, False)
|
||||||
self.gridLayout.addWidget(self.horizontalSplitter_3)
|
self.gridLayout.addWidget(self.horizontalSplitter_3)
|
||||||
icon2 = QtGui.QIcon()
|
icon2 = QtGui.QIcon()
|
||||||
icon2.addPixmap(QtGui.QPixmap(_fromUtf8(":/newPrefix/images/inbox.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
icon2.addPixmap(QtGui.QPixmap(":/newPrefix/images/inbox.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
||||||
self.tabWidget.addTab(self.inbox, icon2, _fromUtf8(""))
|
self.tabWidget.addTab(self.inbox, icon2, "")
|
||||||
self.send = QtGui.QWidget()
|
self.send = QtWidgets.QWidget()
|
||||||
self.send.setObjectName(_fromUtf8("send"))
|
self.send.setObjectName("send")
|
||||||
self.gridLayout_7 = QtGui.QGridLayout(self.send)
|
self.gridLayout_7 = QtWidgets.QGridLayout(self.send)
|
||||||
self.gridLayout_7.setObjectName(_fromUtf8("gridLayout_7"))
|
self.gridLayout_7.setObjectName("gridLayout_7")
|
||||||
self.horizontalSplitter = settingsmixin.SSplitter()
|
self.horizontalSplitter = settingsmixin.SSplitter()
|
||||||
self.horizontalSplitter.setObjectName(_fromUtf8("horizontalSplitter"))
|
self.horizontalSplitter.setObjectName("horizontalSplitter")
|
||||||
self.verticalSplitter_2 = settingsmixin.SSplitter()
|
self.verticalSplitter_2 = settingsmixin.SSplitter()
|
||||||
self.verticalSplitter_2.setObjectName(_fromUtf8("verticalSplitter_2"))
|
self.verticalSplitter_2.setObjectName("verticalSplitter_2")
|
||||||
self.verticalSplitter_2.setOrientation(QtCore.Qt.Vertical)
|
self.verticalSplitter_2.setOrientation(QtCore.Qt.Vertical)
|
||||||
self.tableWidgetAddressBook = settingsmixin.STableWidget(self.send)
|
self.tableWidgetAddressBook = settingsmixin.STableWidget(self.send)
|
||||||
self.tableWidgetAddressBook.setAlternatingRowColors(True)
|
self.tableWidgetAddressBook.setAlternatingRowColors(True)
|
||||||
self.tableWidgetAddressBook.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
|
self.tableWidgetAddressBook.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
|
||||||
self.tableWidgetAddressBook.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
|
self.tableWidgetAddressBook.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
|
||||||
self.tableWidgetAddressBook.setObjectName(_fromUtf8("tableWidgetAddressBook"))
|
self.tableWidgetAddressBook.setObjectName("tableWidgetAddressBook")
|
||||||
self.tableWidgetAddressBook.setColumnCount(2)
|
self.tableWidgetAddressBook.setColumnCount(2)
|
||||||
self.tableWidgetAddressBook.setRowCount(0)
|
self.tableWidgetAddressBook.setRowCount(0)
|
||||||
self.tableWidgetAddressBook.resize(200, self.tableWidgetAddressBook.height())
|
self.tableWidgetAddressBook.resize(200, self.tableWidgetAddressBook.height())
|
||||||
item = QtGui.QTableWidgetItem()
|
item = QtWidgets.QTableWidgetItem()
|
||||||
icon3 = QtGui.QIcon()
|
icon3 = QtGui.QIcon()
|
||||||
icon3.addPixmap(
|
icon3.addPixmap(QtGui.QPixmap(":/newPrefix/images/addressbook.png"), QtGui.QIcon.Selected, QtGui.QIcon.Off)
|
||||||
QtGui.QPixmap(_fromUtf8(":/newPrefix/images/addressbook.png")), QtGui.QIcon.Selected, QtGui.QIcon.Off
|
|
||||||
)
|
|
||||||
item.setIcon(icon3)
|
item.setIcon(icon3)
|
||||||
self.tableWidgetAddressBook.setHorizontalHeaderItem(0, item)
|
self.tableWidgetAddressBook.setHorizontalHeaderItem(0, item)
|
||||||
item = QtGui.QTableWidgetItem()
|
item = QtWidgets.QTableWidgetItem()
|
||||||
self.tableWidgetAddressBook.setHorizontalHeaderItem(1, item)
|
self.tableWidgetAddressBook.setHorizontalHeaderItem(1, item)
|
||||||
self.tableWidgetAddressBook.horizontalHeader().setCascadingSectionResizes(True)
|
self.tableWidgetAddressBook.horizontalHeader().setCascadingSectionResizes(True)
|
||||||
self.tableWidgetAddressBook.horizontalHeader().setDefaultSectionSize(200)
|
self.tableWidgetAddressBook.horizontalHeader().setDefaultSectionSize(200)
|
||||||
self.tableWidgetAddressBook.horizontalHeader().setHighlightSections(False)
|
self.tableWidgetAddressBook.horizontalHeader().setHighlightSections(False)
|
||||||
self.tableWidgetAddressBook.horizontalHeader().setStretchLastSection(True)
|
self.tableWidgetAddressBook.horizontalHeader().setStretchLastSection(True)
|
||||||
self.tableWidgetAddressBook.verticalHeader().setVisible(False)
|
self.tableWidgetAddressBook.verticalHeader().setVisible(False)
|
||||||
|
self.tableWidgetAddressBook.setWordWrap(False)
|
||||||
self.verticalSplitter_2.addWidget(self.tableWidgetAddressBook)
|
self.verticalSplitter_2.addWidget(self.tableWidgetAddressBook)
|
||||||
self.addressBookCompleter = AddressBookCompleter()
|
self.addressBookCompleter = AddressBookCompleter()
|
||||||
self.addressBookCompleter.setCompletionMode(QtGui.QCompleter.PopupCompletion)
|
self.addressBookCompleter.setCompletionMode(QtWidgets.QCompleter.PopupCompletion)
|
||||||
self.addressBookCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
|
self.addressBookCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
|
||||||
self.addressBookCompleterModel = QtGui.QStringListModel()
|
self.addressBookCompleterModel = QtCore.QStringListModel()
|
||||||
self.addressBookCompleter.setModel(self.addressBookCompleterModel)
|
self.addressBookCompleter.setModel(self.addressBookCompleterModel)
|
||||||
self.pushButtonAddAddressBook = QtGui.QPushButton(self.send)
|
self.pushButtonAddAddressBook = QtWidgets.QPushButton(self.send)
|
||||||
self.pushButtonAddAddressBook.setObjectName(_fromUtf8("pushButtonAddAddressBook"))
|
self.pushButtonAddAddressBook.setObjectName("pushButtonAddAddressBook")
|
||||||
self.pushButtonAddAddressBook.resize(200, self.pushButtonAddAddressBook.height())
|
self.pushButtonAddAddressBook.resize(200, self.pushButtonAddAddressBook.height())
|
||||||
self.verticalSplitter_2.addWidget(self.pushButtonAddAddressBook)
|
self.verticalSplitter_2.addWidget(self.pushButtonAddAddressBook)
|
||||||
self.pushButtonFetchNamecoinID = QtGui.QPushButton(self.send)
|
self.pushButtonFetchNamecoinID = QtWidgets.QPushButton(self.send)
|
||||||
self.pushButtonFetchNamecoinID.resize(200, self.pushButtonFetchNamecoinID.height())
|
self.pushButtonFetchNamecoinID.resize(200, self.pushButtonFetchNamecoinID.height())
|
||||||
self.pushButtonFetchNamecoinID.setObjectName(_fromUtf8("pushButtonFetchNamecoinID"))
|
self.pushButtonFetchNamecoinID.setObjectName("pushButtonFetchNamecoinID")
|
||||||
self.verticalSplitter_2.addWidget(self.pushButtonFetchNamecoinID)
|
self.verticalSplitter_2.addWidget(self.pushButtonFetchNamecoinID)
|
||||||
self.verticalSplitter_2.setStretchFactor(0, 1)
|
self.verticalSplitter_2.setStretchFactor(0, 1)
|
||||||
self.verticalSplitter_2.setStretchFactor(1, 0)
|
self.verticalSplitter_2.setStretchFactor(1, 0)
|
||||||
|
@ -218,45 +188,45 @@ class Ui_MainWindow(object):
|
||||||
self.verticalSplitter_2.handle(2).setEnabled(False)
|
self.verticalSplitter_2.handle(2).setEnabled(False)
|
||||||
self.horizontalSplitter.addWidget(self.verticalSplitter_2)
|
self.horizontalSplitter.addWidget(self.verticalSplitter_2)
|
||||||
self.verticalSplitter = settingsmixin.SSplitter()
|
self.verticalSplitter = settingsmixin.SSplitter()
|
||||||
self.verticalSplitter.setObjectName(_fromUtf8("verticalSplitter"))
|
self.verticalSplitter.setObjectName("verticalSplitter")
|
||||||
self.verticalSplitter.setOrientation(QtCore.Qt.Vertical)
|
self.verticalSplitter.setOrientation(QtCore.Qt.Vertical)
|
||||||
self.tabWidgetSend = QtGui.QTabWidget(self.send)
|
self.tabWidgetSend = QtWidgets.QTabWidget(self.send)
|
||||||
self.tabWidgetSend.setObjectName(_fromUtf8("tabWidgetSend"))
|
self.tabWidgetSend.setObjectName("tabWidgetSend")
|
||||||
self.sendDirect = QtGui.QWidget()
|
self.sendDirect = QtWidgets.QWidget()
|
||||||
self.sendDirect.setObjectName(_fromUtf8("sendDirect"))
|
self.sendDirect.setObjectName("sendDirect")
|
||||||
self.gridLayout_8 = QtGui.QGridLayout(self.sendDirect)
|
self.gridLayout_8 = QtWidgets.QGridLayout(self.sendDirect)
|
||||||
self.gridLayout_8.setObjectName(_fromUtf8("gridLayout_8"))
|
self.gridLayout_8.setObjectName("gridLayout_8")
|
||||||
self.verticalSplitter_5 = settingsmixin.SSplitter()
|
self.verticalSplitter_5 = settingsmixin.SSplitter()
|
||||||
self.verticalSplitter_5.setObjectName(_fromUtf8("verticalSplitter_5"))
|
self.verticalSplitter_5.setObjectName("verticalSplitter_5")
|
||||||
self.verticalSplitter_5.setOrientation(QtCore.Qt.Vertical)
|
self.verticalSplitter_5.setOrientation(QtCore.Qt.Vertical)
|
||||||
self.gridLayout_2 = QtGui.QGridLayout()
|
self.gridLayout_2 = QtWidgets.QGridLayout()
|
||||||
self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
|
self.gridLayout_2.setObjectName("gridLayout_2")
|
||||||
self.label_3 = QtGui.QLabel(self.sendDirect)
|
self.label_3 = QtWidgets.QLabel(self.sendDirect)
|
||||||
self.label_3.setObjectName(_fromUtf8("label_3"))
|
self.label_3.setObjectName("label_3")
|
||||||
self.gridLayout_2.addWidget(self.label_3, 2, 0, 1, 1)
|
self.gridLayout_2.addWidget(self.label_3, 2, 0, 1, 1)
|
||||||
self.label_2 = QtGui.QLabel(self.sendDirect)
|
self.label_2 = QtWidgets.QLabel(self.sendDirect)
|
||||||
self.label_2.setObjectName(_fromUtf8("label_2"))
|
self.label_2.setObjectName("label_2")
|
||||||
self.gridLayout_2.addWidget(self.label_2, 0, 0, 1, 1)
|
self.gridLayout_2.addWidget(self.label_2, 0, 0, 1, 1)
|
||||||
self.lineEditSubject = QtGui.QLineEdit(self.sendDirect)
|
self.lineEditSubject = QtWidgets.QLineEdit(self.sendDirect)
|
||||||
self.lineEditSubject.setText(_fromUtf8(""))
|
self.lineEditSubject.setText("")
|
||||||
self.lineEditSubject.setObjectName(_fromUtf8("lineEditSubject"))
|
self.lineEditSubject.setObjectName("lineEditSubject")
|
||||||
self.gridLayout_2.addWidget(self.lineEditSubject, 2, 1, 1, 1)
|
self.gridLayout_2.addWidget(self.lineEditSubject, 2, 1, 1, 1)
|
||||||
self.label = QtGui.QLabel(self.sendDirect)
|
self.label = QtWidgets.QLabel(self.sendDirect)
|
||||||
self.label.setObjectName(_fromUtf8("label"))
|
self.label.setObjectName("label")
|
||||||
self.gridLayout_2.addWidget(self.label, 1, 0, 1, 1)
|
self.gridLayout_2.addWidget(self.label, 1, 0, 1, 1)
|
||||||
self.comboBoxSendFrom = QtGui.QComboBox(self.sendDirect)
|
self.comboBoxSendFrom = QtWidgets.QComboBox(self.sendDirect)
|
||||||
self.comboBoxSendFrom.setMinimumSize(QtCore.QSize(300, 0))
|
self.comboBoxSendFrom.setMinimumSize(QtCore.QSize(300, 0))
|
||||||
self.comboBoxSendFrom.setObjectName(_fromUtf8("comboBoxSendFrom"))
|
self.comboBoxSendFrom.setObjectName("comboBoxSendFrom")
|
||||||
self.gridLayout_2.addWidget(self.comboBoxSendFrom, 0, 1, 1, 1)
|
self.gridLayout_2.addWidget(self.comboBoxSendFrom, 0, 1, 1, 1)
|
||||||
self.lineEditTo = QtGui.QLineEdit(self.sendDirect)
|
self.lineEditTo = QtWidgets.QLineEdit(self.sendDirect)
|
||||||
self.lineEditTo.setObjectName(_fromUtf8("lineEditTo"))
|
self.lineEditTo.setObjectName("lineEditTo")
|
||||||
self.gridLayout_2.addWidget(self.lineEditTo, 1, 1, 1, 1)
|
self.gridLayout_2.addWidget(self.lineEditTo, 1, 1, 1, 1)
|
||||||
self.lineEditTo.setCompleter(self.addressBookCompleter)
|
self.lineEditTo.setCompleter(self.addressBookCompleter)
|
||||||
self.gridLayout_2_Widget = QtGui.QWidget()
|
self.gridLayout_2_Widget = QtWidgets.QWidget()
|
||||||
self.gridLayout_2_Widget.setLayout(self.gridLayout_2)
|
self.gridLayout_2_Widget.setLayout(self.gridLayout_2)
|
||||||
self.verticalSplitter_5.addWidget(self.gridLayout_2_Widget)
|
self.verticalSplitter_5.addWidget(self.gridLayout_2_Widget)
|
||||||
self.textEditMessage = MessageCompose(self.sendDirect)
|
self.textEditMessage = MessageCompose(self.sendDirect)
|
||||||
self.textEditMessage.setObjectName(_fromUtf8("textEditMessage"))
|
self.textEditMessage.setObjectName("textEditMessage")
|
||||||
self.verticalSplitter_5.addWidget(self.textEditMessage)
|
self.verticalSplitter_5.addWidget(self.textEditMessage)
|
||||||
self.verticalSplitter_5.setStretchFactor(0, 0)
|
self.verticalSplitter_5.setStretchFactor(0, 0)
|
||||||
self.verticalSplitter_5.setStretchFactor(1, 1)
|
self.verticalSplitter_5.setStretchFactor(1, 1)
|
||||||
|
@ -264,35 +234,35 @@ class Ui_MainWindow(object):
|
||||||
self.verticalSplitter_5.setCollapsible(1, False)
|
self.verticalSplitter_5.setCollapsible(1, False)
|
||||||
self.verticalSplitter_5.handle(1).setEnabled(False)
|
self.verticalSplitter_5.handle(1).setEnabled(False)
|
||||||
self.gridLayout_8.addWidget(self.verticalSplitter_5, 0, 0, 1, 1)
|
self.gridLayout_8.addWidget(self.verticalSplitter_5, 0, 0, 1, 1)
|
||||||
self.tabWidgetSend.addTab(self.sendDirect, _fromUtf8(""))
|
self.tabWidgetSend.addTab(self.sendDirect, "")
|
||||||
self.sendBroadcast = QtGui.QWidget()
|
self.sendBroadcast = QtWidgets.QWidget()
|
||||||
self.sendBroadcast.setObjectName(_fromUtf8("sendBroadcast"))
|
self.sendBroadcast.setObjectName("sendBroadcast")
|
||||||
self.gridLayout_9 = QtGui.QGridLayout(self.sendBroadcast)
|
self.gridLayout_9 = QtWidgets.QGridLayout(self.sendBroadcast)
|
||||||
self.gridLayout_9.setObjectName(_fromUtf8("gridLayout_9"))
|
self.gridLayout_9.setObjectName("gridLayout_9")
|
||||||
self.verticalSplitter_6 = settingsmixin.SSplitter()
|
self.verticalSplitter_6 = settingsmixin.SSplitter()
|
||||||
self.verticalSplitter_6.setObjectName(_fromUtf8("verticalSplitter_6"))
|
self.verticalSplitter_6.setObjectName("verticalSplitter_6")
|
||||||
self.verticalSplitter_6.setOrientation(QtCore.Qt.Vertical)
|
self.verticalSplitter_6.setOrientation(QtCore.Qt.Vertical)
|
||||||
self.gridLayout_5 = QtGui.QGridLayout()
|
self.gridLayout_5 = QtWidgets.QGridLayout()
|
||||||
self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5"))
|
self.gridLayout_5.setObjectName("gridLayout_5")
|
||||||
self.label_8 = QtGui.QLabel(self.sendBroadcast)
|
self.label_8 = QtWidgets.QLabel(self.sendBroadcast)
|
||||||
self.label_8.setObjectName(_fromUtf8("label_8"))
|
self.label_8.setObjectName("label_8")
|
||||||
self.gridLayout_5.addWidget(self.label_8, 0, 0, 1, 1)
|
self.gridLayout_5.addWidget(self.label_8, 0, 0, 1, 1)
|
||||||
self.lineEditSubjectBroadcast = QtGui.QLineEdit(self.sendBroadcast)
|
self.lineEditSubjectBroadcast = QtWidgets.QLineEdit(self.sendBroadcast)
|
||||||
self.lineEditSubjectBroadcast.setText(_fromUtf8(""))
|
self.lineEditSubjectBroadcast.setText("")
|
||||||
self.lineEditSubjectBroadcast.setObjectName(_fromUtf8("lineEditSubjectBroadcast"))
|
self.lineEditSubjectBroadcast.setObjectName("lineEditSubjectBroadcast")
|
||||||
self.gridLayout_5.addWidget(self.lineEditSubjectBroadcast, 1, 1, 1, 1)
|
self.gridLayout_5.addWidget(self.lineEditSubjectBroadcast, 1, 1, 1, 1)
|
||||||
self.label_7 = QtGui.QLabel(self.sendBroadcast)
|
self.label_7 = QtWidgets.QLabel(self.sendBroadcast)
|
||||||
self.label_7.setObjectName(_fromUtf8("label_7"))
|
self.label_7.setObjectName("label_7")
|
||||||
self.gridLayout_5.addWidget(self.label_7, 1, 0, 1, 1)
|
self.gridLayout_5.addWidget(self.label_7, 1, 0, 1, 1)
|
||||||
self.comboBoxSendFromBroadcast = QtGui.QComboBox(self.sendBroadcast)
|
self.comboBoxSendFromBroadcast = QtWidgets.QComboBox(self.sendBroadcast)
|
||||||
self.comboBoxSendFromBroadcast.setMinimumSize(QtCore.QSize(300, 0))
|
self.comboBoxSendFromBroadcast.setMinimumSize(QtCore.QSize(300, 0))
|
||||||
self.comboBoxSendFromBroadcast.setObjectName(_fromUtf8("comboBoxSendFromBroadcast"))
|
self.comboBoxSendFromBroadcast.setObjectName("comboBoxSendFromBroadcast")
|
||||||
self.gridLayout_5.addWidget(self.comboBoxSendFromBroadcast, 0, 1, 1, 1)
|
self.gridLayout_5.addWidget(self.comboBoxSendFromBroadcast, 0, 1, 1, 1)
|
||||||
self.gridLayout_5_Widget = QtGui.QWidget()
|
self.gridLayout_5_Widget = QtWidgets.QWidget()
|
||||||
self.gridLayout_5_Widget.setLayout(self.gridLayout_5)
|
self.gridLayout_5_Widget.setLayout(self.gridLayout_5)
|
||||||
self.verticalSplitter_6.addWidget(self.gridLayout_5_Widget)
|
self.verticalSplitter_6.addWidget(self.gridLayout_5_Widget)
|
||||||
self.textEditMessageBroadcast = MessageCompose(self.sendBroadcast)
|
self.textEditMessageBroadcast = MessageCompose(self.sendBroadcast)
|
||||||
self.textEditMessageBroadcast.setObjectName(_fromUtf8("textEditMessageBroadcast"))
|
self.textEditMessageBroadcast.setObjectName("textEditMessageBroadcast")
|
||||||
self.verticalSplitter_6.addWidget(self.textEditMessageBroadcast)
|
self.verticalSplitter_6.addWidget(self.textEditMessageBroadcast)
|
||||||
self.verticalSplitter_6.setStretchFactor(0, 0)
|
self.verticalSplitter_6.setStretchFactor(0, 0)
|
||||||
self.verticalSplitter_6.setStretchFactor(1, 1)
|
self.verticalSplitter_6.setStretchFactor(1, 1)
|
||||||
|
@ -300,15 +270,15 @@ class Ui_MainWindow(object):
|
||||||
self.verticalSplitter_6.setCollapsible(1, False)
|
self.verticalSplitter_6.setCollapsible(1, False)
|
||||||
self.verticalSplitter_6.handle(1).setEnabled(False)
|
self.verticalSplitter_6.handle(1).setEnabled(False)
|
||||||
self.gridLayout_9.addWidget(self.verticalSplitter_6, 0, 0, 1, 1)
|
self.gridLayout_9.addWidget(self.verticalSplitter_6, 0, 0, 1, 1)
|
||||||
self.tabWidgetSend.addTab(self.sendBroadcast, _fromUtf8(""))
|
self.tabWidgetSend.addTab(self.sendBroadcast, "")
|
||||||
self.verticalSplitter.addWidget(self.tabWidgetSend)
|
self.verticalSplitter.addWidget(self.tabWidgetSend)
|
||||||
self.tTLContainer = QtGui.QWidget()
|
self.tTLContainer = QtWidgets.QWidget()
|
||||||
self.tTLContainer.setSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed)
|
self.tTLContainer.setSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed)
|
||||||
self.horizontalLayout_5 = QtGui.QHBoxLayout()
|
self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
|
||||||
self.tTLContainer.setLayout(self.horizontalLayout_5)
|
self.tTLContainer.setLayout(self.horizontalLayout_5)
|
||||||
self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5"))
|
self.horizontalLayout_5.setObjectName("horizontalLayout_5")
|
||||||
self.pushButtonTTL = QtGui.QPushButton(self.send)
|
self.pushButtonTTL = QtWidgets.QPushButton(self.send)
|
||||||
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed)
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed)
|
||||||
sizePolicy.setHorizontalStretch(0)
|
sizePolicy.setHorizontalStretch(0)
|
||||||
sizePolicy.setVerticalStretch(0)
|
sizePolicy.setVerticalStretch(0)
|
||||||
sizePolicy.setHeightForWidth(self.pushButtonTTL.sizePolicy().hasHeightForWidth())
|
sizePolicy.setHeightForWidth(self.pushButtonTTL.sizePolicy().hasHeightForWidth())
|
||||||
|
@ -328,29 +298,29 @@ class Ui_MainWindow(object):
|
||||||
font.setUnderline(True)
|
font.setUnderline(True)
|
||||||
self.pushButtonTTL.setFont(font)
|
self.pushButtonTTL.setFont(font)
|
||||||
self.pushButtonTTL.setFlat(True)
|
self.pushButtonTTL.setFlat(True)
|
||||||
self.pushButtonTTL.setObjectName(_fromUtf8("pushButtonTTL"))
|
self.pushButtonTTL.setObjectName("pushButtonTTL")
|
||||||
self.horizontalLayout_5.addWidget(self.pushButtonTTL, 0, QtCore.Qt.AlignRight)
|
self.horizontalLayout_5.addWidget(self.pushButtonTTL, 0, QtCore.Qt.AlignRight)
|
||||||
self.horizontalSliderTTL = QtGui.QSlider(self.send)
|
self.horizontalSliderTTL = QtWidgets.QSlider(self.send)
|
||||||
self.horizontalSliderTTL.setMinimumSize(QtCore.QSize(70, 0))
|
self.horizontalSliderTTL.setMinimumSize(QtCore.QSize(70, 0))
|
||||||
self.horizontalSliderTTL.setOrientation(QtCore.Qt.Horizontal)
|
self.horizontalSliderTTL.setOrientation(QtCore.Qt.Horizontal)
|
||||||
self.horizontalSliderTTL.setInvertedAppearance(False)
|
self.horizontalSliderTTL.setInvertedAppearance(False)
|
||||||
self.horizontalSliderTTL.setInvertedControls(False)
|
self.horizontalSliderTTL.setInvertedControls(False)
|
||||||
self.horizontalSliderTTL.setObjectName(_fromUtf8("horizontalSliderTTL"))
|
self.horizontalSliderTTL.setObjectName("horizontalSliderTTL")
|
||||||
self.horizontalLayout_5.addWidget(self.horizontalSliderTTL, 0, QtCore.Qt.AlignLeft)
|
self.horizontalLayout_5.addWidget(self.horizontalSliderTTL, 0, QtCore.Qt.AlignLeft)
|
||||||
self.labelHumanFriendlyTTLDescription = QtGui.QLabel(self.send)
|
self.labelHumanFriendlyTTLDescription = QtWidgets.QLabel(self.send)
|
||||||
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed)
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed)
|
||||||
sizePolicy.setHorizontalStretch(0)
|
sizePolicy.setHorizontalStretch(0)
|
||||||
sizePolicy.setVerticalStretch(0)
|
sizePolicy.setVerticalStretch(0)
|
||||||
sizePolicy.setHeightForWidth(self.labelHumanFriendlyTTLDescription.sizePolicy().hasHeightForWidth())
|
sizePolicy.setHeightForWidth(self.labelHumanFriendlyTTLDescription.sizePolicy().hasHeightForWidth())
|
||||||
self.labelHumanFriendlyTTLDescription.setSizePolicy(sizePolicy)
|
self.labelHumanFriendlyTTLDescription.setSizePolicy(sizePolicy)
|
||||||
self.labelHumanFriendlyTTLDescription.setMinimumSize(QtCore.QSize(45, 0))
|
self.labelHumanFriendlyTTLDescription.setMinimumSize(QtCore.QSize(45, 0))
|
||||||
self.labelHumanFriendlyTTLDescription.setObjectName(_fromUtf8("labelHumanFriendlyTTLDescription"))
|
self.labelHumanFriendlyTTLDescription.setObjectName("labelHumanFriendlyTTLDescription")
|
||||||
self.horizontalLayout_5.addWidget(self.labelHumanFriendlyTTLDescription, 1, QtCore.Qt.AlignLeft)
|
self.horizontalLayout_5.addWidget(self.labelHumanFriendlyTTLDescription, 1, QtCore.Qt.AlignLeft)
|
||||||
self.pushButtonClear = QtGui.QPushButton(self.send)
|
self.pushButtonClear = QtWidgets.QPushButton(self.send)
|
||||||
self.pushButtonClear.setObjectName(_fromUtf8("pushButtonClear"))
|
self.pushButtonClear.setObjectName("pushButtonClear")
|
||||||
self.horizontalLayout_5.addWidget(self.pushButtonClear, 0, QtCore.Qt.AlignRight)
|
self.horizontalLayout_5.addWidget(self.pushButtonClear, 0, QtCore.Qt.AlignRight)
|
||||||
self.pushButtonSend = QtGui.QPushButton(self.send)
|
self.pushButtonSend = QtWidgets.QPushButton(self.send)
|
||||||
self.pushButtonSend.setObjectName(_fromUtf8("pushButtonSend"))
|
self.pushButtonSend.setObjectName("pushButtonSend")
|
||||||
self.horizontalLayout_5.addWidget(self.pushButtonSend, 0, QtCore.Qt.AlignRight)
|
self.horizontalLayout_5.addWidget(self.pushButtonSend, 0, QtCore.Qt.AlignRight)
|
||||||
self.horizontalSliderTTL.setMaximumSize(QtCore.QSize(105, self.pushButtonSend.height()))
|
self.horizontalSliderTTL.setMaximumSize(QtCore.QSize(105, self.pushButtonSend.height()))
|
||||||
self.verticalSplitter.addWidget(self.tTLContainer)
|
self.verticalSplitter.addWidget(self.tTLContainer)
|
||||||
|
@ -367,31 +337,29 @@ class Ui_MainWindow(object):
|
||||||
self.horizontalSplitter.setCollapsible(1, False)
|
self.horizontalSplitter.setCollapsible(1, False)
|
||||||
self.gridLayout_7.addWidget(self.horizontalSplitter, 0, 0, 1, 1)
|
self.gridLayout_7.addWidget(self.horizontalSplitter, 0, 0, 1, 1)
|
||||||
icon4 = QtGui.QIcon()
|
icon4 = QtGui.QIcon()
|
||||||
icon4.addPixmap(QtGui.QPixmap(_fromUtf8(":/newPrefix/images/send.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
icon4.addPixmap(QtGui.QPixmap(":/newPrefix/images/send.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
||||||
self.tabWidget.addTab(self.send, icon4, _fromUtf8(""))
|
self.tabWidget.addTab(self.send, icon4, "")
|
||||||
self.subscriptions = QtGui.QWidget()
|
self.subscriptions = QtWidgets.QWidget()
|
||||||
self.subscriptions.setObjectName(_fromUtf8("subscriptions"))
|
self.subscriptions.setObjectName("subscriptions")
|
||||||
self.gridLayout_3 = QtGui.QGridLayout(self.subscriptions)
|
self.gridLayout_3 = QtWidgets.QGridLayout(self.subscriptions)
|
||||||
self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
|
self.gridLayout_3.setObjectName("gridLayout_3")
|
||||||
self.horizontalSplitter_4 = settingsmixin.SSplitter()
|
self.horizontalSplitter_4 = settingsmixin.SSplitter()
|
||||||
self.horizontalSplitter_4.setObjectName(_fromUtf8("horizontalSplitter_4"))
|
self.horizontalSplitter_4.setObjectName("horizontalSplitter_4")
|
||||||
self.verticalSplitter_3 = settingsmixin.SSplitter()
|
self.verticalSplitter_3 = settingsmixin.SSplitter()
|
||||||
self.verticalSplitter_3.setObjectName(_fromUtf8("verticalSplitter_3"))
|
self.verticalSplitter_3.setObjectName("verticalSplitter_3")
|
||||||
self.verticalSplitter_3.setOrientation(QtCore.Qt.Vertical)
|
self.verticalSplitter_3.setOrientation(QtCore.Qt.Vertical)
|
||||||
self.treeWidgetSubscriptions = settingsmixin.STreeWidget(self.subscriptions)
|
self.treeWidgetSubscriptions = settingsmixin.STreeWidget(self.subscriptions)
|
||||||
self.treeWidgetSubscriptions.setAlternatingRowColors(True)
|
self.treeWidgetSubscriptions.setAlternatingRowColors(True)
|
||||||
self.treeWidgetSubscriptions.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
|
self.treeWidgetSubscriptions.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
|
||||||
self.treeWidgetSubscriptions.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
|
self.treeWidgetSubscriptions.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
|
||||||
self.treeWidgetSubscriptions.setObjectName(_fromUtf8("treeWidgetSubscriptions"))
|
self.treeWidgetSubscriptions.setObjectName("treeWidgetSubscriptions")
|
||||||
self.treeWidgetSubscriptions.resize(200, self.treeWidgetSubscriptions.height())
|
self.treeWidgetSubscriptions.resize(200, self.treeWidgetSubscriptions.height())
|
||||||
icon5 = QtGui.QIcon()
|
icon5 = QtGui.QIcon()
|
||||||
icon5.addPixmap(
|
icon5.addPixmap(QtGui.QPixmap(":/newPrefix/images/subscriptions.png"), QtGui.QIcon.Selected, QtGui.QIcon.Off)
|
||||||
QtGui.QPixmap(_fromUtf8(":/newPrefix/images/subscriptions.png")), QtGui.QIcon.Selected, QtGui.QIcon.Off
|
|
||||||
)
|
|
||||||
self.treeWidgetSubscriptions.headerItem().setIcon(0, icon5)
|
self.treeWidgetSubscriptions.headerItem().setIcon(0, icon5)
|
||||||
self.verticalSplitter_3.addWidget(self.treeWidgetSubscriptions)
|
self.verticalSplitter_3.addWidget(self.treeWidgetSubscriptions)
|
||||||
self.pushButtonAddSubscription = QtGui.QPushButton(self.subscriptions)
|
self.pushButtonAddSubscription = QtWidgets.QPushButton(self.subscriptions)
|
||||||
self.pushButtonAddSubscription.setObjectName(_fromUtf8("pushButtonAddSubscription"))
|
self.pushButtonAddSubscription.setObjectName("pushButtonAddSubscription")
|
||||||
self.pushButtonAddSubscription.resize(200, self.pushButtonAddSubscription.height())
|
self.pushButtonAddSubscription.resize(200, self.pushButtonAddSubscription.height())
|
||||||
self.verticalSplitter_3.addWidget(self.pushButtonAddSubscription)
|
self.verticalSplitter_3.addWidget(self.pushButtonAddSubscription)
|
||||||
self.verticalSplitter_3.setStretchFactor(0, 1)
|
self.verticalSplitter_3.setStretchFactor(0, 1)
|
||||||
|
@ -401,20 +369,20 @@ class Ui_MainWindow(object):
|
||||||
self.verticalSplitter_3.handle(1).setEnabled(False)
|
self.verticalSplitter_3.handle(1).setEnabled(False)
|
||||||
self.horizontalSplitter_4.addWidget(self.verticalSplitter_3)
|
self.horizontalSplitter_4.addWidget(self.verticalSplitter_3)
|
||||||
self.verticalSplitter_4 = settingsmixin.SSplitter()
|
self.verticalSplitter_4 = settingsmixin.SSplitter()
|
||||||
self.verticalSplitter_4.setObjectName(_fromUtf8("verticalSplitter_4"))
|
self.verticalSplitter_4.setObjectName("verticalSplitter_4")
|
||||||
self.verticalSplitter_4.setOrientation(QtCore.Qt.Vertical)
|
self.verticalSplitter_4.setOrientation(QtCore.Qt.Vertical)
|
||||||
self.horizontalSplitter_2 = QtGui.QSplitter()
|
self.horizontalSplitter_2 = QtWidgets.QSplitter()
|
||||||
self.horizontalSplitter_2.setObjectName(_fromUtf8("horizontalSplitter_2"))
|
self.horizontalSplitter_2.setObjectName("horizontalSplitter_2")
|
||||||
self.inboxSearchLineEditSubscriptions = QtGui.QLineEdit(self.subscriptions)
|
self.inboxSearchLineEditSubscriptions = QtWidgets.QLineEdit(self.subscriptions)
|
||||||
self.inboxSearchLineEditSubscriptions.setObjectName(_fromUtf8("inboxSearchLineEditSubscriptions"))
|
self.inboxSearchLineEditSubscriptions.setObjectName("inboxSearchLineEditSubscriptions")
|
||||||
self.horizontalSplitter_2.addWidget(self.inboxSearchLineEditSubscriptions)
|
self.horizontalSplitter_2.addWidget(self.inboxSearchLineEditSubscriptions)
|
||||||
self.inboxSearchOptionSubscriptions = QtGui.QComboBox(self.subscriptions)
|
self.inboxSearchOptionSubscriptions = QtWidgets.QComboBox(self.subscriptions)
|
||||||
self.inboxSearchOptionSubscriptions.setObjectName(_fromUtf8("inboxSearchOptionSubscriptions"))
|
self.inboxSearchOptionSubscriptions.setObjectName("inboxSearchOptionSubscriptions")
|
||||||
self.inboxSearchOptionSubscriptions.addItem(_fromUtf8(""))
|
self.inboxSearchOptionSubscriptions.addItem("")
|
||||||
self.inboxSearchOptionSubscriptions.addItem(_fromUtf8(""))
|
self.inboxSearchOptionSubscriptions.addItem("")
|
||||||
self.inboxSearchOptionSubscriptions.addItem(_fromUtf8(""))
|
self.inboxSearchOptionSubscriptions.addItem("")
|
||||||
self.inboxSearchOptionSubscriptions.addItem(_fromUtf8(""))
|
self.inboxSearchOptionSubscriptions.addItem("")
|
||||||
self.inboxSearchOptionSubscriptions.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
|
self.inboxSearchOptionSubscriptions.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToContents)
|
||||||
self.inboxSearchOptionSubscriptions.setCurrentIndex(2)
|
self.inboxSearchOptionSubscriptions.setCurrentIndex(2)
|
||||||
self.horizontalSplitter_2.addWidget(self.inboxSearchOptionSubscriptions)
|
self.horizontalSplitter_2.addWidget(self.inboxSearchOptionSubscriptions)
|
||||||
self.horizontalSplitter_2.handle(1).setEnabled(False)
|
self.horizontalSplitter_2.handle(1).setEnabled(False)
|
||||||
|
@ -422,21 +390,21 @@ class Ui_MainWindow(object):
|
||||||
self.horizontalSplitter_2.setStretchFactor(1, 0)
|
self.horizontalSplitter_2.setStretchFactor(1, 0)
|
||||||
self.verticalSplitter_4.addWidget(self.horizontalSplitter_2)
|
self.verticalSplitter_4.addWidget(self.horizontalSplitter_2)
|
||||||
self.tableWidgetInboxSubscriptions = settingsmixin.STableWidget(self.subscriptions)
|
self.tableWidgetInboxSubscriptions = settingsmixin.STableWidget(self.subscriptions)
|
||||||
self.tableWidgetInboxSubscriptions.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
|
self.tableWidgetInboxSubscriptions.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
|
||||||
self.tableWidgetInboxSubscriptions.setAlternatingRowColors(True)
|
self.tableWidgetInboxSubscriptions.setAlternatingRowColors(True)
|
||||||
self.tableWidgetInboxSubscriptions.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
|
self.tableWidgetInboxSubscriptions.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
|
||||||
self.tableWidgetInboxSubscriptions.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
|
self.tableWidgetInboxSubscriptions.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
|
||||||
self.tableWidgetInboxSubscriptions.setWordWrap(False)
|
self.tableWidgetInboxSubscriptions.setWordWrap(False)
|
||||||
self.tableWidgetInboxSubscriptions.setObjectName(_fromUtf8("tableWidgetInboxSubscriptions"))
|
self.tableWidgetInboxSubscriptions.setObjectName("tableWidgetInboxSubscriptions")
|
||||||
self.tableWidgetInboxSubscriptions.setColumnCount(4)
|
self.tableWidgetInboxSubscriptions.setColumnCount(4)
|
||||||
self.tableWidgetInboxSubscriptions.setRowCount(0)
|
self.tableWidgetInboxSubscriptions.setRowCount(0)
|
||||||
item = QtGui.QTableWidgetItem()
|
item = QtWidgets.QTableWidgetItem()
|
||||||
self.tableWidgetInboxSubscriptions.setHorizontalHeaderItem(0, item)
|
self.tableWidgetInboxSubscriptions.setHorizontalHeaderItem(0, item)
|
||||||
item = QtGui.QTableWidgetItem()
|
item = QtWidgets.QTableWidgetItem()
|
||||||
self.tableWidgetInboxSubscriptions.setHorizontalHeaderItem(1, item)
|
self.tableWidgetInboxSubscriptions.setHorizontalHeaderItem(1, item)
|
||||||
item = QtGui.QTableWidgetItem()
|
item = QtWidgets.QTableWidgetItem()
|
||||||
self.tableWidgetInboxSubscriptions.setHorizontalHeaderItem(2, item)
|
self.tableWidgetInboxSubscriptions.setHorizontalHeaderItem(2, item)
|
||||||
item = QtGui.QTableWidgetItem()
|
item = QtWidgets.QTableWidgetItem()
|
||||||
self.tableWidgetInboxSubscriptions.setHorizontalHeaderItem(3, item)
|
self.tableWidgetInboxSubscriptions.setHorizontalHeaderItem(3, item)
|
||||||
self.tableWidgetInboxSubscriptions.horizontalHeader().setCascadingSectionResizes(True)
|
self.tableWidgetInboxSubscriptions.horizontalHeader().setCascadingSectionResizes(True)
|
||||||
self.tableWidgetInboxSubscriptions.horizontalHeader().setDefaultSectionSize(200)
|
self.tableWidgetInboxSubscriptions.horizontalHeader().setDefaultSectionSize(200)
|
||||||
|
@ -450,7 +418,7 @@ class Ui_MainWindow(object):
|
||||||
self.textEditInboxMessageSubscriptions = MessageView(self.subscriptions)
|
self.textEditInboxMessageSubscriptions = MessageView(self.subscriptions)
|
||||||
self.textEditInboxMessageSubscriptions.setBaseSize(QtCore.QSize(0, 500))
|
self.textEditInboxMessageSubscriptions.setBaseSize(QtCore.QSize(0, 500))
|
||||||
self.textEditInboxMessageSubscriptions.setReadOnly(True)
|
self.textEditInboxMessageSubscriptions.setReadOnly(True)
|
||||||
self.textEditInboxMessageSubscriptions.setObjectName(_fromUtf8("textEditInboxMessageSubscriptions"))
|
self.textEditInboxMessageSubscriptions.setObjectName("textEditInboxMessageSubscriptions")
|
||||||
self.verticalSplitter_4.addWidget(self.textEditInboxMessageSubscriptions)
|
self.verticalSplitter_4.addWidget(self.textEditInboxMessageSubscriptions)
|
||||||
self.verticalSplitter_4.setStretchFactor(0, 0)
|
self.verticalSplitter_4.setStretchFactor(0, 0)
|
||||||
self.verticalSplitter_4.setStretchFactor(1, 1)
|
self.verticalSplitter_4.setStretchFactor(1, 1)
|
||||||
|
@ -466,35 +434,31 @@ class Ui_MainWindow(object):
|
||||||
self.horizontalSplitter_4.setCollapsible(1, False)
|
self.horizontalSplitter_4.setCollapsible(1, False)
|
||||||
self.gridLayout_3.addWidget(self.horizontalSplitter_4, 0, 0, 1, 1)
|
self.gridLayout_3.addWidget(self.horizontalSplitter_4, 0, 0, 1, 1)
|
||||||
icon6 = QtGui.QIcon()
|
icon6 = QtGui.QIcon()
|
||||||
icon6.addPixmap(
|
icon6.addPixmap(QtGui.QPixmap(":/newPrefix/images/subscriptions.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
||||||
QtGui.QPixmap(_fromUtf8(":/newPrefix/images/subscriptions.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off
|
self.tabWidget.addTab(self.subscriptions, icon6, "")
|
||||||
)
|
self.chans = QtWidgets.QWidget()
|
||||||
self.tabWidget.addTab(self.subscriptions, icon6, _fromUtf8(""))
|
self.chans.setObjectName("chans")
|
||||||
self.chans = QtGui.QWidget()
|
self.gridLayout_4 = QtWidgets.QGridLayout(self.chans)
|
||||||
self.chans.setObjectName(_fromUtf8("chans"))
|
self.gridLayout_4.setObjectName("gridLayout_4")
|
||||||
self.gridLayout_4 = QtGui.QGridLayout(self.chans)
|
|
||||||
self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4"))
|
|
||||||
self.horizontalSplitter_7 = settingsmixin.SSplitter()
|
self.horizontalSplitter_7 = settingsmixin.SSplitter()
|
||||||
self.horizontalSplitter_7.setObjectName(_fromUtf8("horizontalSplitter_7"))
|
self.horizontalSplitter_7.setObjectName("horizontalSplitter_7")
|
||||||
self.verticalSplitter_17 = settingsmixin.SSplitter()
|
self.verticalSplitter_17 = settingsmixin.SSplitter()
|
||||||
self.verticalSplitter_17.setObjectName(_fromUtf8("verticalSplitter_17"))
|
self.verticalSplitter_17.setObjectName("verticalSplitter_17")
|
||||||
self.verticalSplitter_17.setOrientation(QtCore.Qt.Vertical)
|
self.verticalSplitter_17.setOrientation(QtCore.Qt.Vertical)
|
||||||
self.treeWidgetChans = settingsmixin.STreeWidget(self.chans)
|
self.treeWidgetChans = settingsmixin.STreeWidget(self.chans)
|
||||||
self.treeWidgetChans.setFrameShadow(QtGui.QFrame.Sunken)
|
self.treeWidgetChans.setFrameShadow(QtWidgets.QFrame.Sunken)
|
||||||
self.treeWidgetChans.setLineWidth(1)
|
self.treeWidgetChans.setLineWidth(1)
|
||||||
self.treeWidgetChans.setAlternatingRowColors(True)
|
self.treeWidgetChans.setAlternatingRowColors(True)
|
||||||
self.treeWidgetChans.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
|
self.treeWidgetChans.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
|
||||||
self.treeWidgetChans.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
|
self.treeWidgetChans.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
|
||||||
self.treeWidgetChans.setObjectName(_fromUtf8("treeWidgetChans"))
|
self.treeWidgetChans.setObjectName("treeWidgetChans")
|
||||||
self.treeWidgetChans.resize(200, self.treeWidgetChans.height())
|
self.treeWidgetChans.resize(200, self.treeWidgetChans.height())
|
||||||
icon7 = QtGui.QIcon()
|
icon7 = QtGui.QIcon()
|
||||||
icon7.addPixmap(
|
icon7.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), QtGui.QIcon.Selected, QtGui.QIcon.Off)
|
||||||
QtGui.QPixmap(_fromUtf8(":/newPrefix/images/can-icon-16px.png")), QtGui.QIcon.Selected, QtGui.QIcon.Off
|
|
||||||
)
|
|
||||||
self.treeWidgetChans.headerItem().setIcon(0, icon7)
|
self.treeWidgetChans.headerItem().setIcon(0, icon7)
|
||||||
self.verticalSplitter_17.addWidget(self.treeWidgetChans)
|
self.verticalSplitter_17.addWidget(self.treeWidgetChans)
|
||||||
self.pushButtonAddChan = QtGui.QPushButton(self.chans)
|
self.pushButtonAddChan = QtWidgets.QPushButton(self.chans)
|
||||||
self.pushButtonAddChan.setObjectName(_fromUtf8("pushButtonAddChan"))
|
self.pushButtonAddChan.setObjectName("pushButtonAddChan")
|
||||||
self.pushButtonAddChan.resize(200, self.pushButtonAddChan.height())
|
self.pushButtonAddChan.resize(200, self.pushButtonAddChan.height())
|
||||||
self.verticalSplitter_17.addWidget(self.pushButtonAddChan)
|
self.verticalSplitter_17.addWidget(self.pushButtonAddChan)
|
||||||
self.verticalSplitter_17.setStretchFactor(0, 1)
|
self.verticalSplitter_17.setStretchFactor(0, 1)
|
||||||
|
@ -504,21 +468,21 @@ class Ui_MainWindow(object):
|
||||||
self.verticalSplitter_17.handle(1).setEnabled(False)
|
self.verticalSplitter_17.handle(1).setEnabled(False)
|
||||||
self.horizontalSplitter_7.addWidget(self.verticalSplitter_17)
|
self.horizontalSplitter_7.addWidget(self.verticalSplitter_17)
|
||||||
self.verticalSplitter_8 = settingsmixin.SSplitter()
|
self.verticalSplitter_8 = settingsmixin.SSplitter()
|
||||||
self.verticalSplitter_8.setObjectName(_fromUtf8("verticalSplitter_8"))
|
self.verticalSplitter_8.setObjectName("verticalSplitter_8")
|
||||||
self.verticalSplitter_8.setOrientation(QtCore.Qt.Vertical)
|
self.verticalSplitter_8.setOrientation(QtCore.Qt.Vertical)
|
||||||
self.horizontalSplitter_6 = QtGui.QSplitter()
|
self.horizontalSplitter_6 = QtWidgets.QSplitter()
|
||||||
self.horizontalSplitter_6.setObjectName(_fromUtf8("horizontalSplitter_6"))
|
self.horizontalSplitter_6.setObjectName("horizontalSplitter_6")
|
||||||
self.inboxSearchLineEditChans = QtGui.QLineEdit(self.chans)
|
self.inboxSearchLineEditChans = QtWidgets.QLineEdit(self.chans)
|
||||||
self.inboxSearchLineEditChans.setObjectName(_fromUtf8("inboxSearchLineEditChans"))
|
self.inboxSearchLineEditChans.setObjectName("inboxSearchLineEditChans")
|
||||||
self.horizontalSplitter_6.addWidget(self.inboxSearchLineEditChans)
|
self.horizontalSplitter_6.addWidget(self.inboxSearchLineEditChans)
|
||||||
self.inboxSearchOptionChans = QtGui.QComboBox(self.chans)
|
self.inboxSearchOptionChans = QtWidgets.QComboBox(self.chans)
|
||||||
self.inboxSearchOptionChans.setObjectName(_fromUtf8("inboxSearchOptionChans"))
|
self.inboxSearchOptionChans.setObjectName("inboxSearchOptionChans")
|
||||||
self.inboxSearchOptionChans.addItem(_fromUtf8(""))
|
self.inboxSearchOptionChans.addItem("")
|
||||||
self.inboxSearchOptionChans.addItem(_fromUtf8(""))
|
self.inboxSearchOptionChans.addItem("")
|
||||||
self.inboxSearchOptionChans.addItem(_fromUtf8(""))
|
self.inboxSearchOptionChans.addItem("")
|
||||||
self.inboxSearchOptionChans.addItem(_fromUtf8(""))
|
self.inboxSearchOptionChans.addItem("")
|
||||||
self.inboxSearchOptionChans.addItem(_fromUtf8(""))
|
self.inboxSearchOptionChans.addItem("")
|
||||||
self.inboxSearchOptionChans.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
|
self.inboxSearchOptionChans.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToContents)
|
||||||
self.inboxSearchOptionChans.setCurrentIndex(3)
|
self.inboxSearchOptionChans.setCurrentIndex(3)
|
||||||
self.horizontalSplitter_6.addWidget(self.inboxSearchOptionChans)
|
self.horizontalSplitter_6.addWidget(self.inboxSearchOptionChans)
|
||||||
self.horizontalSplitter_6.handle(1).setEnabled(False)
|
self.horizontalSplitter_6.handle(1).setEnabled(False)
|
||||||
|
@ -526,21 +490,21 @@ class Ui_MainWindow(object):
|
||||||
self.horizontalSplitter_6.setStretchFactor(1, 0)
|
self.horizontalSplitter_6.setStretchFactor(1, 0)
|
||||||
self.verticalSplitter_8.addWidget(self.horizontalSplitter_6)
|
self.verticalSplitter_8.addWidget(self.horizontalSplitter_6)
|
||||||
self.tableWidgetInboxChans = settingsmixin.STableWidget(self.chans)
|
self.tableWidgetInboxChans = settingsmixin.STableWidget(self.chans)
|
||||||
self.tableWidgetInboxChans.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
|
self.tableWidgetInboxChans.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
|
||||||
self.tableWidgetInboxChans.setAlternatingRowColors(True)
|
self.tableWidgetInboxChans.setAlternatingRowColors(True)
|
||||||
self.tableWidgetInboxChans.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
|
self.tableWidgetInboxChans.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
|
||||||
self.tableWidgetInboxChans.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
|
self.tableWidgetInboxChans.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
|
||||||
self.tableWidgetInboxChans.setWordWrap(False)
|
self.tableWidgetInboxChans.setWordWrap(False)
|
||||||
self.tableWidgetInboxChans.setObjectName(_fromUtf8("tableWidgetInboxChans"))
|
self.tableWidgetInboxChans.setObjectName("tableWidgetInboxChans")
|
||||||
self.tableWidgetInboxChans.setColumnCount(4)
|
self.tableWidgetInboxChans.setColumnCount(4)
|
||||||
self.tableWidgetInboxChans.setRowCount(0)
|
self.tableWidgetInboxChans.setRowCount(0)
|
||||||
item = QtGui.QTableWidgetItem()
|
item = QtWidgets.QTableWidgetItem()
|
||||||
self.tableWidgetInboxChans.setHorizontalHeaderItem(0, item)
|
self.tableWidgetInboxChans.setHorizontalHeaderItem(0, item)
|
||||||
item = QtGui.QTableWidgetItem()
|
item = QtWidgets.QTableWidgetItem()
|
||||||
self.tableWidgetInboxChans.setHorizontalHeaderItem(1, item)
|
self.tableWidgetInboxChans.setHorizontalHeaderItem(1, item)
|
||||||
item = QtGui.QTableWidgetItem()
|
item = QtWidgets.QTableWidgetItem()
|
||||||
self.tableWidgetInboxChans.setHorizontalHeaderItem(2, item)
|
self.tableWidgetInboxChans.setHorizontalHeaderItem(2, item)
|
||||||
item = QtGui.QTableWidgetItem()
|
item = QtWidgets.QTableWidgetItem()
|
||||||
self.tableWidgetInboxChans.setHorizontalHeaderItem(3, item)
|
self.tableWidgetInboxChans.setHorizontalHeaderItem(3, item)
|
||||||
self.tableWidgetInboxChans.horizontalHeader().setCascadingSectionResizes(True)
|
self.tableWidgetInboxChans.horizontalHeader().setCascadingSectionResizes(True)
|
||||||
self.tableWidgetInboxChans.horizontalHeader().setDefaultSectionSize(200)
|
self.tableWidgetInboxChans.horizontalHeader().setDefaultSectionSize(200)
|
||||||
|
@ -554,7 +518,7 @@ class Ui_MainWindow(object):
|
||||||
self.textEditInboxMessageChans = MessageView(self.chans)
|
self.textEditInboxMessageChans = MessageView(self.chans)
|
||||||
self.textEditInboxMessageChans.setBaseSize(QtCore.QSize(0, 500))
|
self.textEditInboxMessageChans.setBaseSize(QtCore.QSize(0, 500))
|
||||||
self.textEditInboxMessageChans.setReadOnly(True)
|
self.textEditInboxMessageChans.setReadOnly(True)
|
||||||
self.textEditInboxMessageChans.setObjectName(_fromUtf8("textEditInboxMessageChans"))
|
self.textEditInboxMessageChans.setObjectName("textEditInboxMessageChans")
|
||||||
self.verticalSplitter_8.addWidget(self.textEditInboxMessageChans)
|
self.verticalSplitter_8.addWidget(self.textEditInboxMessageChans)
|
||||||
self.verticalSplitter_8.setStretchFactor(0, 0)
|
self.verticalSplitter_8.setStretchFactor(0, 0)
|
||||||
self.verticalSplitter_8.setStretchFactor(1, 1)
|
self.verticalSplitter_8.setStretchFactor(1, 1)
|
||||||
|
@ -570,10 +534,8 @@ class Ui_MainWindow(object):
|
||||||
self.horizontalSplitter_7.setCollapsible(1, False)
|
self.horizontalSplitter_7.setCollapsible(1, False)
|
||||||
self.gridLayout_4.addWidget(self.horizontalSplitter_7, 0, 0, 1, 1)
|
self.gridLayout_4.addWidget(self.horizontalSplitter_7, 0, 0, 1, 1)
|
||||||
icon8 = QtGui.QIcon()
|
icon8 = QtGui.QIcon()
|
||||||
icon8.addPixmap(
|
icon8.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
||||||
QtGui.QPixmap(_fromUtf8(":/newPrefix/images/can-icon-16px.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off
|
self.tabWidget.addTab(self.chans, icon8, "")
|
||||||
)
|
|
||||||
self.tabWidget.addTab(self.chans, icon8, _fromUtf8(""))
|
|
||||||
self.blackwhitelist = Blacklist()
|
self.blackwhitelist = Blacklist()
|
||||||
self.tabWidget.addTab(self.blackwhitelist, QtGui.QIcon(":/newPrefix/images/blacklist.png"), "")
|
self.tabWidget.addTab(self.blackwhitelist, QtGui.QIcon(":/newPrefix/images/blacklist.png"), "")
|
||||||
# Initialize the Blacklist or Whitelist
|
# Initialize the Blacklist or Whitelist
|
||||||
|
@ -585,62 +547,62 @@ class Ui_MainWindow(object):
|
||||||
self.tabWidget.addTab(self.networkstatus, QtGui.QIcon(":/newPrefix/images/networkstatus.png"), "")
|
self.tabWidget.addTab(self.networkstatus, QtGui.QIcon(":/newPrefix/images/networkstatus.png"), "")
|
||||||
self.gridLayout_10.addWidget(self.tabWidget, 0, 0, 1, 1)
|
self.gridLayout_10.addWidget(self.tabWidget, 0, 0, 1, 1)
|
||||||
MainWindow.setCentralWidget(self.centralwidget)
|
MainWindow.setCentralWidget(self.centralwidget)
|
||||||
self.menubar = QtGui.QMenuBar(MainWindow)
|
self.menubar = QtWidgets.QMenuBar(MainWindow)
|
||||||
self.menubar.setGeometry(QtCore.QRect(0, 0, 885, 27))
|
self.menubar.setGeometry(QtCore.QRect(0, 0, 885, 27))
|
||||||
self.menubar.setObjectName(_fromUtf8("menubar"))
|
self.menubar.setObjectName("menubar")
|
||||||
self.menuFile = QtGui.QMenu(self.menubar)
|
self.menuFile = QtWidgets.QMenu(self.menubar)
|
||||||
self.menuFile.setObjectName(_fromUtf8("menuFile"))
|
self.menuFile.setObjectName("menuFile")
|
||||||
self.menuSettings = QtGui.QMenu(self.menubar)
|
self.menuSettings = QtWidgets.QMenu(self.menubar)
|
||||||
self.menuSettings.setObjectName(_fromUtf8("menuSettings"))
|
self.menuSettings.setObjectName("menuSettings")
|
||||||
self.menuHelp = QtGui.QMenu(self.menubar)
|
self.menuHelp = QtWidgets.QMenu(self.menubar)
|
||||||
self.menuHelp.setObjectName(_fromUtf8("menuHelp"))
|
self.menuHelp.setObjectName("menuHelp")
|
||||||
MainWindow.setMenuBar(self.menubar)
|
MainWindow.setMenuBar(self.menubar)
|
||||||
self.statusbar = QtGui.QStatusBar(MainWindow)
|
self.statusbar = QtWidgets.QStatusBar(MainWindow)
|
||||||
self.statusbar.setMaximumSize(QtCore.QSize(16777215, 22))
|
self.statusbar.setMaximumSize(QtCore.QSize(16777215, 22))
|
||||||
self.statusbar.setObjectName(_fromUtf8("statusbar"))
|
self.statusbar.setObjectName("statusbar")
|
||||||
MainWindow.setStatusBar(self.statusbar)
|
MainWindow.setStatusBar(self.statusbar)
|
||||||
self.actionImport_keys = QtGui.QAction(MainWindow)
|
self.actionImport_keys = QtWidgets.QAction(MainWindow)
|
||||||
self.actionImport_keys.setObjectName(_fromUtf8("actionImport_keys"))
|
self.actionImport_keys.setObjectName("actionImport_keys")
|
||||||
self.actionManageKeys = QtGui.QAction(MainWindow)
|
self.actionManageKeys = QtWidgets.QAction(MainWindow)
|
||||||
self.actionManageKeys.setCheckable(False)
|
self.actionManageKeys.setCheckable(False)
|
||||||
self.actionManageKeys.setEnabled(True)
|
self.actionManageKeys.setEnabled(True)
|
||||||
icon = QtGui.QIcon.fromTheme(_fromUtf8("dialog-password"))
|
icon = QtGui.QIcon.fromTheme("dialog-password")
|
||||||
self.actionManageKeys.setIcon(icon)
|
self.actionManageKeys.setIcon(icon)
|
||||||
self.actionManageKeys.setObjectName(_fromUtf8("actionManageKeys"))
|
self.actionManageKeys.setObjectName("actionManageKeys")
|
||||||
self.actionNetworkSwitch = QtGui.QAction(MainWindow)
|
self.actionNetworkSwitch = QtWidgets.QAction(MainWindow)
|
||||||
self.actionNetworkSwitch.setObjectName(_fromUtf8("actionNetworkSwitch"))
|
self.actionNetworkSwitch.setObjectName("actionNetworkSwitch")
|
||||||
self.actionExit = QtGui.QAction(MainWindow)
|
self.actionExit = QtWidgets.QAction(MainWindow)
|
||||||
icon = QtGui.QIcon.fromTheme(_fromUtf8("application-exit"))
|
icon = QtGui.QIcon.fromTheme("application-exit")
|
||||||
self.actionExit.setIcon(icon)
|
self.actionExit.setIcon(icon)
|
||||||
self.actionExit.setObjectName(_fromUtf8("actionExit"))
|
self.actionExit.setObjectName("actionExit")
|
||||||
self.actionHelp = QtGui.QAction(MainWindow)
|
self.actionHelp = QtWidgets.QAction(MainWindow)
|
||||||
icon = QtGui.QIcon.fromTheme(_fromUtf8("help-contents"))
|
icon = QtGui.QIcon.fromTheme("help-contents")
|
||||||
self.actionHelp.setIcon(icon)
|
self.actionHelp.setIcon(icon)
|
||||||
self.actionHelp.setObjectName(_fromUtf8("actionHelp"))
|
self.actionHelp.setObjectName("actionHelp")
|
||||||
self.actionSupport = QtGui.QAction(MainWindow)
|
self.actionSupport = QtWidgets.QAction(MainWindow)
|
||||||
icon = QtGui.QIcon.fromTheme(_fromUtf8("help-support"))
|
icon = QtGui.QIcon.fromTheme("help-support")
|
||||||
self.actionSupport.setIcon(icon)
|
self.actionSupport.setIcon(icon)
|
||||||
self.actionSupport.setObjectName(_fromUtf8("actionSupport"))
|
self.actionSupport.setObjectName("actionSupport")
|
||||||
self.actionAbout = QtGui.QAction(MainWindow)
|
self.actionAbout = QtWidgets.QAction(MainWindow)
|
||||||
icon = QtGui.QIcon.fromTheme(_fromUtf8("help-about"))
|
icon = QtGui.QIcon.fromTheme("help-about")
|
||||||
self.actionAbout.setIcon(icon)
|
self.actionAbout.setIcon(icon)
|
||||||
self.actionAbout.setObjectName(_fromUtf8("actionAbout"))
|
self.actionAbout.setObjectName("actionAbout")
|
||||||
self.actionSettings = QtGui.QAction(MainWindow)
|
self.actionSettings = QtWidgets.QAction(MainWindow)
|
||||||
icon = QtGui.QIcon.fromTheme(_fromUtf8("document-properties"))
|
icon = QtGui.QIcon.fromTheme("document-properties")
|
||||||
self.actionSettings.setIcon(icon)
|
self.actionSettings.setIcon(icon)
|
||||||
self.actionSettings.setObjectName(_fromUtf8("actionSettings"))
|
self.actionSettings.setObjectName("actionSettings")
|
||||||
self.actionRegenerateDeterministicAddresses = QtGui.QAction(MainWindow)
|
self.actionRegenerateDeterministicAddresses = QtWidgets.QAction(MainWindow)
|
||||||
icon = QtGui.QIcon.fromTheme(_fromUtf8("view-refresh"))
|
icon = QtGui.QIcon.fromTheme("view-refresh")
|
||||||
self.actionRegenerateDeterministicAddresses.setIcon(icon)
|
self.actionRegenerateDeterministicAddresses.setIcon(icon)
|
||||||
self.actionRegenerateDeterministicAddresses.setObjectName(_fromUtf8("actionRegenerateDeterministicAddresses"))
|
self.actionRegenerateDeterministicAddresses.setObjectName("actionRegenerateDeterministicAddresses")
|
||||||
self.actionDeleteAllTrashedMessages = QtGui.QAction(MainWindow)
|
self.actionDeleteAllTrashedMessages = QtWidgets.QAction(MainWindow)
|
||||||
icon = QtGui.QIcon.fromTheme(_fromUtf8("user-trash"))
|
icon = QtGui.QIcon.fromTheme("user-trash")
|
||||||
self.actionDeleteAllTrashedMessages.setIcon(icon)
|
self.actionDeleteAllTrashedMessages.setIcon(icon)
|
||||||
self.actionDeleteAllTrashedMessages.setObjectName(_fromUtf8("actionDeleteAllTrashedMessages"))
|
self.actionDeleteAllTrashedMessages.setObjectName("actionDeleteAllTrashedMessages")
|
||||||
self.actionJoinChan = QtGui.QAction(MainWindow)
|
self.actionJoinChan = QtWidgets.QAction(MainWindow)
|
||||||
icon = QtGui.QIcon.fromTheme(_fromUtf8("contact-new"))
|
icon = QtGui.QIcon.fromTheme("contact-new")
|
||||||
self.actionJoinChan.setIcon(icon)
|
self.actionJoinChan.setIcon(icon)
|
||||||
self.actionJoinChan.setObjectName(_fromUtf8("actionJoinChan"))
|
self.actionJoinChan.setObjectName("actionJoinChan")
|
||||||
self.menuFile.addAction(self.actionManageKeys)
|
self.menuFile.addAction(self.actionManageKeys)
|
||||||
self.menuFile.addAction(self.actionDeleteAllTrashedMessages)
|
self.menuFile.addAction(self.actionDeleteAllTrashedMessages)
|
||||||
self.menuFile.addAction(self.actionRegenerateDeterministicAddresses)
|
self.menuFile.addAction(self.actionRegenerateDeterministicAddresses)
|
||||||
|
@ -671,11 +633,11 @@ class Ui_MainWindow(object):
|
||||||
|
|
||||||
# Popup menu actions container for the Sent page
|
# Popup menu actions container for the Sent page
|
||||||
# pylint: disable=attribute-defined-outside-init
|
# pylint: disable=attribute-defined-outside-init
|
||||||
self.sentContextMenuToolbar = QtGui.QToolBar()
|
self.sentContextMenuToolbar = QtWidgets.QToolBar()
|
||||||
# Popup menu actions container for chans tree
|
# Popup menu actions container for chans tree
|
||||||
self.addressContextMenuToolbar = QtGui.QToolBar()
|
self.addressContextMenuToolbar = QtWidgets.QToolBar()
|
||||||
# Popup menu actions container for subscriptions tree
|
# Popup menu actions container for subscriptions tree
|
||||||
self.subscriptionsContextMenuToolbar = QtGui.QToolBar()
|
self.subscriptionsContextMenuToolbar = QtWidgets.QToolBar()
|
||||||
|
|
||||||
def updateNetworkSwitchMenuLabel(self, dontconnect=None):
|
def updateNetworkSwitchMenuLabel(self, dontconnect=None):
|
||||||
if dontconnect is None:
|
if dontconnect is None:
|
||||||
|
@ -732,9 +694,7 @@ class Ui_MainWindow(object):
|
||||||
hours = int(config.getint('bitmessagesettings', 'ttl') / 60 / 60)
|
hours = int(config.getint('bitmessagesettings', 'ttl') / 60 / 60)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
self.labelHumanFriendlyTTLDescription.setText(
|
self.labelHumanFriendlyTTLDescription.setText(_translate("MainWindow", "%n hour(s)", None, hours))
|
||||||
_translate("MainWindow", "%n hour(s)", None, QtCore.QCoreApplication.CodecForTr, hours)
|
|
||||||
)
|
|
||||||
self.pushButtonClear.setText(_translate("MainWindow", "Clear", None))
|
self.pushButtonClear.setText(_translate("MainWindow", "Clear", None))
|
||||||
self.pushButtonSend.setText(_translate("MainWindow", "Send", None))
|
self.pushButtonSend.setText(_translate("MainWindow", "Send", None))
|
||||||
self.tabWidget.setTabText(self.tabWidget.indexOf(self.send), _translate("MainWindow", "Send", None))
|
self.tabWidget.setTabText(self.tabWidget.indexOf(self.send), _translate("MainWindow", "Send", None))
|
||||||
|
@ -809,7 +769,7 @@ class Ui_MainWindow(object):
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
app = QtGui.QApplication(sys.argv)
|
app = QtWidgets.QApplication(sys.argv)
|
||||||
MainWindow = settingsmixin.SMainWindow()
|
MainWindow = settingsmixin.SMainWindow()
|
||||||
ui = Ui_MainWindow()
|
ui = Ui_MainWindow()
|
||||||
ui.setupUi(MainWindow)
|
ui.setupUi(MainWindow)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
from unqstr import ustr, unic
|
from unqstr import ustr, unic
|
||||||
from PyQt4 import QtCore, QtGui
|
|
||||||
from dbcompat import dbstr
|
from dbcompat import dbstr
|
||||||
|
from qtpy import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
from bitmessageqt import widgets
|
from bitmessageqt import widgets
|
||||||
from addresses import addBMIfNotPresent
|
from addresses import addBMIfNotPresent
|
||||||
|
@ -14,31 +14,31 @@ from .uisignaler import UISignaler
|
||||||
from .utils import avatarize
|
from .utils import avatarize
|
||||||
|
|
||||||
|
|
||||||
class Blacklist(QtGui.QWidget, RetranslateMixin):
|
class Blacklist(QtWidgets.QWidget, RetranslateMixin):
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super(Blacklist, self).__init__(parent)
|
super(Blacklist, self).__init__(parent)
|
||||||
widgets.load('blacklist.ui', self)
|
widgets.load('blacklist.ui', self)
|
||||||
|
|
||||||
QtCore.QObject.connect(self.radioButtonBlacklist, QtCore.SIGNAL(
|
self.radioButtonBlacklist.clicked.connect(
|
||||||
"clicked()"), self.click_radioButtonBlacklist)
|
self.click_radioButtonBlacklist)
|
||||||
QtCore.QObject.connect(self.radioButtonWhitelist, QtCore.SIGNAL(
|
self.radioButtonWhitelist.clicked.connect(
|
||||||
"clicked()"), self.click_radioButtonWhitelist)
|
self.click_radioButtonWhitelist)
|
||||||
QtCore.QObject.connect(self.pushButtonAddBlacklist, QtCore.SIGNAL(
|
self.pushButtonAddBlacklist.clicked.connect(
|
||||||
"clicked()"), self.click_pushButtonAddBlacklist)
|
self.click_pushButtonAddBlacklist)
|
||||||
|
|
||||||
self.init_blacklist_popup_menu()
|
self.init_blacklist_popup_menu()
|
||||||
|
|
||||||
# Initialize blacklist
|
self.tableWidgetBlacklist.itemChanged.connect(
|
||||||
QtCore.QObject.connect(self.tableWidgetBlacklist, QtCore.SIGNAL(
|
self.tableWidgetBlacklistItemChanged)
|
||||||
"itemChanged(QTableWidgetItem *)"), self.tableWidgetBlacklistItemChanged)
|
|
||||||
|
|
||||||
# Set the icon sizes for the identicons
|
# Set the icon sizes for the identicons
|
||||||
identicon_size = 3*7
|
identicon_size = 3 * 7
|
||||||
self.tableWidgetBlacklist.setIconSize(QtCore.QSize(identicon_size, identicon_size))
|
self.tableWidgetBlacklist.setIconSize(
|
||||||
|
QtCore.QSize(identicon_size, identicon_size))
|
||||||
|
|
||||||
self.UISignalThread = UISignaler.get()
|
self.UISignalThread = UISignaler.get()
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
self.UISignalThread.rerenderBlackWhiteList.connect(
|
||||||
"rerenderBlackWhiteList()"), self.rerenderBlackWhiteList)
|
self.rerenderBlackWhiteList)
|
||||||
|
|
||||||
def click_radioButtonBlacklist(self):
|
def click_radioButtonBlacklist(self):
|
||||||
if config.get('bitmessagesettings', 'blackwhitelist') == 'white':
|
if config.get('bitmessagesettings', 'blackwhitelist') == 'white':
|
||||||
|
@ -71,7 +71,7 @@ class Blacklist(QtGui.QWidget, RetranslateMixin):
|
||||||
sql = '''select * from blacklist where address=?'''
|
sql = '''select * from blacklist where address=?'''
|
||||||
else:
|
else:
|
||||||
sql = '''select * from whitelist where address=?'''
|
sql = '''select * from whitelist where address=?'''
|
||||||
queryreturn = sqlQuery(sql,*t)
|
queryreturn = sqlQuery(sql, *t)
|
||||||
if queryreturn == []:
|
if queryreturn == []:
|
||||||
self.tableWidgetBlacklist.setSortingEnabled(False)
|
self.tableWidgetBlacklist.setSortingEnabled(False)
|
||||||
self.tableWidgetBlacklist.insertRow(0)
|
self.tableWidgetBlacklist.insertRow(0)
|
||||||
|
@ -79,7 +79,7 @@ class Blacklist(QtGui.QWidget, RetranslateMixin):
|
||||||
self.NewBlacklistDialogInstance.lineEditLabel.text())))
|
self.NewBlacklistDialogInstance.lineEditLabel.text())))
|
||||||
newItem.setIcon(avatarize(address))
|
newItem.setIcon(avatarize(address))
|
||||||
self.tableWidgetBlacklist.setItem(0, 0, newItem)
|
self.tableWidgetBlacklist.setItem(0, 0, newItem)
|
||||||
newItem = QtGui.QTableWidgetItem(address)
|
newItem = QtWidgets.QTableWidgetItem(address)
|
||||||
newItem.setFlags(
|
newItem.setFlags(
|
||||||
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
||||||
self.tableWidgetBlacklist.setItem(0, 1, newItem)
|
self.tableWidgetBlacklist.setItem(0, 1, newItem)
|
||||||
|
@ -110,7 +110,7 @@ class Blacklist(QtGui.QWidget, RetranslateMixin):
|
||||||
def tableWidgetBlacklistItemChanged(self, item):
|
def tableWidgetBlacklistItemChanged(self, item):
|
||||||
if item.column() == 0:
|
if item.column() == 0:
|
||||||
addressitem = self.tableWidgetBlacklist.item(item.row(), 1)
|
addressitem = self.tableWidgetBlacklist.item(item.row(), 1)
|
||||||
if isinstance(addressitem, QtGui.QTableWidgetItem):
|
if isinstance(addressitem, QtWidgets.QTableWidgetItem):
|
||||||
if self.radioButtonBlacklist.isChecked():
|
if self.radioButtonBlacklist.isChecked():
|
||||||
sqlExecute('''UPDATE blacklist SET label=? WHERE address=?''',
|
sqlExecute('''UPDATE blacklist SET label=? WHERE address=?''',
|
||||||
dbstr(item.text()), dbstr(addressitem.text()))
|
dbstr(item.text()), dbstr(addressitem.text()))
|
||||||
|
@ -120,7 +120,7 @@ class Blacklist(QtGui.QWidget, RetranslateMixin):
|
||||||
|
|
||||||
def init_blacklist_popup_menu(self, connectSignal=True):
|
def init_blacklist_popup_menu(self, connectSignal=True):
|
||||||
# Popup menu for the Blacklist page
|
# Popup menu for the Blacklist page
|
||||||
self.blacklistContextMenuToolbar = QtGui.QToolBar()
|
self.blacklistContextMenuToolbar = QtWidgets.QToolBar()
|
||||||
# Actions
|
# Actions
|
||||||
self.actionBlacklistNew = self.blacklistContextMenuToolbar.addAction(
|
self.actionBlacklistNew = self.blacklistContextMenuToolbar.addAction(
|
||||||
_translate(
|
_translate(
|
||||||
|
@ -145,10 +145,9 @@ class Blacklist(QtGui.QWidget, RetranslateMixin):
|
||||||
self.tableWidgetBlacklist.setContextMenuPolicy(
|
self.tableWidgetBlacklist.setContextMenuPolicy(
|
||||||
QtCore.Qt.CustomContextMenu)
|
QtCore.Qt.CustomContextMenu)
|
||||||
if connectSignal:
|
if connectSignal:
|
||||||
self.connect(self.tableWidgetBlacklist, QtCore.SIGNAL(
|
self.tableWidgetBlacklist.customContextMenuRequested.connect(
|
||||||
'customContextMenuRequested(const QPoint&)'),
|
self.on_context_menuBlacklist)
|
||||||
self.on_context_menuBlacklist)
|
self.popMenuBlacklist = QtWidgets.QMenu(self)
|
||||||
self.popMenuBlacklist = QtGui.QMenu(self)
|
|
||||||
# self.popMenuBlacklist.addAction( self.actionBlacklistNew )
|
# self.popMenuBlacklist.addAction( self.actionBlacklistNew )
|
||||||
self.popMenuBlacklist.addAction(self.actionBlacklistDelete)
|
self.popMenuBlacklist.addAction(self.actionBlacklistDelete)
|
||||||
self.popMenuBlacklist.addSeparator()
|
self.popMenuBlacklist.addSeparator()
|
||||||
|
@ -176,16 +175,16 @@ class Blacklist(QtGui.QWidget, RetranslateMixin):
|
||||||
label = label.decode("utf-8", "replace")
|
label = label.decode("utf-8", "replace")
|
||||||
address = address.decode("utf-8", "replace")
|
address = address.decode("utf-8", "replace")
|
||||||
self.tableWidgetBlacklist.insertRow(0)
|
self.tableWidgetBlacklist.insertRow(0)
|
||||||
newItem = QtGui.QTableWidgetItem(unic(ustr(label)))
|
newItem = QtWidgets.QTableWidgetItem(unic(ustr(label)))
|
||||||
if not enabled:
|
if not enabled:
|
||||||
newItem.setTextColor(QtGui.QColor(128, 128, 128))
|
newItem.setForeground(QtGui.QColor(128, 128, 128))
|
||||||
newItem.setIcon(avatarize(address))
|
newItem.setIcon(avatarize(address))
|
||||||
self.tableWidgetBlacklist.setItem(0, 0, newItem)
|
self.tableWidgetBlacklist.setItem(0, 0, newItem)
|
||||||
newItem = QtGui.QTableWidgetItem(address)
|
newItem = QtWidgets.QTableWidgetItem(address)
|
||||||
newItem.setFlags(
|
newItem.setFlags(
|
||||||
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
||||||
if not enabled:
|
if not enabled:
|
||||||
newItem.setTextColor(QtGui.QColor(128, 128, 128))
|
newItem.setForeground(QtGui.QColor(128, 128, 128))
|
||||||
self.tableWidgetBlacklist.setItem(0, 1, newItem)
|
self.tableWidgetBlacklist.setItem(0, 1, newItem)
|
||||||
self.tableWidgetBlacklist.setSortingEnabled(True)
|
self.tableWidgetBlacklist.setSortingEnabled(True)
|
||||||
|
|
||||||
|
@ -213,7 +212,7 @@ class Blacklist(QtGui.QWidget, RetranslateMixin):
|
||||||
currentRow = self.tableWidgetBlacklist.currentRow()
|
currentRow = self.tableWidgetBlacklist.currentRow()
|
||||||
addressAtCurrentRow = self.tableWidgetBlacklist.item(
|
addressAtCurrentRow = self.tableWidgetBlacklist.item(
|
||||||
currentRow, 1).text()
|
currentRow, 1).text()
|
||||||
clipboard = QtGui.QApplication.clipboard()
|
clipboard = QtWidgets.QApplication.clipboard()
|
||||||
clipboard.setText(ustr(addressAtCurrentRow))
|
clipboard.setText(ustr(addressAtCurrentRow))
|
||||||
|
|
||||||
def on_context_menuBlacklist(self, point):
|
def on_context_menuBlacklist(self, point):
|
||||||
|
@ -224,10 +223,10 @@ class Blacklist(QtGui.QWidget, RetranslateMixin):
|
||||||
currentRow = self.tableWidgetBlacklist.currentRow()
|
currentRow = self.tableWidgetBlacklist.currentRow()
|
||||||
addressAtCurrentRow = self.tableWidgetBlacklist.item(
|
addressAtCurrentRow = self.tableWidgetBlacklist.item(
|
||||||
currentRow, 1).text()
|
currentRow, 1).text()
|
||||||
self.tableWidgetBlacklist.item(
|
self.tableWidgetBlacklist.item(currentRow, 0).setForeground(
|
||||||
currentRow, 0).setTextColor(QtGui.QApplication.palette().text().color())
|
QtWidgets.QApplication.palette().text().color())
|
||||||
self.tableWidgetBlacklist.item(
|
self.tableWidgetBlacklist.item(currentRow, 1).setForeground(
|
||||||
currentRow, 1).setTextColor(QtGui.QApplication.palette().text().color())
|
QtWidgets.QApplication.palette().text().color())
|
||||||
if config.get('bitmessagesettings', 'blackwhitelist') == 'black':
|
if config.get('bitmessagesettings', 'blackwhitelist') == 'black':
|
||||||
sqlExecute(
|
sqlExecute(
|
||||||
'''UPDATE blacklist SET enabled=1 WHERE address=?''',
|
'''UPDATE blacklist SET enabled=1 WHERE address=?''',
|
||||||
|
@ -241,10 +240,10 @@ class Blacklist(QtGui.QWidget, RetranslateMixin):
|
||||||
currentRow = self.tableWidgetBlacklist.currentRow()
|
currentRow = self.tableWidgetBlacklist.currentRow()
|
||||||
addressAtCurrentRow = self.tableWidgetBlacklist.item(
|
addressAtCurrentRow = self.tableWidgetBlacklist.item(
|
||||||
currentRow, 1).text()
|
currentRow, 1).text()
|
||||||
self.tableWidgetBlacklist.item(
|
self.tableWidgetBlacklist.item(currentRow, 0).setForeground(
|
||||||
currentRow, 0).setTextColor(QtGui.QColor(128, 128, 128))
|
QtGui.QColor(128, 128, 128))
|
||||||
self.tableWidgetBlacklist.item(
|
self.tableWidgetBlacklist.item(currentRow, 1).setForeground(
|
||||||
currentRow, 1).setTextColor(QtGui.QColor(128, 128, 128))
|
QtGui.QColor(128, 128, 128))
|
||||||
if config.get('bitmessagesettings', 'blackwhitelist') == 'black':
|
if config.get('bitmessagesettings', 'blackwhitelist') == 'black':
|
||||||
sqlExecute(
|
sqlExecute(
|
||||||
'''UPDATE blacklist SET enabled=0 WHERE address=?''', dbstr(addressAtCurrentRow))
|
'''UPDATE blacklist SET enabled=0 WHERE address=?''', dbstr(addressAtCurrentRow))
|
||||||
|
|
|
@ -62,6 +62,9 @@
|
||||||
<property name="sortingEnabled">
|
<property name="sortingEnabled">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
<attribute name="horizontalHeaderCascadingSectionResizes">
|
<attribute name="horizontalHeaderCascadingSectionResizes">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</attribute>
|
</attribute>
|
||||||
|
@ -98,11 +101,8 @@
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>STableWidget</class>
|
<class>STableWidget</class>
|
||||||
<extends>QTableWidget</extends>
|
<extends>QTableWidget</extends>
|
||||||
<header>bitmessageqt/settingsmixin.h</header>
|
<header>bitmessageqt.settingsmixin</header>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<resources>
|
|
||||||
<include location="bitmessage_icons.qrc"/>
|
|
||||||
</resources>
|
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
"""
|
"""
|
||||||
Custom dialog classes
|
All dialogs are available in this module.
|
||||||
"""
|
"""
|
||||||
# pylint: disable=too-few-public-methods
|
# pylint: disable=too-few-public-methods
|
||||||
from unqstr import ustr
|
from unqstr import ustr
|
||||||
from PyQt4 import QtGui
|
|
||||||
|
from qtpy import QtWidgets
|
||||||
|
|
||||||
import paths
|
import paths
|
||||||
from bitmessageqt import widgets
|
from bitmessageqt import widgets
|
||||||
|
@ -17,7 +18,6 @@ from .settings import SettingsDialog
|
||||||
from tr import _translate
|
from tr import _translate
|
||||||
from version import softwareVersion
|
from version import softwareVersion
|
||||||
|
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"NewChanDialog", "AddAddressDialog", "NewAddressDialog",
|
"NewChanDialog", "AddAddressDialog", "NewAddressDialog",
|
||||||
"NewSubscriptionDialog", "RegenerateAddressesDialog",
|
"NewSubscriptionDialog", "RegenerateAddressesDialog",
|
||||||
|
@ -26,8 +26,8 @@ __all__ = [
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
class AboutDialog(QtGui.QDialog):
|
class AboutDialog(QtWidgets.QDialog):
|
||||||
"""The `About` dialog"""
|
"""The "About" dialog"""
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super(AboutDialog, self).__init__(parent)
|
super(AboutDialog, self).__init__(parent)
|
||||||
widgets.load('about.ui', self)
|
widgets.load('about.ui', self)
|
||||||
|
@ -51,11 +51,11 @@ class AboutDialog(QtGui.QDialog):
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
self.setFixedSize(QtGui.QWidget.sizeHint(self))
|
self.setFixedSize(QtWidgets.QWidget.sizeHint(self))
|
||||||
|
|
||||||
|
|
||||||
class IconGlossaryDialog(QtGui.QDialog):
|
class IconGlossaryDialog(QtWidgets.QDialog):
|
||||||
"""The `Icon Glossary` dialog, explaining the status icon colors"""
|
"""The "Icon Glossary" dialog, explaining the status icon colors"""
|
||||||
def __init__(self, parent=None, config=None):
|
def __init__(self, parent=None, config=None):
|
||||||
super(IconGlossaryDialog, self).__init__(parent)
|
super(IconGlossaryDialog, self).__init__(parent)
|
||||||
widgets.load('iconglossary.ui', self)
|
widgets.load('iconglossary.ui', self)
|
||||||
|
@ -65,22 +65,23 @@ class IconGlossaryDialog(QtGui.QDialog):
|
||||||
|
|
||||||
self.labelPortNumber.setText(_translate(
|
self.labelPortNumber.setText(_translate(
|
||||||
"iconGlossaryDialog",
|
"iconGlossaryDialog",
|
||||||
"You are using TCP port {0}. (This can be changed in the settings)."
|
"You are using TCP port {0}."
|
||||||
|
" (This can be changed in the settings)."
|
||||||
).format(config.getint('bitmessagesettings', 'port')))
|
).format(config.getint('bitmessagesettings', 'port')))
|
||||||
self.setFixedSize(QtGui.QWidget.sizeHint(self))
|
self.setFixedSize(QtWidgets.QWidget.sizeHint(self))
|
||||||
|
|
||||||
|
|
||||||
class HelpDialog(QtGui.QDialog):
|
class HelpDialog(QtWidgets.QDialog):
|
||||||
"""The `Help` dialog"""
|
"""The "Help" dialog"""
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super(HelpDialog, self).__init__(parent)
|
super(HelpDialog, self).__init__(parent)
|
||||||
widgets.load('help.ui', self)
|
widgets.load('help.ui', self)
|
||||||
self.setFixedSize(QtGui.QWidget.sizeHint(self))
|
self.setFixedSize(QtWidgets.QWidget.sizeHint(self))
|
||||||
|
|
||||||
|
|
||||||
class ConnectDialog(QtGui.QDialog):
|
class ConnectDialog(QtWidgets.QDialog):
|
||||||
"""The `Connect` dialog"""
|
"""The "Connect" dialog"""
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super(ConnectDialog, self).__init__(parent)
|
super(ConnectDialog, self).__init__(parent)
|
||||||
widgets.load('connect.ui', self)
|
widgets.load('connect.ui', self)
|
||||||
self.setFixedSize(QtGui.QWidget.sizeHint(self))
|
self.setFixedSize(QtWidgets.QWidget.sizeHint(self))
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
"""
|
"""
|
||||||
Folder tree and messagelist widgets definitions.
|
Folder tree and messagelist widgets definitions.
|
||||||
"""
|
"""
|
||||||
# pylint: disable=too-many-arguments,bad-super-call
|
# pylint: disable=too-many-arguments
|
||||||
# pylint: disable=attribute-defined-outside-init
|
# pylint: disable=attribute-defined-outside-init
|
||||||
|
|
||||||
from cgi import escape
|
from cgi import escape
|
||||||
|
|
||||||
from unqstr import ustr, unic
|
from unqstr import ustr, unic
|
||||||
from PyQt4 import QtCore, QtGui
|
|
||||||
from dbcompat import dbstr
|
from dbcompat import dbstr
|
||||||
|
from qtpy import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
from bmconfigparser import config
|
from bmconfigparser import config
|
||||||
from helper_sql import sqlExecute, sqlQuery
|
from helper_sql import sqlExecute, sqlQuery
|
||||||
|
@ -40,15 +40,16 @@ class AccountMixin(object):
|
||||||
return QtGui.QColor(128, 128, 128)
|
return QtGui.QColor(128, 128, 128)
|
||||||
elif self.type == self.CHAN:
|
elif self.type == self.CHAN:
|
||||||
return QtGui.QColor(216, 119, 0)
|
return QtGui.QColor(216, 119, 0)
|
||||||
elif self.type in [self.MAILINGLIST, self.SUBSCRIPTION]:
|
elif self.type in (self.MAILINGLIST, self.SUBSCRIPTION):
|
||||||
return QtGui.QColor(137, 4, 177)
|
return QtGui.QColor(137, 4, 177)
|
||||||
return QtGui.QApplication.palette().text().color()
|
|
||||||
|
return QtWidgets.QApplication.palette().text().color()
|
||||||
|
|
||||||
def folderColor(self):
|
def folderColor(self):
|
||||||
"""QT UI color for a folder"""
|
"""QT UI color for a folder"""
|
||||||
if not self.parent().isEnabled:
|
if not self.parent().isEnabled:
|
||||||
return QtGui.QColor(128, 128, 128)
|
return QtGui.QColor(128, 128, 128)
|
||||||
return QtGui.QApplication.palette().text().color()
|
return QtWidgets.QApplication.palette().text().color()
|
||||||
|
|
||||||
def accountBrush(self):
|
def accountBrush(self):
|
||||||
"""Account brush (for QT UI)"""
|
"""Account brush (for QT UI)"""
|
||||||
|
@ -85,7 +86,7 @@ class AccountMixin(object):
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
self.unreadCount = int(cnt)
|
self.unreadCount = int(cnt)
|
||||||
if isinstance(self, QtGui.QTreeWidgetItem):
|
if isinstance(self, QtWidgets.QTreeWidgetItem):
|
||||||
self.emitDataChanged()
|
self.emitDataChanged()
|
||||||
|
|
||||||
def setEnabled(self, enabled):
|
def setEnabled(self, enabled):
|
||||||
|
@ -99,7 +100,7 @@ class AccountMixin(object):
|
||||||
for i in range(self.childCount()):
|
for i in range(self.childCount()):
|
||||||
if isinstance(self.child(i), Ui_FolderWidget):
|
if isinstance(self.child(i), Ui_FolderWidget):
|
||||||
self.child(i).setEnabled(enabled)
|
self.child(i).setEnabled(enabled)
|
||||||
if isinstance(self, QtGui.QTreeWidgetItem):
|
if isinstance(self, QtWidgets.QTreeWidgetItem):
|
||||||
self.emitDataChanged()
|
self.emitDataChanged()
|
||||||
|
|
||||||
def setType(self):
|
def setType(self):
|
||||||
|
@ -113,43 +114,44 @@ class AccountMixin(object):
|
||||||
elif config.safeGetBoolean(self.address, 'mailinglist'):
|
elif config.safeGetBoolean(self.address, 'mailinglist'):
|
||||||
self.type = self.MAILINGLIST
|
self.type = self.MAILINGLIST
|
||||||
elif sqlQuery(
|
elif sqlQuery(
|
||||||
'''select label from subscriptions where address=?''', dbstr(self.address)):
|
'SELECT label FROM subscriptions WHERE address=?',
|
||||||
|
dbstr(self.address)
|
||||||
|
):
|
||||||
self.type = AccountMixin.SUBSCRIPTION
|
self.type = AccountMixin.SUBSCRIPTION
|
||||||
else:
|
else:
|
||||||
self.type = self.NORMAL
|
self.type = self.NORMAL
|
||||||
|
|
||||||
def defaultLabel(self):
|
def defaultLabel(self):
|
||||||
"""Default label (in case no label is set manually)"""
|
"""Default label (in case no label is set manually)"""
|
||||||
queryreturn = None
|
queryreturn = retval = None
|
||||||
retval = None
|
|
||||||
if self.type in (
|
if self.type in (
|
||||||
AccountMixin.NORMAL,
|
AccountMixin.NORMAL,
|
||||||
AccountMixin.CHAN, AccountMixin.MAILINGLIST):
|
AccountMixin.CHAN, AccountMixin.MAILINGLIST):
|
||||||
try:
|
try:
|
||||||
retval = unic(ustr(
|
retval = unic(ustr(config.get(self.address, 'label')))
|
||||||
config.get(self.address, 'label')))
|
|
||||||
except Exception:
|
except Exception:
|
||||||
queryreturn = sqlQuery(
|
queryreturn = sqlQuery(
|
||||||
'''select label from addressbook where address=?''', dbstr(self.address))
|
'SELECT label FROM addressbook WHERE address=?',
|
||||||
|
dbstr(self.address)
|
||||||
|
)
|
||||||
elif self.type == AccountMixin.SUBSCRIPTION:
|
elif self.type == AccountMixin.SUBSCRIPTION:
|
||||||
queryreturn = sqlQuery(
|
queryreturn = sqlQuery(
|
||||||
'''select label from subscriptions where address=?''', dbstr(self.address))
|
'SELECT label FROM subscriptions WHERE address=?',
|
||||||
if queryreturn is not None:
|
dbstr(self.address)
|
||||||
if queryreturn != []:
|
)
|
||||||
for row in queryreturn:
|
if queryreturn:
|
||||||
retval, = row
|
retval = unic(ustr(queryreturn[-1][0]))
|
||||||
retval = unic(ustr(retval))
|
|
||||||
elif self.address is None or self.type == AccountMixin.ALL:
|
elif self.address is None or self.type == AccountMixin.ALL:
|
||||||
return unic(_translate("MainWindow", "All accounts"))
|
return unic(_translate("MainWindow", "All accounts"))
|
||||||
|
|
||||||
return retval or unic(self.address)
|
return retval or unic(self.address)
|
||||||
|
|
||||||
|
|
||||||
class BMTreeWidgetItem(QtGui.QTreeWidgetItem, AccountMixin):
|
class BMTreeWidgetItem(QtWidgets.QTreeWidgetItem, AccountMixin):
|
||||||
"""A common abstract class for Tree widget item"""
|
"""A common abstract class for Tree widget item"""
|
||||||
|
|
||||||
def __init__(self, parent, pos, address, unreadCount):
|
def __init__(self, parent, pos, address, unreadCount):
|
||||||
super(QtGui.QTreeWidgetItem, self).__init__()
|
super(QtWidgets.QTreeWidgetItem, self).__init__()
|
||||||
self.setAddress(address)
|
self.setAddress(address)
|
||||||
self.setUnreadCount(unreadCount)
|
self.setUnreadCount(unreadCount)
|
||||||
self._setup(parent, pos)
|
self._setup(parent, pos)
|
||||||
|
@ -158,7 +160,7 @@ class BMTreeWidgetItem(QtGui.QTreeWidgetItem, AccountMixin):
|
||||||
return " (" + ustr(self.unreadCount) + ")" if unreadCount else ""
|
return " (" + ustr(self.unreadCount) + ")" if unreadCount else ""
|
||||||
|
|
||||||
def data(self, column, role):
|
def data(self, column, role):
|
||||||
"""Override internal QT method for returning object data"""
|
"""Override internal Qt method for returning object data"""
|
||||||
if column == 0:
|
if column == 0:
|
||||||
if role == QtCore.Qt.DisplayRole:
|
if role == QtCore.Qt.DisplayRole:
|
||||||
return self._getLabel() + self._getAddressBracket(
|
return self._getLabel() + self._getAddressBracket(
|
||||||
|
@ -191,11 +193,11 @@ class Ui_FolderWidget(BMTreeWidgetItem):
|
||||||
return _translate("MainWindow", self.folderName)
|
return _translate("MainWindow", self.folderName)
|
||||||
|
|
||||||
def setFolderName(self, fname):
|
def setFolderName(self, fname):
|
||||||
"""Set folder name (for QT UI)"""
|
"""Set folder name (for Qt UI)"""
|
||||||
self.folderName = ustr(fname)
|
self.folderName = ustr(fname)
|
||||||
|
|
||||||
def data(self, column, role):
|
def data(self, column, role):
|
||||||
"""Override internal QT method for returning object data"""
|
"""Override internal Qt method for returning object data"""
|
||||||
if column == 0 and role == QtCore.Qt.ForegroundRole:
|
if column == 0 and role == QtCore.Qt.ForegroundRole:
|
||||||
return self.folderBrush()
|
return self.folderBrush()
|
||||||
return super(Ui_FolderWidget, self).data(column, role)
|
return super(Ui_FolderWidget, self).data(column, role)
|
||||||
|
@ -217,12 +219,14 @@ class Ui_FolderWidget(BMTreeWidgetItem):
|
||||||
return self.folderName < other.folderName
|
return self.folderName < other.folderName
|
||||||
return x >= y if reverse else x < y
|
return x >= y if reverse else x < y
|
||||||
|
|
||||||
return super(QtGui.QTreeWidgetItem, self).__lt__(other)
|
return super(QtWidgets.QTreeWidgetItem, self).__lt__(other)
|
||||||
|
|
||||||
|
|
||||||
class Ui_AddressWidget(BMTreeWidgetItem, SettingsMixin):
|
class Ui_AddressWidget(BMTreeWidgetItem, SettingsMixin):
|
||||||
"""Item in the account/folder tree representing an account"""
|
"""Item in the account/folder tree representing an account"""
|
||||||
def __init__(self, parent, pos=0, address=None, unreadCount=0, enabled=True):
|
def __init__(
|
||||||
|
self, parent, pos=0, address=None, unreadCount=0, enabled=True
|
||||||
|
):
|
||||||
super(Ui_AddressWidget, self).__init__(
|
super(Ui_AddressWidget, self).__init__(
|
||||||
parent, pos, address, unreadCount)
|
parent, pos, address, unreadCount)
|
||||||
self.setEnabled(enabled)
|
self.setEnabled(enabled)
|
||||||
|
@ -233,8 +237,7 @@ class Ui_AddressWidget(BMTreeWidgetItem, SettingsMixin):
|
||||||
|
|
||||||
def _getLabel(self):
|
def _getLabel(self):
|
||||||
if self.address is None:
|
if self.address is None:
|
||||||
return unic(_translate(
|
return unic(_translate("MainWindow", "All accounts"))
|
||||||
"MainWindow", "All accounts"))
|
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
return unic(ustr(
|
return unic(ustr(
|
||||||
|
@ -260,15 +263,13 @@ class Ui_AddressWidget(BMTreeWidgetItem, SettingsMixin):
|
||||||
return super(Ui_AddressWidget, self).data(column, role)
|
return super(Ui_AddressWidget, self).data(column, role)
|
||||||
|
|
||||||
def setData(self, column, role, value):
|
def setData(self, column, role, value):
|
||||||
"""Save account label (if you edit in the the UI, this will be triggered and will save it to keys.dat)"""
|
"""
|
||||||
|
Save account label (if you edit in the the UI, this will be
|
||||||
|
triggered and will save it to keys.dat)
|
||||||
|
"""
|
||||||
if role == QtCore.Qt.EditRole \
|
if role == QtCore.Qt.EditRole \
|
||||||
and self.type != AccountMixin.SUBSCRIPTION:
|
and self.type != AccountMixin.SUBSCRIPTION:
|
||||||
config.set(
|
config.set(self.address, 'label', ustr(value))
|
||||||
self.address, 'label',
|
|
||||||
ustr(value)
|
|
||||||
if isinstance(value, QtCore.QVariant)
|
|
||||||
else value.encode('utf-8')
|
|
||||||
)
|
|
||||||
config.save()
|
config.save()
|
||||||
return super(Ui_AddressWidget, self).setData(column, role, value)
|
return super(Ui_AddressWidget, self).setData(column, role, value)
|
||||||
|
|
||||||
|
@ -295,23 +296,25 @@ class Ui_AddressWidget(BMTreeWidgetItem, SettingsMixin):
|
||||||
if self._getSortRank() < other._getSortRank() else reverse
|
if self._getSortRank() < other._getSortRank() else reverse
|
||||||
)
|
)
|
||||||
|
|
||||||
return super(QtGui.QTreeWidgetItem, self).__lt__(other)
|
return super(Ui_AddressWidget, self).__lt__(other)
|
||||||
|
|
||||||
|
|
||||||
class Ui_SubscriptionWidget(Ui_AddressWidget):
|
class Ui_SubscriptionWidget(Ui_AddressWidget):
|
||||||
"""Special treating of subscription addresses"""
|
"""Special treating of subscription addresses"""
|
||||||
# pylint: disable=unused-argument
|
# pylint: disable=unused-argument
|
||||||
def __init__(self, parent, pos=0, address="", unreadCount=0, label="", enabled=True):
|
def __init__(
|
||||||
|
self, parent, pos=0, address="", unreadCount=0, label="",
|
||||||
|
enabled=True
|
||||||
|
):
|
||||||
super(Ui_SubscriptionWidget, self).__init__(
|
super(Ui_SubscriptionWidget, self).__init__(
|
||||||
parent, pos, address, unreadCount, enabled)
|
parent, pos, address, unreadCount, enabled)
|
||||||
|
|
||||||
def _getLabel(self):
|
def _getLabel(self):
|
||||||
queryreturn = sqlQuery(
|
queryreturn = sqlQuery(
|
||||||
'''select label from subscriptions where address=?''', dbstr(self.address))
|
'SELECT label FROM subscriptions WHERE address=?',
|
||||||
if queryreturn != []:
|
dbstr(self.address))
|
||||||
for row in queryreturn:
|
if queryreturn:
|
||||||
retval, = row
|
return unic(ustr(queryreturn[-1][0]))
|
||||||
return unic(ustr(retval))
|
|
||||||
return unic(self.address)
|
return unic(self.address)
|
||||||
|
|
||||||
def setType(self):
|
def setType(self):
|
||||||
|
@ -322,22 +325,17 @@ class Ui_SubscriptionWidget(Ui_AddressWidget):
|
||||||
def setData(self, column, role, value):
|
def setData(self, column, role, value):
|
||||||
"""Save subscription label to database"""
|
"""Save subscription label to database"""
|
||||||
if role == QtCore.Qt.EditRole:
|
if role == QtCore.Qt.EditRole:
|
||||||
if isinstance(value, QtCore.QVariant):
|
|
||||||
label = ustr(
|
|
||||||
value)
|
|
||||||
else:
|
|
||||||
label = unic(ustr(value))
|
|
||||||
sqlExecute(
|
sqlExecute(
|
||||||
'''UPDATE subscriptions SET label=? WHERE address=?''',
|
'UPDATE subscriptions SET label=? WHERE address=?',
|
||||||
dbstr(label), dbstr(self.address))
|
dbstr(unic(ustr(value))), dbstr(self.address))
|
||||||
return super(Ui_SubscriptionWidget, self).setData(column, role, value)
|
return super(Ui_SubscriptionWidget, self).setData(column, role, value)
|
||||||
|
|
||||||
|
|
||||||
class BMTableWidgetItem(QtGui.QTableWidgetItem, SettingsMixin):
|
class BMTableWidgetItem(QtWidgets.QTableWidgetItem, SettingsMixin):
|
||||||
"""A common abstract class for Table widget item"""
|
"""A common abstract class for Table widget item"""
|
||||||
|
|
||||||
def __init__(self, label=None, unread=False):
|
def __init__(self, label=None, unread=False):
|
||||||
super(QtGui.QTableWidgetItem, self).__init__()
|
super(QtWidgets.QTableWidgetItem, self).__init__()
|
||||||
self.setLabel(label)
|
self.setLabel(label)
|
||||||
self.setUnread(unread)
|
self.setUnread(unread)
|
||||||
self._setup()
|
self._setup()
|
||||||
|
@ -407,18 +405,17 @@ class MessageList_AddressWidget(BMAddressWidget):
|
||||||
AccountMixin.NORMAL,
|
AccountMixin.NORMAL,
|
||||||
AccountMixin.CHAN, AccountMixin.MAILINGLIST):
|
AccountMixin.CHAN, AccountMixin.MAILINGLIST):
|
||||||
try:
|
try:
|
||||||
newLabel = unic(ustr(
|
newLabel = unic(ustr(config.get(self.address, 'label')))
|
||||||
config.get(self.address, 'label')))
|
|
||||||
except:
|
except:
|
||||||
queryreturn = sqlQuery(
|
queryreturn = sqlQuery(
|
||||||
'''select label from addressbook where address=?''', dbstr(self.address))
|
'SELECT label FROM addressbook WHERE address=?',
|
||||||
|
dbstr(self.address))
|
||||||
elif self.type == AccountMixin.SUBSCRIPTION:
|
elif self.type == AccountMixin.SUBSCRIPTION:
|
||||||
queryreturn = sqlQuery(
|
queryreturn = sqlQuery(
|
||||||
'''select label from subscriptions where address=?''', dbstr(self.address))
|
'SELECT label FROM subscriptions WHERE address=?',
|
||||||
|
dbstr(self.address))
|
||||||
if queryreturn:
|
if queryreturn:
|
||||||
for row in queryreturn:
|
newLabel = unic(ustr(queryreturn[-1][0]))
|
||||||
newLabel = row[0]
|
|
||||||
newLabel = unic(ustr(newLabel))
|
|
||||||
|
|
||||||
self.label = newLabel
|
self.label = newLabel
|
||||||
|
|
||||||
|
@ -438,7 +435,7 @@ class MessageList_AddressWidget(BMAddressWidget):
|
||||||
def __lt__(self, other):
|
def __lt__(self, other):
|
||||||
if isinstance(other, MessageList_AddressWidget):
|
if isinstance(other, MessageList_AddressWidget):
|
||||||
return self.label.lower() < other.label.lower()
|
return self.label.lower() < other.label.lower()
|
||||||
return super(QtGui.QTableWidgetItem, self).__lt__(other)
|
return super(MessageList_AddressWidget, self).__lt__(other)
|
||||||
|
|
||||||
|
|
||||||
class MessageList_SubjectWidget(BMTableWidgetItem):
|
class MessageList_SubjectWidget(BMTableWidgetItem):
|
||||||
|
@ -463,7 +460,7 @@ class MessageList_SubjectWidget(BMTableWidgetItem):
|
||||||
def __lt__(self, other):
|
def __lt__(self, other):
|
||||||
if isinstance(other, MessageList_SubjectWidget):
|
if isinstance(other, MessageList_SubjectWidget):
|
||||||
return self.label.lower() < other.label.lower()
|
return self.label.lower() < other.label.lower()
|
||||||
return super(QtGui.QTableWidgetItem, self).__lt__(other)
|
return super(MessageList_SubjectWidget, self).__lt__(other)
|
||||||
|
|
||||||
|
|
||||||
# In order for the time columns on the Inbox and Sent tabs to be sorted
|
# In order for the time columns on the Inbox and Sent tabs to be sorted
|
||||||
|
@ -478,7 +475,7 @@ class MessageList_TimeWidget(BMTableWidgetItem):
|
||||||
|
|
||||||
def __init__(self, label=None, unread=False, timestamp=None, msgid=b''):
|
def __init__(self, label=None, unread=False, timestamp=None, msgid=b''):
|
||||||
super(MessageList_TimeWidget, self).__init__(label, unread)
|
super(MessageList_TimeWidget, self).__init__(label, unread)
|
||||||
self.setData(QtCore.Qt.UserRole, QtCore.QByteArray(msgid))
|
self.setData(QtCore.Qt.UserRole, QtCore.QByteArray(bytes(msgid)))
|
||||||
self.setData(TimestampRole, int(timestamp))
|
self.setData(TimestampRole, int(timestamp))
|
||||||
|
|
||||||
def __lt__(self, other):
|
def __lt__(self, other):
|
||||||
|
@ -499,7 +496,6 @@ class MessageList_TimeWidget(BMTableWidgetItem):
|
||||||
|
|
||||||
class Ui_AddressBookWidgetItem(BMAddressWidget):
|
class Ui_AddressBookWidgetItem(BMAddressWidget):
|
||||||
"""Addressbook item"""
|
"""Addressbook item"""
|
||||||
# pylint: disable=unused-argument
|
|
||||||
def __init__(self, label=None, acc_type=AccountMixin.NORMAL):
|
def __init__(self, label=None, acc_type=AccountMixin.NORMAL):
|
||||||
self.type = acc_type
|
self.type = acc_type
|
||||||
super(Ui_AddressBookWidgetItem, self).__init__(label=label)
|
super(Ui_AddressBookWidgetItem, self).__init__(label=label)
|
||||||
|
@ -513,10 +509,7 @@ class Ui_AddressBookWidgetItem(BMAddressWidget):
|
||||||
def setData(self, role, value):
|
def setData(self, role, value):
|
||||||
"""Set data"""
|
"""Set data"""
|
||||||
if role == QtCore.Qt.EditRole:
|
if role == QtCore.Qt.EditRole:
|
||||||
self.label = ustr(
|
self.label = ustr(value)
|
||||||
value
|
|
||||||
if isinstance(value, QtCore.QVariant) else value
|
|
||||||
)
|
|
||||||
if self.type in (
|
if self.type in (
|
||||||
AccountMixin.NORMAL,
|
AccountMixin.NORMAL,
|
||||||
AccountMixin.MAILINGLIST, AccountMixin.CHAN):
|
AccountMixin.MAILINGLIST, AccountMixin.CHAN):
|
||||||
|
@ -525,22 +518,27 @@ class Ui_AddressBookWidgetItem(BMAddressWidget):
|
||||||
config.set(self.address, 'label', self.label)
|
config.set(self.address, 'label', self.label)
|
||||||
config.save()
|
config.save()
|
||||||
except:
|
except:
|
||||||
sqlExecute('''UPDATE addressbook set label=? WHERE address=?''', dbstr(self.label), dbstr(self.address))
|
sqlExecute(
|
||||||
|
'UPDATE addressbook SET label=? WHERE address=?',
|
||||||
|
dbstr(self.label), dbstr(self.address)
|
||||||
|
)
|
||||||
elif self.type == AccountMixin.SUBSCRIPTION:
|
elif self.type == AccountMixin.SUBSCRIPTION:
|
||||||
sqlExecute('''UPDATE subscriptions set label=? WHERE address=?''', dbstr(self.label), dbstr(self.address))
|
sqlExecute(
|
||||||
else:
|
'UPDATE subscriptions SET label=? WHERE address=?',
|
||||||
pass
|
dbstr(self.label), dbstr(self.address))
|
||||||
return super(Ui_AddressBookWidgetItem, self).setData(role, value)
|
return super(Ui_AddressBookWidgetItem, self).setData(role, value)
|
||||||
|
|
||||||
def __lt__(self, other):
|
def __lt__(self, other):
|
||||||
if isinstance(other, Ui_AddressBookWidgetItem):
|
if not isinstance(other, Ui_AddressBookWidgetItem):
|
||||||
reverse = QtCore.Qt.DescendingOrder == \
|
return super(Ui_AddressBookWidgetItem, self).__lt__(other)
|
||||||
self.tableWidget().horizontalHeader().sortIndicatorOrder()
|
|
||||||
|
|
||||||
if self.type == other.type:
|
reverse = QtCore.Qt.DescendingOrder == \
|
||||||
return self.label.lower() < other.label.lower()
|
self.tableWidget().horizontalHeader().sortIndicatorOrder()
|
||||||
return not reverse if self.type < other.type else reverse
|
|
||||||
return super(QtGui.QTableWidgetItem, self).__lt__(other)
|
if self.type == other.type:
|
||||||
|
return self.label.lower() < other.label.lower()
|
||||||
|
|
||||||
|
return not reverse if self.type < other.type else reverse
|
||||||
|
|
||||||
|
|
||||||
class Ui_AddressBookWidgetItemLabel(Ui_AddressBookWidgetItem):
|
class Ui_AddressBookWidgetItemLabel(Ui_AddressBookWidgetItem):
|
||||||
|
@ -570,15 +568,15 @@ class Ui_AddressBookWidgetItemAddress(Ui_AddressBookWidgetItem):
|
||||||
return super(Ui_AddressBookWidgetItemAddress, self).data(role)
|
return super(Ui_AddressBookWidgetItemAddress, self).data(role)
|
||||||
|
|
||||||
|
|
||||||
class AddressBookCompleter(QtGui.QCompleter):
|
class AddressBookCompleter(QtWidgets.QCompleter):
|
||||||
"""Addressbook completer"""
|
"""Addressbook completer"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(AddressBookCompleter, self).__init__()
|
super(AddressBookCompleter, self).__init__()
|
||||||
self.cursorPos = -1
|
self.cursorPos = -1
|
||||||
|
|
||||||
def onCursorPositionChanged(self, oldPos, newPos): # pylint: disable=unused-argument
|
def onCursorPositionChanged(self, oldPos, newPos):
|
||||||
"""Callback for cursor position change"""
|
"""Callback for cursor position change"""
|
||||||
|
# pylint: disable=unused-argument
|
||||||
if oldPos != self.cursorPos:
|
if oldPos != self.cursorPos:
|
||||||
self.cursorPos = -1
|
self.cursorPos = -1
|
||||||
|
|
||||||
|
@ -589,8 +587,7 @@ class AddressBookCompleter(QtGui.QCompleter):
|
||||||
|
|
||||||
def pathFromIndex(self, index):
|
def pathFromIndex(self, index):
|
||||||
"""Perform autocompletion (reimplemented QCompleter method)"""
|
"""Perform autocompletion (reimplemented QCompleter method)"""
|
||||||
autoString = unic(ustr(
|
autoString = unic(ustr(index.data(QtCore.Qt.EditRole).toString()))
|
||||||
index.data(QtCore.Qt.EditRole)))
|
|
||||||
text = unic(ustr(self.widget().text()))
|
text = unic(ustr(self.widget().text()))
|
||||||
|
|
||||||
# If cursor position was saved, restore it, else save it
|
# If cursor position was saved, restore it, else save it
|
||||||
|
@ -620,7 +617,6 @@ class AddressBookCompleter(QtGui.QCompleter):
|
||||||
|
|
||||||
# Get string value from before auto finished string is selected
|
# Get string value from before auto finished string is selected
|
||||||
# pre = text[prevDelimiterIndex + 1:curIndex - 1]
|
# pre = text[prevDelimiterIndex + 1:curIndex - 1]
|
||||||
|
|
||||||
# Get part of string that occurs AFTER cursor
|
# Get part of string that occurs AFTER cursor
|
||||||
part2 = text[nextDelimiterIndex:]
|
part2 = text[nextDelimiterIndex:]
|
||||||
|
|
||||||
|
|
|
@ -1,48 +1,56 @@
|
||||||
"""Language Box Module for Locale Settings"""
|
"""LanguageBox widget is for selecting UI language"""
|
||||||
# pylint: disable=too-few-public-methods,bad-continuation
|
|
||||||
import glob
|
import glob
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from PyQt4 import QtCore, QtGui
|
from qtpy import QtCore, QtWidgets
|
||||||
|
|
||||||
import paths
|
import paths
|
||||||
from bmconfigparser import config
|
from bmconfigparser import config
|
||||||
|
from tr import _translate
|
||||||
|
|
||||||
|
|
||||||
class LanguageBox(QtGui.QComboBox):
|
# pylint: disable=too-few-public-methods
|
||||||
"""LanguageBox class for Qt UI"""
|
class LanguageBox(QtWidgets.QComboBox):
|
||||||
|
"""A subclass of `QtWidgets.QComboBox` for selecting language"""
|
||||||
languageName = {
|
languageName = {
|
||||||
"system": "System Settings", "eo": "Esperanto",
|
"system": "System Settings",
|
||||||
|
"eo": "Esperanto",
|
||||||
"en_pirate": "Pirate English"
|
"en_pirate": "Pirate English"
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super(QtGui.QComboBox, self).__init__(parent)
|
super(LanguageBox, self).__init__(parent)
|
||||||
self.populate()
|
self.populate()
|
||||||
|
|
||||||
def populate(self):
|
def populate(self):
|
||||||
"""Populates drop down list with all available languages."""
|
"""Populates drop down list with all available languages."""
|
||||||
self.clear()
|
self.clear()
|
||||||
localesPath = os.path.join(paths.codePath(), 'translations')
|
localesPath = os.path.join(paths.codePath(), 'translations')
|
||||||
self.addItem(QtGui.QApplication.translate(
|
self.addItem(
|
||||||
"settingsDialog", "System Settings", "system"), "system")
|
_translate("settingsDialog", "System Settings", "system"),
|
||||||
|
"system"
|
||||||
|
)
|
||||||
self.setCurrentIndex(0)
|
self.setCurrentIndex(0)
|
||||||
self.setInsertPolicy(QtGui.QComboBox.InsertAlphabetically)
|
self.setInsertPolicy(QtWidgets.QComboBox.InsertAlphabetically)
|
||||||
for translationFile in sorted(
|
for translationFile in sorted(
|
||||||
glob.glob(os.path.join(localesPath, "bitmessage_*.qm"))
|
glob.glob(os.path.join(localesPath, "bitmessage_*.qm"))
|
||||||
):
|
):
|
||||||
localeShort = \
|
localeShort = \
|
||||||
os.path.split(translationFile)[1].split("_", 1)[1][:-3]
|
os.path.split(translationFile)[1].split("_", 1)[1][:-3]
|
||||||
|
locale = QtCore.QLocale(localeShort)
|
||||||
if localeShort in LanguageBox.languageName:
|
if localeShort in LanguageBox.languageName:
|
||||||
self.addItem(
|
self.addItem(
|
||||||
LanguageBox.languageName[localeShort], localeShort)
|
LanguageBox.languageName[localeShort], localeShort)
|
||||||
|
elif locale.nativeLanguageName() == "":
|
||||||
|
self.addItem(localeShort, localeShort)
|
||||||
else:
|
else:
|
||||||
locale = QtCore.QLocale(localeShort)
|
locale = QtCore.QLocale(localeShort)
|
||||||
self.addItem(
|
self.addItem(
|
||||||
locale.nativeLanguageName() or localeShort, localeShort)
|
locale.nativeLanguageName() or localeShort, localeShort)
|
||||||
|
|
||||||
configuredLocale = config.safeGet(
|
configuredLocale = config.safeGet(
|
||||||
'bitmessagesettings', 'userlocale', "system")
|
'bitmessagesettings', 'userlocale', 'system')
|
||||||
for i in range(self.count()):
|
for i in range(self.count()):
|
||||||
if self.itemData(i) == configuredLocale:
|
if self.itemData(i) == configuredLocale:
|
||||||
self.setCurrentIndex(i)
|
self.setCurrentIndex(i)
|
||||||
|
|
|
@ -1,33 +1,34 @@
|
||||||
"""
|
"""The MessageCompose class definition"""
|
||||||
Message editor with a wheel zoom functionality
|
|
||||||
"""
|
|
||||||
# pylint: disable=bad-continuation
|
|
||||||
|
|
||||||
from PyQt4 import QtCore, QtGui
|
from qtpy import QtCore, QtWidgets
|
||||||
|
from tr import _translate
|
||||||
|
|
||||||
|
|
||||||
class MessageCompose(QtGui.QTextEdit):
|
class MessageCompose(QtWidgets.QTextEdit):
|
||||||
"""Editor class with wheel zoom functionality"""
|
"""Editor class with wheel zoom functionality"""
|
||||||
def __init__(self, parent=0):
|
def __init__(self, parent=None):
|
||||||
super(MessageCompose, self).__init__(parent)
|
super(MessageCompose, self).__init__(parent)
|
||||||
|
# we'll deal with this later when we have a new message format
|
||||||
self.setAcceptRichText(False)
|
self.setAcceptRichText(False)
|
||||||
self.defaultFontPointSize = self.currentFont().pointSize()
|
self.defaultFontPointSize = self.currentFont().pointSize()
|
||||||
|
|
||||||
def wheelEvent(self, event):
|
def wheelEvent(self, event):
|
||||||
"""Mouse wheel scroll event handler"""
|
"""Mouse wheel scroll event handler"""
|
||||||
if (
|
if (
|
||||||
QtGui.QApplication.queryKeyboardModifiers() & QtCore.Qt.ControlModifier
|
(QtWidgets.QApplication.queryKeyboardModifiers()
|
||||||
) == QtCore.Qt.ControlModifier and event.orientation() == QtCore.Qt.Vertical:
|
& QtCore.Qt.ControlModifier) == QtCore.Qt.ControlModifier
|
||||||
|
and event.angleDelta().y() != 0
|
||||||
|
):
|
||||||
if event.delta() > 0:
|
if event.delta() > 0:
|
||||||
self.zoomIn(1)
|
self.zoomIn(1)
|
||||||
else:
|
else:
|
||||||
self.zoomOut(1)
|
self.zoomOut(1)
|
||||||
zoom = self.currentFont().pointSize() * 100 / self.defaultFontPointSize
|
QtWidgets.QApplication.activeWindow().statusbar.showMessage(
|
||||||
QtGui.QApplication.activeWindow().statusBar().showMessage(
|
_translate("MainWindow", "Zoom level {0}%").format(
|
||||||
QtGui.QApplication.translate("MainWindow", "Zoom level {0}%").format(
|
# zoom percentage
|
||||||
str(zoom)
|
self.currentFont().pointSize() * 100
|
||||||
)
|
/ self.defaultFontPointSize
|
||||||
)
|
))
|
||||||
else:
|
else:
|
||||||
# in QTextEdit, super does not zoom, only scroll
|
# in QTextEdit, super does not zoom, only scroll
|
||||||
super(MessageCompose, self).wheelEvent(event)
|
super(MessageCompose, self).wheelEvent(event)
|
||||||
|
|
|
@ -1,23 +1,22 @@
|
||||||
"""
|
"""
|
||||||
Custom message viewer with support for switching between HTML and plain
|
Custom message viewer with support for switching between HTML and plain
|
||||||
text rendering, HTML sanitization, lazy rendering (as you scroll down),
|
text rendering, HTML sanitization, lazy rendering (as you scroll down),
|
||||||
zoom and URL click warning popup
|
zoom and URL click warning popup.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from unqstr import ustr, unic
|
from unqstr import ustr, unic
|
||||||
from PyQt4 import QtCore, QtGui
|
from qtpy import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
from .safehtmlparser import SafeHTMLParser
|
from .safehtmlparser import SafeHTMLParser
|
||||||
from tr import _translate
|
from tr import _translate
|
||||||
|
|
||||||
|
|
||||||
class MessageView(QtGui.QTextBrowser):
|
class MessageView(QtWidgets.QTextBrowser):
|
||||||
"""Message content viewer class, can switch between plaintext and HTML"""
|
"""Message content viewer class, can switch between plaintext and HTML"""
|
||||||
MODE_PLAIN = 0
|
MODE_PLAIN = 0
|
||||||
MODE_HTML = 1
|
MODE_HTML = 1
|
||||||
|
|
||||||
def __init__(self, parent=0):
|
def __init__(self, parent=None):
|
||||||
super(MessageView, self).__init__(parent)
|
super(MessageView, self).__init__(parent)
|
||||||
self.mode = MessageView.MODE_PLAIN
|
self.mode = MessageView.MODE_PLAIN
|
||||||
self.html = None
|
self.html = None
|
||||||
|
@ -39,8 +38,11 @@ class MessageView(QtGui.QTextBrowser):
|
||||||
|
|
||||||
def mousePressEvent(self, event):
|
def mousePressEvent(self, event):
|
||||||
"""Mouse press button event handler"""
|
"""Mouse press button event handler"""
|
||||||
if event.button() == QtCore.Qt.LeftButton and self.html and self.html.has_html and self.cursorForPosition(
|
if (
|
||||||
event.pos()).block().blockNumber() == 0:
|
event.button() == QtCore.Qt.LeftButton
|
||||||
|
and self.html and self.html.has_html
|
||||||
|
and self.cursorForPosition(event.pos()).block().blockNumber() == 0
|
||||||
|
):
|
||||||
if self.mode == MessageView.MODE_PLAIN:
|
if self.mode == MessageView.MODE_PLAIN:
|
||||||
self.showHTML()
|
self.showHTML()
|
||||||
else:
|
else:
|
||||||
|
@ -53,23 +55,23 @@ class MessageView(QtGui.QTextBrowser):
|
||||||
# super will actually automatically take care of zooming
|
# super will actually automatically take care of zooming
|
||||||
super(MessageView, self).wheelEvent(event)
|
super(MessageView, self).wheelEvent(event)
|
||||||
if (
|
if (
|
||||||
QtGui.QApplication.queryKeyboardModifiers() & QtCore.Qt.ControlModifier
|
(QtWidgets.QApplication.queryKeyboardModifiers()
|
||||||
) == QtCore.Qt.ControlModifier and event.orientation() == QtCore.Qt.Vertical:
|
& QtCore.Qt.ControlModifier) == QtCore.Qt.ControlModifier
|
||||||
|
and event.angleDelta().y() != 0
|
||||||
|
):
|
||||||
zoom = self.currentFont().pointSize() * 100 / self.defaultFontPointSize
|
zoom = self.currentFont().pointSize() * 100 / self.defaultFontPointSize
|
||||||
QtGui.QApplication.activeWindow().statusBar().showMessage(_translate(
|
QtWidgets.QApplication.activeWindow().statusbar.showMessage(
|
||||||
"MainWindow", "Zoom level {0}%").format(ustr(zoom)))
|
_translate("MainWindow", "Zoom level {0}%").format(zoom))
|
||||||
|
|
||||||
def setWrappingWidth(self, width=None):
|
def setWrappingWidth(self, width=None):
|
||||||
"""Set word-wrapping width"""
|
"""Set word-wrapping width"""
|
||||||
self.setLineWrapMode(QtGui.QTextEdit.FixedPixelWidth)
|
self.setLineWrapMode(QtWidgets.QTextEdit.FixedPixelWidth)
|
||||||
if width is None:
|
self.setLineWrapColumnOrWidth(width or self.width())
|
||||||
width = self.width()
|
|
||||||
self.setLineWrapColumnOrWidth(width)
|
|
||||||
|
|
||||||
def confirmURL(self, link):
|
def confirmURL(self, link):
|
||||||
"""Show a dialog requesting URL opening confirmation"""
|
"""Show a dialog requesting URL opening confirmation"""
|
||||||
if link.scheme() == "mailto":
|
if link.scheme() == "mailto":
|
||||||
window = QtGui.QApplication.activeWindow()
|
window = QtWidgets.QApplication.activeWindow()
|
||||||
window.ui.lineEditTo.setText(link.path())
|
window.ui.lineEditTo.setText(link.path())
|
||||||
if link.hasQueryItem("subject"):
|
if link.hasQueryItem("subject"):
|
||||||
window.ui.lineEditSubject.setText(
|
window.ui.lineEditSubject.setText(
|
||||||
|
@ -84,39 +86,40 @@ class MessageView(QtGui.QTextBrowser):
|
||||||
)
|
)
|
||||||
window.ui.textEditMessage.setFocus()
|
window.ui.textEditMessage.setFocus()
|
||||||
return
|
return
|
||||||
reply = QtGui.QMessageBox.warning(
|
reply = QtWidgets.QMessageBox.warning(
|
||||||
self,
|
self, _translate("MessageView", "Follow external link"),
|
||||||
QtGui.QApplication.translate(
|
_translate(
|
||||||
"MessageView",
|
"MessageView",
|
||||||
"Follow external link"),
|
"The link \"{0}\" will open in a browser. It may be"
|
||||||
QtGui.QApplication.translate(
|
" a security risk, it could de-anonymise you or download"
|
||||||
"MessageView",
|
" malicious data. Are you sure?"
|
||||||
"The link \"{0}\" will open in a browser. It may be a security risk, it could de-anonymise you"
|
).format(unic(ustr(link.toString()))),
|
||||||
" or download malicious data. Are you sure?").format(unic(ustr(link))),
|
QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
|
||||||
QtGui.QMessageBox.Yes,
|
if reply == QtWidgets.QMessageBox.Yes:
|
||||||
QtGui.QMessageBox.No)
|
|
||||||
if reply == QtGui.QMessageBox.Yes:
|
|
||||||
QtGui.QDesktopServices.openUrl(link)
|
QtGui.QDesktopServices.openUrl(link)
|
||||||
|
|
||||||
def loadResource(self, restype, name):
|
def loadResource(self, restype, name):
|
||||||
"""
|
"""
|
||||||
Callback for loading referenced objects, such as an image. For security reasons at the moment doesn't do
|
Callback for loading referenced objects, such as an image.
|
||||||
anything)
|
For security reasons at the moment doesn't do anything
|
||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def lazyRender(self):
|
def lazyRender(self):
|
||||||
"""
|
"""
|
||||||
Partially render a message. This is to avoid UI freezing when loading huge messages. It continues loading as
|
Partially render a message. This is to avoid UI freezing when
|
||||||
you scroll down.
|
loading huge messages. It continues loading as you scroll down.
|
||||||
"""
|
"""
|
||||||
if self.rendering:
|
if self.rendering:
|
||||||
return
|
return
|
||||||
self.rendering = True
|
self.rendering = True
|
||||||
position = self.verticalScrollBar().value()
|
position = self.verticalScrollBar().value()
|
||||||
cursor = QtGui.QTextCursor(self.document())
|
cursor = QtGui.QTextCursor(self.document())
|
||||||
while self.outpos < len(self.out) and self.verticalScrollBar().value(
|
while (
|
||||||
) >= self.document().size().height() - 2 * self.size().height():
|
self.outpos < len(self.out)
|
||||||
|
and self.verticalScrollBar().value()
|
||||||
|
>= self.document().size().height() - 2 * self.size().height()
|
||||||
|
):
|
||||||
startpos = self.outpos
|
startpos = self.outpos
|
||||||
self.outpos += 10240
|
self.outpos += 10240
|
||||||
# find next end of tag
|
# find next end of tag
|
||||||
|
@ -124,7 +127,8 @@ class MessageView(QtGui.QTextBrowser):
|
||||||
pos = self.out.find(">", self.outpos)
|
pos = self.out.find(">", self.outpos)
|
||||||
if pos > self.outpos:
|
if pos > self.outpos:
|
||||||
self.outpos = pos + 1
|
self.outpos = pos + 1
|
||||||
cursor.movePosition(QtGui.QTextCursor.End, QtGui.QTextCursor.MoveAnchor)
|
cursor.movePosition(
|
||||||
|
QtGui.QTextCursor.End, QtGui.QTextCursor.MoveAnchor)
|
||||||
cursor.insertHtml(unic(self.out[startpos:self.outpos]))
|
cursor.insertHtml(unic(self.out[startpos:self.outpos]))
|
||||||
self.verticalScrollBar().setValue(position)
|
self.verticalScrollBar().setValue(position)
|
||||||
self.rendering = False
|
self.rendering = False
|
||||||
|
@ -134,9 +138,11 @@ class MessageView(QtGui.QTextBrowser):
|
||||||
self.mode = MessageView.MODE_PLAIN
|
self.mode = MessageView.MODE_PLAIN
|
||||||
out = self.html.raw
|
out = self.html.raw
|
||||||
if self.html.has_html:
|
if self.html.has_html:
|
||||||
out = "<div align=\"center\" style=\"text-decoration: underline;\"><b>" + unic(ustr(
|
out = (
|
||||||
QtGui.QApplication.translate(
|
'<div align="center" style="text-decoration: underline;"><b>'
|
||||||
"MessageView", "HTML detected, click here to display")) + "</b></div><br/>" + out)
|
+ unic(ustr(_translate(
|
||||||
|
"MessageView", "HTML detected, click here to display"
|
||||||
|
))) + '</b></div><br/>' + out)
|
||||||
self.out = out
|
self.out = out
|
||||||
self.outpos = 0
|
self.outpos = 0
|
||||||
self.setHtml("")
|
self.setHtml("")
|
||||||
|
@ -145,10 +151,10 @@ class MessageView(QtGui.QTextBrowser):
|
||||||
def showHTML(self):
|
def showHTML(self):
|
||||||
"""Render message as HTML"""
|
"""Render message as HTML"""
|
||||||
self.mode = MessageView.MODE_HTML
|
self.mode = MessageView.MODE_HTML
|
||||||
out = self.html.sanitised
|
self.out = (
|
||||||
out = "<div align=\"center\" style=\"text-decoration: underline;\"><b>" + unic(ustr(
|
'<div align="center" style="text-decoration: underline;"><b>'
|
||||||
QtGui.QApplication.translate("MessageView", "Click here to disable HTML")) + "</b></div><br/>" + out)
|
+ _translate("MessageView", "Click here to disable HTML")
|
||||||
self.out = out
|
+ '</b></div><br/>' + self.html.sanitised)
|
||||||
self.outpos = 0
|
self.outpos = 0
|
||||||
self.setHtml("")
|
self.setHtml("")
|
||||||
self.lazyRender()
|
self.lazyRender()
|
||||||
|
@ -156,8 +162,6 @@ class MessageView(QtGui.QTextBrowser):
|
||||||
def setContent(self, data):
|
def setContent(self, data):
|
||||||
"""Set message content from argument"""
|
"""Set message content from argument"""
|
||||||
self.html = SafeHTMLParser()
|
self.html = SafeHTMLParser()
|
||||||
self.html.reset()
|
|
||||||
self.html.reset_safe()
|
|
||||||
self.html.allow_picture = True
|
self.html.allow_picture = True
|
||||||
self.html.feed(data)
|
self.html.feed(data)
|
||||||
self.html.close()
|
self.html.close()
|
||||||
|
|
|
@ -1,16 +1,15 @@
|
||||||
#!/usr/bin/env python2.7
|
from qtpy import QtCore, QtWidgets
|
||||||
from PyQt4 import QtCore, QtGui
|
|
||||||
|
|
||||||
class MigrationWizardIntroPage(QtGui.QWizardPage):
|
class MigrationWizardIntroPage(QtWidgets.QWizardPage):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(QtGui.QWizardPage, self).__init__()
|
super(QtWidgets.QWizardPage, self).__init__()
|
||||||
self.setTitle("Migrating configuration")
|
self.setTitle("Migrating configuration")
|
||||||
|
|
||||||
label = QtGui.QLabel("This wizard will help you to migrate your configuration. "
|
label = QtWidgets.QLabel("This wizard will help you to migrate your configuration. "
|
||||||
"You can still keep using PyBitMessage once you migrate, the changes are backwards compatible.")
|
"You can still keep using PyBitMessage once you migrate, the changes are backwards compatible.")
|
||||||
label.setWordWrap(True)
|
label.setWordWrap(True)
|
||||||
|
|
||||||
layout = QtGui.QVBoxLayout()
|
layout = QtWidgets.QVBoxLayout()
|
||||||
layout.addWidget(label)
|
layout.addWidget(label)
|
||||||
self.setLayout(layout)
|
self.setLayout(layout)
|
||||||
|
|
||||||
|
@ -18,15 +17,15 @@ class MigrationWizardIntroPage(QtGui.QWizardPage):
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|
||||||
class MigrationWizardAddressesPage(QtGui.QWizardPage):
|
class MigrationWizardAddressesPage(QtWidgets.QWizardPage):
|
||||||
def __init__(self, addresses):
|
def __init__(self, addresses):
|
||||||
super(QtGui.QWizardPage, self).__init__()
|
super(QtWidgets.QWizardPage, self).__init__()
|
||||||
self.setTitle("Addresses")
|
self.setTitle("Addresses")
|
||||||
|
|
||||||
label = QtGui.QLabel("Please select addresses that you are already using with mailchuck. ")
|
label = QtWidgets.QLabel("Please select addresses that you are already using with mailchuck. ")
|
||||||
label.setWordWrap(True)
|
label.setWordWrap(True)
|
||||||
|
|
||||||
layout = QtGui.QVBoxLayout()
|
layout = QtWidgets.QVBoxLayout()
|
||||||
layout.addWidget(label)
|
layout.addWidget(label)
|
||||||
self.setLayout(layout)
|
self.setLayout(layout)
|
||||||
|
|
||||||
|
@ -34,15 +33,15 @@ class MigrationWizardAddressesPage(QtGui.QWizardPage):
|
||||||
return 10
|
return 10
|
||||||
|
|
||||||
|
|
||||||
class MigrationWizardGPUPage(QtGui.QWizardPage):
|
class MigrationWizardGPUPage(QtWidgets.QWizardPage):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(QtGui.QWizardPage, self).__init__()
|
super(QtWidgets.QWizardPage, self).__init__()
|
||||||
self.setTitle("GPU")
|
self.setTitle("GPU")
|
||||||
|
|
||||||
label = QtGui.QLabel("Are you using a GPU? ")
|
label = QtWidgets.QLabel("Are you using a GPU? ")
|
||||||
label.setWordWrap(True)
|
label.setWordWrap(True)
|
||||||
|
|
||||||
layout = QtGui.QVBoxLayout()
|
layout = QtWidgets.QVBoxLayout()
|
||||||
layout.addWidget(label)
|
layout.addWidget(label)
|
||||||
self.setLayout(layout)
|
self.setLayout(layout)
|
||||||
|
|
||||||
|
@ -50,22 +49,22 @@ class MigrationWizardGPUPage(QtGui.QWizardPage):
|
||||||
return 10
|
return 10
|
||||||
|
|
||||||
|
|
||||||
class MigrationWizardConclusionPage(QtGui.QWizardPage):
|
class MigrationWizardConclusionPage(QtWidgets.QWizardPage):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(QtGui.QWizardPage, self).__init__()
|
super(QtWidgets.QWizardPage, self).__init__()
|
||||||
self.setTitle("All done!")
|
self.setTitle("All done!")
|
||||||
|
|
||||||
label = QtGui.QLabel("You successfully migrated.")
|
label = QtWidgets.QLabel("You successfully migrated.")
|
||||||
label.setWordWrap(True)
|
label.setWordWrap(True)
|
||||||
|
|
||||||
layout = QtGui.QVBoxLayout()
|
layout = QtWidgets.QVBoxLayout()
|
||||||
layout.addWidget(label)
|
layout.addWidget(label)
|
||||||
self.setLayout(layout)
|
self.setLayout(layout)
|
||||||
|
|
||||||
|
|
||||||
class Ui_MigrationWizard(QtGui.QWizard):
|
class Ui_MigrationWizard(QtWidgets.QWizard):
|
||||||
def __init__(self, addresses):
|
def __init__(self, addresses):
|
||||||
super(QtGui.QWizard, self).__init__()
|
super(QtWidgets.QWizard, self).__init__()
|
||||||
|
|
||||||
self.pages = {}
|
self.pages = {}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ Network status tab widget definition.
|
||||||
|
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from PyQt4 import QtCore, QtGui
|
from qtpy import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
import l10n
|
import l10n
|
||||||
import network.stats
|
import network.stats
|
||||||
|
@ -16,14 +16,16 @@ from tr import _translate
|
||||||
from .uisignaler import UISignaler
|
from .uisignaler import UISignaler
|
||||||
|
|
||||||
|
|
||||||
class NetworkStatus(QtGui.QWidget, RetranslateMixin):
|
class NetworkStatus(QtWidgets.QWidget, RetranslateMixin):
|
||||||
"""Network status tab"""
|
"""Network status tab"""
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super(NetworkStatus, self).__init__(parent)
|
super(NetworkStatus, self).__init__(parent)
|
||||||
widgets.load('networkstatus.ui', self)
|
widgets.load('networkstatus.ui', self)
|
||||||
|
|
||||||
header = self.tableWidgetConnectionCount.horizontalHeader()
|
header = self.tableWidgetConnectionCount.horizontalHeader()
|
||||||
header.setResizeMode(QtGui.QHeaderView.ResizeToContents)
|
header.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)
|
||||||
|
header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
|
||||||
|
header.setSectionResizeMode(2, QtWidgets.QHeaderView.Stretch)
|
||||||
|
|
||||||
# Somehow this value was 5 when I tested
|
# Somehow this value was 5 when I tested
|
||||||
if header.sortIndicatorSection() > 4:
|
if header.sortIndicatorSection() > 4:
|
||||||
|
@ -32,20 +34,17 @@ class NetworkStatus(QtGui.QWidget, RetranslateMixin):
|
||||||
self.startup = time.localtime()
|
self.startup = time.localtime()
|
||||||
|
|
||||||
self.UISignalThread = UISignaler.get()
|
self.UISignalThread = UISignaler.get()
|
||||||
# pylint: disable=no-member
|
self.UISignalThread.updateNumberOfMessagesProcessed.connect(
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
self.updateNumberOfMessagesProcessed)
|
||||||
"updateNumberOfMessagesProcessed()"), self.updateNumberOfMessagesProcessed)
|
self.UISignalThread.updateNumberOfPubkeysProcessed.connect(
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
self.updateNumberOfPubkeysProcessed)
|
||||||
"updateNumberOfPubkeysProcessed()"), self.updateNumberOfPubkeysProcessed)
|
self.UISignalThread.updateNumberOfBroadcastsProcessed.connect(
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
self.updateNumberOfBroadcastsProcessed)
|
||||||
"updateNumberOfBroadcastsProcessed()"), self.updateNumberOfBroadcastsProcessed)
|
self.UISignalThread.updateNetworkStatusTab.connect(
|
||||||
QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL(
|
self.updateNetworkStatusTab)
|
||||||
"updateNetworkStatusTab(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), self.updateNetworkStatusTab)
|
|
||||||
|
|
||||||
self.timer = QtCore.QTimer()
|
self.timer = QtCore.QTimer()
|
||||||
|
self.timer.timeout.connect(self.runEveryTwoSeconds)
|
||||||
QtCore.QObject.connect(self.timer, QtCore.SIGNAL("timeout()"), self.runEveryTwoSeconds)
|
|
||||||
# pylint: enable=no-member
|
|
||||||
|
|
||||||
def startUpdate(self):
|
def startUpdate(self):
|
||||||
"""Start a timer to update counters every 2 seconds"""
|
"""Start a timer to update counters every 2 seconds"""
|
||||||
|
@ -57,91 +56,66 @@ class NetworkStatus(QtGui.QWidget, RetranslateMixin):
|
||||||
"""Stop counter update timer"""
|
"""Stop counter update timer"""
|
||||||
self.timer.stop()
|
self.timer.stop()
|
||||||
|
|
||||||
def formatBytes(self, num):
|
@staticmethod
|
||||||
|
def formatBytes(num):
|
||||||
"""Format bytes nicely (SI prefixes)"""
|
"""Format bytes nicely (SI prefixes)"""
|
||||||
# pylint: disable=no-self-use
|
for x in (
|
||||||
for x in [
|
_translate("networkstatus", "byte(s)", None, num),
|
||||||
_translate(
|
"kB", "MB", "GB"
|
||||||
"networkstatus",
|
):
|
||||||
"byte(s)",
|
|
||||||
None,
|
|
||||||
QtCore.QCoreApplication.CodecForTr,
|
|
||||||
num),
|
|
||||||
"kB",
|
|
||||||
"MB",
|
|
||||||
"GB",
|
|
||||||
]:
|
|
||||||
if num < 1000.0:
|
if num < 1000.0:
|
||||||
return "%3.0f %s" % (num, x)
|
return "%3.0f %s" % (num, x)
|
||||||
num /= 1000.0
|
num /= 1000.0
|
||||||
return "%3.0f %s" % (num, 'TB')
|
return "%3.0f %s" % (num, "TB")
|
||||||
|
|
||||||
def formatByteRate(self, num):
|
@staticmethod
|
||||||
|
def formatByteRate(num):
|
||||||
"""Format transfer speed in kB/s"""
|
"""Format transfer speed in kB/s"""
|
||||||
# pylint: disable=no-self-use
|
|
||||||
num /= 1000
|
num /= 1000
|
||||||
return "%4.0f kB" % num
|
return "%4.0f kB" % num
|
||||||
|
|
||||||
def updateNumberOfObjectsToBeSynced(self):
|
def updateNumberOfObjectsToBeSynced(self):
|
||||||
"""Update the counter for number of objects to be synced"""
|
"""Update the counter for number of objects to be synced"""
|
||||||
self.labelSyncStatus.setText(
|
self.labelSyncStatus.setText(_translate(
|
||||||
_translate(
|
"networkstatus", "Object(s) to be synced: %n", None,
|
||||||
"networkstatus",
|
network.stats.pendingDownload() + network.stats.pendingUpload()))
|
||||||
"Object(s) to be synced: %n",
|
|
||||||
None,
|
|
||||||
QtCore.QCoreApplication.CodecForTr,
|
|
||||||
network.stats.pendingDownload()
|
|
||||||
+ network.stats.pendingUpload()))
|
|
||||||
|
|
||||||
def updateNumberOfMessagesProcessed(self):
|
def updateNumberOfMessagesProcessed(self):
|
||||||
"""Update the counter for number of processed messages"""
|
"""Update the counter for number of processed messages"""
|
||||||
self.updateNumberOfObjectsToBeSynced()
|
self.updateNumberOfObjectsToBeSynced()
|
||||||
self.labelMessageCount.setText(
|
self.labelMessageCount.setText(_translate(
|
||||||
_translate(
|
"networkstatus", "Processed %n person-to-person message(s).",
|
||||||
"networkstatus",
|
None, state.numberOfMessagesProcessed))
|
||||||
"Processed %n person-to-person message(s).",
|
|
||||||
None,
|
|
||||||
QtCore.QCoreApplication.CodecForTr,
|
|
||||||
state.numberOfMessagesProcessed))
|
|
||||||
|
|
||||||
def updateNumberOfBroadcastsProcessed(self):
|
def updateNumberOfBroadcastsProcessed(self):
|
||||||
"""Update the counter for the number of processed broadcasts"""
|
"""Update the counter for the number of processed broadcasts"""
|
||||||
self.updateNumberOfObjectsToBeSynced()
|
self.updateNumberOfObjectsToBeSynced()
|
||||||
self.labelBroadcastCount.setText(
|
self.labelBroadcastCount.setText(_translate(
|
||||||
_translate(
|
"networkstatus", "Processed %n broadcast message(s).", None,
|
||||||
"networkstatus",
|
state.numberOfBroadcastsProcessed))
|
||||||
"Processed %n broadcast message(s).",
|
|
||||||
None,
|
|
||||||
QtCore.QCoreApplication.CodecForTr,
|
|
||||||
state.numberOfBroadcastsProcessed))
|
|
||||||
|
|
||||||
def updateNumberOfPubkeysProcessed(self):
|
def updateNumberOfPubkeysProcessed(self):
|
||||||
"""Update the counter for the number of processed pubkeys"""
|
"""Update the counter for the number of processed pubkeys"""
|
||||||
self.updateNumberOfObjectsToBeSynced()
|
self.updateNumberOfObjectsToBeSynced()
|
||||||
self.labelPubkeyCount.setText(
|
self.labelPubkeyCount.setText(_translate(
|
||||||
_translate(
|
"networkstatus", "Processed %n public key(s).", None,
|
||||||
"networkstatus",
|
state.numberOfPubkeysProcessed))
|
||||||
"Processed %n public key(s).",
|
|
||||||
None,
|
|
||||||
QtCore.QCoreApplication.CodecForTr,
|
|
||||||
state.numberOfPubkeysProcessed))
|
|
||||||
|
|
||||||
def updateNumberOfBytes(self):
|
def updateNumberOfBytes(self):
|
||||||
"""
|
"""
|
||||||
This function is run every two seconds, so we divide the rate of bytes
|
This function is run every two seconds, so we divide the rate
|
||||||
sent and received by 2.
|
of bytes sent and received by 2.
|
||||||
"""
|
"""
|
||||||
self.labelBytesRecvCount.setText(
|
self.labelBytesRecvCount.setText(_translate(
|
||||||
_translate(
|
"networkstatus", "Down: {0}/s Total: {1}").format(
|
||||||
"networkstatus",
|
self.formatByteRate(network.stats.downloadSpeed()),
|
||||||
"Down: {0}/s Total: {1}").format(
|
self.formatBytes(network.stats.receivedBytes())
|
||||||
self.formatByteRate(network.stats.downloadSpeed()),
|
))
|
||||||
self.formatBytes(network.stats.receivedBytes())))
|
self.labelBytesSentCount.setText(_translate(
|
||||||
self.labelBytesSentCount.setText(
|
"networkstatus", "Up: {0}/s Total: {1}").format(
|
||||||
_translate(
|
self.formatByteRate(network.stats.uploadSpeed()),
|
||||||
"networkstatus", "Up: {0}/s Total: {1}").format(
|
self.formatBytes(network.stats.sentBytes())
|
||||||
self.formatByteRate(network.stats.uploadSpeed()),
|
))
|
||||||
self.formatBytes(network.stats.sentBytes())))
|
|
||||||
|
|
||||||
def updateNetworkStatusTab(self, outbound, add, destination):
|
def updateNetworkStatusTab(self, outbound, add, destination):
|
||||||
"""Add or remove an entry to the list of connected peers"""
|
"""Add or remove an entry to the list of connected peers"""
|
||||||
|
@ -168,67 +142,67 @@ class NetworkStatus(QtGui.QWidget, RetranslateMixin):
|
||||||
if add:
|
if add:
|
||||||
self.tableWidgetConnectionCount.insertRow(0)
|
self.tableWidgetConnectionCount.insertRow(0)
|
||||||
self.tableWidgetConnectionCount.setItem(
|
self.tableWidgetConnectionCount.setItem(
|
||||||
0, 0,
|
0, 0, QtWidgets.QTableWidgetItem(
|
||||||
QtGui.QTableWidgetItem("%s:%i" % (destination.host, destination.port))
|
"%s:%i" % (destination.host, destination.port)))
|
||||||
)
|
|
||||||
self.tableWidgetConnectionCount.setItem(
|
self.tableWidgetConnectionCount.setItem(
|
||||||
0, 2,
|
0, 2, QtWidgets.QTableWidgetItem("%s" % (c.userAgent)))
|
||||||
QtGui.QTableWidgetItem("%s" % (c.userAgent))
|
|
||||||
)
|
|
||||||
self.tableWidgetConnectionCount.setItem(
|
self.tableWidgetConnectionCount.setItem(
|
||||||
0, 3,
|
0, 3, QtWidgets.QTableWidgetItem("%s" % (c.tlsVersion)))
|
||||||
QtGui.QTableWidgetItem("%s" % (c.tlsVersion))
|
|
||||||
)
|
|
||||||
self.tableWidgetConnectionCount.setItem(
|
self.tableWidgetConnectionCount.setItem(
|
||||||
0, 4,
|
0, 4, QtWidgets.QTableWidgetItem(
|
||||||
QtGui.QTableWidgetItem("%s" % (",".join(map(str, c.streams))))
|
"%s" % ",".join(map(str, c.streams))))
|
||||||
)
|
|
||||||
try:
|
try:
|
||||||
# .. todo:: FIXME: hard coded stream no
|
# .. todo:: FIXME: hard coded stream no
|
||||||
rating = "%.1f" % (knownnodes.knownNodes[1][destination]['rating'])
|
rating = "%.1f" % knownnodes.knownNodes[1][destination]['rating']
|
||||||
except KeyError:
|
except KeyError:
|
||||||
rating = "-"
|
rating = "-"
|
||||||
self.tableWidgetConnectionCount.setItem(
|
self.tableWidgetConnectionCount.setItem(
|
||||||
0, 1,
|
0, 1, QtWidgets.QTableWidgetItem("%s" % (rating)))
|
||||||
QtGui.QTableWidgetItem("%s" % (rating))
|
|
||||||
)
|
|
||||||
if outbound:
|
if outbound:
|
||||||
brush = QtGui.QBrush(QtGui.QColor("yellow"), QtCore.Qt.SolidPattern)
|
brush = QtGui.QBrush(
|
||||||
|
QtGui.QColor("yellow"), QtCore.Qt.SolidPattern)
|
||||||
else:
|
else:
|
||||||
brush = QtGui.QBrush(QtGui.QColor("green"), QtCore.Qt.SolidPattern)
|
brush = QtGui.QBrush(
|
||||||
|
QtGui.QColor("green"), QtCore.Qt.SolidPattern)
|
||||||
for j in range(1):
|
for j in range(1):
|
||||||
self.tableWidgetConnectionCount.item(0, j).setBackground(brush)
|
self.tableWidgetConnectionCount.item(0, j).setBackground(brush)
|
||||||
self.tableWidgetConnectionCount.item(0, 0).setData(QtCore.Qt.UserRole, destination)
|
self.tableWidgetConnectionCount.item(0, 0).setData(
|
||||||
self.tableWidgetConnectionCount.item(0, 1).setData(QtCore.Qt.UserRole, outbound)
|
QtCore.Qt.UserRole, destination)
|
||||||
|
self.tableWidgetConnectionCount.item(0, 1).setData(
|
||||||
|
QtCore.Qt.UserRole, outbound)
|
||||||
else:
|
else:
|
||||||
if not connectionpool.pool.inboundConnections:
|
if not connectionpool.pool.inboundConnections:
|
||||||
self.window().setStatusIcon('yellow')
|
self.window().setStatusIcon('yellow')
|
||||||
for i in range(self.tableWidgetConnectionCount.rowCount()):
|
for i in range(self.tableWidgetConnectionCount.rowCount()):
|
||||||
if self.tableWidgetConnectionCount.item(i, 0).data(QtCore.Qt.UserRole) != destination:
|
if self.tableWidgetConnectionCount.item(i, 0).data(
|
||||||
|
QtCore.Qt.UserRole) != destination:
|
||||||
continue
|
continue
|
||||||
if self.tableWidgetConnectionCount.item(i, 1).data(QtCore.Qt.UserRole) == outbound:
|
if self.tableWidgetConnectionCount.item(i, 1).data(
|
||||||
|
QtCore.Qt.UserRole) == outbound:
|
||||||
self.tableWidgetConnectionCount.removeRow(i)
|
self.tableWidgetConnectionCount.removeRow(i)
|
||||||
break
|
break
|
||||||
|
|
||||||
self.tableWidgetConnectionCount.setUpdatesEnabled(True)
|
self.tableWidgetConnectionCount.setUpdatesEnabled(True)
|
||||||
self.tableWidgetConnectionCount.setSortingEnabled(True)
|
self.tableWidgetConnectionCount.setSortingEnabled(True)
|
||||||
self.labelTotalConnections.setText(
|
self.labelTotalConnections.setText(_translate(
|
||||||
_translate(
|
"networkstatus", "Total Connections: {0}").format(
|
||||||
"networkstatus", "Total Connections: {0}").format(
|
self.tableWidgetConnectionCount.rowCount()
|
||||||
str(self.tableWidgetConnectionCount.rowCount())))
|
))
|
||||||
# FYI: The 'singlelistener' thread sets the icon color to green when it
|
# FYI: The 'singlelistener' thread sets the icon color to green
|
||||||
# receives an incoming connection, meaning that the user's firewall is
|
# when it receives an incoming connection, meaning that the user's
|
||||||
# configured correctly.
|
# firewall is configured correctly.
|
||||||
if self.tableWidgetConnectionCount.rowCount() and state.statusIconColor == 'red':
|
if self.tableWidgetConnectionCount.rowCount():
|
||||||
self.window().setStatusIcon('yellow')
|
if state.statusIconColor == 'red':
|
||||||
elif self.tableWidgetConnectionCount.rowCount() == 0 and state.statusIconColor != "red":
|
self.window().setStatusIcon('yellow')
|
||||||
|
elif state.statusIconColor != 'red':
|
||||||
self.window().setStatusIcon('red')
|
self.window().setStatusIcon('red')
|
||||||
|
|
||||||
# timer driven
|
# timer driven
|
||||||
def runEveryTwoSeconds(self):
|
def runEveryTwoSeconds(self):
|
||||||
"""Updates counters, runs every 2 seconds if the timer is running"""
|
"""Updates counters, runs every 2 seconds if the timer is running"""
|
||||||
self.labelLookupsPerSecond.setText(_translate("networkstatus", "Inventory lookups per second: {0}").format(
|
self.labelLookupsPerSecond.setText(_translate(
|
||||||
str(state.Inventory.numberOfInventoryLookupsPerformed / 2)))
|
"networkstatus", "Inventory lookups per second: {0}"
|
||||||
|
).format(state.Inventory.numberOfInventoryLookupsPerformed / 2))
|
||||||
state.Inventory.numberOfInventoryLookupsPerformed = 0
|
state.Inventory.numberOfInventoryLookupsPerformed = 0
|
||||||
self.updateNumberOfBytes()
|
self.updateNumberOfBytes()
|
||||||
self.updateNumberOfObjectsToBeSynced()
|
self.updateNumberOfObjectsToBeSynced()
|
||||||
|
@ -236,10 +210,9 @@ class NetworkStatus(QtGui.QWidget, RetranslateMixin):
|
||||||
def retranslateUi(self):
|
def retranslateUi(self):
|
||||||
"""Conventional Qt Designer method for dynamic l10n"""
|
"""Conventional Qt Designer method for dynamic l10n"""
|
||||||
super(NetworkStatus, self).retranslateUi()
|
super(NetworkStatus, self).retranslateUi()
|
||||||
self.labelTotalConnections.setText(
|
self.labelTotalConnections.setText(_translate(
|
||||||
_translate(
|
"networkstatus", "Total Connections: {0}"
|
||||||
"networkstatus", "Total Connections: {0}").format(
|
).format(self.tableWidgetConnectionCount.rowCount()))
|
||||||
str(self.tableWidgetConnectionCount.rowCount())))
|
|
||||||
self.labelStartupTime.setText(_translate(
|
self.labelStartupTime.setText(_translate(
|
||||||
"networkstatus", "Since startup on {0}"
|
"networkstatus", "Since startup on {0}"
|
||||||
).format(l10n.formatTimestamp(self.startup)))
|
).format(l10n.formatTimestamp(self.startup)))
|
||||||
|
|
|
@ -100,6 +100,9 @@
|
||||||
<property name="sortingEnabled">
|
<property name="sortingEnabled">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
<attribute name="horizontalHeaderCascadingSectionResizes">
|
<attribute name="horizontalHeaderCascadingSectionResizes">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</attribute>
|
</attribute>
|
||||||
|
@ -109,9 +112,6 @@
|
||||||
<attribute name="horizontalHeaderHighlightSections">
|
<attribute name="horizontalHeaderHighlightSections">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</attribute>
|
</attribute>
|
||||||
<attribute name="horizontalHeaderStretchLastSection">
|
|
||||||
<bool>true</bool>
|
|
||||||
</attribute>
|
|
||||||
<attribute name="verticalHeaderVisible">
|
<attribute name="verticalHeaderVisible">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</attribute>
|
</attribute>
|
||||||
|
@ -296,11 +296,8 @@
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>STableWidget</class>
|
<class>STableWidget</class>
|
||||||
<extends>QTableWidget</extends>
|
<extends>QTableWidget</extends>
|
||||||
<header>bitmessageqt/settingsmixin.h</header>
|
<header>bitmessageqt.settingsmixin</header>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<resources>
|
|
||||||
<include location="bitmessage_icons.qrc"/>
|
|
||||||
</resources>
|
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
|
|
@ -375,7 +375,7 @@ The 'Random Number' option is selected by default but deterministic addresses ha
|
||||||
<sender>radioButtonDeterministicAddress</sender>
|
<sender>radioButtonDeterministicAddress</sender>
|
||||||
<signal>toggled(bool)</signal>
|
<signal>toggled(bool)</signal>
|
||||||
<receiver>groupBoxDeterministic</receiver>
|
<receiver>groupBoxDeterministic</receiver>
|
||||||
<slot>setShown(bool)</slot>
|
<slot>setVisible(bool)</slot>
|
||||||
<hints>
|
<hints>
|
||||||
<hint type="sourcelabel">
|
<hint type="sourcelabel">
|
||||||
<x>92</x>
|
<x>92</x>
|
||||||
|
@ -391,7 +391,7 @@ The 'Random Number' option is selected by default but deterministic addresses ha
|
||||||
<sender>radioButtonRandomAddress</sender>
|
<sender>radioButtonRandomAddress</sender>
|
||||||
<signal>toggled(bool)</signal>
|
<signal>toggled(bool)</signal>
|
||||||
<receiver>groupBox</receiver>
|
<receiver>groupBox</receiver>
|
||||||
<slot>setShown(bool)</slot>
|
<slot>setVisible(bool)</slot>
|
||||||
<hints>
|
<hints>
|
||||||
<hint type="sourcelabel">
|
<hint type="sourcelabel">
|
||||||
<x>72</x>
|
<x>72</x>
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
"""
|
"""
|
||||||
src/bitmessageqt/newchandialog.py
|
NewChanDialog class definition
|
||||||
=================================
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from unqstr import ustr, unic
|
from unqstr import ustr, unic
|
||||||
from PyQt4 import QtCore, QtGui
|
from qtpy import QtCore, QtWidgets
|
||||||
|
|
||||||
from bitmessageqt import widgets
|
from bitmessageqt import widgets
|
||||||
from addresses import addBMIfNotPresent
|
from addresses import addBMIfNotPresent
|
||||||
|
@ -16,30 +14,21 @@ from tr import _translate
|
||||||
from .utils import str_chan
|
from .utils import str_chan
|
||||||
|
|
||||||
|
|
||||||
class NewChanDialog(QtGui.QDialog):
|
class NewChanDialog(QtWidgets.QDialog):
|
||||||
"""The `New Chan` dialog"""
|
"""The "New Chan" dialog"""
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super(NewChanDialog, self).__init__(parent)
|
super(NewChanDialog, self).__init__(parent)
|
||||||
widgets.load('newchandialog.ui', self)
|
widgets.load('newchandialog.ui', self)
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.chanAddress.setValidator(
|
self.chanAddress.setValidator(AddressValidator(
|
||||||
AddressValidator(
|
self.chanAddress, self.chanPassPhrase, self.validatorFeedback,
|
||||||
self.chanAddress,
|
self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok), False))
|
||||||
self.chanPassPhrase,
|
self.chanPassPhrase.setValidator(PassPhraseValidator(
|
||||||
self.validatorFeedback,
|
self.chanPassPhrase, self.chanAddress, self.validatorFeedback,
|
||||||
self.buttonBox,
|
self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok), False))
|
||||||
False))
|
|
||||||
self.chanPassPhrase.setValidator(
|
|
||||||
PassPhraseValidator(
|
|
||||||
self.chanPassPhrase,
|
|
||||||
self.chanAddress,
|
|
||||||
self.validatorFeedback,
|
|
||||||
self.buttonBox,
|
|
||||||
False))
|
|
||||||
|
|
||||||
self.timer = QtCore.QTimer()
|
self.timer = QtCore.QTimer()
|
||||||
QtCore.QObject.connect( # pylint: disable=no-member
|
self.timer.timeout.connect(self.delayedUpdateStatus)
|
||||||
self.timer, QtCore.SIGNAL("timeout()"), self.delayedUpdateStatus)
|
|
||||||
self.timer.start(500) # milliseconds
|
self.timer.start(500) # milliseconds
|
||||||
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
|
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
|
||||||
self.show()
|
self.show()
|
||||||
|
@ -65,20 +54,26 @@ class NewChanDialog(QtGui.QDialog):
|
||||||
ustr(self.chanPassPhrase.text()).encode("utf-8", "replace"),
|
ustr(self.chanPassPhrase.text()).encode("utf-8", "replace"),
|
||||||
True))
|
True))
|
||||||
addressGeneratorReturnValue = apiAddressGeneratorReturnQueue.get(True)
|
addressGeneratorReturnValue = apiAddressGeneratorReturnQueue.get(True)
|
||||||
if addressGeneratorReturnValue and addressGeneratorReturnValue[0] != 'chan name does not match address':
|
if len(addressGeneratorReturnValue) > 0 and addressGeneratorReturnValue[0] != 'chan name does not match address':
|
||||||
UISignalQueue.put(('updateStatusBar', _translate(
|
UISignalQueue.put(('updateStatusBar', _translate(
|
||||||
"newchandialog", "Successfully created / joined chan {0}").format(unic(ustr(self.chanPassPhrase.text())))))
|
"newchandialog", "Successfully created / joined chan {0}").format(unic(ustr(self.chanPassPhrase.text())))))
|
||||||
self.parent.ui.tabWidget.setCurrentIndex(
|
self.parent.ui.tabWidget.setCurrentIndex(
|
||||||
self.parent.ui.tabWidget.indexOf(self.parent.ui.chans)
|
self.parent.ui.tabWidget.indexOf(self.parent.ui.chans)
|
||||||
)
|
)
|
||||||
self.done(QtGui.QDialog.Accepted)
|
self.done(QtWidgets.QDialog.Accepted)
|
||||||
else:
|
else:
|
||||||
UISignalQueue.put(('updateStatusBar', _translate("newchandialog", "Chan creation / joining failed")))
|
UISignalQueue.put((
|
||||||
self.done(QtGui.QDialog.Rejected)
|
'updateStatusBar',
|
||||||
|
_translate("newchandialog", "Chan creation / joining failed")
|
||||||
|
))
|
||||||
|
self.done(QtWidgets.QDialog.Rejected)
|
||||||
|
|
||||||
def reject(self):
|
def reject(self):
|
||||||
"""Cancel joining the chan"""
|
"""Cancel joining the chan"""
|
||||||
self.timer.stop()
|
self.timer.stop()
|
||||||
self.hide()
|
self.hide()
|
||||||
UISignalQueue.put(('updateStatusBar', _translate("newchandialog", "Chan creation / joining cancelled")))
|
UISignalQueue.put((
|
||||||
self.done(QtGui.QDialog.Rejected)
|
'updateStatusBar',
|
||||||
|
_translate("newchandialog", "Chan creation / joining cancelled")
|
||||||
|
))
|
||||||
|
self.done(QtWidgets.QDialog.Rejected)
|
||||||
|
|
|
@ -1,22 +1,21 @@
|
||||||
from os import path
|
|
||||||
from unqstr import ustr
|
from unqstr import ustr
|
||||||
import six
|
import six
|
||||||
from PyQt4 import QtGui
|
|
||||||
from debug import logger
|
|
||||||
from bitmessageqt import widgets
|
from bitmessageqt import widgets
|
||||||
|
from qtpy import QtWidgets
|
||||||
|
|
||||||
|
|
||||||
class RetranslateMixin(object):
|
class RetranslateMixin(object):
|
||||||
def retranslateUi(self):
|
def retranslateUi(self):
|
||||||
defaults = QtGui.QWidget()
|
defaults = QtWidgets.QWidget()
|
||||||
widgets.load(self.__class__.__name__.lower() + '.ui', defaults)
|
widgets.load(self.__class__.__name__.lower() + '.ui', defaults)
|
||||||
for attr, value in six.iteritems(defaults.__dict__):
|
for attr, value in six.iteritems(defaults.__dict__):
|
||||||
setTextMethod = getattr(value, "setText", None)
|
setTextMethod = getattr(value, "setText", None)
|
||||||
if callable(setTextMethod):
|
if callable(setTextMethod):
|
||||||
getattr(self, attr).setText(ustr(getattr(defaults, attr).text()))
|
getattr(self, attr).setText(ustr(getattr(defaults, attr).text()))
|
||||||
elif isinstance(value, QtGui.QTableWidget):
|
elif isinstance(value, QtWidgets.QTableWidget):
|
||||||
for i in range (value.columnCount()):
|
for i in range(value.columnCount()):
|
||||||
getattr(self, attr).horizontalHeaderItem(i).setText(
|
getattr(self, attr).horizontalHeaderItem(i).setText(
|
||||||
ustr(getattr(defaults, attr).horizontalHeaderItem(i).text()))
|
ustr(getattr(defaults, attr).horizontalHeaderItem(i).text()))
|
||||||
for i in range (value.rowCount()):
|
for i in range(value.rowCount()):
|
||||||
getattr(self, attr).verticalHeaderItem(i).setText(
|
getattr(self, attr).verticalHeaderItem(i).setText(
|
||||||
ustr(getattr(defaults, attr).verticalHeaderItem(i).text()))
|
ustr(getattr(defaults, attr).verticalHeaderItem(i).text()))
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
"""
|
"""
|
||||||
This module setting file is for settings
|
SettingsDialog class definition
|
||||||
"""
|
"""
|
||||||
from six.moves import configparser
|
from six.moves import configparser
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
|
from qtpy import QtCore, QtGui, QtWidgets
|
||||||
import six
|
import six
|
||||||
from unqstr import ustr
|
from unqstr import ustr
|
||||||
from PyQt4 import QtCore, QtGui
|
|
||||||
|
|
||||||
import debug
|
import debug
|
||||||
import defaults
|
import defaults
|
||||||
|
@ -40,7 +40,7 @@ def getSOCKSProxyType(config):
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
class SettingsDialog(QtGui.QDialog):
|
class SettingsDialog(QtWidgets.QDialog):
|
||||||
"""The "Settings" dialog"""
|
"""The "Settings" dialog"""
|
||||||
def __init__(self, parent=None, firstrun=False):
|
def __init__(self, parent=None, firstrun=False):
|
||||||
super(SettingsDialog, self).__init__(parent)
|
super(SettingsDialog, self).__init__(parent)
|
||||||
|
@ -81,7 +81,7 @@ class SettingsDialog(QtGui.QDialog):
|
||||||
self.tabWidgetSettings.setCurrentIndex(
|
self.tabWidgetSettings.setCurrentIndex(
|
||||||
self.tabWidgetSettings.indexOf(self.tabNetworkSettings)
|
self.tabWidgetSettings.indexOf(self.tabNetworkSettings)
|
||||||
)
|
)
|
||||||
QtGui.QWidget.resize(self, QtGui.QWidget.sizeHint(self))
|
QtWidgets.QWidget.resize(self, QtWidgets.QWidget.sizeHint(self))
|
||||||
|
|
||||||
def adjust_from_config(self, config):
|
def adjust_from_config(self, config):
|
||||||
"""Adjust all widgets state according to config settings"""
|
"""Adjust all widgets state according to config settings"""
|
||||||
|
@ -349,7 +349,7 @@ class SettingsDialog(QtGui.QDialog):
|
||||||
self.config.set('bitmessagesettings', 'replybelow', str(
|
self.config.set('bitmessagesettings', 'replybelow', str(
|
||||||
self.checkBoxReplyBelow.isChecked()))
|
self.checkBoxReplyBelow.isChecked()))
|
||||||
|
|
||||||
lang = str(self.languageComboBox.itemData(
|
lang = ustr(self.languageComboBox.itemData(
|
||||||
self.languageComboBox.currentIndex()))
|
self.languageComboBox.currentIndex()))
|
||||||
self.config.set('bitmessagesettings', 'userlocale', lang)
|
self.config.set('bitmessagesettings', 'userlocale', lang)
|
||||||
self.parent.change_translation()
|
self.parent.change_translation()
|
||||||
|
@ -432,7 +432,7 @@ class SettingsDialog(QtGui.QDialog):
|
||||||
self.config.set('bitmessagesettings', 'maxuploadrate', str(
|
self.config.set('bitmessagesettings', 'maxuploadrate', str(
|
||||||
int(float(self.lineEditMaxUploadRate.text()))))
|
int(float(self.lineEditMaxUploadRate.text()))))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
QtGui.QMessageBox.about(
|
QtWidgets.QMessageBox.about(
|
||||||
self, _translate("MainWindow", "Number needed"),
|
self, _translate("MainWindow", "Number needed"),
|
||||||
_translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
|
@ -487,7 +487,7 @@ class SettingsDialog(QtGui.QDialog):
|
||||||
or float(self.lineEditMaxAcceptableTotalDifficulty.text()) == 0
|
or float(self.lineEditMaxAcceptableTotalDifficulty.text()) == 0
|
||||||
):
|
):
|
||||||
if self.config.get(
|
if self.config.get(
|
||||||
'bitmessagesettings', 'maxacceptablenoncetrialsperbyte'
|
'bitmessagesettings', 'maxacceptablenoncetrialsperbyte'
|
||||||
) != str(int(
|
) != str(int(
|
||||||
float(self.lineEditMaxAcceptableTotalDifficulty.text())
|
float(self.lineEditMaxAcceptableTotalDifficulty.text())
|
||||||
* defaults.networkDefaultProofOfWorkNonceTrialsPerByte)):
|
* defaults.networkDefaultProofOfWorkNonceTrialsPerByte)):
|
||||||
|
@ -504,7 +504,7 @@ class SettingsDialog(QtGui.QDialog):
|
||||||
or float(self.lineEditMaxAcceptableSmallMessageDifficulty.text()) == 0
|
or float(self.lineEditMaxAcceptableSmallMessageDifficulty.text()) == 0
|
||||||
):
|
):
|
||||||
if self.config.get(
|
if self.config.get(
|
||||||
'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes'
|
'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes'
|
||||||
) != str(int(
|
) != str(int(
|
||||||
float(self.lineEditMaxAcceptableSmallMessageDifficulty.text())
|
float(self.lineEditMaxAcceptableSmallMessageDifficulty.text())
|
||||||
* defaults.networkDefaultPayloadLengthExtraBytes)):
|
* defaults.networkDefaultPayloadLengthExtraBytes)):
|
||||||
|
@ -556,7 +556,7 @@ class SettingsDialog(QtGui.QDialog):
|
||||||
if state.maximumLengthOfTimeToBotherResendingMessages < 432000:
|
if state.maximumLengthOfTimeToBotherResendingMessages < 432000:
|
||||||
# If the time period is less than 5 hours, we give
|
# If the time period is less than 5 hours, we give
|
||||||
# zero values to all fields. No message will be sent again.
|
# zero values to all fields. No message will be sent again.
|
||||||
QtGui.QMessageBox.about(
|
QtWidgets.QMessageBox.about(
|
||||||
self,
|
self,
|
||||||
_translate("MainWindow", "Will not resend ever"),
|
_translate("MainWindow", "Will not resend ever"),
|
||||||
_translate(
|
_translate(
|
||||||
|
|
|
@ -1086,9 +1086,6 @@
|
||||||
<tabstop>checkBoxSocksListen</tabstop>
|
<tabstop>checkBoxSocksListen</tabstop>
|
||||||
<tabstop>buttonBox</tabstop>
|
<tabstop>buttonBox</tabstop>
|
||||||
</tabstops>
|
</tabstops>
|
||||||
<resources>
|
|
||||||
<include location="bitmessage_icons.qrc"/>
|
|
||||||
</resources>
|
|
||||||
<connections>
|
<connections>
|
||||||
<connection>
|
<connection>
|
||||||
<sender>buttonBox</sender>
|
<sender>buttonBox</sender>
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
#!/usr/bin/python2.7
|
|
||||||
"""
|
"""
|
||||||
src/settingsmixin.py
|
src/settingsmixin.py
|
||||||
====================
|
====================
|
||||||
|
@ -6,11 +5,12 @@ src/settingsmixin.py
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from unqstr import ustr
|
from unqstr import ustr
|
||||||
from PyQt4 import QtCore, QtGui
|
from qtpy import QtCore, QtWidgets
|
||||||
|
|
||||||
|
|
||||||
class SettingsMixin(object):
|
class SettingsMixin(object):
|
||||||
"""Mixin for adding geometry and state saving between restarts."""
|
"""Mixin for adding geometry and state saving between restarts"""
|
||||||
|
|
||||||
def warnIfNoObjectName(self):
|
def warnIfNoObjectName(self):
|
||||||
"""
|
"""
|
||||||
Handle objects which don't have a name. Currently it ignores them. Objects without a name can't have their
|
Handle objects which don't have a name. Currently it ignores them. Objects without a name can't have their
|
||||||
|
@ -41,8 +41,9 @@ class SettingsMixin(object):
|
||||||
self.warnIfNoObjectName()
|
self.warnIfNoObjectName()
|
||||||
settings = QtCore.QSettings()
|
settings = QtCore.QSettings()
|
||||||
try:
|
try:
|
||||||
geom = settings.value("/".join([ustr(self.objectName()), "geometry"]))
|
geom = settings.value(
|
||||||
target.restoreGeometry(geom.toByteArray() if hasattr(geom, 'toByteArray') else geom)
|
"/".join([ustr(self.objectName()), "geometry"]))
|
||||||
|
target.restoreGeometry(geom)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -52,13 +53,14 @@ class SettingsMixin(object):
|
||||||
settings = QtCore.QSettings()
|
settings = QtCore.QSettings()
|
||||||
try:
|
try:
|
||||||
state = settings.value("/".join([ustr(self.objectName()), "state"]))
|
state = settings.value("/".join([ustr(self.objectName()), "state"]))
|
||||||
target.restoreState(state.toByteArray() if hasattr(state, 'toByteArray') else state)
|
target.restoreState(state)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class SMainWindow(QtGui.QMainWindow, SettingsMixin):
|
class SMainWindow(QtWidgets.QMainWindow, SettingsMixin):
|
||||||
"""Main window with Settings functionality."""
|
"""Main window with Settings functionality"""
|
||||||
|
|
||||||
def loadSettings(self):
|
def loadSettings(self):
|
||||||
"""Load main window settings."""
|
"""Load main window settings."""
|
||||||
self.readGeometry(self)
|
self.readGeometry(self)
|
||||||
|
@ -70,9 +72,9 @@ class SMainWindow(QtGui.QMainWindow, SettingsMixin):
|
||||||
self.writeGeometry(self)
|
self.writeGeometry(self)
|
||||||
|
|
||||||
|
|
||||||
class STableWidget(QtGui.QTableWidget, SettingsMixin):
|
class STableWidget(QtWidgets.QTableWidget, SettingsMixin):
|
||||||
"""Table widget with Settings functionality"""
|
"""Table widget with Settings functionality"""
|
||||||
# pylint: disable=too-many-ancestors
|
|
||||||
def loadSettings(self):
|
def loadSettings(self):
|
||||||
"""Load table settings."""
|
"""Load table settings."""
|
||||||
self.readState(self.horizontalHeader())
|
self.readState(self.horizontalHeader())
|
||||||
|
@ -82,8 +84,9 @@ class STableWidget(QtGui.QTableWidget, SettingsMixin):
|
||||||
self.writeState(self.horizontalHeader())
|
self.writeState(self.horizontalHeader())
|
||||||
|
|
||||||
|
|
||||||
class SSplitter(QtGui.QSplitter, SettingsMixin):
|
class SSplitter(QtWidgets.QSplitter, SettingsMixin):
|
||||||
"""Splitter with Settings functionality."""
|
"""Splitter with Settings functionality"""
|
||||||
|
|
||||||
def loadSettings(self):
|
def loadSettings(self):
|
||||||
"""Load splitter settings"""
|
"""Load splitter settings"""
|
||||||
self.readState(self)
|
self.readState(self)
|
||||||
|
@ -93,17 +96,17 @@ class SSplitter(QtGui.QSplitter, SettingsMixin):
|
||||||
self.writeState(self)
|
self.writeState(self)
|
||||||
|
|
||||||
|
|
||||||
class STreeWidget(QtGui.QTreeWidget, SettingsMixin):
|
class STreeWidget(QtWidgets.QTreeWidget, SettingsMixin):
|
||||||
"""Tree widget with settings functionality."""
|
"""Tree widget with settings functionality"""
|
||||||
# pylint: disable=too-many-ancestors
|
|
||||||
def loadSettings(self):
|
def loadSettings(self):
|
||||||
"""Load tree settings."""
|
"""Load tree settings. Unimplemented."""
|
||||||
# recurse children
|
# recurse children
|
||||||
# self.readState(self)
|
# self.readState(self)
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def saveSettings(self):
|
def saveSettings(self):
|
||||||
"""Save tree settings"""
|
"""Save tree settings. Unimplemented."""
|
||||||
# recurse children
|
# recurse children
|
||||||
# self.writeState(self)
|
# self.writeState(self)
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
# pylint: disable=unused-argument
|
"""BMStatusBar class definition"""
|
||||||
"""Status bar Module"""
|
|
||||||
|
|
||||||
from time import time
|
from time import time
|
||||||
from PyQt4 import QtGui
|
|
||||||
|
from qtpy import QtWidgets
|
||||||
|
|
||||||
|
|
||||||
class BMStatusBar(QtGui.QStatusBar):
|
class BMStatusBar(QtWidgets.QStatusBar):
|
||||||
"""Status bar with queue and priorities"""
|
"""Status bar with queue and priorities"""
|
||||||
duration = 10000
|
duration = 10000
|
||||||
deleteAfter = 60
|
deleteAfter = 60
|
||||||
|
@ -16,21 +16,24 @@ class BMStatusBar(QtGui.QStatusBar):
|
||||||
self.timer = self.startTimer(BMStatusBar.duration)
|
self.timer = self.startTimer(BMStatusBar.duration)
|
||||||
self.iterator = 0
|
self.iterator = 0
|
||||||
|
|
||||||
def timerEvent(self, event):
|
def timerEvent(self, event): # pylint: disable=unused-argument
|
||||||
"""an event handler which allows to queue and prioritise messages to
|
"""an event handler which allows to queue and prioritise messages to
|
||||||
show in the status bar, for example if many messages come very quickly
|
show in the status bar, for example if many messages come very quickly
|
||||||
after one another, it adds delays and so on"""
|
after one another, it adds delays and so on"""
|
||||||
while len(self.important) > 0:
|
while len(self.important) > 0:
|
||||||
self.iterator += 1
|
self.iterator += 1
|
||||||
try:
|
try:
|
||||||
if time() > self.important[self.iterator][1] + BMStatusBar.deleteAfter:
|
if (
|
||||||
|
self.important[self.iterator][1]
|
||||||
|
+ BMStatusBar.deleteAfter < time()
|
||||||
|
):
|
||||||
del self.important[self.iterator]
|
del self.important[self.iterator]
|
||||||
self.iterator -= 1
|
self.iterator -= 1
|
||||||
continue
|
continue
|
||||||
except IndexError:
|
except IndexError:
|
||||||
self.iterator = -1
|
self.iterator = -1
|
||||||
continue
|
continue
|
||||||
super(BMStatusBar, self).showMessage(self.important[self.iterator][0], 0)
|
self.showMessage(self.important[self.iterator][0], 0)
|
||||||
break
|
break
|
||||||
|
|
||||||
def addImportant(self, message):
|
def addImportant(self, message):
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
"""Composing support request message functions."""
|
"""Composing support request message functions."""
|
||||||
# pylint: disable=no-member
|
|
||||||
|
|
||||||
import ctypes
|
import ctypes
|
||||||
|
import os
|
||||||
import ssl
|
import ssl
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from unqstr import ustr, unic
|
from unqstr import ustr, unic
|
||||||
from PyQt4 import QtCore
|
|
||||||
from dbcompat import dbstr
|
from dbcompat import dbstr
|
||||||
|
|
||||||
from bitmessageqt import account
|
from bitmessageqt import account
|
||||||
|
@ -33,7 +32,7 @@ OLD_SUPPORT_ADDRESS = 'BM-2cTkCtMYkrSPwFTpgcBrMrf5d8oZwvMZWK'
|
||||||
SUPPORT_ADDRESS = 'BM-2cUdgkDDAahwPAU6oD2A7DnjqZz3hgY832'
|
SUPPORT_ADDRESS = 'BM-2cUdgkDDAahwPAU6oD2A7DnjqZz3hgY832'
|
||||||
SUPPORT_LABEL = _translate("Support", "PyBitmessage support")
|
SUPPORT_LABEL = _translate("Support", "PyBitmessage support")
|
||||||
SUPPORT_MY_LABEL = _translate("Support", "My new address")
|
SUPPORT_MY_LABEL = _translate("Support", "My new address")
|
||||||
SUPPORT_SUBJECT = 'Support request'
|
SUPPORT_SUBJECT = _translate("Support", "Support request")
|
||||||
SUPPORT_MESSAGE = _translate("Support", '''
|
SUPPORT_MESSAGE = _translate("Support", '''
|
||||||
You can use this message to send a report to one of the PyBitmessage core \
|
You can use this message to send a report to one of the PyBitmessage core \
|
||||||
developers regarding PyBitmessage or the mailchuck.com email service. \
|
developers regarding PyBitmessage or the mailchuck.com email service. \
|
||||||
|
@ -57,6 +56,7 @@ Operating system: {}
|
||||||
Architecture: {}bit
|
Architecture: {}bit
|
||||||
Python Version: {}
|
Python Version: {}
|
||||||
OpenSSL Version: {}
|
OpenSSL Version: {}
|
||||||
|
Qt API: {}
|
||||||
Frozen: {}
|
Frozen: {}
|
||||||
Portable mode: {}
|
Portable mode: {}
|
||||||
C PoW: {}
|
C PoW: {}
|
||||||
|
@ -69,8 +69,12 @@ Connected hosts: {}
|
||||||
|
|
||||||
|
|
||||||
def checkAddressBook(myapp):
|
def checkAddressBook(myapp):
|
||||||
|
"""
|
||||||
|
Add "PyBitmessage support" address to address book, remove old one if found.
|
||||||
|
"""
|
||||||
sqlExecute('DELETE from addressbook WHERE address=?', dbstr(OLD_SUPPORT_ADDRESS))
|
sqlExecute('DELETE from addressbook WHERE address=?', dbstr(OLD_SUPPORT_ADDRESS))
|
||||||
queryreturn = sqlQuery('SELECT * FROM addressbook WHERE address=?', dbstr(SUPPORT_ADDRESS))
|
queryreturn = sqlQuery(
|
||||||
|
'SELECT * FROM addressbook WHERE address=?', dbstr(SUPPORT_ADDRESS))
|
||||||
if queryreturn == []:
|
if queryreturn == []:
|
||||||
sqlExecute(
|
sqlExecute(
|
||||||
'INSERT INTO addressbook VALUES (?,?)',
|
'INSERT INTO addressbook VALUES (?,?)',
|
||||||
|
@ -79,14 +83,17 @@ def checkAddressBook(myapp):
|
||||||
|
|
||||||
|
|
||||||
def checkHasNormalAddress():
|
def checkHasNormalAddress():
|
||||||
for address in config.addresses():
|
"""Returns first enabled normal address or False if not found."""
|
||||||
|
for address in config.addresses(True):
|
||||||
acct = account.accountClass(address)
|
acct = account.accountClass(address)
|
||||||
if acct.type == AccountMixin.NORMAL and config.safeGetBoolean(address, 'enabled'):
|
if acct.type == AccountMixin.NORMAL and config.safeGetBoolean(
|
||||||
|
address, 'enabled'):
|
||||||
return address
|
return address
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def createAddressIfNeeded(myapp):
|
def createAddressIfNeeded(myapp):
|
||||||
|
"""Checks if user has any anabled normal address, creates new one if no."""
|
||||||
if not checkHasNormalAddress():
|
if not checkHasNormalAddress():
|
||||||
queues.addressGeneratorQueue.put((
|
queues.addressGeneratorQueue.put((
|
||||||
'createRandomAddress', 4, 1,
|
'createRandomAddress', 4, 1,
|
||||||
|
@ -102,15 +109,20 @@ def createAddressIfNeeded(myapp):
|
||||||
|
|
||||||
|
|
||||||
def createSupportMessage(myapp):
|
def createSupportMessage(myapp):
|
||||||
|
"""
|
||||||
|
Prepare the support request message and switch to tab "Send"
|
||||||
|
"""
|
||||||
checkAddressBook(myapp)
|
checkAddressBook(myapp)
|
||||||
address = createAddressIfNeeded(myapp)
|
address = createAddressIfNeeded(myapp)
|
||||||
if state.shutdown:
|
if state.shutdown:
|
||||||
return
|
return
|
||||||
|
|
||||||
myapp.ui.lineEditSubject.setText(SUPPORT_SUBJECT)
|
myapp.ui.lineEditSubject.setText(SUPPORT_SUBJECT)
|
||||||
addrIndex = myapp.ui.comboBoxSendFrom.findData(
|
# addrIndex = myapp.ui.comboBoxSendFrom.findData(
|
||||||
address, QtCore.Qt.UserRole,
|
# address, QtCore.Qt.UserRole,
|
||||||
QtCore.Qt.MatchFixedString | QtCore.Qt.MatchCaseSensitive)
|
# QtCore.Qt.MatchFixedString | QtCore.Qt.MatchCaseSensitive
|
||||||
|
# )
|
||||||
|
addrIndex = myapp.ui.comboBoxSendFrom.findData(address)
|
||||||
if addrIndex == -1: # something is very wrong
|
if addrIndex == -1: # something is very wrong
|
||||||
return
|
return
|
||||||
myapp.ui.comboBoxSendFrom.setCurrentIndex(addrIndex)
|
myapp.ui.comboBoxSendFrom.setCurrentIndex(addrIndex)
|
||||||
|
@ -121,15 +133,13 @@ def createSupportMessage(myapp):
|
||||||
if commit:
|
if commit:
|
||||||
version += " GIT " + commit
|
version += " GIT " + commit
|
||||||
|
|
||||||
os = sys.platform
|
if sys.platform.startswith("win"):
|
||||||
if os == "win32":
|
# pylint: disable=no-member
|
||||||
windowsversion = sys.getwindowsversion()
|
osname = "Windows %s.%s" % sys.getwindowsversion()[:2]
|
||||||
os = "Windows " + ustr(windowsversion[0]) + "." + ustr(windowsversion[1])
|
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
from os import uname
|
unixversion = os.uname()
|
||||||
unixversion = uname()
|
osname = unixversion[0] + " " + unixversion[2]
|
||||||
os = unixversion[0] + " " + unixversion[2]
|
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
architecture = "32" if ctypes.sizeof(ctypes.c_voidp) == 4 else "64"
|
architecture = "32" if ctypes.sizeof(ctypes.c_voidp) == 4 else "64"
|
||||||
|
@ -138,22 +148,26 @@ def createSupportMessage(myapp):
|
||||||
opensslversion = "%s (Python internal), %s (external for PyElliptic)" % (
|
opensslversion = "%s (Python internal), %s (external for PyElliptic)" % (
|
||||||
ssl.OPENSSL_VERSION, OpenSSL._version)
|
ssl.OPENSSL_VERSION, OpenSSL._version)
|
||||||
|
|
||||||
|
qtapi = os.environ.get('QT_API', 'fallback')
|
||||||
|
|
||||||
frozen = "N/A"
|
frozen = "N/A"
|
||||||
if paths.frozen:
|
if paths.frozen:
|
||||||
frozen = paths.frozen
|
frozen = paths.frozen
|
||||||
portablemode = "True" if state.appdata == paths.lookupExeFolder() else "False"
|
portablemode = str(state.appdata == paths.lookupExeFolder())
|
||||||
cpow = "True" if proofofwork.bmpow else "False"
|
cpow = "True" if proofofwork.bmpow else "False"
|
||||||
openclpow = ustr(
|
openclpow = ustr(
|
||||||
config.safeGet('bitmessagesettings', 'opencl')
|
config.safeGet('bitmessagesettings', 'opencl')
|
||||||
) if openclEnabled() else "None"
|
) if openclEnabled() else "None"
|
||||||
locale = getTranslationLanguage()
|
locale = getTranslationLanguage()
|
||||||
socks = getSOCKSProxyType(config) or "N/A"
|
socks = getSOCKSProxyType(config) or 'N/A'
|
||||||
upnp = config.safeGet('bitmessagesettings', 'upnp', "N/A")
|
upnp = config.safeGet('bitmessagesettings', 'upnp', 'N/A')
|
||||||
connectedhosts = len(network.stats.connectedHostsList())
|
connectedhosts = len(network.stats.connectedHostsList())
|
||||||
|
|
||||||
myapp.ui.textEditMessage.setText(unic(ustr(SUPPORT_MESSAGE).format(
|
myapp.ui.textEditMessage.setText(unic(ustr(SUPPORT_MESSAGE).format(
|
||||||
version, os, architecture, pythonversion, opensslversion, frozen,
|
version, osname, architecture, pythonversion, opensslversion, qtapi,
|
||||||
portablemode, cpow, openclpow, locale, socks, upnp, connectedhosts)))
|
frozen, portablemode, cpow, openclpow, locale, socks, upnp,
|
||||||
|
connectedhosts
|
||||||
|
)))
|
||||||
|
|
||||||
# single msg tab
|
# single msg tab
|
||||||
myapp.ui.tabWidgetSend.setCurrentIndex(
|
myapp.ui.tabWidgetSend.setCurrentIndex(
|
||||||
|
|
|
@ -4,7 +4,8 @@ from six.moves import queue as Queue
|
||||||
import sys
|
import sys
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
from PyQt4 import QtCore, QtGui
|
from qtpy import QtCore, QtWidgets
|
||||||
|
from six import string_types
|
||||||
|
|
||||||
import bitmessageqt
|
import bitmessageqt
|
||||||
import queues
|
import queues
|
||||||
|
@ -16,7 +17,7 @@ class TestBase(unittest.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.app = (
|
self.app = (
|
||||||
QtGui.QApplication.instance()
|
QtWidgets.QApplication.instance()
|
||||||
or bitmessageqt.BitmessageQtApplication(sys.argv))
|
or bitmessageqt.BitmessageQtApplication(sys.argv))
|
||||||
self.window = self.app.activeWindow()
|
self.window = self.app.activeWindow()
|
||||||
if not self.window:
|
if not self.window:
|
||||||
|
@ -39,10 +40,7 @@ class TestMain(unittest.TestCase):
|
||||||
|
|
||||||
def test_translate(self):
|
def test_translate(self):
|
||||||
"""Check the results of _translate() with various args"""
|
"""Check the results of _translate() with various args"""
|
||||||
self.assertIsInstance(
|
self.assertIsInstance(_translate("MainWindow", "Test"), string_types)
|
||||||
_translate("MainWindow", "Test"),
|
|
||||||
str
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class TestUISignaler(TestBase):
|
class TestUISignaler(TestBase):
|
||||||
|
|
|
@ -1,15 +1,35 @@
|
||||||
|
|
||||||
from PyQt4.QtCore import QThread, SIGNAL
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
from qtpy import QtCore
|
||||||
|
|
||||||
import queues
|
import queues
|
||||||
|
from network.node import Peer
|
||||||
|
|
||||||
|
|
||||||
class UISignaler(QThread):
|
class UISignaler(QtCore.QThread):
|
||||||
_instance = None
|
_instance = None
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
writeNewAddressToTable = QtCore.Signal(str, str, str)
|
||||||
QThread.__init__(self, parent)
|
updateStatusBar = QtCore.Signal(object)
|
||||||
|
updateSentItemStatusByToAddress = QtCore.Signal(object, str)
|
||||||
|
updateSentItemStatusByAckdata = QtCore.Signal(object, str)
|
||||||
|
displayNewInboxMessage = QtCore.Signal(object, str, object, object, str)
|
||||||
|
displayNewSentMessage = QtCore.Signal(
|
||||||
|
object, str, str, object, object, str)
|
||||||
|
updateNetworkStatusTab = QtCore.Signal(bool, bool, Peer)
|
||||||
|
updateNumberOfMessagesProcessed = QtCore.Signal()
|
||||||
|
updateNumberOfPubkeysProcessed = QtCore.Signal()
|
||||||
|
updateNumberOfBroadcastsProcessed = QtCore.Signal()
|
||||||
|
setStatusIcon = QtCore.Signal(str)
|
||||||
|
changedInboxUnread = QtCore.Signal(str)
|
||||||
|
rerenderMessagelistFromLabels = QtCore.Signal()
|
||||||
|
rerenderMessagelistToLabels = QtCore.Signal()
|
||||||
|
rerenderAddressBook = QtCore.Signal()
|
||||||
|
rerenderSubscriptions = QtCore.Signal()
|
||||||
|
rerenderBlackWhiteList = QtCore.Signal()
|
||||||
|
removeInboxRowByMsgid = QtCore.Signal(str)
|
||||||
|
newVersionAvailable = QtCore.Signal(str)
|
||||||
|
displayAlert = QtCore.Signal(str, str, bool)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get(cls):
|
def get(cls):
|
||||||
|
@ -22,69 +42,59 @@ class UISignaler(QThread):
|
||||||
command, data = queues.UISignalQueue.get()
|
command, data = queues.UISignalQueue.get()
|
||||||
if command == 'writeNewAddressToTable':
|
if command == 'writeNewAddressToTable':
|
||||||
label, address, streamNumber = data
|
label, address, streamNumber = data
|
||||||
self.emit(
|
self.writeNewAddressToTable.emit(
|
||||||
SIGNAL("writeNewAddressToTable(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"),
|
label, address, str(streamNumber))
|
||||||
label,
|
|
||||||
address,
|
|
||||||
str(streamNumber))
|
|
||||||
elif command == 'updateStatusBar':
|
elif command == 'updateStatusBar':
|
||||||
self.emit(SIGNAL("updateStatusBar(PyQt_PyObject)"), data)
|
self.updateStatusBar.emit(data)
|
||||||
elif command == 'updateSentItemStatusByToAddress':
|
elif command == 'updateSentItemStatusByToAddress':
|
||||||
toAddress, message = data
|
toAddress, message = data
|
||||||
self.emit(SIGNAL(
|
self.updateSentItemStatusByToAddress.emit(toAddress, message)
|
||||||
"updateSentItemStatusByToAddress(PyQt_PyObject,PyQt_PyObject)"), toAddress, message)
|
|
||||||
elif command == 'updateSentItemStatusByAckdata':
|
elif command == 'updateSentItemStatusByAckdata':
|
||||||
ackData, message = data
|
ackData, message = data
|
||||||
self.emit(SIGNAL(
|
self.updateSentItemStatusByAckdata.emit(ackData, message)
|
||||||
"updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"), ackData, message)
|
|
||||||
elif command == 'displayNewInboxMessage':
|
elif command == 'displayNewInboxMessage':
|
||||||
inventoryHash, toAddress, fromAddress, subject, body = data
|
inventoryHash, toAddress, fromAddress, subject, body = data
|
||||||
self.emit(SIGNAL(
|
|
||||||
"displayNewInboxMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"),
|
self.displayNewInboxMessage.emit(
|
||||||
inventoryHash, toAddress, fromAddress, subject, body)
|
inventoryHash, toAddress, fromAddress,
|
||||||
|
subject, body)
|
||||||
elif command == 'displayNewSentMessage':
|
elif command == 'displayNewSentMessage':
|
||||||
toAddress, fromLabel, fromAddress, subject, message, ackdata = data
|
toAddress, fromLabel, fromAddress, subject, message, ackdata = data
|
||||||
self.emit(SIGNAL(
|
self.displayNewSentMessage.emit(
|
||||||
"displayNewSentMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"),
|
toAddress, fromLabel, fromAddress,
|
||||||
toAddress, fromLabel, fromAddress, subject, message, ackdata)
|
subject.decode('utf-8'), message, ackdata)
|
||||||
elif command == 'updateNetworkStatusTab':
|
elif command == 'updateNetworkStatusTab':
|
||||||
outbound, add, destination = data
|
outbound, add, destination = data
|
||||||
self.emit(
|
self.updateNetworkStatusTab.emit(outbound, add, destination)
|
||||||
SIGNAL("updateNetworkStatusTab(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"),
|
|
||||||
outbound,
|
|
||||||
add,
|
|
||||||
destination)
|
|
||||||
elif command == 'updateNumberOfMessagesProcessed':
|
elif command == 'updateNumberOfMessagesProcessed':
|
||||||
self.emit(SIGNAL("updateNumberOfMessagesProcessed()"))
|
self.updateNumberOfMessagesProcessed.emit()
|
||||||
elif command == 'updateNumberOfPubkeysProcessed':
|
elif command == 'updateNumberOfPubkeysProcessed':
|
||||||
self.emit(SIGNAL("updateNumberOfPubkeysProcessed()"))
|
self.updateNumberOfPubkeysProcessed.emit()
|
||||||
elif command == 'updateNumberOfBroadcastsProcessed':
|
elif command == 'updateNumberOfBroadcastsProcessed':
|
||||||
self.emit(SIGNAL("updateNumberOfBroadcastsProcessed()"))
|
self.updateNumberOfBroadcastsProcessed.emit()
|
||||||
elif command == 'setStatusIcon':
|
elif command == 'setStatusIcon':
|
||||||
self.emit(SIGNAL("setStatusIcon(PyQt_PyObject)"), data)
|
self.setStatusIcon.emit(data)
|
||||||
elif command == 'changedInboxUnread':
|
elif command == 'changedInboxUnread':
|
||||||
self.emit(SIGNAL("changedInboxUnread(PyQt_PyObject)"), data)
|
self.changedInboxUnread.emit(data)
|
||||||
elif command == 'rerenderMessagelistFromLabels':
|
elif command == 'rerenderMessagelistFromLabels':
|
||||||
self.emit(SIGNAL("rerenderMessagelistFromLabels()"))
|
self.rerenderMessagelistFromLabels.emit()
|
||||||
elif command == 'rerenderMessagelistToLabels':
|
elif command == 'rerenderMessagelistToLabels':
|
||||||
self.emit(SIGNAL("rerenderMessagelistToLabels()"))
|
self.rerenderMessagelistToLabels.emit()
|
||||||
elif command == 'rerenderAddressBook':
|
elif command == 'rerenderAddressBook':
|
||||||
self.emit(SIGNAL("rerenderAddressBook()"))
|
self.rerenderAddressBook.emit()
|
||||||
elif command == 'rerenderSubscriptions':
|
elif command == 'rerenderSubscriptions':
|
||||||
self.emit(SIGNAL("rerenderSubscriptions()"))
|
self.rerenderSubscriptions.emit()
|
||||||
elif command == 'rerenderBlackWhiteList':
|
elif command == 'rerenderBlackWhiteList':
|
||||||
self.emit(SIGNAL("rerenderBlackWhiteList()"))
|
self.rerenderBlackWhiteList.emit()
|
||||||
elif command == 'removeInboxRowByMsgid':
|
elif command == 'removeInboxRowByMsgid':
|
||||||
self.emit(SIGNAL("removeInboxRowByMsgid(PyQt_PyObject)"), data)
|
self.removeInboxRowByMsgid.emit(data)
|
||||||
elif command == 'newVersionAvailable':
|
elif command == 'newVersionAvailable':
|
||||||
self.emit(SIGNAL("newVersionAvailable(PyQt_PyObject)"), data)
|
self.newVersionAvailable.emit(data)
|
||||||
elif command == 'alert':
|
elif command == 'alert':
|
||||||
title, text, exitAfterUserClicksOk = data
|
title, text, exitAfterUserClicksOk = data
|
||||||
self.emit(
|
self.displayAlert.emit(title, text, exitAfterUserClicksOk)
|
||||||
SIGNAL("displayAlert(PyQt_PyObject, PyQt_PyObject, PyQt_PyObject)"),
|
|
||||||
title,
|
|
||||||
text,
|
|
||||||
exitAfterUserClicksOk)
|
|
||||||
else:
|
else:
|
||||||
sys.stderr.write(
|
sys.stderr.write(
|
||||||
'Command sent to UISignaler not recognized: %s\n' % command)
|
'Command sent to UISignaler not recognized: %s\n'
|
||||||
|
% command
|
||||||
|
)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import hashlib
|
import hashlib
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from PyQt4 import QtGui
|
from qtpy import QtGui
|
||||||
|
|
||||||
import state
|
import state
|
||||||
from addresses import addBMIfNotPresent
|
from addresses import addBMIfNotPresent
|
||||||
|
@ -30,16 +30,18 @@ def identiconize(address):
|
||||||
# It can be used as a pseudo-password to salt the generation of
|
# It can be used as a pseudo-password to salt the generation of
|
||||||
# the identicons to decrease the risk of attacks where someone creates
|
# the identicons to decrease the risk of attacks where someone creates
|
||||||
# an address to mimic someone else's identicon.
|
# an address to mimic someone else's identicon.
|
||||||
identiconsuffix = config.get('bitmessagesettings', 'identiconsuffix')
|
data = addBMIfNotPresent(address) + config.get(
|
||||||
|
'bitmessagesettings', 'identiconsuffix')
|
||||||
|
data = data.encode("utf-8", "replace")
|
||||||
if identicon_lib[:len('qidenticon')] == 'qidenticon':
|
if identicon_lib[:len('qidenticon')] == 'qidenticon':
|
||||||
# originally by:
|
# originally by:
|
||||||
# :Author:Shin Adachi <shn@glucose.jp>
|
# :Author:Shin Adachi <shn@glucose.jp>
|
||||||
# Licesensed under FreeBSD License.
|
# Licesensed under FreeBSD License.
|
||||||
# stripped from PIL and uses QT instead (by sendiulo, same license)
|
# stripped from PIL and uses QT instead (by sendiulo, same license)
|
||||||
import qidenticon
|
import qidenticon
|
||||||
icon_hash = hashlib.md5(
|
icon_hash = hashlib.md5(data).hexdigest()
|
||||||
(addBMIfNotPresent(address) + identiconsuffix).encode("utf-8", "replace")).hexdigest()
|
use_two_colors = (
|
||||||
use_two_colors = identicon_lib[:len('qidenticon_two')] == 'qidenticon_two'
|
identicon_lib[:len('qidenticon_two')] == 'qidenticon_two')
|
||||||
opacity = int(
|
opacity = int(
|
||||||
identicon_lib not in (
|
identicon_lib not in (
|
||||||
'qidenticon_x', 'qidenticon_two_x',
|
'qidenticon_x', 'qidenticon_two_x',
|
||||||
|
@ -63,8 +65,7 @@ def identiconize(address):
|
||||||
# https://github.com/azaghal/pydenticon
|
# https://github.com/azaghal/pydenticon
|
||||||
# note that it requires pillow (or PIL) to be installed:
|
# note that it requires pillow (or PIL) to be installed:
|
||||||
# https://python-pillow.org/
|
# https://python-pillow.org/
|
||||||
idcon_render = Pydenticon(
|
idcon_render = Pydenticon(data, size * 3)
|
||||||
addBMIfNotPresent(address) + identiconsuffix, size * 3)
|
|
||||||
rendering = idcon_render._render()
|
rendering = idcon_render._render()
|
||||||
data = rendering.convert("RGBA").tostring("raw", "RGBA")
|
data = rendering.convert("RGBA").tostring("raw", "RGBA")
|
||||||
qim = QtGui.QImage(data, size, size, QtGui.QImage.Format_ARGB32)
|
qim = QtGui.QImage(data, size, size, QtGui.QImage.Format_ARGB32)
|
||||||
|
@ -105,11 +106,9 @@ def avatarize(address):
|
||||||
lower_default = state.appdata + 'avatars/' + 'default.' + ext.lower()
|
lower_default = state.appdata + 'avatars/' + 'default.' + ext.lower()
|
||||||
upper_default = state.appdata + 'avatars/' + 'default.' + ext.upper()
|
upper_default = state.appdata + 'avatars/' + 'default.' + ext.upper()
|
||||||
if os.path.isfile(lower_default):
|
if os.path.isfile(lower_default):
|
||||||
default = lower_default
|
|
||||||
idcon.addFile(lower_default)
|
idcon.addFile(lower_default)
|
||||||
return idcon
|
return idcon
|
||||||
elif os.path.isfile(upper_default):
|
elif os.path.isfile(upper_default):
|
||||||
default = upper_default
|
|
||||||
idcon.addFile(upper_default)
|
idcon.addFile(upper_default)
|
||||||
return idcon
|
return idcon
|
||||||
# If no avatar is found
|
# If no avatar is found
|
||||||
|
|
|
@ -1,13 +1,15 @@
|
||||||
from PyQt4 import uic
|
from qtpy import uic
|
||||||
import os.path
|
import os.path
|
||||||
import paths
|
import paths
|
||||||
import sys
|
|
||||||
|
|
||||||
def resource_path(resFile):
|
def resource_path(resFile):
|
||||||
baseDir = paths.codePath()
|
baseDir = paths.codePath()
|
||||||
for subDir in ["ui", "bitmessageqt"]:
|
for subDir in ("ui", "bitmessageqt"):
|
||||||
if os.path.isdir(os.path.join(baseDir, subDir)) and os.path.isfile(os.path.join(baseDir, subDir, resFile)):
|
path = os.path.join(baseDir, subDir, resFile)
|
||||||
return os.path.join(baseDir, subDir, resFile)
|
if os.path.isfile(path):
|
||||||
|
return path
|
||||||
|
|
||||||
|
|
||||||
def load(resFile, widget):
|
def load(resFile, widget):
|
||||||
uic.loadUi(resource_path(resFile), widget)
|
uic.loadUi(resource_path(resFile), widget)
|
||||||
|
|
|
@ -9,6 +9,7 @@ from datetime import datetime
|
||||||
|
|
||||||
from six import string_types
|
from six import string_types
|
||||||
from six.moves import configparser
|
from six.moves import configparser
|
||||||
|
from unqstr import ustr
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import state
|
import state
|
||||||
|
@ -114,7 +115,8 @@ class BMConfigParser(SafeConfigParser):
|
||||||
"""Return a list of local bitmessage addresses (from section labels)"""
|
"""Return a list of local bitmessage addresses (from section labels)"""
|
||||||
sections = [x for x in self.sections() if x.startswith('BM-')]
|
sections = [x for x in self.sections() if x.startswith('BM-')]
|
||||||
if sort:
|
if sort:
|
||||||
sections.sort(key=lambda item: self.get(item, 'label').lower())
|
sections.sort(key=lambda item: ustr(self.get(item, 'label')) \
|
||||||
|
.lower())
|
||||||
return sections
|
return sections
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
"""
|
"""
|
||||||
A thread for creating addresses
|
addressGenerator thread class definition
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import time
|
import time
|
||||||
|
|
|
@ -150,8 +150,7 @@ class objectProcessor(threading.Thread):
|
||||||
" WHERE ackdata=?", int(time.time()), data[readPosition:])
|
" WHERE ackdata=?", int(time.time()), data[readPosition:])
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
data[readPosition:],
|
data[readPosition:], _translate(
|
||||||
_translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Acknowledgement of the message received {0}"
|
"Acknowledgement of the message received {0}"
|
||||||
).format(l10n.formatTimestamp()))
|
).format(l10n.formatTimestamp()))
|
||||||
|
@ -1055,7 +1054,7 @@ class objectProcessor(threading.Thread):
|
||||||
logger.info('ackdata checksum wrong. Not sending ackdata.')
|
logger.info('ackdata checksum wrong. Not sending ackdata.')
|
||||||
return False
|
return False
|
||||||
command = command.rstrip(b'\x00')
|
command = command.rstrip(b'\x00')
|
||||||
if command != 'object':
|
if command != b'object':
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,6 @@ import protocol
|
||||||
import queues
|
import queues
|
||||||
import shared
|
import shared
|
||||||
import state
|
import state
|
||||||
import tr
|
|
||||||
from addresses import decodeAddress, decodeVarint, encodeVarint
|
from addresses import decodeAddress, decodeVarint, encodeVarint
|
||||||
from bmconfigparser import config
|
from bmconfigparser import config
|
||||||
from helper_sql import sqlExecute, sqlQuery
|
from helper_sql import sqlExecute, sqlQuery
|
||||||
|
@ -33,6 +32,7 @@ from six.moves import configparser, queue
|
||||||
from six.moves.reprlib import repr
|
from six.moves.reprlib import repr
|
||||||
import six
|
import six
|
||||||
from dbcompat import dbstr
|
from dbcompat import dbstr
|
||||||
|
from tr import _translate
|
||||||
|
|
||||||
|
|
||||||
def sizeof_fmt(num, suffix='h/s'):
|
def sizeof_fmt(num, suffix='h/s'):
|
||||||
|
@ -221,9 +221,8 @@ class singleWorker(StoppableThread):
|
||||||
return privSigningKeyHex, privEncryptionKeyHex, \
|
return privSigningKeyHex, privEncryptionKeyHex, \
|
||||||
pubSigningKey, pubEncryptionKey
|
pubSigningKey, pubEncryptionKey
|
||||||
|
|
||||||
def _doPOWDefaults(self, payload, TTL,
|
def _doPOWDefaults(
|
||||||
log_prefix='',
|
self, payload, TTL, log_prefix='', log_time=False):
|
||||||
log_time=False):
|
|
||||||
target = 2 ** 64 / (
|
target = 2 ** 64 / (
|
||||||
defaults.networkDefaultProofOfWorkNonceTrialsPerByte * (
|
defaults.networkDefaultProofOfWorkNonceTrialsPerByte * (
|
||||||
len(payload) + 8
|
len(payload) + 8
|
||||||
|
@ -249,14 +248,16 @@ class singleWorker(StoppableThread):
|
||||||
'PoW took %.1f seconds, speed %s.',
|
'PoW took %.1f seconds, speed %s.',
|
||||||
delta, sizeof_fmt(nonce / delta)
|
delta, sizeof_fmt(nonce / delta)
|
||||||
)
|
)
|
||||||
except: # noqa:E722 # NameError
|
except NameError:
|
||||||
self.logger.warning("Proof of Work exception")
|
self.logger.warning("Proof of Work exception")
|
||||||
payload = pack('>Q', nonce) + payload
|
payload = pack('>Q', nonce) + payload
|
||||||
return payload
|
return payload
|
||||||
|
|
||||||
def doPOWForMyV2Pubkey(self, adressHash):
|
def doPOWForMyV2Pubkey(self, adressHash):
|
||||||
""" This function also broadcasts out the pubkey
|
"""
|
||||||
message once it is done with the POW"""
|
This function also broadcasts out the pubkey message once it is
|
||||||
|
done with the POW
|
||||||
|
"""
|
||||||
# Look up my stream number based on my address hash
|
# Look up my stream number based on my address hash
|
||||||
myAddress = shared.myAddressesByHash[adressHash]
|
myAddress = shared.myAddressesByHash[adressHash]
|
||||||
addressVersionNumber, streamNumber = decodeAddress(myAddress)[1:3]
|
addressVersionNumber, streamNumber = decodeAddress(myAddress)[1:3]
|
||||||
|
@ -312,9 +313,10 @@ class singleWorker(StoppableThread):
|
||||||
|
|
||||||
def sendOutOrStoreMyV3Pubkey(self, adressHash):
|
def sendOutOrStoreMyV3Pubkey(self, adressHash):
|
||||||
"""
|
"""
|
||||||
If this isn't a chan address, this function assembles the pubkey data, does the necessary POW and sends it out.
|
If this isn't a chan address, this function assembles the pubkey
|
||||||
If it *is* a chan then it assembles the pubkey and stores is in the pubkey table so that we can send messages
|
data, does the necessary POW and sends it out.
|
||||||
to "ourselves".
|
If it *is* a chan then it assembles the pubkey and stores it in
|
||||||
|
the pubkey table so that we can send messages to "ourselves".
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
myAddress = shared.myAddressesByHash[adressHash]
|
myAddress = shared.myAddressesByHash[adressHash]
|
||||||
|
@ -400,9 +402,10 @@ class singleWorker(StoppableThread):
|
||||||
|
|
||||||
def sendOutOrStoreMyV4Pubkey(self, myAddress):
|
def sendOutOrStoreMyV4Pubkey(self, myAddress):
|
||||||
"""
|
"""
|
||||||
It doesn't send directly anymore. It put is to a queue for another thread to send at an appropriate time,
|
It doesn't send directly anymore. It put is to a queue for
|
||||||
whereas in the past it directly appended it to the outgoing buffer, I think. Same with all the other methods in
|
another thread to send at an appropriate time, whereas in the
|
||||||
this class.
|
past it directly appended it to the outgoing buffer, I think.
|
||||||
|
Same with all the other methods in this class.
|
||||||
"""
|
"""
|
||||||
if not config.has_section(myAddress):
|
if not config.has_section(myAddress):
|
||||||
# The address has been deleted.
|
# The address has been deleted.
|
||||||
|
@ -535,7 +538,10 @@ class singleWorker(StoppableThread):
|
||||||
queues.invQueue.put((streamNumber, inventoryHash))
|
queues.invQueue.put((streamNumber, inventoryHash))
|
||||||
|
|
||||||
def sendBroadcast(self):
|
def sendBroadcast(self):
|
||||||
"""Send a broadcast-type object (assemble the object, perform PoW and put it to the inv announcement queue)"""
|
"""
|
||||||
|
Send a broadcast-type object (assemble the object, perform PoW
|
||||||
|
and put it to the inv announcement queue)
|
||||||
|
"""
|
||||||
# Reset just in case
|
# Reset just in case
|
||||||
sqlExecute(
|
sqlExecute(
|
||||||
'''UPDATE sent SET status='broadcastqueued' '''
|
'''UPDATE sent SET status='broadcastqueued' '''
|
||||||
|
@ -569,8 +575,7 @@ class singleWorker(StoppableThread):
|
||||||
except ValueError:
|
except ValueError:
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Error! Could not find sender address"
|
"Error! Could not find sender address"
|
||||||
" (your address) in the keys.dat file."))
|
" (your address) in the keys.dat file."))
|
||||||
|
@ -585,7 +590,7 @@ class singleWorker(StoppableThread):
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata,
|
||||||
tr._translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Error, can't send."))
|
"Error, can't send."))
|
||||||
))
|
))
|
||||||
|
@ -674,8 +679,7 @@ class singleWorker(StoppableThread):
|
||||||
|
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Doing work necessary to send broadcast..."))
|
"Doing work necessary to send broadcast..."))
|
||||||
))
|
))
|
||||||
|
@ -707,10 +711,8 @@ class singleWorker(StoppableThread):
|
||||||
|
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
"MainWindow", "Broadcast sent on {0}"
|
||||||
"MainWindow",
|
|
||||||
"Broadcast sent on {0}"
|
|
||||||
).format(l10n.formatTimestamp()))
|
).format(l10n.formatTimestamp()))
|
||||||
))
|
))
|
||||||
|
|
||||||
|
@ -723,7 +725,10 @@ class singleWorker(StoppableThread):
|
||||||
)
|
)
|
||||||
|
|
||||||
def sendMsg(self):
|
def sendMsg(self):
|
||||||
"""Send a message-type object (assemble the object, perform PoW and put it to the inv announcement queue)"""
|
"""
|
||||||
|
Send a message-type object (assemble the object, perform PoW
|
||||||
|
and put it to the inv announcement queue)
|
||||||
|
"""
|
||||||
# pylint: disable=too-many-nested-blocks
|
# pylint: disable=too-many-nested-blocks
|
||||||
# Reset just in case
|
# Reset just in case
|
||||||
sqlExecute(
|
sqlExecute(
|
||||||
|
@ -825,8 +830,7 @@ class singleWorker(StoppableThread):
|
||||||
)
|
)
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByToAddress', (
|
'updateSentItemStatusByToAddress', (
|
||||||
toaddress,
|
toaddress, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Encryption key was requested earlier."))
|
"Encryption key was requested earlier."))
|
||||||
))
|
))
|
||||||
|
@ -899,8 +903,7 @@ class singleWorker(StoppableThread):
|
||||||
)
|
)
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByToAddress', (
|
'updateSentItemStatusByToAddress', (
|
||||||
toaddress,
|
toaddress, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Sending a request for the"
|
"Sending a request for the"
|
||||||
" recipient\'s encryption key."))
|
" recipient\'s encryption key."))
|
||||||
|
@ -924,8 +927,7 @@ class singleWorker(StoppableThread):
|
||||||
state.ackdataForWhichImWatching[bytes(ackdata)] = 0
|
state.ackdataForWhichImWatching[bytes(ackdata)] = 0
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Looking up the receiver\'s public key"))
|
"Looking up the receiver\'s public key"))
|
||||||
))
|
))
|
||||||
|
@ -982,8 +984,7 @@ class singleWorker(StoppableThread):
|
||||||
)
|
)
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Problem: Destination is a mobile"
|
"Problem: Destination is a mobile"
|
||||||
" device who requests that the"
|
" device who requests that the"
|
||||||
|
@ -1013,8 +1014,7 @@ class singleWorker(StoppableThread):
|
||||||
defaults.networkDefaultPayloadLengthExtraBytes
|
defaults.networkDefaultPayloadLengthExtraBytes
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Doing work necessary to send message.\n"
|
"Doing work necessary to send message.\n"
|
||||||
"There is no required difficulty for"
|
"There is no required difficulty for"
|
||||||
|
@ -1046,31 +1046,19 @@ class singleWorker(StoppableThread):
|
||||||
requiredAverageProofOfWorkNonceTrialsPerByte,
|
requiredAverageProofOfWorkNonceTrialsPerByte,
|
||||||
requiredPayloadLengthExtraBytes
|
requiredPayloadLengthExtraBytes
|
||||||
)
|
)
|
||||||
|
queues.UISignalQueue.put((
|
||||||
queues.UISignalQueue.put(
|
'updateSentItemStatusByAckdata', (
|
||||||
(
|
ackdata, _translate(
|
||||||
'updateSentItemStatusByAckdata',
|
"MainWindow",
|
||||||
(
|
"Doing work necessary to send message.\n"
|
||||||
ackdata,
|
"Receiver\'s required difficulty: {0} and {1}"
|
||||||
tr._translate(
|
).format(
|
||||||
"MainWindow",
|
float(requiredAverageProofOfWorkNonceTrialsPerByte)
|
||||||
"Doing work necessary to send message.\n"
|
/ defaults.networkDefaultProofOfWorkNonceTrialsPerByte,
|
||||||
"Receiver\'s required difficulty: {0}"
|
float(requiredPayloadLengthExtraBytes)
|
||||||
" and {1}"
|
/ defaults.networkDefaultPayloadLengthExtraBytes
|
||||||
).format(
|
))
|
||||||
str(
|
))
|
||||||
float(requiredAverageProofOfWorkNonceTrialsPerByte)
|
|
||||||
/ defaults.networkDefaultProofOfWorkNonceTrialsPerByte
|
|
||||||
),
|
|
||||||
str(
|
|
||||||
float(requiredPayloadLengthExtraBytes)
|
|
||||||
/ defaults.networkDefaultPayloadLengthExtraBytes
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
if status != 'forcepow':
|
if status != 'forcepow':
|
||||||
maxacceptablenoncetrialsperbyte = config.getint(
|
maxacceptablenoncetrialsperbyte = config.getint(
|
||||||
'bitmessagesettings', 'maxacceptablenoncetrialsperbyte')
|
'bitmessagesettings', 'maxacceptablenoncetrialsperbyte')
|
||||||
|
@ -1090,18 +1078,19 @@ class singleWorker(StoppableThread):
|
||||||
ackdata)
|
ackdata)
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Problem: The work demanded by"
|
"Problem: The work demanded by the"
|
||||||
" the recipient ({0} and {1}) is"
|
" recipient ({0} and {1}) is more"
|
||||||
" more difficult than you are"
|
" difficult than you are willing"
|
||||||
" willing to do. {2}"
|
" to do. {2}"
|
||||||
).format(str(float(requiredAverageProofOfWorkNonceTrialsPerByte)
|
).format(
|
||||||
/ defaults.networkDefaultProofOfWorkNonceTrialsPerByte),
|
float(requiredAverageProofOfWorkNonceTrialsPerByte)
|
||||||
str(float(requiredPayloadLengthExtraBytes)
|
/ defaults.networkDefaultProofOfWorkNonceTrialsPerByte,
|
||||||
/ defaults.networkDefaultPayloadLengthExtraBytes),
|
float(requiredPayloadLengthExtraBytes)
|
||||||
l10n.formatTimestamp()))))
|
/ defaults.networkDefaultPayloadLengthExtraBytes,
|
||||||
|
l10n.formatTimestamp()))
|
||||||
|
))
|
||||||
continue
|
continue
|
||||||
else: # if we are sending a message to ourselves or a chan..
|
else: # if we are sending a message to ourselves or a chan..
|
||||||
self.logger.info('Sending a message.')
|
self.logger.info('Sending a message.')
|
||||||
|
@ -1115,8 +1104,7 @@ class singleWorker(StoppableThread):
|
||||||
except (configparser.NoSectionError, configparser.NoOptionError) as err:
|
except (configparser.NoSectionError, configparser.NoOptionError) as err:
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Problem: You are trying to send a"
|
"Problem: You are trying to send a"
|
||||||
" message to yourself or a chan but your"
|
" message to yourself or a chan but your"
|
||||||
|
@ -1141,8 +1129,7 @@ class singleWorker(StoppableThread):
|
||||||
defaults.networkDefaultPayloadLengthExtraBytes
|
defaults.networkDefaultPayloadLengthExtraBytes
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Doing work necessary to send message."))
|
"Doing work necessary to send message."))
|
||||||
))
|
))
|
||||||
|
@ -1164,8 +1151,7 @@ class singleWorker(StoppableThread):
|
||||||
except ValueError:
|
except ValueError:
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Error! Could not find sender address"
|
"Error! Could not find sender address"
|
||||||
" (your address) in the keys.dat file."))
|
" (your address) in the keys.dat file."))
|
||||||
|
@ -1180,7 +1166,7 @@ class singleWorker(StoppableThread):
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata,
|
||||||
tr._translate(
|
_translate(
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Error, can't send."))
|
"Error, can't send."))
|
||||||
))
|
))
|
||||||
|
@ -1232,8 +1218,7 @@ class singleWorker(StoppableThread):
|
||||||
# The fullAckPayload is a normal msg protocol message
|
# The fullAckPayload is a normal msg protocol message
|
||||||
# with the proof of work already completed that the
|
# with the proof of work already completed that the
|
||||||
# receiver of this message can easily send out.
|
# receiver of this message can easily send out.
|
||||||
fullAckPayload = self.generateFullAckMessage(
|
fullAckPayload = self.generateFullAckMessage(ackdata, TTL)
|
||||||
ackdata, toStreamNumber, TTL)
|
|
||||||
payload += encodeVarint(len(fullAckPayload))
|
payload += encodeVarint(len(fullAckPayload))
|
||||||
payload += fullAckPayload
|
payload += fullAckPayload
|
||||||
dataToSign = pack('>Q', embeddedTime) + b'\x00\x00\x00\x02' + \
|
dataToSign = pack('>Q', embeddedTime) + b'\x00\x00\x00\x02' + \
|
||||||
|
@ -1256,8 +1241,7 @@ class singleWorker(StoppableThread):
|
||||||
)
|
)
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Problem: The recipient\'s encryption key is"
|
"Problem: The recipient\'s encryption key is"
|
||||||
" no good. Could not encrypt message. {0}"
|
" no good. Could not encrypt message. {0}"
|
||||||
|
@ -1325,17 +1309,15 @@ class singleWorker(StoppableThread):
|
||||||
not protocol.checkBitfield(behaviorBitfield, protocol.BITFIELD_DOESACK):
|
not protocol.checkBitfield(behaviorBitfield, protocol.BITFIELD_DOESACK):
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
"MainWindow", "Message sent. Sent at {0}"
|
||||||
"MainWindow",
|
).format(l10n.formatTimestamp()))
|
||||||
"Message sent. Sent at {0}"
|
))
|
||||||
).format(l10n.formatTimestamp()))))
|
|
||||||
else:
|
else:
|
||||||
# not sending to a chan or one of my addresses
|
# not sending to a chan or one of my addresses
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByAckdata', (
|
'updateSentItemStatusByAckdata', (
|
||||||
ackdata,
|
ackdata, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Message sent. Waiting for acknowledgement."
|
"Message sent. Waiting for acknowledgement."
|
||||||
" Sent on {0}"
|
" Sent on {0}"
|
||||||
|
@ -1466,8 +1448,7 @@ class singleWorker(StoppableThread):
|
||||||
queues.UISignalQueue.put(('updateStatusBar', statusbar))
|
queues.UISignalQueue.put(('updateStatusBar', statusbar))
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByToAddress', (
|
'updateSentItemStatusByToAddress', (
|
||||||
toAddress,
|
toAddress, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Doing work necessary to request encryption key."))
|
"Doing work necessary to request encryption key."))
|
||||||
))
|
))
|
||||||
|
@ -1491,30 +1472,31 @@ class singleWorker(StoppableThread):
|
||||||
int(time.time()), retryNumber + 1, sleeptill, dbstr(toAddress))
|
int(time.time()), retryNumber + 1, sleeptill, dbstr(toAddress))
|
||||||
|
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateStatusBar',
|
'updateStatusBar', _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Broadcasting the public key request. This program will"
|
"Broadcasting the public key request. This program will"
|
||||||
" auto-retry if they are offline.")
|
" auto-retry if they are offline.")
|
||||||
))
|
))
|
||||||
queues.UISignalQueue.put((
|
queues.UISignalQueue.put((
|
||||||
'updateSentItemStatusByToAddress', (
|
'updateSentItemStatusByToAddress', (
|
||||||
toAddress,
|
toAddress, _translate(
|
||||||
tr._translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Sending public key request. Waiting for reply."
|
"Sending public key request. Waiting for reply."
|
||||||
" Requested at {0}"
|
" Requested at {0}"
|
||||||
).format(l10n.formatTimestamp()))
|
).format(l10n.formatTimestamp()))
|
||||||
))
|
))
|
||||||
|
|
||||||
def generateFullAckMessage(self, ackdata, _, TTL):
|
def generateFullAckMessage(self, ackdata, TTL):
|
||||||
"""
|
"""Create ACK packet"""
|
||||||
It might be perfectly fine to just use the same TTL for the ackdata that we use for the message. But I would
|
# It might be perfectly fine to just use the same TTL for
|
||||||
rather it be more difficult for attackers to associate ackData with the associated msg object. However, users
|
# the ackdata that we use for the message. But I would rather
|
||||||
would want the TTL of the acknowledgement to be about the same as they set for the message itself. So let's set
|
# it be more difficult for attackers to associate ackData with
|
||||||
the TTL of the acknowledgement to be in one of three 'buckets': 1 hour, 7 days, or 28 days, whichever is
|
# the associated msg object. However, users would want the TTL
|
||||||
relatively close to what the user specified.
|
# of the acknowledgement to be about the same as they set
|
||||||
"""
|
# for the message itself. So let's set the TTL of the
|
||||||
|
# acknowledgement to be in one of three 'buckets': 1 hour, 7
|
||||||
|
# days, or 28 days, whichever is relatively close to what the
|
||||||
|
# user specified.
|
||||||
if TTL < 24 * 60 * 60: # 1 day
|
if TTL < 24 * 60 * 60: # 1 day
|
||||||
TTL = 24 * 60 * 60 # 1 day
|
TTL = 24 * 60 * 60 # 1 day
|
||||||
elif TTL < 7 * 24 * 60 * 60: # 1 week
|
elif TTL < 7 * 24 * 60 * 60: # 1 week
|
||||||
|
|
|
@ -18,6 +18,7 @@ if not hasattr(sys, 'hexversion') or sys.hexversion < 0x20300F0:
|
||||||
)
|
)
|
||||||
|
|
||||||
import logging # noqa:E402
|
import logging # noqa:E402
|
||||||
|
from distutils import version
|
||||||
import subprocess # nosec B404
|
import subprocess # nosec B404
|
||||||
|
|
||||||
from importlib import import_module
|
from importlib import import_module
|
||||||
|
@ -54,23 +55,23 @@ PACKAGE_MANAGER = {
|
||||||
}
|
}
|
||||||
|
|
||||||
PACKAGES = {
|
PACKAGES = {
|
||||||
"PyQt4": {
|
"qtpy": {
|
||||||
"OpenBSD": "py-qt4",
|
"OpenBSD": "py-qtpy",
|
||||||
"FreeBSD": "py27-qt4",
|
"FreeBSD": "py27-QtPy",
|
||||||
"Debian": "python-qt4",
|
"Debian": "python-qtpy",
|
||||||
"Ubuntu": "python-qt4",
|
"Ubuntu": "python-qtpy",
|
||||||
"Ubuntu 12": "python-qt4",
|
"Ubuntu 12": "python-qtpy",
|
||||||
"Ubuntu 20": "",
|
"Ubuntu 20": "python-qtpy",
|
||||||
"openSUSE": "python-qt",
|
"openSUSE": "python-QtPy",
|
||||||
"Fedora": "PyQt4",
|
"Fedora": "python2-QtPy",
|
||||||
"Guix": "python2-pyqt@4.11.4",
|
"Guix": "",
|
||||||
"Gentoo": "dev-python/PyQt4",
|
"Gentoo": "dev-python/QtPy",
|
||||||
"optional": True,
|
"optional": True,
|
||||||
"description":
|
"description":
|
||||||
"You only need PyQt if you want to use the GUI."
|
"You only need qtpy if you want to use the GUI."
|
||||||
" When only running as a daemon, this can be skipped.\n"
|
" When only running as a daemon, this can be skipped.\n"
|
||||||
"However, you would have to install it manually"
|
"Also maybe you need to install PyQt5 or PyQt4"
|
||||||
" because setuptools does not support PyQt."
|
" if your package manager not installs it as qtpy dependency"
|
||||||
},
|
},
|
||||||
"msgpack": {
|
"msgpack": {
|
||||||
"OpenBSD": "py-msgpack",
|
"OpenBSD": "py-msgpack",
|
||||||
|
@ -157,19 +158,19 @@ detectOS.result = None
|
||||||
def detectOSRelease():
|
def detectOSRelease():
|
||||||
"""Detecting the release of OS"""
|
"""Detecting the release of OS"""
|
||||||
with open("/etc/os-release", 'r') as osRelease:
|
with open("/etc/os-release", 'r') as osRelease:
|
||||||
version = None
|
ver = None
|
||||||
for line in osRelease:
|
for line in osRelease:
|
||||||
if line.startswith("NAME="):
|
if line.startswith("NAME="):
|
||||||
detectOS.result = OS_RELEASE.get(
|
detectOS.result = OS_RELEASE.get(
|
||||||
line.replace('"', '').split("=")[-1].strip().lower())
|
line.replace('"', '').split("=")[-1].strip().lower())
|
||||||
elif line.startswith("VERSION_ID="):
|
elif line.startswith("VERSION_ID="):
|
||||||
try:
|
try:
|
||||||
version = float(line.split("=")[1].replace("\"", ""))
|
ver = float(line.split("=")[1].replace("\"", ""))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
if detectOS.result == "Ubuntu" and version < 14:
|
if detectOS.result == "Ubuntu" and ver < 14:
|
||||||
detectOS.result = "Ubuntu 12"
|
detectOS.result = "Ubuntu 12"
|
||||||
elif detectOS.result == "Ubuntu" and version >= 20:
|
elif detectOS.result == "Ubuntu" and ver >= 20:
|
||||||
detectOS.result = "Ubuntu 20"
|
detectOS.result = "Ubuntu 20"
|
||||||
|
|
||||||
|
|
||||||
|
@ -192,7 +193,7 @@ def try_import(module, log_extra=False):
|
||||||
def check_ripemd160():
|
def check_ripemd160():
|
||||||
"""Check availability of the RIPEMD160 hash function"""
|
"""Check availability of the RIPEMD160 hash function"""
|
||||||
try:
|
try:
|
||||||
from fallback import RIPEMD160Hash # pylint: disable=relative-import
|
from fallback import RIPEMD160Hash
|
||||||
except ImportError:
|
except ImportError:
|
||||||
return False
|
return False
|
||||||
return RIPEMD160Hash is not None
|
return RIPEMD160Hash is not None
|
||||||
|
@ -381,9 +382,18 @@ def check_curses():
|
||||||
def check_pyqt():
|
def check_pyqt():
|
||||||
"""Do pyqt dependency check.
|
"""Do pyqt dependency check.
|
||||||
|
|
||||||
Here we are checking for PyQt4 with its version, as for it require
|
Here we are checking for qtpy with its version, as for it require
|
||||||
PyQt 4.8 or later.
|
qtpy.
|
||||||
"""
|
"""
|
||||||
|
# pylint: disable=no-member
|
||||||
|
try:
|
||||||
|
import qtpy
|
||||||
|
except ImportError:
|
||||||
|
logger.error(
|
||||||
|
'PyBitmessage requires qtpy, and PyQt5 or PyQt4, '
|
||||||
|
' PyQt 4.8 or later and Qt 4.7 or later.')
|
||||||
|
return False
|
||||||
|
|
||||||
sip_found = False
|
sip_found = False
|
||||||
try:
|
try:
|
||||||
import sip
|
import sip
|
||||||
|
@ -394,24 +404,40 @@ def check_pyqt():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
QtCore = try_import(
|
QtCore = try_import(
|
||||||
'PyQt4.QtCore', 'PyBitmessage requires PyQt 4.8 or later and Qt 4.7 or later.')
|
'qtpy.QtCore', 'PyBitmessage requires qtpy and Qt 4.7 or later.')
|
||||||
|
|
||||||
if not QtCore:
|
if not QtCore:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
logger.info('PyQt Version: %s', QtCore.PYQT_VERSION_STR)
|
try:
|
||||||
logger.info('Qt Version: %s', QtCore.QT_VERSION_STR)
|
logger.info('PyQt Version: %s', QtCore.PYQT_VERSION_STR)
|
||||||
|
except AttributeError:
|
||||||
|
logger.info('Can be PySide..')
|
||||||
|
try:
|
||||||
|
logger.info('Qt Version: %s', QtCore.__version__)
|
||||||
|
except AttributeError:
|
||||||
|
# Can be PySide..
|
||||||
|
pass
|
||||||
passed = True
|
passed = True
|
||||||
if QtCore.PYQT_VERSION < 0x40800:
|
|
||||||
logger.error(
|
try:
|
||||||
'This version of PyQt is too old. PyBitmessage requries'
|
if version.LooseVersion(QtCore.PYQT_VERSION_STR) < '4.8':
|
||||||
' PyQt 4.8 or later.')
|
logger.error(
|
||||||
passed = False
|
'This version of PyQt is too old. PyBitmessage requries'
|
||||||
if QtCore.QT_VERSION < 0x40700:
|
' PyQt 4.8 or later.')
|
||||||
logger.error(
|
passed = False
|
||||||
'This version of Qt is too old. PyBitmessage requries'
|
except AttributeError:
|
||||||
' Qt 4.7 or later.')
|
# Can be PySide..
|
||||||
passed = False
|
pass
|
||||||
|
try:
|
||||||
|
if version.LooseVersion(QtCore.__version__) < '4.7':
|
||||||
|
logger.error(
|
||||||
|
'This version of Qt is too old. PyBitmessage requries'
|
||||||
|
' Qt 4.7 or later.')
|
||||||
|
passed = False
|
||||||
|
except AttributeError:
|
||||||
|
# Can be PySide..
|
||||||
|
pass
|
||||||
|
|
||||||
if passed and not sip_found:
|
if passed and not sip_found:
|
||||||
logger.info("sip is not found although PyQt is found")
|
logger.info("sip is not found although PyQt is found")
|
||||||
|
@ -419,9 +445,8 @@ def check_pyqt():
|
||||||
|
|
||||||
return passed
|
return passed
|
||||||
|
|
||||||
|
|
||||||
def check_msgpack():
|
def check_msgpack():
|
||||||
"""Do sgpack module check.
|
"""Do msgpack module check.
|
||||||
|
|
||||||
simply checking if msgpack package with all its dependency
|
simply checking if msgpack package with all its dependency
|
||||||
is available or not as recommended for messages coding.
|
is available or not as recommended for messages coding.
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
Message encoding end decoding functions
|
Message encoding end decoding functions
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import string
|
|
||||||
import zlib
|
import zlib
|
||||||
|
|
||||||
import messagetypes
|
import messagetypes
|
||||||
|
@ -100,14 +99,14 @@ class MsgDecode(object):
|
||||||
def decodeExtended(self, data):
|
def decodeExtended(self, data):
|
||||||
"""Handle extended encoding"""
|
"""Handle extended encoding"""
|
||||||
dc = zlib.decompressobj()
|
dc = zlib.decompressobj()
|
||||||
tmp = ""
|
tmp = b""
|
||||||
while len(tmp) <= config.safeGetInt("zlib", "maxsize"):
|
while len(tmp) <= config.safeGetInt("zlib", "maxsize"):
|
||||||
try:
|
try:
|
||||||
got = dc.decompress(
|
got = dc.decompress(
|
||||||
data, config.safeGetInt("zlib", "maxsize")
|
data, config.safeGetInt("zlib", "maxsize")
|
||||||
+ 1 - len(tmp))
|
+ 1 - len(tmp))
|
||||||
# EOF
|
# EOF
|
||||||
if got == "":
|
if got == b"":
|
||||||
break
|
break
|
||||||
tmp += got
|
tmp += got
|
||||||
data = dc.unconsumed_tail
|
data = dc.unconsumed_tail
|
||||||
|
@ -143,7 +142,7 @@ class MsgDecode(object):
|
||||||
|
|
||||||
def decodeSimple(self, data):
|
def decodeSimple(self, data):
|
||||||
"""Handle simple encoding"""
|
"""Handle simple encoding"""
|
||||||
bodyPositionIndex = string.find(data, '\nBody:')
|
bodyPositionIndex = data.find(b'\nBody:')
|
||||||
if bodyPositionIndex > 1:
|
if bodyPositionIndex > 1:
|
||||||
subject = data[8:bodyPositionIndex]
|
subject = data[8:bodyPositionIndex]
|
||||||
# Only save and show the first 500 characters of the subject.
|
# Only save and show the first 500 characters of the subject.
|
||||||
|
@ -151,10 +150,11 @@ class MsgDecode(object):
|
||||||
subject = subject[:500]
|
subject = subject[:500]
|
||||||
body = data[bodyPositionIndex + 6:]
|
body = data[bodyPositionIndex + 6:]
|
||||||
else:
|
else:
|
||||||
subject = ''
|
subject = b''
|
||||||
body = data
|
body = data
|
||||||
# Throw away any extra lines (headers) after the subject.
|
# Throw away any extra lines (headers) after the subject.
|
||||||
if subject:
|
if subject:
|
||||||
subject = subject.splitlines()[0]
|
subject = subject.splitlines()[0]
|
||||||
self.subject = subject
|
# Field types should be the same for all message types
|
||||||
self.body = body
|
self.subject = subject.decode('utf-8', 'replace')
|
||||||
|
self.body = body.decode('utf-8', 'replace')
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
"""
|
"""
|
||||||
Namecoin queries
|
Namecoin queries
|
||||||
"""
|
"""
|
||||||
# pylint: disable=too-many-branches,protected-access
|
# pylint: disable=too-many-branches
|
||||||
|
|
||||||
import base64
|
import base64
|
||||||
from six.moves import http_client as httplib
|
from six.moves import http_client as httplib
|
||||||
|
@ -14,14 +14,14 @@ import defaults
|
||||||
from addresses import decodeAddress
|
from addresses import decodeAddress
|
||||||
from bmconfigparser import config
|
from bmconfigparser import config
|
||||||
from debug import logger
|
from debug import logger
|
||||||
from tr import _translate # translate
|
from tr import _translate
|
||||||
|
|
||||||
|
|
||||||
configSection = "bitmessagesettings"
|
configSection = "bitmessagesettings"
|
||||||
|
|
||||||
|
|
||||||
class RPCError(Exception):
|
class RPCError(Exception):
|
||||||
"""Error thrown when the RPC call returns an error."""
|
"""Error thrown when the RPC call returns an error."""
|
||||||
|
|
||||||
error = None
|
error = None
|
||||||
|
|
||||||
def __init__(self, data):
|
def __init__(self, data):
|
||||||
|
@ -29,7 +29,7 @@ class RPCError(Exception):
|
||||||
self.error = data
|
self.error = data
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "{0}: {1}".format(type(self).__name__, self.error)
|
return '{0}: {1}'.format(type(self).__name__, self.error)
|
||||||
|
|
||||||
|
|
||||||
class namecoinConnection(object):
|
class namecoinConnection(object):
|
||||||
|
@ -46,8 +46,8 @@ class namecoinConnection(object):
|
||||||
|
|
||||||
def __init__(self, options=None):
|
def __init__(self, options=None):
|
||||||
"""
|
"""
|
||||||
Initialise. If options are given, take the connection settings from
|
Initialise. If options are given, take the connection settings from
|
||||||
them instead of loading from the configs. This can be used to test
|
them instead of loading from the configs. This can be used to test
|
||||||
currently entered connection settings in the config dialog without
|
currently entered connection settings in the config dialog without
|
||||||
actually changing the values (yet).
|
actually changing the values (yet).
|
||||||
"""
|
"""
|
||||||
|
@ -69,14 +69,14 @@ class namecoinConnection(object):
|
||||||
self.user = options["user"]
|
self.user = options["user"]
|
||||||
self.password = options["password"]
|
self.password = options["password"]
|
||||||
|
|
||||||
assert self.nmctype == "namecoind" or self.nmctype == "nmcontrol"
|
assert self.nmctype in ("namecoind", "nmcontrol")
|
||||||
if self.nmctype == "namecoind":
|
if self.nmctype == "namecoind":
|
||||||
self.con = httplib.HTTPConnection(self.host, self.port, timeout=3)
|
self.con = httplib.HTTPConnection(self.host, self.port, timeout=3)
|
||||||
|
|
||||||
def query(self, identity):
|
def query(self, identity):
|
||||||
"""
|
"""
|
||||||
Query for the bitmessage address corresponding to the given identity
|
Query for the bitmessage address corresponding to the given identity
|
||||||
string. If it doesn't contain a slash, id/ is prepended. We return
|
string. If it doesn't contain a slash, id/ is prepended. We return
|
||||||
the result as (Error, Address) pair, where the Error is an error
|
the result as (Error, Address) pair, where the Error is an error
|
||||||
message to display or None in case of success.
|
message to display or None in case of success.
|
||||||
"""
|
"""
|
||||||
|
@ -140,7 +140,7 @@ class namecoinConnection(object):
|
||||||
|
|
||||||
def test(self):
|
def test(self):
|
||||||
"""
|
"""
|
||||||
Test the connection settings. This routine tries to query a "getinfo"
|
Test the connection settings. This routine tries to query a "getinfo"
|
||||||
command, and builds either an error message or a success message with
|
command, and builds either an error message or a success message with
|
||||||
some info from it.
|
some info from it.
|
||||||
"""
|
"""
|
||||||
|
@ -160,9 +160,8 @@ class namecoinConnection(object):
|
||||||
versStr = "0.%d.%d" % (v1, v2)
|
versStr = "0.%d.%d" % (v1, v2)
|
||||||
else:
|
else:
|
||||||
versStr = "0.%d.%d.%d" % (v1, v2, v3)
|
versStr = "0.%d.%d.%d" % (v1, v2, v3)
|
||||||
message = (
|
return (
|
||||||
"success",
|
'success', _translate(
|
||||||
_translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Success! Namecoind version {0} running.").format(
|
"Success! Namecoind version {0} running.").format(
|
||||||
versStr.decode("utf-8", "ignore")))
|
versStr.decode("utf-8", "ignore")))
|
||||||
|
@ -172,32 +171,24 @@ class namecoinConnection(object):
|
||||||
prefix = "Plugin data running"
|
prefix = "Plugin data running"
|
||||||
if ("reply" in res) and res["reply"][:len(prefix)] == prefix:
|
if ("reply" in res) and res["reply"][:len(prefix)] == prefix:
|
||||||
return (
|
return (
|
||||||
"success",
|
'success', _translate(
|
||||||
_translate(
|
|
||||||
"MainWindow",
|
"MainWindow",
|
||||||
"Success! NMControll is up and running."
|
"Success! NMControll is up and running.")
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.error("Unexpected nmcontrol reply: %s", res)
|
logger.error("Unexpected nmcontrol reply: %s", res)
|
||||||
message = (
|
return (
|
||||||
"failed",
|
'failed', _translate(
|
||||||
_translate(
|
"MainWindow", "Couldn\'t understand NMControl.")
|
||||||
"MainWindow",
|
|
||||||
"Couldn\'t understand NMControl."
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
sys.exit("Unsupported Namecoin type")
|
sys.exit("Unsupported Namecoin type")
|
||||||
|
|
||||||
return message
|
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.info("Namecoin connection test failure")
|
logger.info("Namecoin connection test failure")
|
||||||
return (
|
return (
|
||||||
"failed",
|
'failed', _translate(
|
||||||
_translate(
|
|
||||||
"MainWindow", "The connection to namecoin failed.")
|
"MainWindow", "The connection to namecoin failed.")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -245,26 +236,24 @@ class namecoinConnection(object):
|
||||||
"Authorization", "Basic %s" % base64.b64encode(authstr))
|
"Authorization", "Basic %s" % base64.b64encode(authstr))
|
||||||
self.con.endheaders()
|
self.con.endheaders()
|
||||||
self.con.send(data)
|
self.con.send(data)
|
||||||
|
try:
|
||||||
|
resp = self.con.getresponse()
|
||||||
|
result = resp.read()
|
||||||
|
if resp.status != 200:
|
||||||
|
raise Exception(
|
||||||
|
"Namecoin returned status %i: %s" %
|
||||||
|
(resp.status, resp.reason))
|
||||||
|
except: # noqa:E722
|
||||||
|
logger.info("HTTP receive error")
|
||||||
except: # noqa:E722
|
except: # noqa:E722
|
||||||
logger.info("HTTP connection error")
|
logger.info("HTTP connection error")
|
||||||
return None
|
|
||||||
|
|
||||||
try:
|
|
||||||
resp = self.con.getresponse()
|
|
||||||
result = resp.read()
|
|
||||||
if resp.status != 200:
|
|
||||||
raise Exception(
|
|
||||||
"Namecoin returned status"
|
|
||||||
" %i: %s" % (resp.status, resp.reason))
|
|
||||||
except: # noqa:E722
|
|
||||||
logger.info("HTTP receive error")
|
|
||||||
return None
|
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def queryServer(self, data):
|
def queryServer(self, data):
|
||||||
"""Helper routine sending data to the RPC "
|
"""
|
||||||
"server and returning the result."""
|
Helper routine sending data to the RPC server and returning the result.
|
||||||
|
"""
|
||||||
|
|
||||||
try:
|
try:
|
||||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
@ -296,23 +285,24 @@ def lookupNamecoinFolder():
|
||||||
"""
|
"""
|
||||||
|
|
||||||
app = "namecoin"
|
app = "namecoin"
|
||||||
from os import path, environ
|
|
||||||
if sys.platform == "darwin":
|
if sys.platform == "darwin":
|
||||||
if "HOME" in environ:
|
try:
|
||||||
dataFolder = path.join(os.environ["HOME"],
|
dataFolder = os.path.join(
|
||||||
"Library/Application Support/", app) + "/"
|
os.getenv("HOME"), "Library/Application Support/", app)
|
||||||
else:
|
except TypeError: # getenv is None
|
||||||
sys.exit(
|
sys.exit(
|
||||||
"Could not find home folder, please report this message"
|
"Could not find home folder, please report this message"
|
||||||
" and your OS X version to the BitMessage Github."
|
" and your OS X version to the BitMessage Github."
|
||||||
)
|
) # TODO: remove exits from utility modules
|
||||||
|
|
||||||
elif "win32" in sys.platform or "win64" in sys.platform:
|
dataFolder = (
|
||||||
dataFolder = path.join(environ["APPDATA"], app) + "\\"
|
os.path.join(os.getenv("APPDATA"), app)
|
||||||
else:
|
if sys.platform.startswith('win') else
|
||||||
dataFolder = path.join(environ["HOME"], ".%s" % app) + "/"
|
os.path.join(os.getenv("HOME"), ".%s" % app)
|
||||||
|
)
|
||||||
|
|
||||||
return dataFolder
|
return dataFolder + os.path.sep
|
||||||
|
|
||||||
|
|
||||||
def ensureNamecoinOptions():
|
def ensureNamecoinOptions():
|
||||||
|
@ -357,8 +347,8 @@ def ensureNamecoinOptions():
|
||||||
nmc.close()
|
nmc.close()
|
||||||
except IOError:
|
except IOError:
|
||||||
logger.warning(
|
logger.warning(
|
||||||
"%s unreadable or missing, Namecoin support deactivated",
|
"%s unreadable or missing, Namecoin support deactivated", nmcConfig
|
||||||
nmcConfig)
|
)
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.warning("Error processing namecoin.conf", exc_info=True)
|
logger.warning("Error processing namecoin.conf", exc_info=True)
|
||||||
|
|
||||||
|
|
|
@ -23,9 +23,9 @@ class IndicatorLibmessaging(object):
|
||||||
return
|
return
|
||||||
|
|
||||||
self._menu = {
|
self._menu = {
|
||||||
'send': unicode(_translate('MainWindow', 'Send')),
|
'send': _translate('MainWindow', 'Send'),
|
||||||
'messages': unicode(_translate('MainWindow', 'Messages')),
|
'messages': _translate('MainWindow', 'Messages'),
|
||||||
'subscriptions': unicode(_translate('MainWindow', 'Subscriptions'))
|
'subscriptions': _translate('MainWindow', 'Subscriptions')
|
||||||
}
|
}
|
||||||
|
|
||||||
self.new_message_item = self.new_broadcast_item = None
|
self.new_message_item = self.new_broadcast_item = None
|
||||||
|
@ -45,12 +45,11 @@ class IndicatorLibmessaging(object):
|
||||||
|
|
||||||
def show_unread(self, draw_attention=False):
|
def show_unread(self, draw_attention=False):
|
||||||
"""
|
"""
|
||||||
show the number of unread messages and subscriptions
|
Show the number of unread messages and subscriptions
|
||||||
on the messaging menu
|
on the messaging menu
|
||||||
"""
|
"""
|
||||||
for source, count in zip(
|
for source, count in zip(
|
||||||
('messages', 'subscriptions'),
|
('messages', 'subscriptions'), self.form.getUnread()
|
||||||
self.form.getUnread()
|
|
||||||
):
|
):
|
||||||
if count > 0:
|
if count > 0:
|
||||||
if self.app.has_source(source):
|
if self.app.has_source(source):
|
||||||
|
|
|
@ -6,7 +6,7 @@ A menu plugin showing QR-Code for bitmessage address in modal dialog.
|
||||||
from six.moves.urllib.parse import urlencode
|
from six.moves.urllib.parse import urlencode
|
||||||
|
|
||||||
import qrcode
|
import qrcode
|
||||||
from PyQt4 import QtCore, QtGui
|
from qtpy import QtGui, QtCore, QtWidgets
|
||||||
|
|
||||||
from pybitmessage.tr import _translate
|
from pybitmessage.tr import _translate
|
||||||
|
|
||||||
|
@ -39,23 +39,23 @@ class Image(qrcode.image.base.BaseImage): # pylint: disable=abstract-method
|
||||||
QtCore.Qt.black)
|
QtCore.Qt.black)
|
||||||
|
|
||||||
|
|
||||||
class QRCodeDialog(QtGui.QDialog):
|
class QRCodeDialog(QtWidgets.QDialog):
|
||||||
"""The dialog"""
|
"""The dialog"""
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
super(QRCodeDialog, self).__init__(parent)
|
super(QRCodeDialog, self).__init__(parent)
|
||||||
self.image = QtGui.QLabel(self)
|
self.image = QtWidgets.QLabel(self)
|
||||||
self.label = QtGui.QLabel(self)
|
self.label = QtWidgets.QLabel(self)
|
||||||
font = QtGui.QFont()
|
font = QtGui.QFont()
|
||||||
font.setBold(True)
|
font.setBold(True)
|
||||||
font.setWeight(75)
|
font.setWeight(75)
|
||||||
self.label.setFont(font)
|
self.label.setFont(font)
|
||||||
self.label.setAlignment(
|
self.label.setAlignment(
|
||||||
QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
|
QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
|
||||||
buttonBox = QtGui.QDialogButtonBox(self)
|
buttonBox = QtWidgets.QDialogButtonBox(self)
|
||||||
buttonBox.setOrientation(QtCore.Qt.Horizontal)
|
buttonBox.setOrientation(QtCore.Qt.Horizontal)
|
||||||
buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok)
|
buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Ok)
|
||||||
buttonBox.accepted.connect(self.accept)
|
buttonBox.accepted.connect(self.accept)
|
||||||
layout = QtGui.QVBoxLayout(self)
|
layout = QtWidgets.QVBoxLayout(self)
|
||||||
layout.addWidget(self.image)
|
layout.addWidget(self.image)
|
||||||
layout.addWidget(self.label)
|
layout.addWidget(self.label)
|
||||||
layout.addWidget(buttonBox)
|
layout.addWidget(buttonBox)
|
||||||
|
@ -72,7 +72,7 @@ class QRCodeDialog(QtGui.QDialog):
|
||||||
self.label.setText(text)
|
self.label.setText(text)
|
||||||
self.label.setToolTip(text)
|
self.label.setToolTip(text)
|
||||||
self.label.setFixedWidth(pixmap.width())
|
self.label.setFixedWidth(pixmap.width())
|
||||||
self.setFixedSize(QtGui.QWidget.sizeHint(self))
|
self.setFixedSize(QtWidgets.QWidget.sizeHint(self))
|
||||||
|
|
||||||
|
|
||||||
def connect_plugin(form):
|
def connect_plugin(form):
|
||||||
|
|
|
@ -32,6 +32,7 @@ def get_plugins(group, point='', name=None, fallback=None):
|
||||||
except (AttributeError,
|
except (AttributeError,
|
||||||
ImportError,
|
ImportError,
|
||||||
ValueError,
|
ValueError,
|
||||||
|
RuntimeError, # PyQt for example
|
||||||
pkg_resources.DistributionNotFound,
|
pkg_resources.DistributionNotFound,
|
||||||
pkg_resources.UnknownExtra):
|
pkg_resources.UnknownExtra):
|
||||||
logger.debug(
|
logger.debug(
|
||||||
|
|
|
@ -42,10 +42,7 @@ Returns an instance of :class:`QPixmap` which have generated identicon image.
|
||||||
|
|
||||||
from six.moves import range
|
from six.moves import range
|
||||||
|
|
||||||
try:
|
from qtpy import QtCore, QtGui
|
||||||
from PyQt5 import QtCore, QtGui
|
|
||||||
except (ImportError, RuntimeError):
|
|
||||||
from PyQt4 import QtCore, QtGui
|
|
||||||
|
|
||||||
|
|
||||||
class IdenticonRendererBase(object):
|
class IdenticonRendererBase(object):
|
||||||
|
@ -129,11 +126,13 @@ class IdenticonRendererBase(object):
|
||||||
QtCore.QPointF(size, size), QtCore.QPointF(0., size)]
|
QtCore.QPointF(size, size), QtCore.QPointF(0., size)]
|
||||||
rotation = [0, 90, 180, 270]
|
rotation = [0, 90, 180, 270]
|
||||||
|
|
||||||
nopen = QtGui.QPen(foreColor, QtCore.Qt.NoPen)
|
nopen = QtGui.QPen(foreColor)
|
||||||
|
nopen.setStyle(QtCore.Qt.NoPen)
|
||||||
foreBrush = QtGui.QBrush(foreColor, QtCore.Qt.SolidPattern)
|
foreBrush = QtGui.QBrush(foreColor, QtCore.Qt.SolidPattern)
|
||||||
if penwidth > 0:
|
if penwidth > 0:
|
||||||
pen_color = QtGui.QColor(255, 255, 255)
|
pen_color = QtGui.QColor(255, 255, 255)
|
||||||
pen = QtGui.QPen(pen_color, QtCore.Qt.SolidPattern)
|
pen = QtGui.QPen(pen_color)
|
||||||
|
pen.setBrush(QtCore.Qt.SolidPattern)
|
||||||
pen.setWidth(penwidth)
|
pen.setWidth(penwidth)
|
||||||
|
|
||||||
painter = QtGui.QPainter()
|
painter = QtGui.QPainter()
|
||||||
|
|
|
@ -4,7 +4,7 @@ import atexit
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from PyQt5 import QtGui, QtWidgets
|
from qtpy import QtGui, QtWidgets
|
||||||
from xvfbwrapper import Xvfb
|
from xvfbwrapper import Xvfb
|
||||||
from pybitmessage import qidenticon
|
from pybitmessage import qidenticon
|
||||||
except ImportError:
|
except ImportError:
|
||||||
|
|
55
src/tr.py
55
src/tr.py
|
@ -1,7 +1,6 @@
|
||||||
"""
|
"""
|
||||||
Translating text
|
Slim layer providing environment agnostic _translate()
|
||||||
"""
|
"""
|
||||||
import os
|
|
||||||
|
|
||||||
from unqstr import ustr
|
from unqstr import ustr
|
||||||
|
|
||||||
|
@ -11,51 +10,17 @@ except ImportError:
|
||||||
from . import state
|
from . import state
|
||||||
|
|
||||||
|
|
||||||
class translateClass:
|
def _tr_dummy(context, text, disambiguation=None, n=None):
|
||||||
"""
|
|
||||||
This is used so that the translateText function can be used
|
|
||||||
when we are in daemon mode and not using any QT functions.
|
|
||||||
"""
|
|
||||||
# pylint: disable=old-style-class,too-few-public-methods
|
|
||||||
def __init__(self, context, text):
|
|
||||||
self.context = context
|
|
||||||
self.text = text
|
|
||||||
|
|
||||||
def arg(self, _):
|
|
||||||
"""Replace argument placeholders"""
|
|
||||||
if '%' in self.text:
|
|
||||||
# This doesn't actually do anything with the arguments
|
|
||||||
# because we don't have a UI in which to display this information anyway.
|
|
||||||
return translateClass(self.context, self.text.replace('%', '', 1))
|
|
||||||
return self.text
|
|
||||||
|
|
||||||
|
|
||||||
def _translate(context, text, disambiguation=None, encoding=None, n=None):
|
|
||||||
# pylint: disable=unused-argument
|
# pylint: disable=unused-argument
|
||||||
return ustr(translateText(context, text, n))
|
return text
|
||||||
|
|
||||||
|
|
||||||
def translateText(context, text, n=None):
|
if state.enableGUI and not state.curses:
|
||||||
"""Translate text in context"""
|
|
||||||
try:
|
try:
|
||||||
enableGUI = state.enableGUI
|
from qtpy import QtWidgets, QtCore
|
||||||
except AttributeError: # inside the plugin
|
except ImportError:
|
||||||
enableGUI = True
|
_translate = _tr_dummy
|
||||||
if enableGUI:
|
|
||||||
try:
|
|
||||||
from PyQt4 import QtCore, QtGui
|
|
||||||
except Exception as err:
|
|
||||||
print('PyBitmessage requires PyQt unless you want to run it as a daemon'
|
|
||||||
' and interact with it using the API.'
|
|
||||||
' You can download PyQt from http://www.riverbankcomputing.com/software/pyqt/download'
|
|
||||||
' or by searching Google for \'PyQt Download\'.'
|
|
||||||
' If you want to run in daemon mode, see https://bitmessage.org/wiki/Daemon')
|
|
||||||
print('Error message:', err)
|
|
||||||
os._exit(0) # pylint: disable=protected-access
|
|
||||||
if n is None:
|
|
||||||
return QtGui.QApplication.translate(context, text)
|
|
||||||
return QtGui.QApplication.translate(context, text, None, QtCore.QCoreApplication.CodecForTr, n)
|
|
||||||
else:
|
else:
|
||||||
if '%' in text:
|
_translate = QtWidgets.QApplication.translate
|
||||||
return translateClass(context, text.replace('%', '', 1))
|
else:
|
||||||
return text
|
_translate = _tr_dummy
|
||||||
|
|
|
@ -268,9 +268,12 @@ class uPnPThread(StoppableThread):
|
||||||
with knownnodes.knownNodesLock:
|
with knownnodes.knownNodesLock:
|
||||||
knownnodes.addKnownNode(
|
knownnodes.addKnownNode(
|
||||||
1, self_peer, is_self=True)
|
1, self_peer, is_self=True)
|
||||||
queues.UISignalQueue.put(('updateStatusBar', tr._translate(
|
queues.UISignalQueue.put((
|
||||||
"MainWindow", 'UPnP port mapping established on port {0}'
|
'updateStatusBar', tr._translate(
|
||||||
).format(str(self.extPort))))
|
"MainWindow",
|
||||||
|
"UPnP port mapping established on port {0}"
|
||||||
|
).format(self.extPort)
|
||||||
|
))
|
||||||
break
|
break
|
||||||
except socket.timeout:
|
except socket.timeout:
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
Package: pybitmessage
|
Package: pybitmessage
|
||||||
Section: net
|
Section: net
|
||||||
Build-Depends: dh-python, libssl-dev, python-all-dev, python-setuptools, python-six
|
Build-Depends: dh-python, libssl-dev, python-all-dev, python-setuptools, python-six
|
||||||
Depends: openssl, python-setuptools
|
Depends: openssl, python-setuptools, python-six
|
||||||
Recommends: apparmor, python-msgpack, python-qt4, python-stem, tor
|
Recommends: apparmor, python-msgpack, python-pyqt5, python-stem, tor
|
||||||
Suggests: python-pyopencl, python-jsonrpclib, python-defusedxml, python-qrcode
|
Suggests: python-pyopencl, python-jsonrpclib, python-defusedxml, python-qrcode
|
||||||
Suite: bionic
|
Suite: bionic
|
||||||
Setup-Env-Vars: DEB_BUILD_OPTIONS=nocheck
|
Setup-Env-Vars: DEB_BUILD_OPTIONS=nocheck
|
||||||
|
|
Reference in New Issue
Block a user