summaryrefslogtreecommitdiff
path: root/onionshare_gui
diff options
context:
space:
mode:
authorMicah Lee <micah@micahflee.com>2020-06-29 12:25:21 -0700
committerMicah Lee <micah@micahflee.com>2020-06-29 12:25:21 -0700
commit9c70edfd12eab6d0f2d6d202b31591764a02b961 (patch)
tree886b4706996ff89ec178a28b6635db57e86d3c61 /onionshare_gui
parent11d44eab5046c16231f605b36d0ed1e0d12d01b3 (diff)
parentce0d21bb7a961fa72e0437b1d06740576154989d (diff)
downloadonionshare-9c70edfd12eab6d0f2d6d202b31591764a02b961.tar.gz
onionshare-9c70edfd12eab6d0f2d6d202b31591764a02b961.zip
Merge branch 'qrcode' of https://github.com/mig5/onionshare into mig5-qrcode
Diffstat (limited to 'onionshare_gui')
-rw-r--r--onionshare_gui/tab/server_status.py19
-rw-r--r--onionshare_gui/widgets.py64
2 files changed, 81 insertions, 2 deletions
diff --git a/onionshare_gui/tab/server_status.py b/onionshare_gui/tab/server_status.py
index cd9b8db9..08213747 100644
--- a/onionshare_gui/tab/server_status.py
+++ b/onionshare_gui/tab/server_status.py
@@ -25,7 +25,7 @@ from PyQt5.QtCore import Qt
from onionshare import strings
from ..widgets import Alert
-
+from ..widgets import QRCodeDialog
class ServerStatus(QtWidgets.QWidget):
"""
@@ -100,6 +100,14 @@ class ServerStatus(QtWidgets.QWidget):
self.copy_hidservauth_button = QtWidgets.QPushButton(
strings._("gui_copy_hidservauth")
)
+ self.show_url_qr_code_button = QtWidgets.QPushButton(strings._("gui_show_url_qr_code"))
+ self.show_url_qr_code_button.hide()
+ self.show_url_qr_code_button.clicked.connect(self.show_url_qr_code_button_clicked)
+ self.show_url_qr_code_button.setFlat(True)
+ self.show_url_qr_code_button.setStyleSheet(
+ self.common.gui.css["server_status_url_buttons"]
+ )
+
self.copy_hidservauth_button.setFlat(True)
self.copy_hidservauth_button.setStyleSheet(
self.common.gui.css["server_status_url_buttons"]
@@ -107,6 +115,7 @@ class ServerStatus(QtWidgets.QWidget):
self.copy_hidservauth_button.clicked.connect(self.copy_hidservauth)
url_buttons_layout = QtWidgets.QHBoxLayout()
url_buttons_layout.addWidget(self.copy_url_button)
+ url_buttons_layout.addWidget(self.show_url_qr_code_button)
url_buttons_layout.addWidget(self.copy_hidservauth_button)
url_buttons_layout.addStretch()
@@ -194,6 +203,8 @@ class ServerStatus(QtWidgets.QWidget):
self.url.show()
self.copy_url_button.show()
+ self.show_url_qr_code_button.show()
+
if self.settings.get("general", "client_auth"):
self.copy_hidservauth_button.show()
else:
@@ -359,6 +370,12 @@ class ServerStatus(QtWidgets.QWidget):
self.cancel_server()
self.button_clicked.emit()
+ def show_url_qr_code_button_clicked(self):
+ """
+ Show a QR code of the onion URL.
+ """
+ self.qr_code_dialog = QRCodeDialog(self.common, self.get_url())
+
def start_server(self):
"""
Start the server.
diff --git a/onionshare_gui/widgets.py b/onionshare_gui/widgets.py
index 74ef2c88..58ddd1b5 100644
--- a/onionshare_gui/widgets.py
+++ b/onionshare_gui/widgets.py
@@ -18,7 +18,8 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
from PyQt5 import QtCore, QtWidgets, QtGui
-
+from onionshare import strings
+import qrcode
class Alert(QtWidgets.QMessageBox):
"""
@@ -90,3 +91,64 @@ class MinimumWidthWidget(QtWidgets.QWidget):
super(MinimumWidthWidget, self).__init__()
self.setMinimumWidth(width)
+
+class Image(qrcode.image.base.BaseImage):
+ """
+ A custom Image class, for use with the QR Code pixmap.
+ """
+
+ def __init__(self, border, width, box_size):
+ self.border = border
+ self.width = width
+ self.box_size = box_size
+ size = (width + border * 2) * box_size
+ self._image = QtGui.QImage(
+ size, size, QtGui.QImage.Format_RGB16)
+ self._image.fill(QtCore.Qt.white)
+
+ def pixmap(self):
+ return QtGui.QPixmap.fromImage(self._image)
+
+ def drawrect(self, row, col):
+ painter = QtGui.QPainter(self._image)
+ painter.fillRect(
+ (col + self.border) * self.box_size,
+ (row + self.border) * self.box_size,
+ self.box_size, self.box_size,
+ QtCore.Qt.black)
+
+ def save(self, stream, kind=None):
+ pass
+
+
+class QRCodeDialog(QtWidgets.QDialog):
+ """
+ A dialog showing a QR code.
+ """
+
+ def __init__(self, common, text):
+ super(QRCodeDialog, self).__init__()
+
+ self.common = common
+ self.text = text
+
+ self.common.log("QrCode", "__init__")
+
+ self.qr_label = QtWidgets.QLabel(self)
+ self.qr_label.setPixmap(
+ qrcode.make(self.text, image_factory=Image).pixmap())
+
+ self.qr_label_description = QtWidgets.QLabel(self)
+ self.qr_label_description.setText(strings._("gui_qr_code_description"))
+ self.qr_label_description.setWordWrap(True)
+
+ self.setWindowTitle(strings._("gui_qr_code_dialog_title"))
+ self.setWindowIcon(
+ QtGui.QIcon(self.common.get_resource_path("images/logo.png"))
+ )
+ layout = QtWidgets.QVBoxLayout(self)
+ layout.addWidget(self.qr_label)
+ layout.addWidget(self.qr_label_description)
+
+ self.exec_()
+