diff options
author | Micah Lee <micah@micahflee.com> | 2020-06-29 12:25:21 -0700 |
---|---|---|
committer | Micah Lee <micah@micahflee.com> | 2020-06-29 12:25:21 -0700 |
commit | 9c70edfd12eab6d0f2d6d202b31591764a02b961 (patch) | |
tree | 886b4706996ff89ec178a28b6635db57e86d3c61 /onionshare_gui | |
parent | 11d44eab5046c16231f605b36d0ed1e0d12d01b3 (diff) | |
parent | ce0d21bb7a961fa72e0437b1d06740576154989d (diff) | |
download | onionshare-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.py | 19 | ||||
-rw-r--r-- | onionshare_gui/widgets.py | 64 |
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_() + |