# -*- coding: utf-8 -*- """ OnionShare | https://onionshare.org/ Copyright (C) 2014-2021 Micah Lee, et al. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ from PySide2 import QtCore, QtWidgets, QtGui import qrcode from . import strings from .gui_common import GuiCommon class Alert(QtWidgets.QMessageBox): """ An alert box dialog. """ def __init__( self, common, message, icon=QtWidgets.QMessageBox.NoIcon, buttons=QtWidgets.QMessageBox.Ok, autostart=True, ): super(Alert, self).__init__(None) self.common = common self.common.log("Alert", "__init__") self.setWindowTitle("OnionShare") self.setWindowIcon(QtGui.QIcon(GuiCommon.get_resource_path("images/logo.png"))) self.setText(message) self.setIcon(icon) self.setStandardButtons(buttons) if autostart: self.exec_() class AddFileDialog(QtWidgets.QFileDialog): """ Overridden version of QFileDialog which allows us to select folders as well as, or instead of, files. For adding files/folders to share. Note that this dialog can't be used in macOS, only in Windows, Linux, and BSD. This is because the macOS sandbox requires native dialogs, and this is a Qt5 dialog. """ def __init__(self, common, *args, **kwargs): QtWidgets.QFileDialog.__init__(self, *args, **kwargs) self.common = common self.common.log("AddFileDialog", "__init__") self.setOption(self.DontUseNativeDialog, True) self.setOption(self.ReadOnly, True) self.setOption(self.ShowDirsOnly, False) self.setFileMode(self.ExistingFiles) tree_view = self.findChild(QtWidgets.QTreeView) tree_view.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) list_view = self.findChild(QtWidgets.QListView, "listView") list_view.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) def accept(self): self.common.log("AddFileDialog", "accept") QtWidgets.QDialog.accept(self) class MinimumWidthWidget(QtWidgets.QWidget): """ An empty widget with a minimum width, just to force layouts to behave """ def __init__(self, width): 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.setWindowTitle(strings._("gui_qr_code_dialog_title")) self.setWindowIcon(QtGui.QIcon(GuiCommon.get_resource_path("images/logo.png"))) layout = QtWidgets.QVBoxLayout(self) layout.addWidget(self.qr_label) self.exec_()