From 86485a9b096bb5b6995f900a2e8970f074a85859 Mon Sep 17 00:00:00 2001 From: sendiulo Date: Wed, 18 Sep 2013 17:39:45 +0200 Subject: [PATCH] nonfunctional identicon settings-GUI --- src/bitmessageqt/__init__.py | 23 ++++-- src/bitmessageqt/bitmessage_icons.qrc | 5 ++ src/bitmessageqt/bitmessageui.py | 12 ++- src/bitmessageqt/settings.py | 89 ++++++++++++++------ src/bitmessageqt/settings.ui | 113 ++++++++++++++++++++++---- src/qidenticon.py | 45 ++++++---- 6 files changed, 222 insertions(+), 65 deletions(-) diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index 42ccb7ae..2a5eb10e 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -56,7 +56,7 @@ def _translate(context, text): return QtGui.QApplication.translate(context, text) def identiconize(address): - size = 1 + size = 48 str_broadcast_subscribers = '[Broadcast subscribers]' if address == str_broadcast_subscribers: @@ -71,11 +71,15 @@ def identiconize(address): # Attacks where someone creates an address to mimic someone else's identicon should be impossible then # i think it should generate a random string by default + # If you include another identicon library, please generate an + # example identicon with the following md5 hash: + # 3fd4bf901b9d4ea1394f0fb358725b28 + try: identicon_lib = shared.config.get('bitmessagesettings', 'identicon') except: - identicon_lib = 'qidenticon' - + # default to no identicons + identicon_lib = False if (identicon_lib[:len('qidenticon')] == 'qidenticon'): # print identicon_lib @@ -87,11 +91,13 @@ def identiconize(address): import hashlib hash = hashlib.md5(addBMIfNotPresent(address)+identiconsuffix).hexdigest() use_two_colors = (identicon_lib[:len('qidenticon_two')] == 'qidenticon_two') - transparent = (identicon_lib == 'qidenticon_x') | (identicon_lib == 'qidenticon_two_x') + opacity = int(not((identicon_lib == 'qidenticon_x') | (identicon_lib == 'qidenticon_two_x') | (identicon_lib == 'qidenticon_b') | (identicon_lib == 'qidenticon_two_b')))*255 penwidth = 0 - pixmap = qidenticon.render_identicon(int(hash, 16), 48, use_two_colors, transparent, penwidth) - idcon = QtGui.QIcon() - idcon.addPixmap(pixmap, QtGui.QIcon.Normal, QtGui.QIcon.Off) + image = qidenticon.render_identicon(int(hash, 16), size, use_two_colors, opacity, penwidth) + # filename = './images/identicons/'+hash+'.png' + # image.save(filename) + idcon = QIcon() + idcon.addPixmap(image, QtGui.QIcon.Normal, QtGui.QIcon.Off) return idcon elif identicon_lib == 'pydenticon': # print identicon_lib @@ -101,7 +107,7 @@ def identiconize(address): # 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) + 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) @@ -116,6 +122,7 @@ def identiconize(address): if identicon_lib & len(identicon_lib) > 0: print 'Error: couldn\'t find this identicon library: ', identicon_lib print 'Control for typos!' + # default to no identicons idcon = QtGui.QIcon() return idcon diff --git a/src/bitmessageqt/bitmessage_icons.qrc b/src/bitmessageqt/bitmessage_icons.qrc index bdd3fd07..68574630 100644 --- a/src/bitmessageqt/bitmessage_icons.qrc +++ b/src/bitmessageqt/bitmessage_icons.qrc @@ -1,5 +1,10 @@ + ../images/no_identicons.png + ../images/qidenticon_x.png + ../images/qidenticon.png + ../images/qidenticon_two.png + ../images/qidenticon_two_x.png ../images/can-icon-24px-yellow.png ../images/can-icon-24px-red.png ../images/can-icon-24px-green.png diff --git a/src/bitmessageqt/bitmessageui.py b/src/bitmessageqt/bitmessageui.py index c051c076..8f8b8951 100644 --- a/src/bitmessageqt/bitmessageui.py +++ b/src/bitmessageqt/bitmessageui.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'bitmessageui.ui' # -# Created: Mon Aug 12 00:08:20 2013 +# Created: Wed Sep 18 17:38:54 2013 # by: PyQt4 UI code generator 4.10.2 # # WARNING! All changes made in this file will be lost! @@ -630,3 +630,13 @@ class Ui_MainWindow(object): self.actionJoinChan.setText(_translate("MainWindow", "Join / Create chan", None)) import bitmessage_icons_rc + +if __name__ == "__main__": + import sys + app = QtGui.QApplication(sys.argv) + MainWindow = QtGui.QMainWindow() + ui = Ui_MainWindow() + ui.setupUi(MainWindow) + MainWindow.show() + sys.exit(app.exec_()) + diff --git a/src/bitmessageqt/settings.py b/src/bitmessageqt/settings.py index 821df6cf..290c0cb6 100644 --- a/src/bitmessageqt/settings.py +++ b/src/bitmessageqt/settings.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'settings.ui' # -# Created: Sun Aug 25 18:09:38 2013 +# Created: Wed Sep 18 17:38:55 2013 # by: PyQt4 UI code generator 4.10.2 # # WARNING! All changes made in this file will be lost! @@ -45,8 +45,6 @@ class Ui_settingsDialog(object): self.checkBoxMinimizeToTray.setChecked(True) self.checkBoxMinimizeToTray.setObjectName(_fromUtf8("checkBoxMinimizeToTray")) self.gridLayout_5.addWidget(self.checkBoxMinimizeToTray, 2, 0, 1, 1) - spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.gridLayout_5.addItem(spacerItem, 10, 0, 1, 1) self.checkBoxStartOnLogon = QtGui.QCheckBox(self.tabUserInterface) self.checkBoxStartOnLogon.setObjectName(_fromUtf8("checkBoxStartOnLogon")) self.gridLayout_5.addWidget(self.checkBoxStartOnLogon, 0, 0, 1, 1) @@ -82,7 +80,35 @@ class Ui_settingsDialog(object): self.languageComboBox.addItem(_fromUtf8("")) self.languageComboBox.addItem(_fromUtf8("")) self.horizontalLayout_2.addWidget(self.languageComboBox) - self.gridLayout_5.addWidget(self.groupBox, 10, 1, 1, 1) + self.gridLayout_5.addWidget(self.groupBox, 7, 1, 4, 1) + self.groupBox_3 = QtGui.QGroupBox(self.tabUserInterface) + self.groupBox_3.setObjectName(_fromUtf8("groupBox_3")) + self.comboBox = QtGui.QComboBox(self.groupBox_3) + self.comboBox.setGeometry(QtCore.QRect(20, 20, 251, 31)) + self.comboBox.setIconSize(QtCore.QSize(24, 24)) + self.comboBox.setObjectName(_fromUtf8("comboBox")) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/newPrefix/images/no_identicons.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.comboBox.addItem(icon, _fromUtf8("")) + icon1 = QtGui.QIcon() + icon1.addPixmap(QtGui.QPixmap(_fromUtf8(":/newPrefix/images/qidenticon.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.comboBox.addItem(icon1, _fromUtf8("")) + icon2 = QtGui.QIcon() + icon2.addPixmap(QtGui.QPixmap(_fromUtf8(":/newPrefix/images/qidenticon_x.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.comboBox.addItem(icon2, _fromUtf8("")) + icon3 = QtGui.QIcon() + icon3.addPixmap(QtGui.QPixmap(_fromUtf8(":/newPrefix/images/qidenticon_two.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.comboBox.addItem(icon3, _fromUtf8("")) + icon4 = QtGui.QIcon() + icon4.addPixmap(QtGui.QPixmap(_fromUtf8(":/newPrefix/images/qidenticon_two_x.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.comboBox.addItem(icon4, _fromUtf8("")) + self.checkBoxLoadAvatars = QtGui.QCheckBox(self.groupBox_3) + self.checkBoxLoadAvatars.setGeometry(QtCore.QRect(20, 50, 121, 18)) + self.checkBoxLoadAvatars.setObjectName(_fromUtf8("checkBoxLoadAvatars")) + self.lineEdit = QtGui.QLineEdit(self.groupBox_3) + self.lineEdit.setGeometry(QtCore.QRect(140, 50, 131, 16)) + self.lineEdit.setObjectName(_fromUtf8("lineEdit")) + self.gridLayout_5.addWidget(self.groupBox_3, 7, 0, 4, 1) self.tabWidgetSettings.addTab(self.tabUserInterface, _fromUtf8("")) self.tabNetworkSettings = QtGui.QWidget() self.tabNetworkSettings.setObjectName(_fromUtf8("tabNetworkSettings")) @@ -92,8 +118,8 @@ class Ui_settingsDialog(object): self.groupBox1.setObjectName(_fromUtf8("groupBox1")) self.gridLayout_3 = QtGui.QGridLayout(self.groupBox1) self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3")) - spacerItem1 = QtGui.QSpacerItem(125, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout_3.addItem(spacerItem1, 0, 0, 1, 1) + spacerItem = QtGui.QSpacerItem(125, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.gridLayout_3.addItem(spacerItem, 0, 0, 1, 1) self.label = QtGui.QLabel(self.groupBox1) self.label.setObjectName(_fromUtf8("label")) self.gridLayout_3.addWidget(self.label, 0, 1, 1, 1) @@ -150,8 +176,8 @@ class Ui_settingsDialog(object): self.checkBoxSocksListen.setObjectName(_fromUtf8("checkBoxSocksListen")) self.gridLayout_2.addWidget(self.checkBoxSocksListen, 3, 1, 1, 4) self.gridLayout_4.addWidget(self.groupBox_2, 1, 0, 1, 1) - spacerItem2 = QtGui.QSpacerItem(20, 70, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.gridLayout_4.addItem(spacerItem2, 2, 0, 1, 1) + spacerItem1 = QtGui.QSpacerItem(20, 70, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + self.gridLayout_4.addItem(spacerItem1, 2, 0, 1, 1) self.tabWidgetSettings.addTab(self.tabNetworkSettings, _fromUtf8("")) self.tab = QtGui.QWidget() self.tab.setObjectName(_fromUtf8("tab")) @@ -161,8 +187,8 @@ class Ui_settingsDialog(object): self.label_8.setWordWrap(True) self.label_8.setObjectName(_fromUtf8("label_8")) self.gridLayout_6.addWidget(self.label_8, 0, 0, 1, 3) - spacerItem3 = QtGui.QSpacerItem(203, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout_6.addItem(spacerItem3, 1, 0, 1, 1) + spacerItem2 = QtGui.QSpacerItem(203, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.gridLayout_6.addItem(spacerItem2, 1, 0, 1, 1) self.label_9 = QtGui.QLabel(self.tab) self.label_9.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_9.setObjectName(_fromUtf8("label_9")) @@ -176,8 +202,8 @@ class Ui_settingsDialog(object): self.lineEditTotalDifficulty.setMaximumSize(QtCore.QSize(70, 16777215)) self.lineEditTotalDifficulty.setObjectName(_fromUtf8("lineEditTotalDifficulty")) self.gridLayout_6.addWidget(self.lineEditTotalDifficulty, 1, 2, 1, 1) - spacerItem4 = QtGui.QSpacerItem(203, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout_6.addItem(spacerItem4, 3, 0, 1, 1) + spacerItem3 = QtGui.QSpacerItem(203, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.gridLayout_6.addItem(spacerItem3, 3, 0, 1, 1) self.label_11 = QtGui.QLabel(self.tab) self.label_11.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_11.setObjectName(_fromUtf8("label_11")) @@ -208,8 +234,8 @@ class Ui_settingsDialog(object): self.label_15.setWordWrap(True) self.label_15.setObjectName(_fromUtf8("label_15")) self.gridLayout_7.addWidget(self.label_15, 0, 0, 1, 3) - spacerItem5 = QtGui.QSpacerItem(102, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout_7.addItem(spacerItem5, 1, 0, 1, 1) + spacerItem4 = QtGui.QSpacerItem(102, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.gridLayout_7.addItem(spacerItem4, 1, 0, 1, 1) self.label_13 = QtGui.QLabel(self.tab_2) self.label_13.setLayoutDirection(QtCore.Qt.LeftToRight) self.label_13.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) @@ -224,8 +250,8 @@ class Ui_settingsDialog(object): self.lineEditMaxAcceptableTotalDifficulty.setMaximumSize(QtCore.QSize(70, 16777215)) self.lineEditMaxAcceptableTotalDifficulty.setObjectName(_fromUtf8("lineEditMaxAcceptableTotalDifficulty")) self.gridLayout_7.addWidget(self.lineEditMaxAcceptableTotalDifficulty, 1, 2, 1, 1) - spacerItem6 = QtGui.QSpacerItem(102, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout_7.addItem(spacerItem6, 2, 0, 1, 1) + spacerItem5 = QtGui.QSpacerItem(102, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.gridLayout_7.addItem(spacerItem5, 2, 0, 1, 1) self.label_14 = QtGui.QLabel(self.tab_2) self.label_14.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_14.setObjectName(_fromUtf8("label_14")) @@ -239,15 +265,15 @@ class Ui_settingsDialog(object): self.lineEditMaxAcceptableSmallMessageDifficulty.setMaximumSize(QtCore.QSize(70, 16777215)) self.lineEditMaxAcceptableSmallMessageDifficulty.setObjectName(_fromUtf8("lineEditMaxAcceptableSmallMessageDifficulty")) self.gridLayout_7.addWidget(self.lineEditMaxAcceptableSmallMessageDifficulty, 2, 2, 1, 1) - spacerItem7 = QtGui.QSpacerItem(20, 147, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.gridLayout_7.addItem(spacerItem7, 3, 1, 1, 1) + spacerItem6 = QtGui.QSpacerItem(20, 147, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + self.gridLayout_7.addItem(spacerItem6, 3, 1, 1, 1) self.tabWidgetSettings.addTab(self.tab_2, _fromUtf8("")) self.tabNamecoin = QtGui.QWidget() self.tabNamecoin.setObjectName(_fromUtf8("tabNamecoin")) self.gridLayout_8 = QtGui.QGridLayout(self.tabNamecoin) self.gridLayout_8.setObjectName(_fromUtf8("gridLayout_8")) - spacerItem8 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout_8.addItem(spacerItem8, 2, 0, 1, 1) + spacerItem7 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.gridLayout_8.addItem(spacerItem7, 2, 0, 1, 1) self.label_16 = QtGui.QLabel(self.tabNamecoin) self.label_16.setWordWrap(True) self.label_16.setObjectName(_fromUtf8("label_16")) @@ -259,10 +285,10 @@ class Ui_settingsDialog(object): self.lineEditNamecoinHost = QtGui.QLineEdit(self.tabNamecoin) self.lineEditNamecoinHost.setObjectName(_fromUtf8("lineEditNamecoinHost")) self.gridLayout_8.addWidget(self.lineEditNamecoinHost, 2, 2, 1, 1) + spacerItem8 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.gridLayout_8.addItem(spacerItem8, 3, 0, 1, 1) spacerItem9 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout_8.addItem(spacerItem9, 3, 0, 1, 1) - spacerItem10 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout_8.addItem(spacerItem10, 4, 0, 1, 1) + self.gridLayout_8.addItem(spacerItem9, 4, 0, 1, 1) self.label_18 = QtGui.QLabel(self.tabNamecoin) self.label_18.setEnabled(True) self.label_18.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) @@ -271,8 +297,8 @@ class Ui_settingsDialog(object): self.lineEditNamecoinPort = QtGui.QLineEdit(self.tabNamecoin) self.lineEditNamecoinPort.setObjectName(_fromUtf8("lineEditNamecoinPort")) self.gridLayout_8.addWidget(self.lineEditNamecoinPort, 3, 2, 1, 1) - spacerItem11 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.gridLayout_8.addItem(spacerItem11, 8, 1, 1, 1) + spacerItem10 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + self.gridLayout_8.addItem(spacerItem10, 8, 1, 1, 1) self.labelNamecoinUser = QtGui.QLabel(self.tabNamecoin) self.labelNamecoinUser.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.labelNamecoinUser.setObjectName(_fromUtf8("labelNamecoinUser")) @@ -280,8 +306,8 @@ class Ui_settingsDialog(object): self.lineEditNamecoinUser = QtGui.QLineEdit(self.tabNamecoin) self.lineEditNamecoinUser.setObjectName(_fromUtf8("lineEditNamecoinUser")) self.gridLayout_8.addWidget(self.lineEditNamecoinUser, 4, 2, 1, 1) - spacerItem12 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout_8.addItem(spacerItem12, 5, 0, 1, 1) + spacerItem11 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.gridLayout_8.addItem(spacerItem11, 5, 0, 1, 1) self.labelNamecoinPassword = QtGui.QLabel(self.tabNamecoin) self.labelNamecoinPassword.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.labelNamecoinPassword.setObjectName(_fromUtf8("labelNamecoinPassword")) @@ -353,6 +379,14 @@ class Ui_settingsDialog(object): self.languageComboBox.setItemText(6, _translate("settingsDialog", "Russian", "ru")) self.languageComboBox.setItemText(7, _translate("settingsDialog", "Pirate English", "en_pirate")) self.languageComboBox.setItemText(8, _translate("settingsDialog", "Other (set in keys.dat)", "other")) + self.groupBox_3.setTitle(_translate("settingsDialog", "Identicons (with example image)", None)) + self.comboBox.setItemText(0, _translate("settingsDialog", "no identicons", None)) + self.comboBox.setItemText(1, _translate("settingsDialog", "qidenticon", None)) + self.comboBox.setItemText(2, _translate("settingsDialog", "qidenticon_x", None)) + self.comboBox.setItemText(3, _translate("settingsDialog", "qidenticon_two", None)) + self.comboBox.setItemText(4, _translate("settingsDialog", "qidenticon_two_x", None)) + self.checkBoxLoadAvatars.setText(_translate("settingsDialog", "Load avatar images", None)) + self.lineEdit.setToolTip(_translate("settingsDialog", "

