Skip to content

Commit 82a3330

Browse files
committed
Initial support for PyQt5 (main window shown) using QtPy package.
QtPy is a compatibility layer which allows to use the code written for PyQt5 with any python Qt binding: PyQt4, PyQt5, pyside or pyside2. Main differences in PyQt5: - all widget classes are now in QtWidgets package, not QtGui; - QString obsoleted by unicode (sip API 2); - changed the way of signals connection. Closes: Bitmessage#1191
1 parent 20a1fb5 commit 82a3330

27 files changed

+1400
-1341
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ addons:
99
packages:
1010
- build-essential
1111
- libcap-dev
12-
- python-qt4
12+
- python-pyqt5
1313
- tor
1414
- xvfb
1515
install:

src/bitmessageqt/__init__.py

Lines changed: 582 additions & 511 deletions
Large diffs are not rendered by default.

src/bitmessageqt/account.py

Lines changed: 48 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,31 @@
1-
# pylint: disable=too-many-instance-attributes,attribute-defined-outside-init
21
"""
3-
account.py
4-
==========
5-
62
Account related functions.
73
84
"""
95

10-
from __future__ import absolute_import
11-
126
import inspect
137
import re
148
import sys
159
import time
1610

17-
from PyQt4 import QtGui
18-
1911
import queues
2012
from addresses import decodeAddress
2113
from bmconfigparser import BMConfigParser
2214
from helper_ackPayload import genAckPayload
2315
from helper_sql import sqlQuery, sqlExecute
24-
from .foldertree import AccountMixin
25-
from .utils import str_broadcast_subscribers
16+
from foldertree import AccountMixin
17+
from utils import str_broadcast_subscribers
18+
from tr import _translate
2619

2720

2821
def getSortedAccounts():
29-
"""Get a sorted list of configSections"""
30-
22+
"""Get a sorted list of address config sections"""
3123
configSections = BMConfigParser().addresses()
3224
configSections.sort(
3325
cmp=lambda x, y: cmp(
34-
unicode(
35-
BMConfigParser().get(
36-
x,
37-
'label'),
38-
'utf-8').lower(),
39-
unicode(
40-
BMConfigParser().get(
41-
y,
42-
'label'),
43-
'utf-8').lower()))
26+
unicode(BMConfigParser().get(x, 'label'), 'utf-8').lower(),
27+
unicode(BMConfigParser().get(y, 'label'), 'utf-8').lower())
28+
)
4429
return configSections
4530

4631

@@ -94,7 +79,8 @@ def accountClass(address):
9479
return subscription
9580
try:
9681
gateway = BMConfigParser().get(address, "gateway")
97-
for _, cls in inspect.getmembers(sys.modules[__name__], inspect.isclass):
82+
for _, cls in inspect.getmembers(
83+
sys.modules[__name__], inspect.isclass):
9884
if issubclass(cls, GatewayAccount) and cls.gatewayName == gateway:
9985
return cls(address)
10086
# general gateway
@@ -105,7 +91,7 @@ def accountClass(address):
10591
return BMAccount(address)
10692

10793

108-
class AccountColor(AccountMixin): # pylint: disable=too-few-public-methods
94+
class AccountColor(AccountMixin):
10995
"""Set the type of account"""
11096

11197
def __init__(self, address, address_type=None):
@@ -127,12 +113,35 @@ def __init__(self, address, address_type=None):
127113
self.type = address_type
128114

129115

130-
class BMAccount(object):
131-
"""Encapsulate a Bitmessage account"""
132-
116+
class NoAccount(object):
117+
"""Minimal account like object (All accounts)"""
118+
# pylint: disable=too-many-instance-attributes
133119
def __init__(self, address=None):
134120
self.address = address
135121
self.type = AccountMixin.NORMAL
122+
self.toAddress = self.fromAddress = ''
123+
self.subject = self.message = ''
124+
self.fromLabel = self.toLabel = ''
125+
126+
def getLabel(self, address=None):
127+
"""Get a label for this bitmessage account"""
128+
return address or self.address
129+
130+
def parseMessage(self, toAddress, fromAddress, subject, message):
131+
"""Set metadata and address labels on self"""
132+
self.toAddress = toAddress
133+
self.fromAddress = fromAddress
134+
self.subject = subject
135+
self.message = message
136+
self.fromLabel = self.getLabel(fromAddress)
137+
self.toLabel = self.getLabel(toAddress)
138+
139+
140+
class BMAccount(NoAccount):
141+
"""Encapsulate a Bitmessage account"""
142+
143+
def __init__(self, address=None):
144+
super(BMAccount, self).__init__(address)
136145
if BMConfigParser().has_section(address):
137146
if BMConfigParser().safeGetBoolean(self.address, 'chan'):
138147
self.type = AccountMixin.CHAN
@@ -148,8 +157,7 @@ def __init__(self, address=None):
148157

