The Address tree now is sorted and updates when number of unread messages changes.master
parent
83a069d1f6
commit
83109796fe
@ -0,0 +1,133 @@
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from utils import *
|
||||
import shared
|
||||
|
||||
class Ui_FolderWidget(QtGui.QTreeWidgetItem):
|
||||
folderWeight = {"inbox": 1, "sent": 2, "trash": 3}
|
||||
def __init__(self, parent, pos = 0, address = "", folderName = "", unreadCount = 0):
|
||||
super(QtGui.QTreeWidgetItem, self).__init__()
|
||||
self.address = address
|
||||
self.folderName = folderName
|
||||
self.unreadCount = unreadCount
|
||||
parent.insertChild(pos, self)
|
||||
self.updateText()
|
||||
|
||||
def setAddress(self, address):
|
||||
self.address = str(address)
|
||||
self.updateText()
|
||||
|
||||
def setUnreadCount(self, cnt):
|
||||
self.unreadCount = int(cnt)
|
||||
self.updateText()
|
||||
|
||||
def setFolderName(self, fname):
|
||||
self.folderName = str(fname)
|
||||
self.updateText()
|
||||
|
||||
def updateText(self):
|
||||
text = QtGui.QApplication.translate("MainWindow", self.folderName)
|
||||
font = QtGui.QFont()
|
||||
if self.unreadCount > 0:
|
||||
text += " (" + str(self.unreadCount) + ")"
|
||||
font.setBold(True)
|
||||
else:
|
||||
font.setBold(False)
|
||||
self.setFont(0, font)
|
||||
self.setText(0, text)
|
||||
self.setToolTip(0, text)
|
||||
self.setData(0, QtCore.Qt.UserRole, [self.address, self.folderName])
|
||||
|
||||
# inbox, sent, thrash first, rest alphabetically
|
||||
def __lt__(self, other):
|
||||
if (isinstance(other, Ui_FolderWidget)):
|
||||
if self.folderName in self.folderWeight:
|
||||
x = self.folderWeight[self.folderName]
|
||||
else:
|
||||
x = 4
|
||||
if other.folderName in self.folderWeight:
|
||||
y = self.folderWeight[other.folderName]
|
||||
else:
|
||||
y = 4
|
||||
|
||||
if x == y:
|
||||
return self.folderName > other.folderName
|
||||
else:
|
||||
return x > y
|
||||
|
||||
return super(QtGui.QTreeWidgetItem, self).__lt__(other)
|
||||
|
||||
|
||||
class Ui_AddressWidget(QtGui.QTreeWidgetItem):
|
||||
def __init__(self, parent, pos = 0, address = "", unreadCount = 0):
|
||||
super(QtGui.QTreeWidgetItem, self).__init__()
|
||||
self.address = address
|
||||
self.unreadCount = unreadCount
|
||||
parent.insertTopLevelItem(pos, self)
|
||||
# only set default when creating
|
||||
#super(QtGui.QTreeWidgetItem, self).setExpanded(shared.config.getboolean(self.address, 'enabled'))
|
||||
self.setExpanded(shared.safeConfigGetBoolean(self.address, 'enabled'))
|
||||
self.updateText()
|
||||
|
||||
def setAddress(self, address):
|
||||
self.address = str(address)
|
||||
self.updateText()
|
||||
|
||||
def setUnreadCount(self, cnt):
|
||||
self.unreadCount = int(cnt)
|
||||
self.updateText()
|
||||
|
||||
def updateText(self):
|
||||
text = QtGui.QApplication.translate("MainWindow",
|
||||
unicode(shared.config.get(self.address, 'label'), 'utf-8)')
|
||||
+ ' (' + self.address + ')')
|
||||
|
||||
font = QtGui.QFont()
|
||||
if self.unreadCount > 0:
|
||||
# only show message count if the child doesn't show
|
||||
if not self.isExpanded():
|
||||
text += " (" + str(self.unreadCount) + ")"
|
||||
font.setBold(True)
|
||||
else:
|
||||
font.setBold(False)
|
||||
self.setFont(0, font)
|
||||
|
||||
#set text color
|
||||
if shared.safeConfigGetBoolean(self.address, 'enabled'):
|
||||
if shared.safeConfigGetBoolean(self.address, 'mailinglist'):
|
||||
brush = QtGui.QBrush(QtGui.QColor(137, 04, 177))
|
||||
else:
|
||||
brush = QtGui.QBrush(QtGui.QApplication.palette().text().color())
|
||||
#self.setExpanded(True)
|
||||
else:
|
||||
brush = QtGui.QBrush(QtGui.QColor(128, 128, 128))
|
||||
#self.setExpanded(False)
|
||||
brush.setStyle(QtCore.Qt.NoBrush)
|
||||
self.setForeground(0, brush)
|
||||
|
||||
self.setIcon(0, avatarize(self.address))
|
||||
self.setText(0, text)
|
||||
self.setToolTip(0, text)
|
||||
self.setData(0, QtCore.Qt.UserRole, [self.address, "inbox"])
|
||||
|
||||
def setExpanded(self, expand):
|
||||
super(Ui_AddressWidget, self).setExpanded(expand)
|
||||
self.updateText()
|
||||
|
||||
# label (or address) alphabetically, disabled at the end
|
||||
def __lt__(self, other):
|
||||
if (isinstance(other, Ui_AddressWidget)):
|
||||
if shared.config.getboolean(self.address, 'enabled') == shared.config.getboolean(other.address, 'enabled'):
|
||||
if shared.config.get(self.address, 'label'):
|
||||
x = shared.config.get(self.address, 'label').decode('utf-8').lower()
|
||||
else:
|
||||
x = self.address.decode('utf-8').lower()
|
||||
if shared.config.get(other.address, 'label'):
|
||||
y = shared.config.get(other.address, 'label').decode('utf-8').lower()
|
||||
else:
|
||||
y = other.address.decode('utf-8').lower()
|
||||
return y < x
|
||||
# else:
|
||||
return (False if shared.config.getboolean(self.address, 'enabled') else True)
|
||||
|
||||
return super(QtGui.QTreeWidgetItem, self).__lt__(other)
|
@ -0,0 +1,104 @@
|
||||
from PyQt4 import QtGui
|
||||
import hashlib
|
||||
import os
|
||||
import shared
|
||||
from addresses import addBMIfNotPresent
|
||||
|
||||
def identiconize(address):
|
||||
size = 48
|
||||
|
||||
# If you include another identicon library, please generate an
|
||||
# example identicon with the following md5 hash:
|
||||
# 3fd4bf901b9d4ea1394f0fb358725b28
|
||||
|
||||
try:
|
||||
identicon_lib = shared.config.get('bitmessagesettings', 'identiconlib')
|
||||
except:
|
||||
# default to qidenticon_two_x
|
||||
identicon_lib = 'qidenticon_two_x'
|
||||
|
||||
# As an 'identiconsuffix' you could put "@bitmessge.ch" or "@bm.addr" to make it compatible with other identicon generators. (Note however, that E-Mail programs might convert the BM-address to lowercase first.)
|
||||
# It can be used as a pseudo-password to salt the generation of the identicons to decrease the risk
|
||||
# of attacks where someone creates an address to mimic someone else's identicon.
|
||||
identiconsuffix = shared.config.get('bitmessagesettings', 'identiconsuffix')
|
||||
|
||||
if not shared.config.getboolean('bitmessagesettings', 'useidenticons'):
|
||||
idcon = QtGui.QIcon()
|
||||
return idcon
|
||||
|
||||
if (identicon_lib[:len('qidenticon')] == 'qidenticon'):
|
||||
# print identicon_lib
|
||||
# originally by:
|
||||
# :Author:Shin Adachi <shn@glucose.jp>
|
||||
# Licesensed under FreeBSD License.
|
||||
# stripped from PIL and uses QT instead (by sendiulo, same license)
|
||||
import qidenticon
|
||||
hash = hashlib.md5(addBMIfNotPresent(address)+identiconsuffix).hexdigest()
|
||||
use_two_colors = (identicon_lib[:len('qidenticon_two')] == 'qidenticon_two')
|
||||
opacity = int(not((identicon_lib == 'qidenticon_x') | (identicon_lib == 'qidenticon_two_x') | (identicon_lib == 'qidenticon_b') | (identicon_lib == 'qidenticon_two_b')))*255
|
||||
penwidth = 0
|
||||
image = qidenticon.render_identicon(int(hash, 16), size, use_two_colors, opacity, penwidth)
|
||||
# filename = './images/identicons/'+hash+'.png'
|
||||
# image.save(filename)
|
||||
idcon = QtGui.QIcon()
|
||||
idcon.addPixmap(image, QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
||||
return idcon
|
||||
elif identicon_lib == 'pydenticon':
|
||||
# print identicon_lib
|
||||
# Here you could load pydenticon.py (just put it in the "src" folder of your Bitmessage source)
|
||||
from pydenticon import Pydenticon
|
||||
# It is not included in the source, because it is licensed under GPLv3
|
||||
# GPLv3 is a copyleft license that would influence our licensing
|
||||
# Find the source here: http://boottunes.googlecode.com/svn-history/r302/trunk/src/pydenticon.py
|
||||
# note that it requires PIL to be installed: http://www.pythonware.com/products/pil/
|
||||
idcon_render = Pydenticon(addBMIfNotPresent(address)+identiconsuffix, size*3)
|
||||
rendering = idcon_render._render()
|
||||
data = rendering.convert("RGBA").tostring("raw", "RGBA")
|
||||
qim = QImage(data, size, size, QImage.Format_ARGB32)
|
||||
pix = QPixmap.fromImage(qim)
|
||||
idcon = QtGui.QIcon()
|
||||
idcon.addPixmap(pix, QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
||||
return idcon
|
||||
|
||||
def avatarize(address):
|
||||
"""
|
||||
loads a supported image for the given address' hash form 'avatars' folder
|
||||
falls back to default avatar if 'default.*' file exists
|
||||
falls back to identiconize(address)
|
||||
"""
|
||||
idcon = QtGui.QIcon()
|
||||
hash = hashlib.md5(addBMIfNotPresent(address)).hexdigest()
|
||||
str_broadcast_subscribers = '[Broadcast subscribers]'
|
||||
if address == str_broadcast_subscribers:
|
||||
# don't hash [Broadcast subscribers]
|
||||
hash = address
|
||||
# http://pyqt.sourceforge.net/Docs/PyQt4/qimagereader.html#supportedImageFormats
|
||||
# print QImageReader.supportedImageFormats ()
|
||||
# QImageReader.supportedImageFormats ()
|
||||
extensions = ['PNG', 'GIF', 'JPG', 'JPEG', 'SVG', 'BMP', 'MNG', 'PBM', 'PGM', 'PPM', 'TIFF', 'XBM', 'XPM', 'TGA']
|
||||
# try to find a specific avatar
|
||||
for ext in extensions:
|
||||
lower_hash = shared.appdata + 'avatars/' + hash + '.' + ext.lower()
|
||||
upper_hash = shared.appdata + 'avatars/' + hash + '.' + ext.upper()
|
||||
if os.path.isfile(lower_hash):
|
||||
# print 'found avatar of ', address
|
||||
idcon.addFile(lower_hash)
|
||||
return idcon
|
||||
elif os.path.isfile(upper_hash):
|
||||
# print 'found avatar of ', address
|
||||
idcon.addFile(upper_hash)
|
||||
return idcon
|
||||
# if we haven't found any, try to find a default avatar
|
||||
for ext in extensions:
|
||||
lower_default = shared.appdata + 'avatars/' + 'default.' + ext.lower()
|
||||
upper_default = shared.appdata + 'avatars/' + 'default.' + ext.upper()
|
||||
if os.path.isfile(lower_default):
|
||||
default = lower_default
|
||||
idcon.addFile(lower_default)
|
||||
return idcon
|
||||
elif os.path.isfile(upper_default):
|
||||
default = upper_default
|
||||
idcon.addFile(upper_default)
|
||||
return idcon
|
||||
# If no avatar is found
|
||||
return identiconize(address)
|
Loading…
Reference in new issue