The content of this text field will be appended to the BM-address before creating the hash for the identicons. By default it is filled with a random string to make the identicons in your client unique, otherwise the identicon could be an attack vector if an adversary creates an address resulting in a similar identicon. If you keep this string (or any other random or non-random string) you will be able to keep the same identicons.

", None)) self.tabWidgetSettings.setTabText(self.tabWidgetSettings.indexOf(self.tabUserInterface), _translate("settingsDialog", "User Interface", None)) self.groupBox1.setTitle(_translate("settingsDialog", "Listening port", None)) self.label.setText(_translate("settingsDialog", "Listen for connections on port:", None)) @@ -389,6 +423,7 @@ class Ui_settingsDialog(object): self.radioButtonNamecoinNmcontrol.setText(_translate("settingsDialog", "NMControl", None)) self.tabWidgetSettings.setTabText(self.tabWidgetSettings.indexOf(self.tabNamecoin), _translate("settingsDialog", "Namecoin integration", None)) +import bitmessage_icons_rc if __name__ == "__main__": import sys diff --git a/src/bitmessageqt/settings.ui b/src/bitmessageqt/settings.ui index eec38d8d..a5e6e4e6 100644 --- a/src/bitmessageqt/settings.ui +++ b/src/bitmessageqt/settings.ui @@ -47,19 +47,6 @@ - - - - Qt::Vertical - - - - 20 - 40 - - - - @@ -105,7 +92,7 @@ - + Interface Language @@ -163,6 +150,100 @@ + + + + Identicons (with example image) + + + + + 20 + 20 + 251 + 31 + + + + + 24 + 24 + + + + + no identicons + + + + :/newPrefix/images/no_identicons.png:/newPrefix/images/no_identicons.png + + + + + qidenticon + + + + :/newPrefix/images/qidenticon.png:/newPrefix/images/qidenticon.png + + + + + qidenticon_x + + + + :/newPrefix/images/qidenticon_x.png:/newPrefix/images/qidenticon_x.png + + + + + qidenticon_two + + + + :/newPrefix/images/qidenticon_two.png:/newPrefix/images/qidenticon_two.png + + + + + qidenticon_two_x + + + + :/newPrefix/images/qidenticon_two_x.png:/newPrefix/images/qidenticon_two_x.png + + + + + + + 20 + 50 + 121 + 18 + + + + Load avatar images + + + + + + 140 + 50 + 131 + 16 + + + + <html><head/><body><p>The content of this text field will be appended to the BM-address before creating the hash for the identicons. By default it is filled with a random string to make the identicons in your client unique, otherwise the identicon could be an attack vector if an adversary creates an address resulting in a similar identicon. If you keep this string (or any other random or non-random string) you will be able to keep the same identicons.</p></body></html> + + + + @@ -756,7 +837,9 @@ checkBoxSocksListen buttonBox - + + + buttonBox diff --git a/src/qidenticon.py b/src/qidenticon.py index ffc25eea..cc3af6b3 100644 --- a/src/qidenticon.py +++ b/src/qidenticon.py @@ -67,12 +67,12 @@ class IdenticonRendererBase(object): code = int(code) self.code = code - def render(self, size, twoColor, transparent, penwidth): + def render(self, size, twoColor, opacity, penwidth): """ - render identicon to QPixmap + render identicon to QPicture @param size identicon patchsize. (image size is 3 * [size]) - @return QPixmap + @return QPicture """ # decode the code @@ -82,7 +82,7 @@ class IdenticonRendererBase(object): image = QPixmap(QSize(size * 3 +penwidth, size * 3 +penwidth)) # fill background - backColor = QtGui.QColor(255,255,255,(not transparent) * 255) + backColor = QtGui.QColor(255,255,255,opacity) image.fill(backColor) kwds = { @@ -133,7 +133,7 @@ class IdenticonRendererBase(object): nopen = QtGui.QPen(foreColor, Qt.NoPen) foreBrush = QtGui.QBrush(foreColor, Qt.SolidPattern) if penwidth > 0: - pen_color = QtGui.QColor(223, 223, 223) + pen_color = QtGui.QColor(255, 255, 255) pen = QtGui.QPen(pen_color, Qt.SolidPattern) pen.setWidth(penwidth) @@ -147,8 +147,8 @@ class IdenticonRendererBase(object): if invert: # subtract the actual polygon from a rectangle to invert it - rect_polygon = QPolygonF(rect) - polygon = rect_polygon.subtracted(polygon) + poly_rect = QPolygonF(rect) + polygon = poly_rect.subtracted(polygon) painter.setBrush(foreBrush) if penwidth > 0: # draw the borders @@ -157,7 +157,7 @@ class IdenticonRendererBase(object): # draw the fill painter.setPen(nopen) painter.drawPolygon(polygon, Qt.WindingFill) - + painter.end() return image @@ -173,22 +173,39 @@ class DonRenderer(IdenticonRendererBase): """ PATH_SET = [ - [(0, 0), (4, 0), (4, 4), (0, 4)], # 0 + #[0] full square: + [(0, 0), (4, 0), (4, 4), (0, 4)], + #[1] right-angled triangle pointing top-left: [(0, 0), (4, 0), (0, 4)], + #[2] upwardy triangle: [(2, 0), (4, 4), (0, 4)], + #[3] left half of square, standing rectangle: [(0, 0), (2, 0), (2, 4), (0, 4)], - [(2, 0), (4, 2), (2, 4), (0, 2)], # 4 + #[4] square standing on diagonale: + [(2, 0), (4, 2), (2, 4), (0, 2)], + #[5] kite pointing topleft: [(0, 0), (4, 2), (4, 4), (2, 4)], + #[6] Sierpinski triangle, fractal triangles: [(2, 0), (4, 4), (2, 4), (3, 2), (1, 2), (2, 4), (0, 4)], + #[7] sharp angled lefttop pointing triangle: [(0, 0), (4, 2), (2, 4)], - [(1, 1), (3, 1), (3, 3), (1, 3)], # 8 + #[8] small centered square: + [(1, 1), (3, 1), (3, 3), (1, 3)], + #[9] two small triangles: [(2, 0), (4, 0), (0, 4), (0, 2), (2, 2)], + #[10] small topleft square: [(0, 0), (2, 0), (2, 2), (0, 2)], + #[11] downpointing right-angled triangle on bottom: [(0, 2), (4, 2), (2, 4)], + #[12] uppointing right-angled triangle on bottom: [(2, 2), (4, 4), (0, 4)], + #[13] small rightbottom pointing right-angled triangle on topleft: [(2, 0), (2, 2), (0, 2)], + #[14] small lefttop pointing right-angled triangle on topleft: [(0, 0), (2, 0), (0, 2)], - []] # 15 + #[15] empty: + []] + # get the [0] full square, [4] square standing on diagonale, [8] small centered square, or [15] empty tile: MIDDLE_PATCH_SET = [0, 4, 8, 15] # modify path set @@ -232,7 +249,7 @@ class DonRenderer(IdenticonRendererBase): foreColor, secondColor, swap_cross -def render_identicon(code, size, twoColor=False, transparent=False, penwidth=0, renderer=None): +def render_identicon(code, size, twoColor=False, opacity=255, penwidth=0, renderer=None): if not renderer: renderer = DonRenderer - return renderer(code).render(size, twoColor, transparent, penwidth) \ No newline at end of file + return renderer(code).render(size, twoColor, opacity, penwidth) \ No newline at end of file