149158
def getLabel(self, address=None):
150159
"""Get a label for this bitmessage account"""
151-
if address is None:
152-
address = self.address
160+
address = super(BMAccount, self).getLabel(address)
153161
label = BMConfigParser().safeGet(address, 'label', address)
154162
queryreturn = sqlQuery(
155163
'''select label from addressbook where address=?''', address)
@@ -162,33 +170,7 @@ def getLabel(self, address=None):
162170
if queryreturn != []:
163171
for row in queryreturn:
164172
label, = row
165-
return label
166-
167-
def parseMessage(self, toAddress, fromAddress, subject, message):
168-
"""Set metadata and address labels on self"""
169-
170-
self.toAddress = toAddress
171-
self.fromAddress = fromAddress
172-
if isinstance(subject, unicode):
173-
self.subject = str(subject)
174-
else:
175-
self.subject = subject
176-
self.message = message
177-
self.fromLabel = self.getLabel(fromAddress)
178-
self.toLabel = self.getLabel(toAddress)
179-
180-
181-
class NoAccount(BMAccount):
182-
"""Override the __init__ method on a BMAccount"""
183-
184-
def __init__(self, address=None): # pylint: disable=super-init-not-called
185-
self.address = address
186-
self.type = AccountMixin.NORMAL
187-
188-
def getLabel(self, address=None):
189-
if address is None:
190-
address = self.address
191-
return address
173+
return unicode(label, 'utf-8')
192174

193175

194176
class SubscriptionAccount(BMAccount):
@@ -208,15 +190,11 @@ class GatewayAccount(BMAccount):
208190
ALL_OK = 0
209191
REGISTRATION_DENIED = 1
210192

211-
def __init__(self, address):
212-
super(GatewayAccount, self).__init__(address)
213-
214193
def send(self):
215-
"""Override the send method for gateway accounts"""
216-
217-
# pylint: disable=unused-variable
218-
status, addressVersionNumber, streamNumber, ripe = decodeAddress(self.toAddress)
219-
stealthLevel = BMConfigParser().safeGetInt('bitmessagesettings', 'ackstealthlevel')
194+
"""The send method for gateway accounts"""
195+
streamNumber, ripe = decodeAddress(self.toAddress)[2:]
196+
stealthLevel = BMConfigParser().safeGetInt(
197+
'bitmessagesettings', 'ackstealthlevel')
220198
ackdata = genAckPayload(streamNumber, stealthLevel)
221199
sqlExecute(
222200
'''INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''',
@@ -289,10 +267,9 @@ def status(self):
289267

290268
def settings(self):
291269
"""settings specific to a MailchuckAccount"""
292-
293270
self.toAddress = self.registrationAddress
294271
self.subject = "config"
295-
self.message = QtGui.QApplication.translate(
272+
self.message = _translate(
296273
"Mailchuck",
297274
"""# You can use this to configure your email gateway account
298275
# Uncomment the setting you want to use
@@ -338,8 +315,9 @@ def settings(self):
338315

339316
def parseMessage(self, toAddress, fromAddress, subject, message):
340317
"""parseMessage specific to a MailchuckAccount"""
341-
342-
super(MailchuckAccount, self).parseMessage(toAddress, fromAddress, subject, message)
318+
super(MailchuckAccount, self).parseMessage(
319+
toAddress, fromAddress, subject, message
320+
)
343321
if fromAddress == self.relayAddress:
344322
matches = self.regExpIncoming.search(subject)
345323
if matches is not None:
@@ -360,6 +338,7 @@ def parseMessage(self, toAddress, fromAddress, subject, message):
360338
self.toLabel = matches.group(1)
361339
self.toAddress = matches.group(1)
362340
self.feedback = self.ALL_OK
363-
if fromAddress == self.registrationAddress and self.subject == "Registration Request Denied":
341+
if fromAddress == self.registrationAddress \
342+
and self.subject == "Registration Request Denied":
364343
self.feedback = self.REGISTRATION_DENIED
365344
return self.feedback

0 commit comments

Comments
 (0)