Example #1
0
    def testKeyEvent(self):
        widget = QLineEdit()
        key = Qt.Key_A
        eventFilter = KeyEventFilter(widget, QEvent.KeyPress, key)
        widget.installEventFilter(eventFilter)

        QTest.keyClick(widget, key)

        self.assert_(eventFilter.processed)
    def __init__(self, parent=None):
        super(BlockingClient, self).__init__(parent)

        self.thread = FortuneThread()
        self.currentFortune = ''

        hostLabel = QLabel("&Server name:")
        portLabel = QLabel("S&erver port:")

        for ipAddress in QNetworkInterface.allAddresses():
            if ipAddress != QHostAddress.LocalHost and ipAddress.toIPv4Address() != 0:
                break
        else:
            ipAddress = QHostAddress(QHostAddress.LocalHost)

        ipAddress = ipAddress.toString()

        self.hostLineEdit = QLineEdit(ipAddress)
        self.portLineEdit = QLineEdit()
        self.portLineEdit.setValidator(QIntValidator(1, 65535, self))

        hostLabel.setBuddy(self.hostLineEdit)
        portLabel.setBuddy(self.portLineEdit)

        self.statusLabel = QLabel(
                "This example requires that you run the Fortune Server example as well.")
        self.statusLabel.setWordWrap(True)

        self.getFortuneButton = QPushButton("Get Fortune")
        self.getFortuneButton.setDefault(True)
        self.getFortuneButton.setEnabled(False)

        quitButton = QPushButton("Quit")

        buttonBox = QDialogButtonBox()
        buttonBox.addButton(self.getFortuneButton, QDialogButtonBox.ActionRole)
        buttonBox.addButton(quitButton, QDialogButtonBox.RejectRole)

        self.getFortuneButton.clicked.connect(self.requestNewFortune)
        quitButton.clicked.connect(self.close)
        self.hostLineEdit.textChanged.connect(self.enableGetFortuneButton)
        self.portLineEdit.textChanged.connect(self.enableGetFortuneButton)
        self.thread.newFortune.connect(self.showFortune)
        self.thread.error.connect(self.displayError)

        mainLayout = QGridLayout()
        mainLayout.addWidget(hostLabel, 0, 0)
        mainLayout.addWidget(self.hostLineEdit, 0, 1)
        mainLayout.addWidget(portLabel, 1, 0)
        mainLayout.addWidget(self.portLineEdit, 1, 1)
        mainLayout.addWidget(self.statusLabel, 2, 0, 1, 2)
        mainLayout.addWidget(buttonBox, 3, 0, 1, 2)
        self.setLayout(mainLayout)

        self.setWindowTitle("Blocking Fortune Client")
        self.portLineEdit.setFocus()
    def __init__(self, parent=None):
        super(AddDialogWidget, self).__init__(parent)

        nameLabel = QLabel("Name")
        addressLabel = QLabel("Address")
        buttonBox = QDialogButtonBox(QDialogButtonBox.Ok |
                                      QDialogButtonBox.Cancel)

        self.nameText = QLineEdit()
        self.addressText = QTextEdit()

        grid = QGridLayout()
        grid.setColumnStretch(1, 2)
        grid.addWidget(nameLabel, 0, 0)
        grid.addWidget(self.nameText, 0, 1)
        grid.addWidget(addressLabel, 1, 0, Qt.AlignLeft | Qt.AlignTop)
        grid.addWidget(self.addressText, 1, 1, Qt.AlignLeft)

        layout = QVBoxLayout()
        layout.addLayout(grid)
        layout.addWidget(buttonBox)

        self.setLayout(layout)

        self.setWindowTitle("Add a Contact")

        buttonBox.accepted.connect(self.accept)
        buttonBox.rejected.connect(self.reject)
Example #4
0
    def __init__(self, parent=None):
        super(ColorEdit, self).__init__(parent)

        self.color = QColor('#FF00FF')

        self.edit = QLineEdit()
        self.edit.setText('FF00FF')
        self.edit.setMaximumWidth(70)
        self.edit.textEdited.connect(self.editChanged)
        self.edit.returnPressed.connect(self.editChanged)

        self.box = QPushButton()
        self.box.setFlat(True)
        self.box.setFixedSize(18, 18)
        self.box.setStyleSheet('background-color: #FF00FF; border: 1px solid black;')
        self.box.setCursor(Qt.PointingHandCursor)
        self.box.clicked.connect(self.boxClicked)

        hlayout = QHBoxLayout()
        hlayout.setContentsMargins(0, 0, 0, 0)
        hlayout.setSpacing(0)
        hlayout.addWidget(QLabel('#'))
        hlayout.addWidget(self.edit)
        hlayout.addSpacing(5)
        hlayout.addWidget(self.box)
        hlayout.addStretch()

        self.setLayout(hlayout)
Example #5
0
    def __init__(self):
        super(FindToolBar, self).__init__()
        self._line_edit = QLineEdit()
        self._line_edit.setClearButtonEnabled(True)
        self._line_edit.setPlaceholderText("Find...")
        self._line_edit.setMaximumWidth(300)
        self._line_edit.returnPressed.connect(self._find_next)
        self.addWidget(self._line_edit)

        self._previous_button = QToolButton()
        self._previous_button.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/up-32.png'))
        self._previous_button.clicked.connect(self._find_previous)
        self.addWidget(self._previous_button)

        self._next_button = QToolButton()
        self._next_button.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/down-32.png'))
        self._next_button.clicked.connect(self._find_next)
        self.addWidget(self._next_button)

        self._case_sensitive_checkbox = QCheckBox('Case Sensitive')
        self.addWidget(self._case_sensitive_checkbox)

        self._hideButton = QToolButton()
        self._hideButton.setShortcut(QKeySequence(Qt.Key_Escape))
        self._hideButton.setIcon(QIcon(':/qt-project.org/styles/macstyle/images/closedock-16.png'))
        self._hideButton.clicked.connect(self.hide)
        self.addWidget(self._hideButton)
Example #6
0
    def __init__(self):
        super(MainWindow, self).__init__()

        self.setWindowTitle('PySide2 WebEngineWidgets Example')

        self.toolBar = QToolBar()
        self.addToolBar(self.toolBar)
        self.backButton = QPushButton()
        self.backButton.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/left-32.png'))
        self.backButton.clicked.connect(self.back)
        self.toolBar.addWidget(self.backButton)
        self.forwardButton = QPushButton()
        self.forwardButton.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/right-32.png'))
        self.forwardButton.clicked.connect(self.forward)
        self.toolBar.addWidget(self.forwardButton)

        self.addressLineEdit = QLineEdit()
        self.addressLineEdit.returnPressed.connect(self.load)
        self.toolBar.addWidget(self.addressLineEdit)

        self.webEngineView = QWebEngineView()
        self.setCentralWidget(self.webEngineView)
        initialUrl = 'http://qt.io'
        self.addressLineEdit.setText(initialUrl)
        self.webEngineView.load(QUrl(initialUrl))
        self.webEngineView.page().titleChanged.connect(self.setWindowTitle)
        self.webEngineView.page().urlChanged.connect(self.urlChanged)
Example #7
0
class FindToolBar(QToolBar):

    find = QtCore.Signal(str, QWebEnginePage.FindFlags)

    def __init__(self):
        super(FindToolBar, self).__init__()
        self._line_edit = QLineEdit()
        self._line_edit.setClearButtonEnabled(True)
        self._line_edit.setPlaceholderText("Find...")
        self._line_edit.setMaximumWidth(300)
        self._line_edit.returnPressed.connect(self._find_next)
        self.addWidget(self._line_edit)

        self._previous_button = QToolButton()
        self._previous_button.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/up-32.png'))
        self._previous_button.clicked.connect(self._find_previous)
        self.addWidget(self._previous_button)

        self._next_button = QToolButton()
        self._next_button.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/down-32.png'))
        self._next_button.clicked.connect(self._find_next)
        self.addWidget(self._next_button)

        self._case_sensitive_checkbox = QCheckBox('Case Sensitive')
        self.addWidget(self._case_sensitive_checkbox)

        self._hideButton = QToolButton()
        self._hideButton.setShortcut(QKeySequence(Qt.Key_Escape))
        self._hideButton.setIcon(QIcon(':/qt-project.org/styles/macstyle/images/closedock-16.png'))
        self._hideButton.clicked.connect(self.hide)
        self.addWidget(self._hideButton)

    def focus_find(self):
        self._line_edit.setFocus()

    def _emit_find(self, backward):
        needle =  self._line_edit.text().strip()
        if needle:
            flags = QWebEnginePage.FindFlags()
            if self._case_sensitive_checkbox.isChecked():
                flags |= QWebEnginePage.FindCaseSensitively
            if backward:
                flags |= QWebEnginePage.FindBackward
            self.find.emit(needle, flags)

    def _find_next(self):
        self._emit_find(False)

    def _find_previous(self):
        self._emit_find(True)
Example #8
0
class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()

        self.setWindowTitle('PySide2 WebEngineWidgets Example')

        self.toolBar = QToolBar()
        self.addToolBar(self.toolBar)
        self.backButton = QPushButton()
        self.backButton.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/left-32.png'))
        self.backButton.clicked.connect(self.back)
        self.toolBar.addWidget(self.backButton)
        self.forwardButton = QPushButton()
        self.forwardButton.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/right-32.png'))
        self.forwardButton.clicked.connect(self.forward)
        self.toolBar.addWidget(self.forwardButton)

        self.addressLineEdit = QLineEdit()
        self.addressLineEdit.returnPressed.connect(self.load)
        self.toolBar.addWidget(self.addressLineEdit)

        self.webEngineView = QWebEngineView()
        self.setCentralWidget(self.webEngineView)
        initialUrl = 'http://qt.io'
        self.addressLineEdit.setText(initialUrl)
        self.webEngineView.load(QUrl(initialUrl))
        self.webEngineView.page().titleChanged.connect(self.setWindowTitle)
        self.webEngineView.page().urlChanged.connect(self.urlChanged)

    def load(self):
        url = QUrl.fromUserInput(self.addressLineEdit.text())
        if url.isValid():
            self.webEngineView.load(url)

    def back(self):
        self.webEngineView.page().triggerAction(QWebEnginePage.Back)

    def forward(self):
        self.webEngineView.page().triggerAction(QWebEnginePage.Forward)

    def urlChanged(self, url):
        self.addressLineEdit.setText(url.toString())
Example #9
0
class ClusterDialog(QDialog):
    
    editClusterName = None
    def __init__(self, lifeline, defaultName, parent = None):
        super(ClusterDialog, self).__init__(parent)

        self.lifeline = lifeline
        layout = QVBoxLayout(self)

        message = QLabel('Enter group name')
        layout.addWidget(message)

        self.editClusterName = QLineEdit(defaultName)
        self.editClusterName.setFixedHeight(30)
        self.editClusterName.setFixedWidth(400)
        self.editClusterName.textChanged.connect(self.validateCluster)
        layout.addWidget(self.editClusterName)

        self.validation_msg = QLabel(' ')
        layout.addWidget(self.validation_msg)

        buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, QtCore.Qt.Horizontal, self)
        buttons.accepted.connect(self.accept)
        buttons.rejected.connect(self.reject)
        layout.addWidget(buttons)

        self.validateCluster()

    def validateCluster(self):
        cnt = 0
        for l in self.lifeline:
            if self.editClusterName.text() in l.getClassName() and not l.getFlagCluster() and not l.getClusterLifeline():
                cnt += 1

        available_flag = True
        for l in self.lifeline:
            if self.editClusterName.text() in l.getClassName() and l.getFlagCluster():
                available_flag = False
                break

        if available_flag:
            self.validation_msg.setText("group name includes %d life-lines" % (cnt))
        else:
            self.validation_msg.setText("group name is not available")

    def getClusterText(self):
        return self.editClusterName.text()
    
    @staticmethod
    def getClusterName(lifelines, defaultName, parent = None):
        dialog = ClusterDialog(lifelines,defaultName,parent)
        result = dialog.exec_()
        return (result, dialog.getClusterText())
Example #10
0
	def __init__(self, parent = None):
		super(Form, self).__init__(parent)

		self.setWindowTitle('My Form')

		self.edit = QLineEdit('Write your name here...')
		self.button = QPushButton('Show Greetings')

		layout = QVBoxLayout()
		layout.addWidget(self.edit)
		layout.addWidget(self.button)
		self.setLayout(layout)

		self.button.clicked.connect(self.greetings)
Example #11
0
class ColorEdit(QWidget):

    def __init__(self, parent=None):
        super(ColorEdit, self).__init__(parent)

        self.color = QColor('#FF00FF')

        self.edit = QLineEdit()
        self.edit.setText('FF00FF')
        self.edit.setMaximumWidth(70)
        self.edit.textEdited.connect(self.editChanged)
        self.edit.returnPressed.connect(self.editChanged)

        self.box = QPushButton()
        self.box.setFlat(True)
        self.box.setFixedSize(18, 18)
        self.box.setStyleSheet('background-color: #FF00FF; border: 1px solid black;')
        self.box.setCursor(Qt.PointingHandCursor)
        self.box.clicked.connect(self.boxClicked)

        hlayout = QHBoxLayout()
        hlayout.setContentsMargins(0, 0, 0, 0)
        hlayout.setSpacing(0)
        hlayout.addWidget(QLabel('#'))
        hlayout.addWidget(self.edit)
        hlayout.addSpacing(5)
        hlayout.addWidget(self.box)
        hlayout.addStretch()

        self.setLayout(hlayout)

    def editChanged(self):
        self.setColorText(self.edit.text())

    def boxClicked(self):
        dialog = QColorDialog()
        if dialog.exec_():
            self.setColorText(dialog.selectedColor().name())

    def setColorText(self, text):
        text = str(text).upper().replace('#', '')
        color = QColor('#' + text)
        if not color.isValid():
            return
        self.box.setStyleSheet('background-color: #' + text + '; border: 1px solid black;')
        self.edit.setText(text)
        self.color = color
        return True

    def getColor(self):
        return self.color
Example #12
0
    def __init__(self):
        super(MainWindow, self).__init__()

        self.setWindowTitle('PySide2 tabbed browser Example')

        self._tab_widget = BrowserTabWidget(create_main_window_with_browser)
        self._tab_widget.enabled_changed.connect(self._enabled_changed)
        self._tab_widget.download_requested.connect(self._download_requested)
        self.setCentralWidget(self._tab_widget)
        self.connect(self._tab_widget, QtCore.SIGNAL("url_changed(QUrl)"),
                     self.url_changed)

        self._bookmark_dock = QDockWidget()
        self._bookmark_dock.setWindowTitle('Bookmarks')
        self._bookmark_widget = BookmarkWidget()
        self._bookmark_widget.open_bookmark.connect(self.load_url)
        self._bookmark_widget.open_bookmark_in_new_tab.connect(self.load_url_in_new_tab)
        self._bookmark_dock.setWidget(self._bookmark_widget)
        self.addDockWidget(Qt.LeftDockWidgetArea, self._bookmark_dock)

        self._find_tool_bar = None

        self._actions = {}
        self._create_menu()

        self._tool_bar = QToolBar()
        self.addToolBar(self._tool_bar)
        for action in self._actions.values():
            if not action.icon().isNull():
                self._tool_bar.addAction(action)

        self._addres_line_edit = QLineEdit()
        self._addres_line_edit.setClearButtonEnabled(True)
        self._addres_line_edit.returnPressed.connect(self.load)
        self._tool_bar.addWidget(self._addres_line_edit)
        self._zoom_label = QLabel()
        self.statusBar().addPermanentWidget(self._zoom_label)
        self._update_zoom_label()

        self._bookmarksToolBar = QToolBar()
        self.addToolBar(Qt.TopToolBarArea, self._bookmarksToolBar)
        self.insertToolBarBreak(self._bookmarksToolBar)
        self._bookmark_widget.changed.connect(self._update_bookmarks)
        self._update_bookmarks()
Example #13
0
class Form(QDialog):
	def __init__(self, parent = None):
		super(Form, self).__init__(parent)

		self.setWindowTitle('My Form')

		self.edit = QLineEdit('Write your name here...')
		self.button = QPushButton('Show Greetings')

		layout = QVBoxLayout()
		layout.addWidget(self.edit)
		layout.addWidget(self.button)
		self.setLayout(layout)

		self.button.clicked.connect(self.greetings)

	@Slot()
	def greetings(self):
		print('hellow {}'.format(self.edit.text()))
Example #14
0
class AddDialogWidget(QDialog):
    """ A dialog to add a new address to the addressbook. """

    def __init__(self, parent=None):
        super(AddDialogWidget, self).__init__(parent)

        nameLabel = QLabel("Name")
        addressLabel = QLabel("Address")
        buttonBox = QDialogButtonBox(QDialogButtonBox.Ok |
                                      QDialogButtonBox.Cancel)

        self.nameText = QLineEdit()
        self.addressText = QTextEdit()

        grid = QGridLayout()
        grid.setColumnStretch(1, 2)
        grid.addWidget(nameLabel, 0, 0)
        grid.addWidget(self.nameText, 0, 1)
        grid.addWidget(addressLabel, 1, 0, Qt.AlignLeft | Qt.AlignTop)
        grid.addWidget(self.addressText, 1, 1, Qt.AlignLeft)

        layout = QVBoxLayout()
        layout.addLayout(grid)
        layout.addWidget(buttonBox)

        self.setLayout(layout)

        self.setWindowTitle("Add a Contact")

        buttonBox.accepted.connect(self.accept)
        buttonBox.rejected.connect(self.reject)

    # These properties make using this dialog a little cleaner. It's much
    # nicer to type "addDialog.address" to retrieve the address as compared
    # to "addDialog.addressText.toPlainText()"
    @property
    def name(self):
        return self.nameText.text()

    @property
    def address(self):
        return self.addressText.toPlainText()
Example #15
0
    def __init__(self, lifeline, defaultName, parent = None):
        super(ClusterDialog, self).__init__(parent)

        self.lifeline = lifeline
        layout = QVBoxLayout(self)

        message = QLabel('Enter group name')
        layout.addWidget(message)

        self.editClusterName = QLineEdit(defaultName)
        self.editClusterName.setFixedHeight(30)
        self.editClusterName.setFixedWidth(400)
        self.editClusterName.textChanged.connect(self.validateCluster)
        layout.addWidget(self.editClusterName)

        self.validation_msg = QLabel(' ')
        layout.addWidget(self.validation_msg)

        buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, QtCore.Qt.Horizontal, self)
        buttons.accepted.connect(self.accept)
        buttons.rejected.connect(self.reject)
        layout.addWidget(buttons)

        self.validateCluster()
class BlockingClient(QWidget):
    def __init__(self, parent=None):
        super(BlockingClient, self).__init__(parent)

        self.thread = FortuneThread()
        self.currentFortune = ''

        hostLabel = QLabel("&Server name:")
        portLabel = QLabel("S&erver port:")

        for ipAddress in QNetworkInterface.allAddresses():
            if ipAddress != QHostAddress.LocalHost and ipAddress.toIPv4Address() != 0:
                break
        else:
            ipAddress = QHostAddress(QHostAddress.LocalHost)

        ipAddress = ipAddress.toString()

        self.hostLineEdit = QLineEdit(ipAddress)
        self.portLineEdit = QLineEdit()
        self.portLineEdit.setValidator(QIntValidator(1, 65535, self))

        hostLabel.setBuddy(self.hostLineEdit)
        portLabel.setBuddy(self.portLineEdit)

        self.statusLabel = QLabel(
                "This example requires that you run the Fortune Server example as well.")
        self.statusLabel.setWordWrap(True)

        self.getFortuneButton = QPushButton("Get Fortune")
        self.getFortuneButton.setDefault(True)
        self.getFortuneButton.setEnabled(False)

        quitButton = QPushButton("Quit")

        buttonBox = QDialogButtonBox()
        buttonBox.addButton(self.getFortuneButton, QDialogButtonBox.ActionRole)
        buttonBox.addButton(quitButton, QDialogButtonBox.RejectRole)

        self.getFortuneButton.clicked.connect(self.requestNewFortune)
        quitButton.clicked.connect(self.close)
        self.hostLineEdit.textChanged.connect(self.enableGetFortuneButton)
        self.portLineEdit.textChanged.connect(self.enableGetFortuneButton)
        self.thread.newFortune.connect(self.showFortune)
        self.thread.error.connect(self.displayError)

        mainLayout = QGridLayout()
        mainLayout.addWidget(hostLabel, 0, 0)
        mainLayout.addWidget(self.hostLineEdit, 0, 1)
        mainLayout.addWidget(portLabel, 1, 0)
        mainLayout.addWidget(self.portLineEdit, 1, 1)
        mainLayout.addWidget(self.statusLabel, 2, 0, 1, 2)
        mainLayout.addWidget(buttonBox, 3, 0, 1, 2)
        self.setLayout(mainLayout)

        self.setWindowTitle("Blocking Fortune Client")
        self.portLineEdit.setFocus()

    def requestNewFortune(self):
        self.getFortuneButton.setEnabled(False)
        self.thread.requestNewFortune(self.hostLineEdit.text(),
                int(self.portLineEdit.text()))

    def showFortune(self, nextFortune):
        if nextFortune == self.currentFortune:
            self.requestNewFortune()
            return

        self.currentFortune = nextFortune
        self.statusLabel.setText(self.currentFortune)
        self.getFortuneButton.setEnabled(True)

    def displayError(self, socketError, message):
        if socketError == QAbstractSocket.HostNotFoundError:
            QMessageBox.information(self, "Blocking Fortune Client",
                    "The host was not found. Please check the host and port "
                    "settings.")
        elif socketError == QAbstractSocket.ConnectionRefusedError:
            QMessageBox.information(self, "Blocking Fortune Client",
                    "The connection was refused by the peer. Make sure the "
                    "fortune server is running, and check that the host name "
                    "and port settings are correct.")
        else:
            QMessageBox.information(self, "Blocking Fortune Client",
                    "The following error occurred: %s." % message)

        self.getFortuneButton.setEnabled(True)

    def enableGetFortuneButton(self):
        self.getFortuneButton.setEnabled(self.hostLineEdit.text() != '' and
                self.portLineEdit.text() != '')
Example #17
0
class AuthorStatsPlots(PBDialog):
    """Class that constructs a window to show
    the results of `authorStats`
    """
    def __init__(self, figs, title=None, parent=None):
        """Constructor.

        Parameters:
            figs: the list of figures
            title (optional): the window title
            parent (default None): the parent object,
                which should have a property `lastAuthorStats`
        """
        super(AuthorStatsPlots, self).__init__(parent)
        self.figs = figs
        self.canvas = None
        if title is not None:
            self.setWindowTitle(title)
        layout = QGridLayout(self)
        layout.setSpacing(1)
        self.setLayout(layout)
        self.updatePlots()

        nlines = int(len(figs) / 2)
        self.layout().addWidget(PBLabel(igstr.linesMoreInfo), nlines + 1, 0)

        try:
            hIndex = "%d" % self.parent().lastAuthorStats["h"]
        except (TypeError, AttributeError):
            hIndex = igstr.hIndexE
        self.hIndex = PBLabel(igstr.hIndexV % hIndex)
        largerFont = QFont("Times", 15, QFont.Bold)
        self.hIndex.setFont(largerFont)
        self.layout().addWidget(self.hIndex, nlines + 1, 1)

        self.textBox = QLineEdit("")
        self.textBox.setReadOnly(True)
        self.layout().addWidget(self.textBox, nlines + 2, 0, 1, 2)
        self.saveButton = QPushButton(igstr.save, self)
        self.saveButton.clicked.connect(self.saveAction)
        self.layout().addWidget(self.saveButton, nlines + 3, 0)

        self.clButton = QPushButton(igstr.close, self)
        self.clButton.clicked.connect(self.onClose)
        self.clButton.setAutoDefault(True)
        self.layout().addWidget(self.clButton, nlines + 3, 1)

    def onClose(self):
        """Close dialog"""
        QDialog.close(self)

    def saveAction(self):
        """Save the plot into a file,
        after asking the directory where to save them
        """
        savePath = askDirName(self, igstr.whereSavePlots)
        if savePath != "":
            try:
                self.parent().lastAuthorStats["figs"] = pBStats.plotStats(
                    author=True, save=True, path=savePath)
            except AttributeError:
                pBGUILogger.warning("", exc_info=True)
            else:
                infoMessage(igstr.plotsSaved)
                self.saveButton.setDisabled(True)

    def onPress(self, event):
        """Print the plot coordinates where a click was performed.
        To be connected through `mpl_connect`.
        Used for testing.

        Parameter:
            a `matplotlib.backend_bases.Event`
        """
        print(event.xdata, event.ydata)

    def pickEvent(self, event):
        """Save into `self.textBox` the coordinates
        of the clicked object (`Line2D` or `Rectangle`) in the plot.

        Parameter:
            a `matplotlib.backend_bases.Event`
        """
        ob = event.artist
        ix = -1
        for i, f in enumerate(self.figs):
            if f == ob.figure:
                ix = i
        if isinstance(ob, Rectangle):
            self.textBox.setText(
                igstr.xInYearIs %
                (figTitles[ix], int(ob.get_x()), int(ob.get_height())))
        elif isinstance(ob, Line2D):
            xdata = ob.get_xdata()
            ydata = ob.get_ydata()
            ind = event.ind
            if ix == 4:
                formatString = igstr.xInDateIsF
            else:
                formatString = igstr.xInDateIsD
            self.textBox.setText(formatString % (
                figTitles[ix],
                np.take(xdata, ind)[0].strftime(igstr.datefmt),
                np.take(ydata, ind)[0],
            ))

    def updatePlots(self):
        """Reset the dialog window removing all the previous items
        and create new canvas for the figures.
        """
        i = 0
        while True:
            item = self.layout().takeAt(i)
            if item is None:
                break
            del item
        if hasattr(self, "canvas"):
            del self.canvas
        self.canvas = []
        for fig in self.figs:
            if fig is not None:
                self.canvas.append(FigureCanvas(fig))
                self.layout().addWidget(self.canvas[-1], int(i / 2), i % 2)
                self.canvas[-1].mpl_connect("pick_event", self.pickEvent)
                self.canvas[-1].draw()
                i += 1
class MessagePropertyEditor(QWidget, PropertyWidget):
    def __init__(self, target_property_name):
        QWidget.__init__(self)
        PropertyWidget.__init__(self, target_property_name)
        layout = QVBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        self.key_editor = QLineEdit()
        self.value_editor = QLineEdit()
        layout.addWidget(self.key_editor)
        layout.addWidget(self.value_editor)
        self.setLayout(layout)

        self.key_editor.textChanged.connect(self._on_key_edit)
        self.value_editor.editingFinished.connect(self._on_value_edit)

    def _on_key_edit(self, text):
        if self.target:
            target_prop = self.target[self.target_property_name]
            target_prop.update_key(text)
            self.value_editor.setText(target_prop.value)

    def _on_value_edit(self):
        if self.target:
            target_prop = self.target[self.target_property_name]
            target_prop.value = self.value_editor.text()

    def _on_target_changed(self):
        if self.target:
            target_prop = self.target[self.target_property_name]
            self.key_editor.setText(target_prop.key)
            self.value_editor.setText(target_prop.value)
        else:
            self.key_editor.setText("")
            self.value_editor.setText("")
Example #19
0
class MainWindow(QMainWindow):
    """Provides the parent window that includes the BookmarkWidget,
    BrowserTabWidget, and a DownloadWidget, to offer the complete
    web browsing experience."""
    def __init__(self):
        super(MainWindow, self).__init__()

        self.setWindowTitle('PySide2 tabbed browser Example')

        self._tab_widget = BrowserTabWidget(create_main_window_with_browser)
        self._tab_widget.enabled_changed.connect(self._enabled_changed)
        self._tab_widget.download_requested.connect(self._download_requested)
        self.setCentralWidget(self._tab_widget)
        self.connect(self._tab_widget, QtCore.SIGNAL("url_changed(QUrl)"),
                     self.url_changed)

        self._bookmark_dock = QDockWidget()
        self._bookmark_dock.setWindowTitle('Bookmarks')
        self._bookmark_widget = BookmarkWidget()
        self._bookmark_widget.open_bookmark.connect(self.load_url)
        self._bookmark_widget.open_bookmark_in_new_tab.connect(
            self.load_url_in_new_tab)
        self._bookmark_dock.setWidget(self._bookmark_widget)
        self.addDockWidget(Qt.LeftDockWidgetArea, self._bookmark_dock)

        self._find_tool_bar = None

        self._actions = {}
        self._create_menu()

        self._tool_bar = QToolBar()
        self.addToolBar(self._tool_bar)
        for action in self._actions.values():
            if not action.icon().isNull():
                self._tool_bar.addAction(action)

        self._addres_line_edit = QLineEdit()
        self._addres_line_edit.setClearButtonEnabled(True)
        self._addres_line_edit.returnPressed.connect(self.load)
        self._tool_bar.addWidget(self._addres_line_edit)
        self._zoom_label = QLabel()
        self.statusBar().addPermanentWidget(self._zoom_label)
        self._update_zoom_label()

        self._bookmarksToolBar = QToolBar()
        self.addToolBar(Qt.TopToolBarArea, self._bookmarksToolBar)
        self.insertToolBarBreak(self._bookmarksToolBar)
        self._bookmark_widget.changed.connect(self._update_bookmarks)
        self._update_bookmarks()

    def _update_bookmarks(self):
        self._bookmark_widget.populate_tool_bar(self._bookmarksToolBar)
        self._bookmark_widget.populate_other(self._bookmark_menu, 3)

    def _create_menu(self):
        file_menu = self.menuBar().addMenu("&File")
        exit_action = QAction(QIcon.fromTheme("application-exit"),
                              "E&xit",
                              self,
                              shortcut="Ctrl+Q",
                              triggered=qApp.quit)
        file_menu.addAction(exit_action)

        navigation_menu = self.menuBar().addMenu("&Navigation")

        style_icons = ':/qt-project.org/styles/commonstyle/images/'
        back_action = QAction(QIcon.fromTheme(
            "go-previous", QIcon(style_icons + 'left-32.png')),
                              "Back",
                              self,
                              shortcut=QKeySequence(QKeySequence.Back),
                              triggered=self._tab_widget.back)
        self._actions[QWebEnginePage.Back] = back_action
        back_action.setEnabled(False)
        navigation_menu.addAction(back_action)
        forward_action = QAction(QIcon.fromTheme(
            "go-next", QIcon(style_icons + 'right-32.png')),
                                 "Forward",
                                 self,
                                 shortcut=QKeySequence(QKeySequence.Forward),
                                 triggered=self._tab_widget.forward)
        forward_action.setEnabled(False)
        self._actions[QWebEnginePage.Forward] = forward_action

        navigation_menu.addAction(forward_action)
        reload_action = QAction(QIcon(style_icons + 'refresh-32.png'),
                                "Reload",
                                self,
                                shortcut=QKeySequence(QKeySequence.Refresh),
                                triggered=self._tab_widget.reload)
        self._actions[QWebEnginePage.Reload] = reload_action
        reload_action.setEnabled(False)
        navigation_menu.addAction(reload_action)

        navigation_menu.addSeparator()

        new_tab_action = QAction("New Tab",
                                 self,
                                 shortcut='Ctrl+T',
                                 triggered=self.add_browser_tab)
        navigation_menu.addAction(new_tab_action)

        close_tab_action = QAction("Close Current Tab",
                                   self,
                                   shortcut="Ctrl+W",
                                   triggered=self._close_current_tab)
        navigation_menu.addAction(close_tab_action)

        navigation_menu.addSeparator()

        history_action = QAction("History...",
                                 self,
                                 triggered=self._tab_widget.show_history)
        navigation_menu.addAction(history_action)

        edit_menu = self.menuBar().addMenu("&Edit")

        find_action = QAction("Find",
                              self,
                              shortcut=QKeySequence(QKeySequence.Find),
                              triggered=self._show_find)
        edit_menu.addAction(find_action)

        edit_menu.addSeparator()
        undo_action = QAction("Undo",
                              self,
                              shortcut=QKeySequence(QKeySequence.Undo),
                              triggered=self._tab_widget.undo)
        self._actions[QWebEnginePage.Undo] = undo_action
        undo_action.setEnabled(False)
        edit_menu.addAction(undo_action)

        redo_action = QAction("Redo",
                              self,
                              shortcut=QKeySequence(QKeySequence.Redo),
                              triggered=self._tab_widget.redo)
        self._actions[QWebEnginePage.Redo] = redo_action
        redo_action.setEnabled(False)
        edit_menu.addAction(redo_action)

        edit_menu.addSeparator()

        cut_action = QAction("Cut",
                             self,
                             shortcut=QKeySequence(QKeySequence.Cut),
                             triggered=self._tab_widget.cut)
        self._actions[QWebEnginePage.Cut] = cut_action
        cut_action.setEnabled(False)
        edit_menu.addAction(cut_action)

        copy_action = QAction("Copy",
                              self,
                              shortcut=QKeySequence(QKeySequence.Copy),
                              triggered=self._tab_widget.copy)
        self._actions[QWebEnginePage.Copy] = copy_action
        copy_action.setEnabled(False)
        edit_menu.addAction(copy_action)

        paste_action = QAction("Paste",
                               self,
                               shortcut=QKeySequence(QKeySequence.Paste),
                               triggered=self._tab_widget.paste)
        self._actions[QWebEnginePage.Paste] = paste_action
        paste_action.setEnabled(False)
        edit_menu.addAction(paste_action)

        edit_menu.addSeparator()

        select_all_action = QAction("Select All",
                                    self,
                                    shortcut=QKeySequence(
                                        QKeySequence.SelectAll),
                                    triggered=self._tab_widget.select_all)
        self._actions[QWebEnginePage.SelectAll] = select_all_action
        select_all_action.setEnabled(False)
        edit_menu.addAction(select_all_action)

        self._bookmark_menu = self.menuBar().addMenu("&Bookmarks")
        add_bookmark_action = QAction("&Add Bookmark",
                                      self,
                                      triggered=self._add_bookmark)
        self._bookmark_menu.addAction(add_bookmark_action)
        add_tool_bar_bookmark_action = QAction(
            "&Add Bookmark to Tool Bar",
            self,
            triggered=self._add_tool_bar_bookmark)
        self._bookmark_menu.addAction(add_tool_bar_bookmark_action)
        self._bookmark_menu.addSeparator()

        tools_menu = self.menuBar().addMenu("&Tools")
        download_action = QAction(
            "Open Downloads",
            self,
            triggered=DownloadWidget.open_download_directory)
        tools_menu.addAction(download_action)

        window_menu = self.menuBar().addMenu("&Window")

        window_menu.addAction(self._bookmark_dock.toggleViewAction())

        window_menu.addSeparator()

        zoom_in_action = QAction(QIcon.fromTheme("zoom-in"),
                                 "Zoom In",
                                 self,
                                 shortcut=QKeySequence(QKeySequence.ZoomIn),
                                 triggered=self._zoom_in)
        window_menu.addAction(zoom_in_action)
        zoom_out_action = QAction(QIcon.fromTheme("zoom-out"),
                                  "Zoom Out",
                                  self,
                                  shortcut=QKeySequence(QKeySequence.ZoomOut),
                                  triggered=self._zoom_out)
        window_menu.addAction(zoom_out_action)

        reset_zoom_action = QAction(QIcon.fromTheme("zoom-original"),
                                    "Reset Zoom",
                                    self,
                                    shortcut="Ctrl+0",
                                    triggered=self._reset_zoom)
        window_menu.addAction(reset_zoom_action)

        about_menu = self.menuBar().addMenu("&About")
        about_action = QAction("About Qt",
                               self,
                               shortcut=QKeySequence(
                                   QKeySequence.HelpContents),
                               triggered=qApp.aboutQt)
        about_menu.addAction(about_action)

    def add_browser_tab(self):
        return self._tab_widget.add_browser_tab()

    def _close_current_tab(self):
        if self._tab_widget.count() > 1:
            self._tab_widget.close_current_tab()
        else:
            self.close()

    def close_event(self, event):
        main_windows.remove(self)
        event.accept()

    def load(self):
        url_string = self._addres_line_edit.text().strip()
        if url_string:
            self.load_url_string(url_string)

    def load_url_string(self, url_s):
        url = QUrl.fromUserInput(url_s)
        if (url.isValid()):
            self.load_url(url)

    def load_url(self, url):
        self._tab_widget.load(url)

    def load_url_in_new_tab(self, url):
        self.add_browser_tab().load(url)

    def url_changed(self, url):
        self._addres_line_edit.setText(url.toString())

    def _enabled_changed(self, web_action, enabled):
        action = self._actions[web_action]
        if action:
            action.setEnabled(enabled)

    def _add_bookmark(self):
        index = self._tab_widget.currentIndex()
        if index >= 0:
            url = self._tab_widget.url()
            title = self._tab_widget.tabText(index)
            icon = self._tab_widget.tabIcon(index)
            self._bookmark_widget.add_bookmark(url, title, icon)

    def _add_tool_bar_bookmark(self):
        index = self._tab_widget.currentIndex()
        if index >= 0:
            url = self._tab_widget.url()
            title = self._tab_widget.tabText(index)
            icon = self._tab_widget.tabIcon(index)
            self._bookmark_widget.add_tool_bar_bookmark(url, title, icon)

    def _zoom_in(self):
        new_zoom = self._tab_widget.zoom_factor() * 1.5
        if (new_zoom <= WebEngineView.maximum_zoom_factor()):
            self._tab_widget.set_zoom_factor(new_zoom)
            self._update_zoom_label()

    def _zoom_out(self):
        new_zoom = self._tab_widget.zoom_factor() / 1.5
        if (new_zoom >= WebEngineView.minimum_zoom_factor()):
            self._tab_widget.set_zoom_factor(new_zoom)
            self._update_zoom_label()

    def _reset_zoom(self):
        self._tab_widget.set_zoom_factor(1)
        self._update_zoom_label()

    def _update_zoom_label(self):
        percent = int(self._tab_widget.zoom_factor() * 100)
        self._zoom_label.setText("{}%".format(percent))

    def _download_requested(self, item):
        # Remove old downloads before opening a new one
        for old_download in self.statusBar().children():
            if type(old_download).__name__ == 'download_widget' and \
                old_download.state() != QWebEngineDownloadItem.DownloadInProgress:
                self.statusBar().removeWidget(old_download)
                del old_download

        item.accept()
        download_widget = download_widget(item)
        download_widget.removeRequested.connect(
            self._remove_download_requested, Qt.QueuedConnection)
        self.statusBar().addWidget(download_widget)

    def _remove_download_requested(self):
        download_widget = self.sender()
        self.statusBar().removeWidget(download_widget)
        del download_widget

    def _show_find(self):
        if self._find_tool_bar is None:
            self._find_tool_bar = FindToolBar()
            self._find_tool_bar.find.connect(self._tab_widget.find)
            self.addToolBar(Qt.BottomToolBarArea, self._find_tool_bar)
        else:
            self._find_tool_bar.show()
        self._find_tool_bar.focus_find()

    def write_bookmarks(self):
        self._bookmark_widget.write_bookmarks()
Example #20
0
class SubtitleInfoDialog(QDialog):
    def __init__(self,
                 subtitles_name,
                 subtitles_delay,
                 subtitles_language,
                 subtitles_track_name,
                 subtitles_set_default,
                 subtitles_set_forced,
                 subtitles_default_value_delay,
                 subtitles_default_value_language,
                 subtitles_default_value_track_name,
                 subtitles_default_value_set_default,
                 subtitles_default_value_set_forced,
                 subtitle_set_default_disabled=False,
                 subtitle_set_forced_disabled=False,
                 disable_edit=False,
                 parent=None):
        super().__init__(parent)
        self.window_title = "Subtitle Info"
        self.state = "no"
        self.subtitles_count = len(subtitles_delay)

        self.messageIcon = QLabel()
        self.subtitle_tab_comboBox = InfoCellDialogTabComboBox(
            hint="Subtitles Groups")
        for i in range(self.subtitles_count):
            self.subtitle_tab_comboBox.addItem("Subtitle #" + str(i + 1))
        self.subtitle_tab_comboBox.setCurrentIndex(0)
        self.subtitle_tab_comboBox.currentIndexChanged.connect(
            self.update_current_subtitle_index)
        self.current_subtitle_index = 0

        self.disable_edit = disable_edit
        self.current_subtitle_name = subtitles_name
        self.current_subtitle_language = subtitles_language
        self.current_subtitle_delay = subtitles_delay
        self.current_subtitle_track_name = subtitles_track_name
        self.current_subtitle_set_default = subtitles_set_default
        self.current_subtitle_set_forced = subtitles_set_forced

        self.default_subtitle_language = subtitles_default_value_language
        self.default_subtitle_delay = subtitles_default_value_delay
        self.default_subtitle_track_name = subtitles_default_value_track_name
        self.default_subtitle_set_default = subtitles_default_value_set_default
        self.default_subtitle_set_forced = subtitles_default_value_set_forced

        self.subtitle_set_default_disabled = subtitle_set_default_disabled
        self.subtitle_set_forced_disabled = subtitle_set_forced_disabled

        self.subtitle_name_label = QLabel("Subtitle Name:")
        self.subtitle_name_value = QLabel(
            str(self.current_subtitle_name[self.current_subtitle_index]))
        width_to_be_fixed = 0
        for i in range(len(self.current_subtitle_name)):
            width_to_be_fixed = max(
                width_to_be_fixed,
                self.subtitle_name_value.fontMetrics().boundingRect(
                    self.current_subtitle_name[i]).width())
        self.subtitle_name_value.setFixedWidth(width_to_be_fixed + 10)
        self.subtitle_delay_label = QLabel("Subtitle Delay:")
        self.subtitle_delay_spin = QDoubleSpinBox()
        self.setup_subtitle_delay_spin()

        self.subtitle_language_label = QLabel("Subtitle Language:")
        self.subtitle_language_comboBox = QComboBox()
        self.setup_subtitle_language_comboBox()

        self.subtitle_track_name_label = QLabel("Subtitle Track Name:")
        self.subtitle_track_name_lineEdit = QLineEdit()
        self.setup_subtitle_track_name_lineEdit()

        self.subtitle_set_forced_label = QLabel("Subtitle Forced State:")
        self.subtitle_set_forced_checkBox = QCheckBox()
        self.setup_subtitle_set_forced_checkBox()

        self.subtitle_set_default_label = QLabel("Subtitle Default State:")
        self.subtitle_set_default_checkBox = QCheckBox()
        self.setup_subtitle_set_default_checkBox()

        self.yes_button = QPushButton("OK")
        self.no_button = QPushButton("Cancel")
        self.reset_button = QPushButton("Reset To Default")

        self.buttons_layout = QHBoxLayout()
        self.subtitle_delay_layout = QHBoxLayout()
        self.subtitle_language_layout = QHBoxLayout()
        self.subtitle_track_name_layout = QHBoxLayout()
        self.subtitle_set_default_layout = QHBoxLayout()
        self.subtitle_set_forced_layout = QHBoxLayout()
        self.buttons_layout.addWidget(QLabel(""), stretch=3)
        self.buttons_layout.addWidget(self.reset_button, stretch=2)
        self.buttons_layout.addWidget(self.yes_button, stretch=2)
        self.buttons_layout.addWidget(self.no_button, stretch=2)
        self.buttons_layout.addWidget(QLabel(""), stretch=3)
        self.subtitle_setting_layout = QGridLayout()
        self.subtitle_editable_setting_layout = QFormLayout()
        self.subtitle_editable_setting_layout.addRow(self.subtitle_name_label,
                                                     self.subtitle_name_value)
        self.subtitle_editable_setting_layout.addRow(
            self.subtitle_track_name_label, self.subtitle_track_name_lineEdit)
        self.subtitle_editable_setting_layout.addRow(
            self.subtitle_language_label, self.subtitle_language_comboBox)
        self.subtitle_editable_setting_layout.addRow(self.subtitle_delay_label,
                                                     self.subtitle_delay_spin)
        self.subtitle_editable_setting_layout.addRow(
            self.subtitle_set_default_label,
            self.subtitle_set_default_checkBox)
        self.subtitle_editable_setting_layout.addRow(
            self.subtitle_set_forced_label, self.subtitle_set_forced_checkBox)
        self.subtitle_setting_layout.addWidget(self.subtitle_tab_comboBox, 0,
                                               0)
        self.subtitle_setting_layout.addLayout(
            self.subtitle_editable_setting_layout, 1, 0, 5, 2)
        self.subtitle_setting_layout.addWidget(self.messageIcon, 1, 3, 5, -1)

        self.main_layout = QGridLayout()
        self.main_layout.addLayout(self.subtitle_setting_layout, 0, 0, 2, 3)
        self.main_layout.addLayout(self.buttons_layout, 2, 0, 1, -1)
        self.main_layout.setContentsMargins(20, 20, 20, 20)
        self.setLayout(self.main_layout)

        self.setup_ui()
        self.signal_connect()

    def setup_ui(self):
        self.disable_question_mark_window()
        self.messageIcon.setPixmap(
            QtGui.QPixmap(GlobalFiles.SubtitleIconPath).scaledToHeight(100))
        self.set_dialog_values()
        self.set_default_buttons()
        if self.subtitle_set_default_disabled:
            self.subtitle_set_default_disable()
        if self.subtitle_set_forced_disabled:
            self.subtitle_set_forced_disable()
        if self.disable_edit:
            self.subtitle_track_name_lineEdit.setEnabled(False)
            self.subtitle_language_comboBox.setEnabled(False)
            self.subtitle_delay_spin.setEnabled(False)
            self.subtitle_set_default_checkBox.setEnabled(False)
            self.subtitle_set_forced_checkBox.setEnabled(False)
            self.reset_button.setEnabled(False)

        self.setup_tool_tip_hint_subtitle_set_default()
        self.setup_tool_tip_hint_subtitle_set_forced()

    def signal_connect(self):
        self.subtitle_track_name_lineEdit.textEdited.connect(
            self.update_current_subtitle_track_name)
        self.subtitle_delay_spin.editingFinished.connect(
            self.update_current_subtitle_delay)
        self.subtitle_language_comboBox.currentTextChanged.connect(
            self.update_current_subtitle_language)
        self.subtitle_set_default_checkBox.stateChanged.connect(
            self.update_current_subtitle_set_default)
        self.subtitle_set_forced_checkBox.stateChanged.connect(
            self.update_current_subtitle_set_forced)
        self.yes_button.clicked.connect(self.click_yes)
        self.no_button.clicked.connect(self.click_no)
        self.reset_button.clicked.connect(self.reset_subtitle_setting)

    def click_yes(self):
        self.state = "yes"
        self.close()

    def click_no(self):
        self.state = "no"
        self.close()

    def set_dialog_values(self):
        self.setWindowTitle(self.window_title)
        self.setWindowIcon(GlobalFiles.InfoSettingIcon)

    def disable_question_mark_window(self):
        self.setWindowFlag(Qt.WindowContextHelpButtonHint, on=False)

    def increase_message_font_size(self, value):
        message_font = self.message.font()
        message_font.setPointSize(self.message.fontInfo().pointSize() + value)
        self.message.setFont(message_font)

    def set_default_buttons(self):
        self.yes_button.setDefault(True)
        self.yes_button.setFocus()

    def showEvent(self, a0: QtGui.QShowEvent) -> None:
        super().showEvent(a0)
        self.setFixedSize(self.size())

    def setup_subtitle_track_name_lineEdit(self):
        self.subtitle_track_name_lineEdit.setClearButtonEnabled(True)
        self.subtitle_track_name_lineEdit.setText(
            self.current_subtitle_track_name[self.current_subtitle_index])

    def setup_subtitle_language_comboBox(self):
        self.subtitle_language_comboBox.addItems(AllSubtitlesLanguages)
        self.subtitle_language_comboBox.setCurrentIndex(
            AllSubtitlesLanguages.index(
                self.current_subtitle_language[self.current_subtitle_index]))
        self.subtitle_language_comboBox.setMaxVisibleItems(8)
        self.subtitle_language_comboBox.setStyleSheet(
            "QComboBox { combobox-popup: 0; }")

    def setup_subtitle_delay_spin(self):
        # self.subtitle_delay_spin.setMaximumWidth(screen_size.width() // 16)
        self.subtitle_delay_spin.setDecimals(3)
        self.subtitle_delay_spin.setMinimum(-9999.0)
        self.subtitle_delay_spin.setMaximum(9999.0)
        self.subtitle_delay_spin.setSingleStep(0.5)
        self.subtitle_delay_spin.setValue(
            float(self.current_subtitle_delay[self.current_subtitle_index]))

    def setup_subtitle_set_default_checkBox(self):
        self.subtitle_set_default_checkBox.setText("Set Default")
        self.subtitle_set_default_checkBox.setChecked(
            bool(self.current_subtitle_set_default[
                self.current_subtitle_index]))

    def setup_subtitle_set_forced_checkBox(self):
        self.subtitle_set_forced_checkBox.setText("Set Forced")
        self.subtitle_set_forced_checkBox.setChecked(
            bool(
                self.current_subtitle_set_forced[self.current_subtitle_index]))

    def update_current_subtitle_track_name(self):
        self.current_subtitle_track_name[self.current_subtitle_index] = str(
            self.subtitle_track_name_lineEdit.text())

    def update_current_subtitle_delay(self):
        self.current_subtitle_delay[self.current_subtitle_index] = round(
            self.subtitle_delay_spin.value(), 5)

    def update_current_subtitle_language(self):
        self.current_subtitle_language[self.current_subtitle_index] = str(
            self.subtitle_language_comboBox.currentText())

    def update_current_subtitle_set_default(self):
        new_state = self.subtitle_set_default_checkBox.checkState(
        ) == Qt.Checked
        self.current_subtitle_set_default[
            self.current_subtitle_index] = new_state
        if new_state:
            for i in range(len(self.current_subtitle_set_default)):
                if i != self.current_subtitle_index:
                    self.current_subtitle_set_default[i] = False

    def update_current_subtitle_set_forced(self):
        new_state = self.subtitle_set_forced_checkBox.checkState(
        ) == Qt.Checked
        self.current_subtitle_set_forced[
            self.current_subtitle_index] = new_state
        if new_state:
            for i in range(len(self.current_subtitle_set_forced)):
                if i != self.current_subtitle_index:
                    self.current_subtitle_set_forced[i] = False

    def reset_subtitle_setting(self):
        self.current_subtitle_language[
            self.current_subtitle_index] = self.default_subtitle_language[
                self.current_subtitle_index]
        self.current_subtitle_delay[
            self.current_subtitle_index] = self.default_subtitle_delay[
                self.current_subtitle_index]
        self.current_subtitle_track_name[
            self.current_subtitle_index] = self.default_subtitle_track_name[
                self.current_subtitle_index]
        self.current_subtitle_set_default[
            self.current_subtitle_index] = self.default_subtitle_set_default[
                self.current_subtitle_index]
        self.current_subtitle_set_forced[
            self.current_subtitle_index] = self.default_subtitle_set_forced[
                self.current_subtitle_index]

        self.subtitle_language_comboBox.setCurrentIndex(
            AllSubtitlesLanguages.index(
                self.current_subtitle_language[self.current_subtitle_index]))
        self.subtitle_delay_spin.setValue(
            float(self.current_subtitle_delay[self.current_subtitle_index]))
        self.subtitle_track_name_lineEdit.setText(
            self.current_subtitle_track_name[self.current_subtitle_index])
        self.subtitle_set_default_checkBox.setChecked(
            bool(self.current_subtitle_set_default[
                self.current_subtitle_index]))
        self.subtitle_set_forced_checkBox.setChecked(
            bool(
                self.current_subtitle_set_forced[self.current_subtitle_index]))

    def subtitle_set_default_disable(self):
        self.subtitle_set_default_checkBox.setDisabled(True)

    def subtitle_set_forced_disable(self):
        self.subtitle_set_forced_checkBox.setDisabled(True)

    def setup_tool_tip_hint_subtitle_set_default(self):
        if self.subtitle_set_default_checkBox.isEnabled():
            self.subtitle_set_default_checkBox.setToolTip(
                "<nobr>set this subtitle to be the default subtitle track "
                "when play")
            self.subtitle_set_default_checkBox.setToolTipDuration(12000)
        else:
            self.subtitle_set_default_checkBox.setToolTip(
                "<nobr>set this subtitle to be the default subtitle track when play<br><b>Disabled</b> because "
                "option "
                "<b>make this subtitle default</b> is enabled on mux setting tab "
            )
            self.subtitle_set_default_checkBox.setToolTipDuration(12000)

    def setup_tool_tip_hint_subtitle_set_forced(self):
        if self.subtitle_set_forced_checkBox.isEnabled():
            self.subtitle_set_forced_checkBox.setToolTip(
                "<nobr>set this subtitle to be the forced subtitle track when "
                "play")
            self.subtitle_set_forced_checkBox.setToolTipDuration(12000)
        else:
            self.subtitle_set_forced_checkBox.setToolTip(
                "<nobr>set this subtitle to be the forced subtitle track when play<br><b>Disabled</b> because "
                "option "
                "<b>make this subtitle default and forced</b> is enabled on mux setting tab "
            )
            self.subtitle_set_forced_checkBox.setToolTipDuration(12000)

    def update_current_subtitle_index(self, new_index):
        self.current_subtitle_index = new_index
        self.subtitle_delay_spin.setValue(
            float(self.current_subtitle_delay[self.current_subtitle_index]))
        self.subtitle_set_default_checkBox.setChecked(
            bool(self.current_subtitle_set_default[
                self.current_subtitle_index]))
        self.subtitle_set_forced_checkBox.setChecked(
            bool(
                self.current_subtitle_set_forced[self.current_subtitle_index]))
        self.subtitle_language_comboBox.setCurrentIndex(
            AllSubtitlesLanguages.index(
                self.current_subtitle_language[self.current_subtitle_index]))
        self.subtitle_track_name_lineEdit.setText(
            self.current_subtitle_track_name[self.current_subtitle_index])
        self.subtitle_name_value.setText(
            str(self.current_subtitle_name[self.current_subtitle_index]))

    def execute(self):
        self.exec_()
class Translate(QMainWindow):
    def __init__(self):
        super(Translate, self).__init__()
        self.resize(640, 480)
        self.setMinimumSize(640, 480)
        self.setMaximumSize(640, 480)
        self.setWindowTitle('Translate')
        self.setWindowIcon(QIcon('arti.PNG'))

        self.setFont(QFont('Roboto', 12))

        palette = QPalette()
        palette.setColor(palette.Window, QColor('#000000'))
        palette.setColor(palette.WindowText, QColor('#FFFFFF'))
        palette.setColor(palette.Button, QColor("#00FF00"))
        palette.setColor(palette.ButtonText, QColor("#000000"))
        self.setPalette(palette)

        self.menubar = QMenuBar(self)
        self.menubar.setGeometry(0, 0, 682, 21)
        self.menubar.setFont(QFont('Roboto', 10))

        self.date_menu = QMenu(self.menubar)
        self.date_menu.setTitle(str(datetime.now().strftime('%d-%m-%Y')))

        self.setMenuBar(self.menubar)
        self.menubar.addAction(self.date_menu.menuAction())

        self.label = QLabel(self)
        self.label.setGeometry(QRect(0, 40, 631, 91))
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setText(
            'Welcome to Translate \n Tip: The language for text you enter below is always English.'
        )

        self.to_translate = QLineEdit(self)
        self.to_translate.setGeometry(QRect(10, 180, 611, 41))
        self.to_translate.setPlaceholderText('Initial Text:')

        self.label_2 = QLabel(self)
        self.label_2.setGeometry(QRect(10, 270, 151, 31))
        self.label_2.setText('Select Language -->')

        self.translate_button = QPushButton(self)
        self.translate_button.setGeometry(QRect(400, 260, 191, 51))
        self.translate_button.setCursor(QCursor(Qt.PointingHandCursor))
        self.translate_button.setText('Let\'s Translate!!')
        self.translate_button.clicked.connect(lambda: self.button_press())

        self.translated_text = QLabel(self)
        self.translated_text.setGeometry(QRect(20, 350, 601, 71))
        self.translated_text.setAlignment(Qt.AlignCenter)
        self.translated_text.setWordWrap(True)

        self.language = QComboBox(self)
        self.language.addItem("None")
        self.language.addItem("Afrikaans")  # 1
        self.language.addItem("Albanian")  # 2
        self.language.addItem("Amharic")  # 3
        self.language.addItem("Arabic")  # 4
        self.language.addItem("Armenian")  # 5
        self.language.addItem("Azerbaijani")  # 6
        self.language.addItem("Basque")  # 7
        self.language.addItem("Belarusian")  # 8
        self.language.addItem("Bengali")  # 9
        self.language.addItem("Bosnian")  # 10
        self.language.addItem("Bulgarian")  # 11
        self.language.addItem("Catalan")  # 12
        self.language.addItem("Cebuano")  # 13
        self.language.addItem("Chinese (Simplified)")  # 14
        self.language.addItem("Chinese (Traditional)")  # 15
        self.language.addItem("Corsican")  # 16
        self.language.addItem("Croatian")  # 17
        self.language.addItem("Czech")  # 18
        self.language.addItem("Danish")  # 19
        self.language.addItem("Dutch")  # 20
        self.language.addItem("English")  # 21
        self.language.addItem("Esperanto")  # 22
        self.language.addItem("Estonian")  # 23
        self.language.addItem("Finnish")  # 24
        self.language.addItem("French")  # 25
        self.language.addItem("Frisian")  # 26
        self.language.addItem("Galician")  # 27
        self.language.addItem("Georgian")  # 28
        self.language.addItem("German")  # 29
        self.language.addItem("Greek")  # 30
        self.language.addItem("Gujarati")  # 31
        self.language.addItem("Haitian Creole")  # 32
        self.language.addItem("Hausa")  # 33
        self.language.addItem("Hawaiian")  # 34
        self.language.addItem("Hebrew")  # 35
        self.language.addItem("Hindi")  # 36
        self.language.addItem("Hmong")  # 37
        self.language.addItem("Hungarian")  # 38
        self.language.addItem("Icelandic")  # 39
        self.language.addItem("Igbo")  # 40
        self.language.addItem("Indonesian")  # 41
        self.language.addItem("Irish")  # 42
        self.language.addItem("Italian")  # 43
        self.language.addItem("Japanese")  # 44
        self.language.addItem("Javanese")  # 45
        self.language.addItem("Kannada")  # 46
        self.language.addItem("Kazakh")  # 47
        self.language.addItem("Khmer")  # 48
        self.language.addItem("Kinyarwanda")  # 49
        self.language.addItem("Korean")  # 50
        self.language.addItem("Kurdish")  # 51
        self.language.addItem("Kyrgyz")  # 52
        self.language.addItem("Lao")  # 53
        self.language.addItem("Latin")  # 54
        self.language.addItem("Latvian")  # 55
        self.language.addItem("Lithuanian")  # 56
        self.language.addItem("Luxembourgish")  # 57
        self.language.addItem("Macedonian")  # 58
        self.language.addItem("Malagasy")  # 59
        self.language.addItem("Malay")  # 60
        self.language.addItem("Malayalam")  # 61
        self.language.addItem("Maltese")  # 62
        self.language.addItem("Maori")  # 63
        self.language.addItem("Marathi")  # 64
        self.language.addItem("Mongolian")  # 65
        self.language.addItem("Mayanmar (Burmese)")  # 66
        self.language.addItem("Nepali")  # 67
        self.language.addItem("Norwegian")  # 68
        self.language.addItem("Nyanja (Chichewa)")  # 69
        self.language.addItem("Odia (Oriya)")  # 70
        self.language.addItem("Pashto")  # 71
        self.language.addItem("Persian")  # 72
        self.language.addItem("Polish")  # 73
        self.language.addItem("Portugese (Portugal, Brazil)")  # 74
        self.language.addItem("Punjabi")  # 75
        self.language.addItem("Romanian")  # 76
        self.language.addItem("Russian")  # 77
        self.language.addItem("Samoan")  # 78
        self.language.addItem("Scots Gaelic")  # 79
        self.language.addItem("Serbian")  # 80
        self.language.addItem("Sesotho")  # 81
        self.language.addItem("Shona")  # 82
        self.language.addItem("Sindhi")  # 83
        self.language.addItem("Sinhala (Sinhalese)")  # 84
        self.language.addItem("Slovak")  # 85
        self.language.addItem("Slovenian")  # 86
        self.language.addItem("Somali")  # 87
        self.language.addItem("Spanish")  # 88
        self.language.addItem("Sundanese")  # 89
        self.language.addItem("Swahili")  # 90
        self.language.addItem("Swedish")  # 91
        self.language.addItem("Tagalong (Filipino)")  # 92
        self.language.addItem("Tajik")  # 93
        self.language.addItem("Tamil")  # 94
        self.language.addItem("Tatar")  # 95
        self.language.addItem("Telugu")  # 96
        self.language.addItem("Thai")  # 97
        self.language.addItem("Turkish")  # 98
        self.language.addItem("Turkmen")  # 99
        self.language.addItem("Ukrainian")  # 100
        self.language.addItem("Urdu")  # 101
        self.language.addItem("Uyghur")  # 102
        self.language.addItem("Uzbek")  # 103
        self.language.addItem("Vietnamese")  # 104
        self.language.addItem("Welsh")  # 105
        self.language.addItem("Xhosa")  # 106
        self.language.addItem("Yiddish")  # 107
        self.language.addItem("Yoruba")  # 108
        self.language.addItem("Zulu")  # 109
        self.language.setGeometry(QRect(180, 270, 171, 31))
        QMetaObject.connectSlotsByName(self)

    def translate(self, final_lang):
        self.translated_text.setText(
            str(self.translator.translate(to=str(final_lang))))

    def button_press(self):
        self.query = self.to_translate.text()
        self.translator = TextBlob(self.query)
        self.to_translate.clear()

        if self.language.currentIndex() == 0:
            self.translated_text.setText('Please choose a Language First.')

        try:
            if self.language.currentIndex() == 1:
                self.translate('af')

            elif self.language.currentIndex() == 2:
                self.translate('sq')

            elif self.language.currentIndex() == 3:
                self.translate('am')

            elif self.language.currentIndex() == 4:
                self.translate('ar')

            elif self.language.currentIndex() == 5:
                self.translate('hy')

            elif self.language.currentIndex() == 6:
                self.translate('az')

            elif self.language.currentIndex() == 7:
                self.translate('eu')

            elif self.language.currentIndex() == 8:
                self.translate('be')

            elif self.language.currentIndex() == 9:
                self.translate('bn')

            elif self.language.currentIndex() == 10:
                self.translate('bs')

            elif self.language.currentIndex() == 11:
                self.translate('bg')

            elif self.language.currentIndex() == 12:
                self.translate('ca')

            elif self.language.currentIndex() == 13:
                self.translate('ceb')

            elif self.language.currentIndex() == 14:
                try:
                    self.translate('zh-CN')
                except:
                    self.translate('zh')

            elif self.language.currentIndex() == 15:
                self.translate('zh-TW')

            elif self.language.currentIndex() == 16:
                self.translate('co')

            elif self.language.currentIndex() == 17:
                self.translate('hr')

            elif self.language.currentIndex() == 18:
                self.translate('cs')

            elif self.language.currentIndex() == 19:
                self.translate('da')

            elif self.language.currentIndex() == 20:
                self.translate('nl')

            elif self.language.currentIndex() == 21:
                self.translate('en')

            elif self.language.currentIndex() == 22:
                self.translate('eo')

            elif self.language.currentIndex() == 23:
                self.translate('et')

            elif self.language.currentIndex() == 24:
                self.translate('fi')

            elif self.language.currentIndex() == 25:
                self.translate('fr')

            elif self.language.currentIndex() == 26:
                self.translate('fy')

            elif self.language.currentIndex() == 27:
                self.translate('gl')

            elif self.language.currentIndex() == 28:
                self.translate('ka')

            elif self.language.currentIndex() == 29:
                self.translate('de')

            elif self.language.currentIndex() == 30:
                self.translate('el')

            elif self.language.currentIndex() == 31:
                self.translate('gu')

            elif self.language.currentIndex() == 32:
                self.translate('ht')

            elif self.language.currentIndex() == 33:
                self.translate('ha')

            elif self.language.currentIndex() == 34:
                self.translate('haw')

            elif self.language.currentIndex() == 35:
                try:
                    self.translate('he')
                except:
                    self.translate('iw')

            elif self.language.currentIndex() == 36:
                self.translate('hi')

            elif self.language.currentIndex() == 37:
                self.translate('hmn')

            elif self.language.currentIndex() == 38:
                self.translate('hu')

            elif self.language.currentIndex() == 39:
                self.translate('is')

            elif self.language.currentIndex() == 40:
                self.translate('ig')

            elif self.language.currentIndex() == 41:
                self.translate('id')

            elif self.language.currentIndex() == 42:
                self.translate('ga')

            elif self.language.currentIndex() == 43:
                self.translate('it')

            elif self.language.currentIndex() == 44:
                self.translate('ja')

            elif self.language.currentIndex() == 45:
                self.translate('jv')

            elif self.language.currentIndex() == 46:
                self.translate('kn')

            elif self.language.currentIndex() == 47:
                self.translate('kk')

            elif self.language.currentIndex() == 48:
                self.translate('km')

            elif self.language.currentIndex() == 49:
                self.translate('rw')

            elif self.language.currentIndex() == 50:
                self.translate('ko')

            elif self.language.currentIndex() == 51:
                self.translate('ku')

            elif self.language.currentIndex() == 52:
                self.translate('ky')

            elif self.language.currentIndex() == 53:
                self.translate('lo')

            elif self.language.currentIndex() == 54:
                self.translate('la')

            elif self.language.currentIndex() == 55:
                self.translate('lv')

            elif self.language.currentIndex() == 56:
                self.translate('lt')

            elif self.language.currentIndex() == 57:
                self.translate('lb')

            elif self.language.currentIndex() == 58:
                self.translate('mk')

            elif self.language.currentIndex() == 59:
                self.translate('mg')

            elif self.language.currentIndex() == 60:
                self.translate('ms')

            elif self.language.currentIndex() == 61:
                self.translate('ml')

            elif self.language.currentIndex() == 62:
                self.translate('mt')

            elif self.language.currentIndex() == 63:
                self.translate('mi')

            elif self.language.currentIndex() == 64:
                self.translate('mr')

            elif self.language.currentIndex() == 65:
                self.translate('mn')

            elif self.language.currentIndex() == 66:
                self.translate('my')

            elif self.language.currentIndex() == 67:
                self.translate('ne')

            elif self.language.currentIndex() == 68:
                self.translate('no')

            elif self.language.currentIndex() == 69:
                self.translate('ny')

            elif self.language.currentIndex() == 70:
                self.translate('or')

            elif self.language.currentIndex() == 71:
                self.translate('ps')

            elif self.language.currentIndex() == 72:
                self.translate('fa')

            elif self.language.currentIndex() == 73:
                self.translate('pl')

            elif self.language.currentIndex() == 74:
                self.translate('pt')

            elif self.language.currentIndex() == 75:
                self.translate('pa')

            elif self.language.currentIndex() == 76:
                self.translate('ro')

            elif self.language.currentIndex() == 77:
                self.translate('ru')

            elif self.language.currentIndex() == 78:
                self.translate('sm')

            elif self.language.currentIndex() == 79:
                self.translate('gd')

            elif self.language.currentIndex() == 80:
                self.translate('sr')

            elif self.language.currentIndex() == 81:
                self.translate('st')

            elif self.language.currentIndex() == 82:
                self.translate('sn')

            elif self.language.currentIndex() == 83:
                self.translate('sd')

            elif self.language.currentIndex() == 84:
                self.translate('si')

            elif self.language.currentIndex() == 85:
                self.translate('sk')

            elif self.language.currentIndex() == 86:
                self.translate('sl')

            elif self.language.currentIndex() == 87:
                self.translate('so')

            elif self.language.currentIndex() == 88:
                self.translate('es')

            elif self.language.currentIndex() == 89:
                self.translate('su')

            elif self.language.currentIndex() == 90:
                self.translate('sw')

            elif self.language.currentIndex() == 91:
                self.translate('sv')

            elif self.language.currentIndex() == 92:
                self.translate('tl')

            elif self.language.currentIndex() == 93:
                self.translate('tg')

            elif self.language.currentIndex() == 94:
                self.translate('ta')

            elif self.language.currentIndex() == 95:
                self.translate('tt')

            elif self.language.currentIndex() == 96:
                self.translate('te')

            elif self.language.currentIndex() == 97:
                self.translate('th')

            elif self.language.currentIndex() == 98:
                self.translate('tr')

            elif self.language.currentIndex() == 99:
                self.translate('tk')

            elif self.language.currentIndex() == 100:
                self.translate('uk')

            elif self.language.currentIndex() == 101:
                self.translate('ur')

            elif self.language.currentIndex() == 102:
                self.translate('ug')

            elif self.language.currentIndex() == 103:
                self.translate('uz')

            elif self.language.currentIndex() == 104:
                self.translate('vi')

            elif self.language.currentIndex() == 105:
                self.translate('cy')

            elif self.language.currentIndex() == 106:
                self.translate('xh')

            elif self.language.currentIndex() == 107:
                self.translate('yi')

            elif self.language.currentIndex() == 108:
                self.translate('yo')

            elif self.language.currentIndex() == 109:
                self.translate('zu')

        except:
            self.translated_text.setText(
                "An error occurred. Either the initial and final language is same or try "
                "again. \n"
                "Tip2: You cannot translate numbers; only words. 😭😭")
class Register(QDialog):
    """
    Klasa służąca do utworzenia nowego użytkownika z najniższymi uprawnieniami.
    """
    def __init__(self):
        super(Register, self).__init__()
        self.url_register = 'account/register'

        layout = QFormLayout()
        btn_box = QDialogButtonBox()
        lbl_name = QLabel('Imię:')
        lbl_subname = QLabel('Nazwisko:')
        lbl_email = QLabel('Email:')
        lbl_pass2 = QLabel('Wpisz hasło:')
        lbl_pass3 = QLabel('Wpisz hasło ponownie:')
        self.edit_name = QLineEdit()
        self.edit_surname = QLineEdit()
        self.edit_email = QLineEdit()
        self.edit_pass2 = QLineEdit()
        self.edit_pass3 = QLineEdit()
        self.edit_pass2.setEchoMode(QLineEdit.Password)
        self.edit_pass3.setEchoMode(QLineEdit.Password)
        v_spacer = QSpacerItem(20, 40, QSizePolicy.Minimum,
                               QSizePolicy.Expanding)
        self.regex = QRegExp('^(\w|\.|\_|\-)+[@](\w|\_|\-|\.)+[.]\w{2,3}$')
        self.validator = QRegExpValidator(self.regex)
        self.edit_email.setValidator(self.validator)

        self.setWindowTitle('Rejestracja')
        self.setWindowIcon(QtGui.QIcon('resources/library_icon.png'))
        self.setMinimumWidth(640)
        self.setMinimumHeight(400)

        btn_box.setStandardButtons(QDialogButtonBox.Cancel
                                   | QDialogButtonBox.Save)
        layout.addRow(lbl_name, self.edit_name)
        layout.addRow(lbl_subname, self.edit_surname)
        layout.addRow(lbl_email, self.edit_email)
        layout.addRow(lbl_pass2, self.edit_pass2)
        layout.addRow(lbl_pass3, self.edit_pass3)
        layout.setItem(6, QFormLayout.LabelRole, v_spacer)
        layout.setWidget(7, QFormLayout.FieldRole, btn_box)
        self.setLayout(layout)

        btn_box.rejected.connect(self.reject)
        btn_box.accepted.connect(self.register_user)

    def register_user(self):
        """
        Rejestruje nowego użytkownika z zerowymi uprawnieniami (jedynie rezerwowanie książek i przeglądanie
        własnych, wypożyczonych książek).
        """
        jsons = {
            "name": self.edit_name.text(),
            "surname": self.edit_surname.text(),
            "email": self.edit_email.text(),
            "password": self.edit_pass2.text(),
            "confirmPassword": self.edit_pass3.text(),
            "roleId": 1
        }

        if jsons.get('password') != jsons.get('confirmPassword'):
            QMessageBox.warning(self, "Błędne hasła",
                                "Hasła nie są takie same.")
            return
        if jsons.get('password') == '':
            QMessageBox.warning(self, "Błąd", "Hasła nie mogą być puste.")
            return
        if len(self.edit_pass2.text()) < 6:
            QMessageBox.warning(self, "Błąd", "Hasło jest za krótkie.")
            return
        if jsons.get('email') == '':
            QMessageBox.warning(self, "Błąd", "Email nie może być pusty.")
            self.edit_new_email.setFocus()
            return

        que = queue.Queue()
        x = threading.Thread(target=post_request,
                             args=("".join([URL, self.url_register]), jsons,
                                   None, que))

        x.start()
        x.join()

        response = que.get()
        if response == 'ConnectionError':
            QMessageBox.critical(
                self, "Błąd",
                'Błąd połączenia z internetem! Sprawdź połączenie.')
            return
        print(response)
        if response.status_code == 200:
            QMessageBox.information(
                self, "Rejestracja",
                'Pomyślnie zarejestrowano nowego użytkownika.')
        self.accept()
class ItemRow:
    def __init__(self,
                 parent: QWidget, parent_layout: QVBoxLayout,
                 resource_database: ResourceDatabase, item: ResourceRequirement,
                 rows: List["ItemRow"]
                 ):
        self.parent = parent
        self.resource_database = resource_database
        self._rows = rows
        rows.append(self)

        self.layout = QHBoxLayout()
        self.layout.setObjectName(f"Box layout for {item.resource.long_name}")
        parent_layout.addLayout(self.layout)

        self.resource_type_combo = _create_resource_type_combo(item.resource.resource_type, parent)
        self.resource_type_combo.setMinimumWidth(75)
        self.resource_type_combo.setMaximumWidth(75)

        self.resource_name_combo = _create_resource_name_combo(self.resource_database,
                                                               item.resource.resource_type,
                                                               item.resource,
                                                               self.parent)

        self.negate_combo = QComboBox(parent)
        self.negate_combo.addItem("≥", False)
        self.negate_combo.addItem("<", True)
        self.negate_combo.setCurrentIndex(int(item.negate))
        self.negate_combo.setMinimumWidth(40)
        self.negate_combo.setMaximumWidth(40)

        self.amount_edit = QLineEdit(parent)
        self.amount_edit.setValidator(QIntValidator(1, 10000))
        self.amount_edit.setText(str(item.amount))
        self.amount_edit.setMinimumWidth(45)
        self.amount_edit.setMaximumWidth(45)

        self.remove_button = QPushButton(parent)
        self.remove_button.setText("X")
        self.remove_button.setMaximumWidth(20)

        self.layout.addWidget(self.resource_type_combo)
        self.layout.addWidget(self.resource_name_combo)
        self.layout.addWidget(self.negate_combo)
        self.layout.addWidget(self.amount_edit)
        self.layout.addWidget(self.remove_button)

        self.resource_type_combo.currentIndexChanged.connect(self._update_type)
        self.remove_button.clicked.connect(self._delete_row)

    def _update_type(self):
        old_combo = self.resource_name_combo
        self.resource_name_combo = _create_resource_name_combo(self.resource_database,
                                                               self.resource_type_combo.currentData(),
                                                               None,
                                                               self.parent)

        self.layout.replaceWidget(old_combo, self.resource_name_combo)
        old_combo.deleteLater()

    def _delete_row(self):
        self.resource_type_combo.deleteLater()
        self.resource_name_combo.deleteLater()
        self.negate_combo.deleteLater()
        self.amount_edit.deleteLater()
        self.remove_button.deleteLater()
        self.layout.deleteLater()
        self._rows.remove(self)

    @property
    def current_individual(self) -> ResourceRequirement:
        return ResourceRequirement(
            self.resource_name_combo.currentData(),
            int(self.amount_edit.text()),
            self.negate_combo.currentData()
        )
Example #24
0
    def __init__(self, parent=None):
        QWidget.__init__(self)
        self.parent = parent
        self.parent.addWidget(self)
        self.auto_login, self.auto_pwd, self.auto_email, self.auto_time = data.get_autofill(
        )
        self.gridLayout = QGridLayout(self)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setSpacing(0)
        self.gridLayout.setColumnStretch(0, 3)
        self.gridLayout.setColumnStretch(1, 7)

        self.pushButton_auto = QPushButton(self)
        self.pushButton_auto.setText("Autofill")
        self.pushButton_auto.setStyleSheet(styles.btn_allegro_ops_auto)
        self.pushButton_auto.setCheckable(True)
        self.pushButton_auto.setChecked(True)
        self.pushButton_auto.clicked.connect(lambda: self.on_auto())
        self.gridLayout.addWidget(self.pushButton_auto, 0, 0, 1, 1)

        self.pushButton_help = QPushButton(self)
        self.pushButton_help.setText("Help")
        self.pushButton_help.setStyleSheet(styles.btn_allegro_ops_auto)
        self.pushButton_help.setCheckable(True)
        self.pushButton_help.setChecked(False)
        self.pushButton_help.clicked.connect(lambda: self.on_help())
        self.gridLayout.addWidget(self.pushButton_help, 1, 0, 1, 1)

        self.spacer_btn_d = QSpacerItem(40, 20, QSizePolicy.Expanding)
        self.gridLayout.addItem(self.spacer_btn_d, 2, 0, 1, 1)

        self.stackedWidget = QStackedWidget(self)
        self.stackedWidget.setStyleSheet(
            """QStackedWidget{background-color: #fff;}""")
        self.gridLayout.addWidget(self.stackedWidget, 0, 1, 3, 1)

        self.widget_auto = QWidget(self.stackedWidget)
        self.widget_auto.setStyleSheet("""QWidget{background-color: #fff;}""")
        self.stackedWidget.addWidget(self.widget_auto)

        self.widget_help = QWidget(self.stackedWidget)
        self.widget_help.setStyleSheet("""QWidget{background-color: #fff;}""")
        self.stackedWidget.addWidget(self.widget_help)

        self.gridLayout_help = QVBoxLayout(self.widget_help)
        self.gridLayout_help.setContentsMargins(50, 50, 50, 50)
        self.gridLayout_help.setSpacing(50)

        self.label_help = QLabel(self.widget_help)
        self.label_help.setStyleSheet(styles.label_lineEdit)
        self.label_help.setWordWrap(True)
        self.label_help.setText(styles.help_text)
        self.gridLayout_help.addWidget(self.label_help)

        self.spacer_help = QSpacerItem(40, 20, QSizePolicy.Expanding)
        self.gridLayout_help.addItem(self.spacer_help)

        self.gridLayout_auto = QGridLayout(self.widget_auto)
        self.gridLayout_auto.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_auto.setSpacing(20)
        self.gridLayout_auto.setColumnStretch(0, 1)
        self.gridLayout_auto.setColumnStretch(1, 1)
        self.gridLayout_auto.setColumnStretch(2, 1)
        self.gridLayout_auto.setColumnStretch(3, 1)
        self.gridLayout_auto.setRowStretch(0, 3)
        self.gridLayout_auto.setRowStretch(1, 1)
        self.gridLayout_auto.setRowStretch(2, 1)
        self.gridLayout_auto.setRowStretch(3, 1)
        self.gridLayout_auto.setRowStretch(4, 1)
        self.gridLayout_auto.setRowStretch(5, 1)
        self.gridLayout_auto.setRowStretch(6, 3)

        self.lineEdit_login = QLineEdit(self.widget_auto)
        self.lineEdit_login.setMinimumSize(QSize(0, 60))
        self.lineEdit_login.setSizeIncrement(QSize(40, 40))
        self.lineEdit_login.setStyleSheet(styles.lineEdit_opt)
        self.gridLayout_auto.addWidget(self.lineEdit_login, 1, 2, 1, 1)
        self.lineEdit_login.setPlaceholderText(
            "login or email of your account")
        self.lineEdit_login.setText(self.auto_login)

        self.lineEdit_password = QLineEdit(self.widget_auto)
        self.lineEdit_password.setMinimumSize(QSize(20, 60))
        self.lineEdit_password.setStyleSheet(styles.lineEdit_opt)
        self.lineEdit_password.setEchoMode(QLineEdit.Password)
        self.lineEdit_password.setReadOnly(False)
        self.gridLayout_auto.addWidget(self.lineEdit_password, 2, 2, 1, 1)
        self.lineEdit_password.setPlaceholderText("password of your account")
        self.lineEdit_password.setText(self.auto_pwd)

        self.lineEdit_email = QLineEdit(self.widget_auto)
        self.lineEdit_email.setMinimumSize(QSize(0, 60))
        self.lineEdit_email.setStyleSheet(styles.lineEdit_opt)
        self.lineEdit_email.setFrame(True)
        self.lineEdit_email.setEchoMode(QLineEdit.Normal)
        self.gridLayout_auto.addWidget(self.lineEdit_email, 3, 2, 1, 1)
        self.lineEdit_email.setPlaceholderText(
            "email to which the notification will be sent")
        self.lineEdit_email.setText(self.auto_email)

        self.lineEdit_time = QLineEdit(self.widget_auto)
        self.lineEdit_time.setMinimumSize(QSize(0, 60))
        self.lineEdit_time.setStyleSheet(styles.lineEdit)
        self.gridLayout_auto.addWidget(self.lineEdit_time, 4, 2, 1, 1)
        self.lineEdit_time.setPlaceholderText("interval between refreshes")
        self.lineEdit_time.setText(str(self.auto_time))

        self.label_login = QLabel("Allegro login", self)
        self.label_login.setStyleSheet(styles.label_lineEdit)
        self.gridLayout_auto.addWidget(self.label_login, 1, 1, 1, 1)

        self.label_password = QLabel("Allegro password", self)
        self.label_password.setStyleSheet(styles.label_lineEdit)
        self.gridLayout_auto.addWidget(self.label_password, 2, 1, 1, 1)

        self.label_email = QLabel("Email to notificate", self)
        self.label_email.setStyleSheet(styles.label_lineEdit)
        self.gridLayout_auto.addWidget(self.label_email, 3, 1, 1, 1)

        self.label_time = QLabel("Refresh time[s]", self)
        self.label_time.setStyleSheet(styles.label_lineEdit)
        self.gridLayout_auto.addWidget(self.label_time, 4, 1, 1, 1)

        self.pushButton_set = QPushButton("Set", self.widget_auto)
        self.pushButton_set.clicked.connect(lambda: self.on_set())
        self.pushButton_set.setMinimumSize(QSize(0, 40))
        self.pushButton_set.setStyleSheet(styles.btn_dark)
        self.gridLayout_auto.addWidget(self.pushButton_set, 5, 2, 1, 1)

        self.spacer_auto_l = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                         QSizePolicy.Minimum)
        self.gridLayout_auto.addItem(self.spacer_auto_l, 1, 1, 1, 1)

        self.spacer_auto_r = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                         QSizePolicy.Minimum)
        self.gridLayout_auto.addItem(self.spacer_auto_r, 1, 3, 1, 1)

        self.spacer_auto_t = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                         QSizePolicy.Minimum)
        self.gridLayout_auto.addItem(self.spacer_auto_t, 0, 0, 1, 1)

        self.spacer_auto_b = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                         QSizePolicy.Minimum)
        self.gridLayout_auto.addItem(self.spacer_auto_b, 6, 0, 1, 1)
Example #25
0
    def __init__(self,
                 name,
                 link,
                 is_done,
                 price,
                 xpath,
                 time,
                 is_monitoring,
                 parent=None,
                 shared_dict=None):
        QFrame.__init__(self, parent)
        self.shared_dict = shared_dict
        self.setMinimumSize(QSize(0, 300))
        self.setStyleSheet("""QFrame{border-bottom: 0.5px solid #aaa;}""")
        self.setFrameShape(QFrame.StyledPanel)
        self.setFrameShadow(QFrame.Raised)
        self.horizontalLayout = QHBoxLayout(self)

        # create description frame and layout
        self.frame_description = QFrame(self)
        self.frame_description.setMinimumSize(QSize(440, 16777215))
        self.frame_description.setStyleSheet("""QFrame{border: none;}""")
        self.frame_description.setFrameShape(QFrame.StyledPanel)
        self.frame_description.setFrameShadow(QFrame.Raised)
        self.gridLayout_description = QGridLayout(self.frame_description)
        self.horizontalLayout.addWidget(self.frame_description)
        self.gridLayout_description.setColumnStretch(0, 1)
        self.gridLayout_description.setColumnStretch(1, 2)
        self.gridLayout_description.setColumnStretch(2, 3)
        self.gridLayout_description.setColumnStretch(3, 1)
        self.gridLayout_description.setColumnStretch(4, 6)

        # fill description layout
        self.label_name = QLabel(name, self.frame_description)
        self.label_name.setStyleSheet(styles.label_allegro_monitored_name)
        self.label_name.setTextFormat(Qt.MarkdownText)
        self.label_name.setAlignment(Qt.AlignJustify | Qt.AlignVCenter)
        self.label_name.setWordWrap(False)
        self.gridLayout_description.addWidget(self.label_name, 0, 0, 1, 5)

        url_link = "<a href=\"" + link + "\" style = \" color: #838836; text-decoration: none; font-family:corbel; title=\"Go to monitored page\"\">check product</a>"
        self.label_monitored_link = QLabel(url_link, self.frame_description)
        self.label_monitored_link.setStyleSheet(
            styles.label_allegro_monitored_link)
        self.gridLayout_description.addWidget(self.label_monitored_link, 1, 1,
                                              2, 2)
        self.label_monitored_link.setOpenExternalLinks(True)

        self.label_stat = QLabel(self.frame_description)
        self.label_stat.setStyleSheet(styles.label_allegro_monitored_stat)
        self.gridLayout_description.addWidget(self.label_stat, 1, 4, 1, 1)

        self.label_is_on = QLabel(self.frame_description)
        self.label_is_on.setStyleSheet(styles.label_allegro_monitored_stat)
        self.gridLayout_description.addWidget(self.label_is_on, 5, 0, 1, 2)

        self.label_new_time = QLabel(
            "Actual refresh time[s]: " + str(time) + " s",
            self.frame_description)
        self.label_new_time.setStyleSheet(styles.label_allegro_monitored_stat)
        self.gridLayout_description.addWidget(self.label_new_time, 4, 0, 1, 3)

        self.lineEdit_new_time = QLineEdit(self.frame_description)
        self.lineEdit_new_time.setMinimumSize(QSize(0, 33))
        self.lineEdit_new_time.setStyleSheet(styles.lineEdit)
        self.gridLayout_description.addWidget(self.lineEdit_new_time, 4, 3, 1,
                                              2)
        self.lineEdit_new_time.setPlaceholderText("Set new interval")

        self.label_new_price = QLabel("Actual price: " + str(price), self)
        self.label_new_price.setStyleSheet(styles.label_allegro_monitored_stat)
        self.gridLayout_description.addWidget(self.label_new_price, 3, 0, 1, 3)

        self.lineEdit_new_price = QLineEdit(self)
        self.lineEdit_new_price.setMinimumSize(QSize(0, 35))
        self.lineEdit_new_price.setStyleSheet(styles.lineEdit)
        self.gridLayout_description.addWidget(self.lineEdit_new_price, 3, 3, 1,
                                              2)
        self.lineEdit_new_price.setPlaceholderText("Set new price")

        self.label_img_link = QLabel(self.frame_description)
        self.label_img_link.setMaximumSize(QSize(20, 20))
        self.label_img_link.setStyleSheet("""QLabel{border: none;}""")
        self.label_img_link.setPixmap(
            QPixmap(os.path.join(path, "img/link.png")))
        self.label_img_link.setScaledContents(True)
        self.gridLayout_description.addWidget(self.label_img_link, 1, 0, 2, 1)

        self.label_img_stat = QLabel("done", self.frame_description)
        if is_done:
            self.label_stat.setText("done")
            self.label_img_stat.setPixmap(
                QPixmap(os.path.join(path, "img/check.png")))
        else:
            self.label_stat.setText("in progress")
            self.label_img_stat.setPixmap(
                QPixmap(os.path.join(path, "img/loading.png")))
        self.label_img_stat.setMaximumSize(QSize(20, 20))
        self.label_img_stat.setStyleSheet("""QLabel{border: none;}""")
        self.label_img_stat.setScaledContents(True)
        self.gridLayout_description.addWidget(self.label_img_stat, 1, 3, 1, 1)

        self.label_img_monitor = QLabel("done", self.frame_description)
        if is_monitoring:
            monitor_text = "I am just monitoring"
            self.label_img_monitor.setPixmap(
                QPixmap(os.path.join(path, "img/monitoring.png")))
        else:
            monitor_text = "I am going to buy"
            self.label_img_monitor.setPixmap(
                QPixmap(os.path.join(path, "img/buy.png")))
        self.label_is_monitoring = QLabel(monitor_text, self)
        self.label_is_monitoring.setStyleSheet(
            styles.label_allegro_monitored_stat)
        self.gridLayout_description.addWidget(self.label_is_monitoring, 2, 4,
                                              1, 1)

        self.label_img_monitor.setMaximumSize(QSize(20, 20))
        self.label_img_monitor.setStyleSheet("""QLabel{border: none;}""")
        self.label_img_monitor.setScaledContents(True)
        self.gridLayout_description.addWidget(self.label_img_monitor, 2, 3, 1,
                                              1)

        # create spacer and delete btn
        self.spacer = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                  QSizePolicy.Minimum)
        self.horizontalLayout.addItem(self.spacer)

        self.pushButton_delete = QPushButton(self)
        # self.pushButton_delete.clicked.connect( lambda: self.deleteLater())
        self.pushButton_delete.clicked.connect(lambda: self.on_delete(link))
        icon = QIcon()
        icon.addFile(os.path.join(path, "img/delete.png"), QSize(),
                     QIcon.Selected, QIcon.Off)
        # icon.Active.addFile(os.path.join(path, "img/icon.png"), QSize(), QIcon.Selected, QIcon.Off)
        self.pushButton_delete.setIcon(icon)
        self.pushButton_delete.setIconSize(QSize(50, 50))
        self.pushButton_delete.setStyleSheet("""QPushButton{border:none; }""")
        self.pushButton_delete.setCursor(QCursor(Qt.PointingHandCursor))
        # self.pushButton_delete.ico
        self.horizontalLayout.addWidget(self.pushButton_delete)

        self.is_on = data.get_switch_state(link)
        self.pushButton_switch = QPushButton(self)
        self.pushButton_switch.clicked.connect(lambda: self.on_switch(link))
        self.icon_on = QIcon()
        self.icon_off = QIcon()
        self.icon_on.addFile(os.path.join(path, "img/switch_on.png"), QSize(),
                             QIcon.Selected, QIcon.On)
        self.icon_off.addFile(os.path.join(path, "img/switch_off.png"),
                              QSize(), QIcon.Selected, QIcon.Off)
        if self.is_on:
            self.label_is_on.setText("Disable")
            self.pushButton_switch.setIcon(self.icon_on)
        else:
            self.label_is_on.setText("Enable")
            self.pushButton_switch.setIcon(self.icon_off)
        self.pushButton_switch.setIconSize(QSize(100, 40))
        self.pushButton_switch.setStyleSheet("""QPushButton{border:none; }""")
        self.pushButton_switch.setCursor(QCursor(Qt.PointingHandCursor))
        self.gridLayout_description.addWidget(self.pushButton_switch, 5, 2, 1,
                                              1)

        self.pushButton_save_changes = QPushButton("Save", self)
        self.pushButton_save_changes.clicked.connect(
            lambda: self.on_save_changes(link))
        self.pushButton_save_changes.setIconSize(QSize(100, 20))
        self.pushButton_save_changes.setStyleSheet(styles.btn_dark)
        self.pushButton_save_changes.setCursor(QCursor(Qt.PointingHandCursor))
        self.gridLayout_description.addWidget(self.pushButton_save_changes, 5,
                                              3, 1, 2)
Example #26
0
    def __init__(self, parent=None, shared_dict=None):
        QWidget.__init__(self, parent)
        parent.addWidget(self)
        self.shared_dict = shared_dict
        self.gridLayout = QGridLayout(self)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setRowStretch(0, 1)
        self.gridLayout.setRowStretch(1, 1)
        self.gridLayout.setRowStretch(2, 1)
        self.gridLayout.setRowStretch(3, 1)
        self.gridLayout.setRowStretch(4, 1)
        self.gridLayout.setRowStretch(5, 1)
        self.gridLayout.setRowStretch(6, 1)
        self.gridLayout.setRowStretch(7, 1)
        self.gridLayout.setRowStretch(8, 1)
        self.gridLayout.setRowStretch(9, 1)
        self.gridLayout.setRowStretch(10, 1)
        self.gridLayout.setRowStretch(11, 1)
        self.gridLayout.setRowStretch(12, 1)
        self.gridLayout.setRowStretch(13, 1)
        self.gridLayout.setRowStretch(14, 2)
        self.gridLayout.setRowStretch(15, 1)
        self.gridLayout.setColumnStretch(0, 5)
        self.gridLayout.setColumnStretch(1, 5)
        self.gridLayout.setColumnStretch(2, 1)
        self.gridLayout.setColumnStretch(3, 2)
        self.gridLayout.setColumnStretch(4, 1)
        self.gridLayout.setColumnStretch(5, 2)
        self.gridLayout.setColumnStretch(6, 1)
        self.gridLayout.setColumnStretch(7, 2)
        self.gridLayout.setColumnStretch(8, 3)
        self.gridLayout.setColumnStretch(9, 5)

        # create lineEdits
        self.lineEdit_login = QLineEdit(self)
        self.lineEdit_login.setMinimumSize(QSize(0, 60))
        self.lineEdit_login.setSizeIncrement(QSize(40, 40))
        self.lineEdit_login.setStyleSheet(styles.lineEdit)
        self.lineEdit_login.setMaxLength(32767)
        self.gridLayout.addWidget(self.lineEdit_login, 4, 1, 1, 3)
        self.lineEdit_login.setPlaceholderText(
            "login or email of your account")

        self.lineEdit_password = QLineEdit(self)
        self.lineEdit_password.setMinimumSize(QSize(20, 60))
        self.lineEdit_password.setStyleSheet(styles.lineEdit)
        self.lineEdit_password.setEchoMode(QLineEdit.Password)
        self.lineEdit_password.setReadOnly(False)
        self.gridLayout.addWidget(self.lineEdit_password, 7, 1, 1, 3)
        self.lineEdit_password.setPlaceholderText("password of your account")

        self.lineEdit_email = QLineEdit(self)
        self.lineEdit_email.setMinimumSize(QSize(0, 60))
        self.lineEdit_email.setStyleSheet(styles.lineEdit)
        self.lineEdit_email.setFrame(True)
        self.lineEdit_email.setEchoMode(QLineEdit.Normal)
        self.gridLayout.addWidget(self.lineEdit_email, 7, 5, 1, 4)
        self.lineEdit_email.setPlaceholderText(
            "email to which the notification will be sent")

        self.lineEdit_link = QLineEdit(self)
        self.lineEdit_link.setMinimumSize(QSize(0, 60))
        self.lineEdit_link.setStyleSheet(styles.lineEdit)
        self.gridLayout.addWidget(self.lineEdit_link, 10, 1, 1, 8)
        self.lineEdit_link.setPlaceholderText(
            "link to the page that you want to monitor")

        self.lineEdit_price = QLineEdit(self)
        self.lineEdit_price.setMinimumSize(QSize(0, 60))
        self.lineEdit_price.setStyleSheet(styles.lineEdit)
        self.gridLayout.addWidget(self.lineEdit_price, 13, 1, 1, 1)
        self.lineEdit_price.setPlaceholderText(
            "Price below which to notificate")

        self.lineEdit_xpath = QLineEdit(self)
        self.lineEdit_xpath.setMinimumSize(QSize(0, 60))
        self.lineEdit_xpath.setStyleSheet(styles.lineEdit)
        self.gridLayout.addWidget(self.lineEdit_xpath, 13, 3, 1, 3)
        self.lineEdit_xpath.setPlaceholderText(
            "XPATH of element with the price")

        self.lineEdit_time = QLineEdit(self)
        self.lineEdit_time.setMinimumSize(QSize(0, 60))
        self.lineEdit_time.setStyleSheet(styles.lineEdit)
        self.gridLayout.addWidget(self.lineEdit_time, 13, 7, 1, 2)
        self.lineEdit_time.setPlaceholderText("interval between refreshes")

        # Create Labels
        self.label_title = QLabel("Add new monitoring object", self)
        self.label_title.setStyleSheet(styles.label_title)
        self.label_title.setAlignment(Qt.AlignCenter)
        self.gridLayout.addWidget(self.label_title, 0, 1, 1, 8)

        self.label_info = QLabel("", self)
        self.label_info.setStyleSheet(styles.label_info_wrong)
        self.label_info.setAlignment(Qt.AlignCenter)
        self.gridLayout.addWidget(self.label_info, 1, 1, 1, 8)

        self.label_login = QLabel("Allegro login", self)
        self.label_login.setStyleSheet(styles.label_lineEdit)
        self.gridLayout.addWidget(self.label_login, 3, 1, 1, 3)

        self.label_password = QLabel("Allegro password", self)
        self.label_password.setStyleSheet(styles.label_lineEdit)
        self.gridLayout.addWidget(self.label_password, 6, 1, 1, 3)

        self.label_email = QLabel("Email to notificate", self)
        self.label_email.setStyleSheet(styles.label_lineEdit)
        self.gridLayout.addWidget(self.label_email, 6, 5, 1, 4)

        self.label_link = QLabel("Product link", self)
        self.label_link.setStyleSheet(styles.label_lineEdit)
        self.gridLayout.addWidget(self.label_link, 9, 1, 1, 8)

        self.label_price = QLabel("Price", self)
        self.label_price.setStyleSheet(styles.label_lineEdit)
        self.gridLayout.addWidget(self.label_price, 12, 1, 1, 1)

        self.label_xpath = QLabel("Monitored element", self)
        self.label_xpath.setStyleSheet(styles.label_lineEdit)
        self.gridLayout.addWidget(self.label_xpath, 12, 3, 1, 3)

        self.label_time = QLabel("Refresh time[s]", self)
        self.label_time.setStyleSheet(styles.label_lineEdit)
        self.gridLayout.addWidget(self.label_time, 12, 7, 1, 2)

        self.pushButton_search = QPushButton(self)
        self.pushButton_search.clicked.connect(
            lambda: webbrowser.open('https://allegro.pl/'))
        icon = QIcon()
        icon.addFile(os.path.join(path, "img/search.png"), QSize(),
                     QIcon.Selected, QIcon.Off)
        self.pushButton_search.setIcon(icon)
        self.pushButton_search.setIconSize(QSize(100, 100))
        self.pushButton_search.setStyleSheet("""QPushButton{border:none;}""")
        self.pushButton_search.setCursor(QCursor(Qt.PointingHandCursor))
        self.gridLayout.addWidget(self.pushButton_search, 3, 7, 3, 1)

        # Create spacers
        self.spacer_search_l = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                           QSizePolicy.Minimum)
        self.gridLayout.addItem(self.spacer_search_l, 5, 5, 1, 2)

        self.spacer_search_r = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                           QSizePolicy.Minimum)
        self.gridLayout.addItem(self.spacer_search_r, 5, 8, 1, 1)

        self.spacer_search_t = QSpacerItem(20, 40, QSizePolicy.Minimum,
                                           QSizePolicy.Expanding)
        self.gridLayout.addItem(self.spacer_search_t, 2, 1, 1, 8)

        self.spacer_search_b = QSpacerItem(20, 40, QSizePolicy.Minimum,
                                           QSizePolicy.Expanding)
        self.gridLayout.addItem(self.spacer_search_b, 5, 1, 1, 8)

        self.spacer_email_l = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                          QSizePolicy.Minimum)
        self.gridLayout.addItem(self.spacer_email_l, 7, 4, 1, 1)

        self.spacer_link_l = QSpacerItem(40, 20, QSizePolicy.MinimumExpanding,
                                         QSizePolicy.Minimum)
        self.gridLayout.addItem(self.spacer_link_l, 13, 0, 1, 1)

        self.spacer_link_r = QSpacerItem(40, 20, QSizePolicy.MinimumExpanding,
                                         QSizePolicy.Minimum)
        self.gridLayout.addItem(self.spacer_link_r, 13, 9, 1, 1)

        self.spacer_link_t = QSpacerItem(20, 40, QSizePolicy.Minimum,
                                         QSizePolicy.Expanding)
        self.gridLayout.addItem(self.spacer_link_t, 8, 1, 1, 8)

        self.spacer_link_b = QSpacerItem(20, 40, QSizePolicy.Minimum,
                                         QSizePolicy.Expanding)
        self.gridLayout.addItem(self.spacer_link_b, 11, 1, 1, 8)

        self.spacer_price_b = QSpacerItem(20, 40, QSizePolicy.Minimum,
                                          QSizePolicy.Expanding)
        self.gridLayout.addItem(self.spacer_price_b, 14, 1, 1, 7)

        # create frame bottom
        self.frame_bottom = QFrame(self)
        self.frame_bottom.setStyleSheet(
            """QFrame{background-color: #fff; padding: 10px;}""")
        self.frame_bottom.setFrameShape(QFrame.StyledPanel)
        self.frame_bottom.setFrameShadow(QFrame.Raised)
        self.gridLayout.addWidget(self.frame_bottom, 15, 0, 1, 10)
        self.horizontalLayout_frame_bottom = QHBoxLayout(self.frame_bottom)

        self.spacer_frame_bottom_l = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                                 QSizePolicy.Minimum)
        self.horizontalLayout_frame_bottom.addItem(self.spacer_frame_bottom_l)

        self.pushButton_bn = QPushButton("Buy when price drops",
                                         self.frame_bottom)
        self.pushButton_bn.setMinimumSize(QSize(0, 40))
        self.pushButton_bn.setStyleSheet(styles.btn_light)
        self.horizontalLayout_frame_bottom.addWidget(self.pushButton_bn)
        self.pushButton_bn.setShortcut("Return")

        self.spacer_frame_bottom_c = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                                 QSizePolicy.Minimum)
        self.horizontalLayout_frame_bottom.addItem(self.spacer_frame_bottom_c)

        self.pushButton_monitor = QPushButton("Monitor", self.frame_bottom)
        self.pushButton_monitor.clicked.connect(
            lambda: self.new_link_handler(True))
        self.pushButton_monitor.setMinimumSize(QSize(0, 40))
        self.pushButton_monitor.setStyleSheet(styles.btn_dark)
        self.horizontalLayout_frame_bottom.addWidget(self.pushButton_monitor)

        self.spacer_frame_bottom_r = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                                 QSizePolicy.Minimum)
        self.horizontalLayout_frame_bottom.addItem(self.spacer_frame_bottom_r)

        self.horizontalLayout_frame_bottom.setStretch(0, 1)
        self.horizontalLayout_frame_bottom.setStretch(1, 1)
        self.horizontalLayout_frame_bottom.setStretch(2, 2)
        self.horizontalLayout_frame_bottom.setStretch(3, 1)
        self.horizontalLayout_frame_bottom.setStretch(4, 1)
        self.timer = QTimer(self)

        auto_login, auto_pwd, auto_email, auto_time = data.get_autofill()
        self.lineEdit_login.setText(auto_login)
        self.lineEdit_password.setText(auto_pwd)
        self.lineEdit_email.setText(auto_email)
        self.lineEdit_time.setText(str(auto_time))
Example #27
0
class PageAllegroAdd(QWidget):
    def __init__(self, parent=None, shared_dict=None):
        QWidget.__init__(self, parent)
        parent.addWidget(self)
        self.shared_dict = shared_dict
        self.gridLayout = QGridLayout(self)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setRowStretch(0, 1)
        self.gridLayout.setRowStretch(1, 1)
        self.gridLayout.setRowStretch(2, 1)
        self.gridLayout.setRowStretch(3, 1)
        self.gridLayout.setRowStretch(4, 1)
        self.gridLayout.setRowStretch(5, 1)
        self.gridLayout.setRowStretch(6, 1)
        self.gridLayout.setRowStretch(7, 1)
        self.gridLayout.setRowStretch(8, 1)
        self.gridLayout.setRowStretch(9, 1)
        self.gridLayout.setRowStretch(10, 1)
        self.gridLayout.setRowStretch(11, 1)
        self.gridLayout.setRowStretch(12, 1)
        self.gridLayout.setRowStretch(13, 1)
        self.gridLayout.setRowStretch(14, 2)
        self.gridLayout.setRowStretch(15, 1)
        self.gridLayout.setColumnStretch(0, 5)
        self.gridLayout.setColumnStretch(1, 5)
        self.gridLayout.setColumnStretch(2, 1)
        self.gridLayout.setColumnStretch(3, 2)
        self.gridLayout.setColumnStretch(4, 1)
        self.gridLayout.setColumnStretch(5, 2)
        self.gridLayout.setColumnStretch(6, 1)
        self.gridLayout.setColumnStretch(7, 2)
        self.gridLayout.setColumnStretch(8, 3)
        self.gridLayout.setColumnStretch(9, 5)

        # create lineEdits
        self.lineEdit_login = QLineEdit(self)
        self.lineEdit_login.setMinimumSize(QSize(0, 60))
        self.lineEdit_login.setSizeIncrement(QSize(40, 40))
        self.lineEdit_login.setStyleSheet(styles.lineEdit)
        self.lineEdit_login.setMaxLength(32767)
        self.gridLayout.addWidget(self.lineEdit_login, 4, 1, 1, 3)
        self.lineEdit_login.setPlaceholderText(
            "login or email of your account")

        self.lineEdit_password = QLineEdit(self)
        self.lineEdit_password.setMinimumSize(QSize(20, 60))
        self.lineEdit_password.setStyleSheet(styles.lineEdit)
        self.lineEdit_password.setEchoMode(QLineEdit.Password)
        self.lineEdit_password.setReadOnly(False)
        self.gridLayout.addWidget(self.lineEdit_password, 7, 1, 1, 3)
        self.lineEdit_password.setPlaceholderText("password of your account")

        self.lineEdit_email = QLineEdit(self)
        self.lineEdit_email.setMinimumSize(QSize(0, 60))
        self.lineEdit_email.setStyleSheet(styles.lineEdit)
        self.lineEdit_email.setFrame(True)
        self.lineEdit_email.setEchoMode(QLineEdit.Normal)
        self.gridLayout.addWidget(self.lineEdit_email, 7, 5, 1, 4)
        self.lineEdit_email.setPlaceholderText(
            "email to which the notification will be sent")

        self.lineEdit_link = QLineEdit(self)
        self.lineEdit_link.setMinimumSize(QSize(0, 60))
        self.lineEdit_link.setStyleSheet(styles.lineEdit)
        self.gridLayout.addWidget(self.lineEdit_link, 10, 1, 1, 8)
        self.lineEdit_link.setPlaceholderText(
            "link to the page that you want to monitor")

        self.lineEdit_price = QLineEdit(self)
        self.lineEdit_price.setMinimumSize(QSize(0, 60))
        self.lineEdit_price.setStyleSheet(styles.lineEdit)
        self.gridLayout.addWidget(self.lineEdit_price, 13, 1, 1, 1)
        self.lineEdit_price.setPlaceholderText(
            "Price below which to notificate")

        self.lineEdit_xpath = QLineEdit(self)
        self.lineEdit_xpath.setMinimumSize(QSize(0, 60))
        self.lineEdit_xpath.setStyleSheet(styles.lineEdit)
        self.gridLayout.addWidget(self.lineEdit_xpath, 13, 3, 1, 3)
        self.lineEdit_xpath.setPlaceholderText(
            "XPATH of element with the price")

        self.lineEdit_time = QLineEdit(self)
        self.lineEdit_time.setMinimumSize(QSize(0, 60))
        self.lineEdit_time.setStyleSheet(styles.lineEdit)
        self.gridLayout.addWidget(self.lineEdit_time, 13, 7, 1, 2)
        self.lineEdit_time.setPlaceholderText("interval between refreshes")

        # Create Labels
        self.label_title = QLabel("Add new monitoring object", self)
        self.label_title.setStyleSheet(styles.label_title)
        self.label_title.setAlignment(Qt.AlignCenter)
        self.gridLayout.addWidget(self.label_title, 0, 1, 1, 8)

        self.label_info = QLabel("", self)
        self.label_info.setStyleSheet(styles.label_info_wrong)
        self.label_info.setAlignment(Qt.AlignCenter)
        self.gridLayout.addWidget(self.label_info, 1, 1, 1, 8)

        self.label_login = QLabel("Allegro login", self)
        self.label_login.setStyleSheet(styles.label_lineEdit)
        self.gridLayout.addWidget(self.label_login, 3, 1, 1, 3)

        self.label_password = QLabel("Allegro password", self)
        self.label_password.setStyleSheet(styles.label_lineEdit)
        self.gridLayout.addWidget(self.label_password, 6, 1, 1, 3)

        self.label_email = QLabel("Email to notificate", self)
        self.label_email.setStyleSheet(styles.label_lineEdit)
        self.gridLayout.addWidget(self.label_email, 6, 5, 1, 4)

        self.label_link = QLabel("Product link", self)
        self.label_link.setStyleSheet(styles.label_lineEdit)
        self.gridLayout.addWidget(self.label_link, 9, 1, 1, 8)

        self.label_price = QLabel("Price", self)
        self.label_price.setStyleSheet(styles.label_lineEdit)
        self.gridLayout.addWidget(self.label_price, 12, 1, 1, 1)

        self.label_xpath = QLabel("Monitored element", self)
        self.label_xpath.setStyleSheet(styles.label_lineEdit)
        self.gridLayout.addWidget(self.label_xpath, 12, 3, 1, 3)

        self.label_time = QLabel("Refresh time[s]", self)
        self.label_time.setStyleSheet(styles.label_lineEdit)
        self.gridLayout.addWidget(self.label_time, 12, 7, 1, 2)

        self.pushButton_search = QPushButton(self)
        self.pushButton_search.clicked.connect(
            lambda: webbrowser.open('https://allegro.pl/'))
        icon = QIcon()
        icon.addFile(os.path.join(path, "img/search.png"), QSize(),
                     QIcon.Selected, QIcon.Off)
        self.pushButton_search.setIcon(icon)
        self.pushButton_search.setIconSize(QSize(100, 100))
        self.pushButton_search.setStyleSheet("""QPushButton{border:none;}""")
        self.pushButton_search.setCursor(QCursor(Qt.PointingHandCursor))
        self.gridLayout.addWidget(self.pushButton_search, 3, 7, 3, 1)

        # Create spacers
        self.spacer_search_l = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                           QSizePolicy.Minimum)
        self.gridLayout.addItem(self.spacer_search_l, 5, 5, 1, 2)

        self.spacer_search_r = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                           QSizePolicy.Minimum)
        self.gridLayout.addItem(self.spacer_search_r, 5, 8, 1, 1)

        self.spacer_search_t = QSpacerItem(20, 40, QSizePolicy.Minimum,
                                           QSizePolicy.Expanding)
        self.gridLayout.addItem(self.spacer_search_t, 2, 1, 1, 8)

        self.spacer_search_b = QSpacerItem(20, 40, QSizePolicy.Minimum,
                                           QSizePolicy.Expanding)
        self.gridLayout.addItem(self.spacer_search_b, 5, 1, 1, 8)

        self.spacer_email_l = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                          QSizePolicy.Minimum)
        self.gridLayout.addItem(self.spacer_email_l, 7, 4, 1, 1)

        self.spacer_link_l = QSpacerItem(40, 20, QSizePolicy.MinimumExpanding,
                                         QSizePolicy.Minimum)
        self.gridLayout.addItem(self.spacer_link_l, 13, 0, 1, 1)

        self.spacer_link_r = QSpacerItem(40, 20, QSizePolicy.MinimumExpanding,
                                         QSizePolicy.Minimum)
        self.gridLayout.addItem(self.spacer_link_r, 13, 9, 1, 1)

        self.spacer_link_t = QSpacerItem(20, 40, QSizePolicy.Minimum,
                                         QSizePolicy.Expanding)
        self.gridLayout.addItem(self.spacer_link_t, 8, 1, 1, 8)

        self.spacer_link_b = QSpacerItem(20, 40, QSizePolicy.Minimum,
                                         QSizePolicy.Expanding)
        self.gridLayout.addItem(self.spacer_link_b, 11, 1, 1, 8)

        self.spacer_price_b = QSpacerItem(20, 40, QSizePolicy.Minimum,
                                          QSizePolicy.Expanding)
        self.gridLayout.addItem(self.spacer_price_b, 14, 1, 1, 7)

        # create frame bottom
        self.frame_bottom = QFrame(self)
        self.frame_bottom.setStyleSheet(
            """QFrame{background-color: #fff; padding: 10px;}""")
        self.frame_bottom.setFrameShape(QFrame.StyledPanel)
        self.frame_bottom.setFrameShadow(QFrame.Raised)
        self.gridLayout.addWidget(self.frame_bottom, 15, 0, 1, 10)
        self.horizontalLayout_frame_bottom = QHBoxLayout(self.frame_bottom)

        self.spacer_frame_bottom_l = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                                 QSizePolicy.Minimum)
        self.horizontalLayout_frame_bottom.addItem(self.spacer_frame_bottom_l)

        self.pushButton_bn = QPushButton("Buy when price drops",
                                         self.frame_bottom)
        self.pushButton_bn.setMinimumSize(QSize(0, 40))
        self.pushButton_bn.setStyleSheet(styles.btn_light)
        self.horizontalLayout_frame_bottom.addWidget(self.pushButton_bn)
        self.pushButton_bn.setShortcut("Return")

        self.spacer_frame_bottom_c = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                                 QSizePolicy.Minimum)
        self.horizontalLayout_frame_bottom.addItem(self.spacer_frame_bottom_c)

        self.pushButton_monitor = QPushButton("Monitor", self.frame_bottom)
        self.pushButton_monitor.clicked.connect(
            lambda: self.new_link_handler(True))
        self.pushButton_monitor.setMinimumSize(QSize(0, 40))
        self.pushButton_monitor.setStyleSheet(styles.btn_dark)
        self.horizontalLayout_frame_bottom.addWidget(self.pushButton_monitor)

        self.spacer_frame_bottom_r = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                                 QSizePolicy.Minimum)
        self.horizontalLayout_frame_bottom.addItem(self.spacer_frame_bottom_r)

        self.horizontalLayout_frame_bottom.setStretch(0, 1)
        self.horizontalLayout_frame_bottom.setStretch(1, 1)
        self.horizontalLayout_frame_bottom.setStretch(2, 2)
        self.horizontalLayout_frame_bottom.setStretch(3, 1)
        self.horizontalLayout_frame_bottom.setStretch(4, 1)
        self.timer = QTimer(self)

        auto_login, auto_pwd, auto_email, auto_time = data.get_autofill()
        self.lineEdit_login.setText(auto_login)
        self.lineEdit_password.setText(auto_pwd)
        self.lineEdit_email.setText(auto_email)
        self.lineEdit_time.setText(str(auto_time))

    def new_link_handler(self, is_monitoring):
        # check if fields were filled properly
        no_warnings = True
        is_email = False
        link = ""
        login = ""
        email = ""
        password = ""
        xpath = ""
        price = 0
        time = 60
        if self.lineEdit_email.text() == "":
            self.lineEdit_email.setStyleSheet(styles.lineEdit_warning)
            no_warnings = False
        else:
            self.lineEdit_email.setStyleSheet(styles.lineEdit)
            email = self.lineEdit_email.text()
            for symbol in email:
                if symbol == '@':
                    is_email = True
            if not is_email:
                self.lineEdit_email.setStyleSheet(styles.lineEdit_warning)
                no_warnings = False
        if self.lineEdit_login.text() == "":
            self.lineEdit_login.setStyleSheet(styles.lineEdit_warning)
            no_warnings = False
        else:
            self.lineEdit_login.setStyleSheet(styles.lineEdit)
            login = self.lineEdit_login.text()
        if self.lineEdit_link.text() == "":
            self.lineEdit_link.setStyleSheet(styles.lineEdit_warning)
            no_warnings = False
        else:
            self.lineEdit_link.setStyleSheet(styles.lineEdit)
            link = self.lineEdit_link.text()

        if self.lineEdit_password.text() == "":
            self.lineEdit_password.setStyleSheet(styles.lineEdit_warning)
            no_warnings = False
        else:
            self.lineEdit_password.setStyleSheet(styles.lineEdit)
            password = self.lineEdit_password.text()

        if self.lineEdit_price.text() == "":
            self.lineEdit_price.setStyleSheet(styles.lineEdit_warning)
            no_warnings = False
        else:
            self.lineEdit_price.setStyleSheet(styles.lineEdit)
            price = float(self.lineEdit_price.text())

        if self.lineEdit_xpath.text() == "":
            self.lineEdit_xpath.setStyleSheet(styles.lineEdit_warning)
            no_warnings = False
        else:
            self.lineEdit_xpath.setStyleSheet(styles.lineEdit)
            xpath = self.lineEdit_xpath.text()

        if self.lineEdit_time.text() == "":
            self.lineEdit_time.setStyleSheet(styles.lineEdit_warning)
            no_warnings = False
        else:
            self.lineEdit_time.setStyleSheet(styles.lineEdit)
            time = int(self.lineEdit_time.text())

        if no_warnings:
            self.lineEdit_login.clear()
            self.lineEdit_password.clear()
            self.lineEdit_email.clear()
            self.lineEdit_link.clear()
            self.lineEdit_price.clear()
            self.lineEdit_xpath.clear()
            self.lineEdit_time.clear()
            try:
                data.add_monitored_elements(login, email, password, link,
                                            price, xpath, time, is_monitoring)
                self.shared_dict['isTerminatedP2'] = True
            except InvalidArgumentException:
                self.set_info_text("Warning. Wrong link submitted", True)
            except KeyError:
                self.set_info_text("Error. This page has already monitored",
                                   True)
            else:
                self.set_info_text("Info. Object was successfully added",
                                   False)
                self.lineEdit_login.setText(self.auto_login)
                self.lineEdit_password.setText(self.auto_pwd)
                self.lineEdit_email.setText(self.auto_email)
                self.lineEdit_time.setText(self.auto_time)
                self.lineEdit_link.clear()
                self.lineEdit_price.clear()
                self.lineEdit_xpath.clear()
        else:
            self.set_info_text("Warning. Fill all field properly", True)
        return data.get_element(link)

    # def on_monitor(self):
    #     new_price = monitoring.check_if_price_lower(self.label_link, self.label_xpath, self.label_price, self.label_time)
    #     email_send.send_email(self.label_email, self.label_link, new_price)

    def set_info_text(self, text, is_warning):
        self.label_info.setText(text)
        if is_warning:
            self.label_info.setStyleSheet(styles.label_info_wrong)
        else:
            self.label_info.setStyleSheet(styles.label_info_right)
        self.timer.setInterval(5000)
        self.timer.timeout.connect(lambda: self.label_info.setText(""))
        self.timer.start()
    def __init__(self):
        super(Translate, self).__init__()
        self.resize(640, 480)
        self.setMinimumSize(640, 480)
        self.setMaximumSize(640, 480)
        self.setWindowTitle('Translate')
        self.setWindowIcon(QIcon('arti.PNG'))

        self.setFont(QFont('Roboto', 12))

        palette = QPalette()
        palette.setColor(palette.Window, QColor('#000000'))
        palette.setColor(palette.WindowText, QColor('#FFFFFF'))
        palette.setColor(palette.Button, QColor("#00FF00"))
        palette.setColor(palette.ButtonText, QColor("#000000"))
        self.setPalette(palette)

        self.menubar = QMenuBar(self)
        self.menubar.setGeometry(0, 0, 682, 21)
        self.menubar.setFont(QFont('Roboto', 10))

        self.date_menu = QMenu(self.menubar)
        self.date_menu.setTitle(str(datetime.now().strftime('%d-%m-%Y')))

        self.setMenuBar(self.menubar)
        self.menubar.addAction(self.date_menu.menuAction())

        self.label = QLabel(self)
        self.label.setGeometry(QRect(0, 40, 631, 91))
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setText(
            'Welcome to Translate \n Tip: The language for text you enter below is always English.'
        )

        self.to_translate = QLineEdit(self)
        self.to_translate.setGeometry(QRect(10, 180, 611, 41))
        self.to_translate.setPlaceholderText('Initial Text:')

        self.label_2 = QLabel(self)
        self.label_2.setGeometry(QRect(10, 270, 151, 31))
        self.label_2.setText('Select Language -->')

        self.translate_button = QPushButton(self)
        self.translate_button.setGeometry(QRect(400, 260, 191, 51))
        self.translate_button.setCursor(QCursor(Qt.PointingHandCursor))
        self.translate_button.setText('Let\'s Translate!!')
        self.translate_button.clicked.connect(lambda: self.button_press())

        self.translated_text = QLabel(self)
        self.translated_text.setGeometry(QRect(20, 350, 601, 71))
        self.translated_text.setAlignment(Qt.AlignCenter)
        self.translated_text.setWordWrap(True)

        self.language = QComboBox(self)
        self.language.addItem("None")
        self.language.addItem("Afrikaans")  # 1
        self.language.addItem("Albanian")  # 2
        self.language.addItem("Amharic")  # 3
        self.language.addItem("Arabic")  # 4
        self.language.addItem("Armenian")  # 5
        self.language.addItem("Azerbaijani")  # 6
        self.language.addItem("Basque")  # 7
        self.language.addItem("Belarusian")  # 8
        self.language.addItem("Bengali")  # 9
        self.language.addItem("Bosnian")  # 10
        self.language.addItem("Bulgarian")  # 11
        self.language.addItem("Catalan")  # 12
        self.language.addItem("Cebuano")  # 13
        self.language.addItem("Chinese (Simplified)")  # 14
        self.language.addItem("Chinese (Traditional)")  # 15
        self.language.addItem("Corsican")  # 16
        self.language.addItem("Croatian")  # 17
        self.language.addItem("Czech")  # 18
        self.language.addItem("Danish")  # 19
        self.language.addItem("Dutch")  # 20
        self.language.addItem("English")  # 21
        self.language.addItem("Esperanto")  # 22
        self.language.addItem("Estonian")  # 23
        self.language.addItem("Finnish")  # 24
        self.language.addItem("French")  # 25
        self.language.addItem("Frisian")  # 26
        self.language.addItem("Galician")  # 27
        self.language.addItem("Georgian")  # 28
        self.language.addItem("German")  # 29
        self.language.addItem("Greek")  # 30
        self.language.addItem("Gujarati")  # 31
        self.language.addItem("Haitian Creole")  # 32
        self.language.addItem("Hausa")  # 33
        self.language.addItem("Hawaiian")  # 34
        self.language.addItem("Hebrew")  # 35
        self.language.addItem("Hindi")  # 36
        self.language.addItem("Hmong")  # 37
        self.language.addItem("Hungarian")  # 38
        self.language.addItem("Icelandic")  # 39
        self.language.addItem("Igbo")  # 40
        self.language.addItem("Indonesian")  # 41
        self.language.addItem("Irish")  # 42
        self.language.addItem("Italian")  # 43
        self.language.addItem("Japanese")  # 44
        self.language.addItem("Javanese")  # 45
        self.language.addItem("Kannada")  # 46
        self.language.addItem("Kazakh")  # 47
        self.language.addItem("Khmer")  # 48
        self.language.addItem("Kinyarwanda")  # 49
        self.language.addItem("Korean")  # 50
        self.language.addItem("Kurdish")  # 51
        self.language.addItem("Kyrgyz")  # 52
        self.language.addItem("Lao")  # 53
        self.language.addItem("Latin")  # 54
        self.language.addItem("Latvian")  # 55
        self.language.addItem("Lithuanian")  # 56
        self.language.addItem("Luxembourgish")  # 57
        self.language.addItem("Macedonian")  # 58
        self.language.addItem("Malagasy")  # 59
        self.language.addItem("Malay")  # 60
        self.language.addItem("Malayalam")  # 61
        self.language.addItem("Maltese")  # 62
        self.language.addItem("Maori")  # 63
        self.language.addItem("Marathi")  # 64
        self.language.addItem("Mongolian")  # 65
        self.language.addItem("Mayanmar (Burmese)")  # 66
        self.language.addItem("Nepali")  # 67
        self.language.addItem("Norwegian")  # 68
        self.language.addItem("Nyanja (Chichewa)")  # 69
        self.language.addItem("Odia (Oriya)")  # 70
        self.language.addItem("Pashto")  # 71
        self.language.addItem("Persian")  # 72
        self.language.addItem("Polish")  # 73
        self.language.addItem("Portugese (Portugal, Brazil)")  # 74
        self.language.addItem("Punjabi")  # 75
        self.language.addItem("Romanian")  # 76
        self.language.addItem("Russian")  # 77
        self.language.addItem("Samoan")  # 78
        self.language.addItem("Scots Gaelic")  # 79
        self.language.addItem("Serbian")  # 80
        self.language.addItem("Sesotho")  # 81
        self.language.addItem("Shona")  # 82
        self.language.addItem("Sindhi")  # 83
        self.language.addItem("Sinhala (Sinhalese)")  # 84
        self.language.addItem("Slovak")  # 85
        self.language.addItem("Slovenian")  # 86
        self.language.addItem("Somali")  # 87
        self.language.addItem("Spanish")  # 88
        self.language.addItem("Sundanese")  # 89
        self.language.addItem("Swahili")  # 90
        self.language.addItem("Swedish")  # 91
        self.language.addItem("Tagalong (Filipino)")  # 92
        self.language.addItem("Tajik")  # 93
        self.language.addItem("Tamil")  # 94
        self.language.addItem("Tatar")  # 95
        self.language.addItem("Telugu")  # 96
        self.language.addItem("Thai")  # 97
        self.language.addItem("Turkish")  # 98
        self.language.addItem("Turkmen")  # 99
        self.language.addItem("Ukrainian")  # 100
        self.language.addItem("Urdu")  # 101
        self.language.addItem("Uyghur")  # 102
        self.language.addItem("Uzbek")  # 103
        self.language.addItem("Vietnamese")  # 104
        self.language.addItem("Welsh")  # 105
        self.language.addItem("Xhosa")  # 106
        self.language.addItem("Yiddish")  # 107
        self.language.addItem("Yoruba")  # 108
        self.language.addItem("Zulu")  # 109
        self.language.setGeometry(QRect(180, 270, 171, 31))
        QMetaObject.connectSlotsByName(self)
Example #29
0
class MainWindow(QMainWindow):
    """Provides the parent window that includes the BookmarkWidget,
    BrowserTabWidget, and a DownloadWidget, to offer the complete
    web browsing experience."""
    def __init__(self):
        super(MainWindow, self).__init__()

        self.setWindowTitle('PySide2 tabbed browser Example')

        self._tab_widget = BrowserTabWidget(create_main_window_with_browser)
        self._tab_widget.enabled_changed.connect(self._enabled_changed)
        self._tab_widget.download_requested.connect(self._download_requested)
        self.setCentralWidget(self._tab_widget)
        self.connect(self._tab_widget, QtCore.SIGNAL("url_changed(QUrl)"),
                     self.url_changed)

        self._bookmark_dock = QDockWidget()
        self._bookmark_dock.setWindowTitle('Bookmarks')
        self._bookmark_widget = BookmarkWidget()
        self._bookmark_widget.open_bookmark.connect(self.load_url)
        self._bookmark_widget.open_bookmark_in_new_tab.connect(self.load_url_in_new_tab)
        self._bookmark_dock.setWidget(self._bookmark_widget)
        self.addDockWidget(Qt.LeftDockWidgetArea, self._bookmark_dock)

        self._find_tool_bar = None

        self._actions = {}
        self._create_menu()

        self._tool_bar = QToolBar()
        self.addToolBar(self._tool_bar)
        for action in self._actions.values():
            if not action.icon().isNull():
                self._tool_bar.addAction(action)

        self._addres_line_edit = QLineEdit()
        self._addres_line_edit.setClearButtonEnabled(True)
        self._addres_line_edit.returnPressed.connect(self.load)
        self._tool_bar.addWidget(self._addres_line_edit)
        self._zoom_label = QLabel()
        self.statusBar().addPermanentWidget(self._zoom_label)
        self._update_zoom_label()

        self._bookmarksToolBar = QToolBar()
        self.addToolBar(Qt.TopToolBarArea, self._bookmarksToolBar)
        self.insertToolBarBreak(self._bookmarksToolBar)
        self._bookmark_widget.changed.connect(self._update_bookmarks)
        self._update_bookmarks()

    def _update_bookmarks(self):
        self._bookmark_widget.populate_tool_bar(self._bookmarksToolBar)
        self._bookmark_widget.populate_other(self._bookmark_menu, 3)

    def _create_menu(self):
        file_menu = self.menuBar().addMenu("&File")
        exit_action = QAction(QIcon.fromTheme("application-exit"), "E&xit",
                             self, shortcut = "Ctrl+Q", triggered=qApp.quit)
        file_menu.addAction(exit_action)

        navigation_menu = self.menuBar().addMenu("&Navigation")

        style_icons = ':/qt-project.org/styles/commonstyle/images/'
        back_action = QAction(QIcon.fromTheme("go-previous",
                                             QIcon(style_icons + 'left-32.png')),
                             "Back", self,
                             shortcut = QKeySequence(QKeySequence.Back),
                             triggered = self._tab_widget.back)
        self._actions[QWebEnginePage.Back] = back_action
        back_action.setEnabled(False)
        navigation_menu.addAction(back_action)
        forward_action = QAction(QIcon.fromTheme("go-next",
                                                QIcon(style_icons + 'right-32.png')),
                                "Forward", self,
                                shortcut = QKeySequence(QKeySequence.Forward),
                                triggered = self._tab_widget.forward)
        forward_action.setEnabled(False)
        self._actions[QWebEnginePage.Forward] = forward_action

        navigation_menu.addAction(forward_action)
        reload_action = QAction(QIcon(style_icons + 'refresh-32.png'),
                               "Reload", self,
                               shortcut = QKeySequence(QKeySequence.Refresh),
                               triggered = self._tab_widget.reload)
        self._actions[QWebEnginePage.Reload] = reload_action
        reload_action.setEnabled(False)
        navigation_menu.addAction(reload_action)

        navigation_menu.addSeparator()

        new_tab_action = QAction("New Tab", self,
                             shortcut = 'Ctrl+T',
                             triggered = self.add_browser_tab)
        navigation_menu.addAction(new_tab_action)

        close_tab_action = QAction("Close Current Tab", self,
                                 shortcut = "Ctrl+W",
                                 triggered = self._close_current_tab)
        navigation_menu.addAction(close_tab_action)

        edit_menu = self.menuBar().addMenu("&Edit")

        find_action = QAction("Find", self,
                             shortcut = QKeySequence(QKeySequence.Find),
                             triggered = self._show_find)
        edit_menu.addAction(find_action)

        edit_menu.addSeparator()
        undo_action = QAction("Undo", self,
                             shortcut = QKeySequence(QKeySequence.Undo),
                             triggered = self._tab_widget.undo)
        self._actions[QWebEnginePage.Undo] = undo_action
        undo_action.setEnabled(False)
        edit_menu.addAction(undo_action)

        redo_action = QAction("Redo", self,
                             shortcut = QKeySequence(QKeySequence.Redo),
                             triggered = self._tab_widget.redo)
        self._actions[QWebEnginePage.Redo] = redo_action
        redo_action.setEnabled(False)
        edit_menu.addAction(redo_action)

        edit_menu.addSeparator()

        cut_action = QAction("Cut", self,
                            shortcut = QKeySequence(QKeySequence.Cut),
                            triggered = self._tab_widget.cut)
        self._actions[QWebEnginePage.Cut] = cut_action
        cut_action.setEnabled(False)
        edit_menu.addAction(cut_action)

        copy_action = QAction("Copy", self,
                             shortcut = QKeySequence(QKeySequence.Copy),
                             triggered = self._tab_widget.copy)
        self._actions[QWebEnginePage.Copy] = copy_action
        copy_action.setEnabled(False)
        edit_menu.addAction(copy_action)

        paste_action = QAction("Paste", self,
                             shortcut = QKeySequence(QKeySequence.Paste),
                             triggered = self._tab_widget.paste)
        self._actions[QWebEnginePage.Paste] = paste_action
        paste_action.setEnabled(False)
        edit_menu.addAction(paste_action)

        edit_menu.addSeparator()

        select_all_action = QAction("Select All", self,
                                  shortcut = QKeySequence(QKeySequence.SelectAll),
                                  triggered = self._tab_widget.select_all)
        self._actions[QWebEnginePage.SelectAll] = select_all_action
        select_all_action.setEnabled(False)
        edit_menu.addAction(select_all_action)

        self._bookmark_menu = self.menuBar().addMenu("&Bookmarks")
        add_bookmark_action = QAction("&Add Bookmark", self,
                                    triggered = self._add_bookmark)
        self._bookmark_menu.addAction(add_bookmark_action)
        add_tool_bar_bookmark_action = QAction("&Add Bookmark to Tool Bar", self,
                                           triggered = self._add_tool_bar_bookmark)
        self._bookmark_menu.addAction(add_tool_bar_bookmark_action)
        self._bookmark_menu.addSeparator()

        tools_menu = self.menuBar().addMenu("&Tools")
        download_action = QAction("Open Downloads", self,
                                 triggered = DownloadWidget.open_download_directory)
        tools_menu.addAction(download_action)

        window_menu = self.menuBar().addMenu("&Window")

        window_menu.addAction(self._bookmark_dock.toggleViewAction())

        window_menu.addSeparator()

        zoom_in_action = QAction(QIcon.fromTheme("zoom-in"),
                               "Zoom In", self,
                               shortcut = QKeySequence(QKeySequence.ZoomIn),
                               triggered = self._zoom_in)
        window_menu.addAction(zoom_in_action)
        zoom_out_action = QAction(QIcon.fromTheme("zoom-out"),
                                "Zoom Out", self,
                                shortcut = QKeySequence(QKeySequence.ZoomOut),
                                triggered = self._zoom_out)
        window_menu.addAction(zoom_out_action)

        reset_zoom_action = QAction(QIcon.fromTheme("zoom-original"),
                                  "Reset Zoom", self,
                                  shortcut = "Ctrl+0",
                                  triggered = self._reset_zoom)
        window_menu.addAction(reset_zoom_action)

        about_menu = self.menuBar().addMenu("&About")
        about_action = QAction("About Qt", self,
                              shortcut = QKeySequence(QKeySequence.HelpContents),
                              triggered=qApp.aboutQt)
        about_menu.addAction(about_action)

    def add_browser_tab(self):
        return self._tab_widget.add_browser_tab()

    def _close_current_tab(self):
        if self._tab_widget.count() > 1:
            self._tab_widget.close_current_tab()
        else:
            self.close()

    def close_event(self, event):
        main_windows.remove(self)
        event.accept()

    def load(self):
        url_string = self._addres_line_edit.text().strip()
        if url_string:
            self.load_url_string(url_string)

    def load_url_string(self, url_s):
        url = QUrl.fromUserInput(url_s)
        if (url.isValid()):
            self.load_url(url)

    def load_url(self, url):
        self._tab_widget.load(url)

    def load_url_in_new_tab(self, url):
        self.add_browser_tab().load(url)

    def url_changed(self, url):
        self._addres_line_edit.setText(url.toString())

    def _enabled_changed(self, web_action, enabled):
        action = self._actions[web_action]
        if action:
            action.setEnabled(enabled)

    def _add_bookmark(self):
        index = self._tab_widget.currentIndex()
        if index >= 0:
            url = self._tab_widget.url()
            title = self._tab_widget.tabText(index)
            icon = self._tab_widget.tabIcon(index)
            self._bookmark_widget.add_bookmark(url, title, icon)

    def _add_tool_bar_bookmark(self):
        index = self._tab_widget.currentIndex()
        if index >= 0:
            url = self._tab_widget.url()
            title = self._tab_widget.tabText(index)
            icon = self._tab_widget.tabIcon(index)
            self._bookmark_widget.add_tool_bar_bookmark(url, title, icon)

    def _zoom_in(self):
        new_zoom = self._tab_widget.zoom_factor() * 1.5
        if (new_zoom <= WebEngineView.maximum_zoom_factor()):
            self._tab_widget.set_zoom_factor(new_zoom)
            self._update_zoom_label()

    def _zoom_out(self):
        new_zoom = self._tab_widget.zoom_factor() / 1.5
        if (new_zoom >= WebEngineView.minimum_zoom_factor()):
            self._tab_widget.set_zoom_factor(new_zoom)
            self._update_zoom_label()

    def _reset_zoom(self):
        self._tab_widget.set_zoom_factor(1)
        self._update_zoom_label()

    def _update_zoom_label(self):
        percent = int(self._tab_widget.zoom_factor() * 100)
        self._zoom_label.setText("{}%".format(percent))

    def _download_requested(self, item):
        # Remove old downloads before opening a new one
        for old_download in self.statusBar().children():
            if type(old_download).__name__ == 'download_widget' and \
                old_download.state() != QWebEngineDownloadItem.DownloadInProgress:
                self.statusBar().removeWidget(old_download)
                del old_download

        item.accept()
        download_widget = download_widget(item)
        download_widget.removeRequested.connect(self._remove_download_requested,
                                               Qt.QueuedConnection)
        self.statusBar().addWidget(download_widget)

    def _remove_download_requested(self):
            download_widget = self.sender()
            self.statusBar().removeWidget(download_widget)
            del download_widget

    def _show_find(self):
        if self._find_tool_bar is None:
            self._find_tool_bar = FindToolBar()
            self._find_tool_bar.find.connect(self._tab_widget.find)
            self.addToolBar(Qt.BottomToolBarArea, self._find_tool_bar)
        else:
            self._find_tool_bar.show()
        self._find_tool_bar.focus_find()

    def write_bookmarks(self):
        self._bookmark_widget.write_bookmarks()
Example #30
0
    def _create_reg(self, ind_list, name, width, color):
        # Create a widget to hold the register's bits
        reg_widget = QWidget(self)
        reg_layout = QVBoxLayout(reg_widget)
        reg_widget.setLayout(reg_layout)
        reg_layout.setSpacing(0)
        reg_layout.setMargin(0)

        # Create a widget to hold the register's label and value textbox
        label_value = QWidget(reg_widget)
        lv_layout = QHBoxLayout(label_value)
        label_value.setLayout(lv_layout)
        lv_layout.setSpacing(1)
        lv_layout.setMargin(0)
        reg_layout.addWidget(label_value)

        # Create a label to show the register's name
        reg_label = QLabel(name, label_value)
        reg_label.setAlignment(Qt.AlignCenter)
        font = reg_label.font()
        font.setPointSize(8)
        reg_label.setFont(font)
        lv_layout.addWidget(reg_label)

        # Create a textbox to show the register's value in octal
        n_digits = int((width + 2) / 3)
        if n_digits == 1:
            value_width = 25
        elif n_digits == 2:
            value_width = 30
        else:
            value_width = 45

        reg_value = QLineEdit(label_value)
        reg_value.setReadOnly(True)
        reg_value.setMaximumSize(value_width, 32)
        reg_value.setText(n_digits * '0')
        font = QFont('Monospace')
        font.setStyleHint(QFont.TypeWriter)
        font.setPointSize(10)
        reg_value.setFont(font)
        reg_value.setAlignment(Qt.AlignCenter)
        lv_layout.addWidget(reg_value)

        # Create a frame to hold the register's bits
        bit_frame = QFrame(reg_widget)
        bit_layout = QHBoxLayout(bit_frame)
        bit_layout.setSpacing(1)
        bit_layout.setMargin(0)
        bit_frame.setLayout(bit_layout)
        bit_frame.setFrameStyle(QFrame.StyledPanel | QFrame.Raised)

        # Add indicators for each bit in the register, from MSB to LSB
        for i in range(width, 0, -1):
            ind = Indicator(bit_frame, color)
            ind.setFixedSize(20, 32)
            bit_layout.addWidget(ind)
            ind_list.insert(0, ind)

            # Add separators between each group of 3 bits
            if (i > 1) and ((i % 3) == 1):
                sep = QFrame(bit_frame)
                sep.setFrameStyle(QFrame.VLine | QFrame.Raised)
                bit_layout.addWidget(sep)

        reg_layout.addWidget(bit_frame)

        return reg_widget, reg_value
Example #31
0
    def __init__(self):
        super().__init__()
        self.setWindowTitle('输出.srt时间轴文件')
        self.resize(550, 350)
        self.layout = QGridLayout()
        self.setLayout(self.layout)

        self.startPos = QTimeEdit()
        self.startPos.setDisplayFormat('hh:mm:ss.zzz')
        self.layout.addWidget(QLabel('开始位置'), 0, 0, 1, 3)
        self.layout.addWidget(self.startPos, 0, 2, 1, 3)

        self.endPos = QTimeEdit()
        self.endPos.setDisplayFormat('hh:mm:ss.zzz')
        self.layout.addWidget(QLabel('结束位置'), 0, 6, 1, 3)
        self.layout.addWidget(self.endPos, 0, 8, 1, 3)

        self.timeMarkType = QComboBox()
        self.timeMarkType.addItems(['相对时间', '绝对时间'])
        self.layout.addWidget(QLabel('记录方式'), 1, 0, 1, 3)
        self.layout.addWidget(self.timeMarkType, 1, 2, 1, 3)

        self.offset = QTimeEdit()
        self.offset.setDisplayFormat('hh:mm:ss.zzz')
        self.layout.addWidget(QLabel('时间轴偏移'), 1, 6, 1, 4)
        self.layout.addWidget(self.offset, 1, 8, 1, 3)

        self.layout.addWidget(QLabel('最大无效时长(毫秒)'), 2, 0, 1, 6)
        self.maxIgnore = QLineEdit()
        self.layout.addWidget(self.maxIgnore, 2, 4, 1, 4)
        self.maxIgnore.setText("100")

        self.layout.addWidget(QLabel('最大合并间隔(毫秒)'), 3, 0, 1, 6)
        self.maxMerge = QLineEdit()
        self.layout.addWidget(self.maxMerge, 3, 4, 1, 4)
        self.maxMerge.setText("100")

        self.mergeOrIgnore = QComboBox()
        self.mergeOrIgnore.addItems(['优先合并', '优先忽略'])
        self.layout.addWidget(QLabel('合并&忽略优先设置'), 4, 0, 1, 6)
        self.layout.addWidget(self.mergeOrIgnore, 4, 4, 1, 3)

        self.isExportUnnumbering = QCheckBox()
        self.layout.addWidget(self.isExportUnnumbering, 5, 0, 1, 1)
        self.layout.addWidget(QLabel('同时导出无编号.srt文件'), 5, 1, 1, 6)

        self.saveDir = QLineEdit()
        self.layout.addWidget(self.saveDir, 6, 0, 1, 6)
        self.setPath = QPushButton('保存位置')
        self.layout.addWidget(self.setPath, 6, 6, 1, 1)
        self.setPath.clicked.connect(self.choosePath)

        self.exportSrt = QPushButton('导出文件')
        self.cancel = QPushButton('取消')
        self.help = QPushButton('帮助')
        self.layout.addWidget(self.exportSrt, 7, 0, 1, 2)
        self.layout.addWidget(self.cancel, 7, 2, 1, 2)
        self.layout.addWidget(self.help, 7, 4, 1, 2)
        self.exportSrt.clicked.connect(self.execExportSrt)

        self.cancel.clicked.connect(self.closeWindow)
        self.help.clicked.connect(self.dispHelp)
Example #32
0
class InstructionRegister(QWidget):
    def __init__(self, parent, usbif, color):
        super().__init__(parent)
        self._br_inds = []
        self._st_inds = []
        self._sq_inds = []
        self._status_inds = {}

        self._setup_ui(color)

        usbif.poll(um.ReadMonRegI())
        usbif.poll(um.ReadMonRegStatus())
        usbif.poll(um.ReadStatusPeripheral())

        usbif.listen(self)

    def handle_msg(self, msg):
        if isinstance(msg, um.MonRegI):
            self.set_i_values(msg.br, msg.st, msg.sqext, msg.sq)
        elif isinstance(msg, um.MonRegStatus):
            self._status_inds['iip'].set_on(msg.iip)
            self._status_inds['inhl'].set_on(msg.inhl)
            self._status_inds['inkl'].set_on(msg.inkl)
        elif isinstance(msg, um.StatusPeripheral):
            self._status_inds['ld'].set_on(msg.ld)
            self._status_inds['chld'].set_on(msg.chld)
            self._status_inds['rd'].set_on(msg.rd)
            self._status_inds['chrd'].set_on(msg.chrd)

    def set_i_values(self, br, st, sqext, sq):
        self._set_reg_value(self._br_inds, self._br_value, br)
        self._set_reg_value(self._st_inds, self._st_value, st)
        self._set_reg_value(self._sq_inds, self._sq_value, (sqext << 5) | sq)
        self._inst_value.setText(agc.disassemble_subinst(sqext, sq, st))

    def _setup_ui(self, color):
        # Set up our basic layout
        layout = QHBoxLayout(self)
        self.setLayout(layout)
        layout.setSpacing(3)
        layout.setMargin(1)

        # Construct register groups for BR, ST, and SQ
        br_frame, self._br_value = self._create_reg(self._br_inds, 'BR', 2,
                                                    color)
        st_frame, self._st_value = self._create_reg(self._st_inds, 'ST', 3,
                                                    color)
        sq_frame, self._sq_value = self._create_reg(self._sq_inds, 'SQ', 7,
                                                    color)
        layout.addWidget(br_frame)
        layout.addWidget(st_frame)
        layout.addWidget(sq_frame)

        stat_group = QWidget(self)
        layout.addWidget(stat_group)
        stat_layout = QGridLayout(stat_group)
        stat_layout.setMargin(0)
        stat_layout.setSpacing(0)

        col = 0
        for name, label in STATUS_INDS.items():
            self._status_inds[name] = self._create_status_light(
                label, stat_group, stat_layout, col)
            col += 1

        # Create a grouping widget for the I label and decoded instruction value box
        label_value = QWidget(self)
        lv_layout = QHBoxLayout(label_value)
        lv_layout.setSpacing(3)
        lv_layout.setMargin(1)
        lv_layout.setContentsMargins(0, 32, 0, 0)
        label_value.setLayout(lv_layout)
        layout.addWidget(label_value)

        # Create a value box for displaying the overall decoded instruction
        self._inst_value = QLineEdit(label_value)
        self._inst_value.setReadOnly(True)
        self._inst_value.setMaximumSize(65, 32)
        self._inst_value.setText('TC0')
        font = QFont('Monospace')
        font.setStyleHint(QFont.TypeWriter)
        font.setPointSize(10)
        self._inst_value.setFont(font)
        self._inst_value.setAlignment(Qt.AlignCenter)
        lv_layout.addWidget(self._inst_value)

        # Create a label to show 'I'
        label = QLabel('I', label_value)
        font = label.font()
        font.setPointSize(14)
        font.setBold(True)
        label.setFont(font)
        lv_layout.addWidget(label)

        # Add some spacing to account for lack of parity indicators
        layout.addSpacing(52)

    def _set_reg_value(self, inds, value_box, x):
        # Generic function to display in octal the value of a register, with the
        # appropriate number of digits
        for i in range(0, len(inds)):
            inds[i].set_on((x & (1 << i)) != 0)

        fmt_string = '%%0%oo' % int((len(inds) + 2) / 3)
        value_box.setText(fmt_string % x)

    def _create_reg(self, ind_list, name, width, color):
        # Create a widget to hold the register's bits
        reg_widget = QWidget(self)
        reg_layout = QVBoxLayout(reg_widget)
        reg_widget.setLayout(reg_layout)
        reg_layout.setSpacing(0)
        reg_layout.setMargin(0)

        # Create a widget to hold the register's label and value textbox
        label_value = QWidget(reg_widget)
        lv_layout = QHBoxLayout(label_value)
        label_value.setLayout(lv_layout)
        lv_layout.setSpacing(1)
        lv_layout.setMargin(0)
        reg_layout.addWidget(label_value)

        # Create a label to show the register's name
        reg_label = QLabel(name, label_value)
        reg_label.setAlignment(Qt.AlignCenter)
        font = reg_label.font()
        font.setPointSize(8)
        reg_label.setFont(font)
        lv_layout.addWidget(reg_label)

        # Create a textbox to show the register's value in octal
        n_digits = int((width + 2) / 3)
        if n_digits == 1:
            value_width = 25
        elif n_digits == 2:
            value_width = 30
        else:
            value_width = 45

        reg_value = QLineEdit(label_value)
        reg_value.setReadOnly(True)
        reg_value.setMaximumSize(value_width, 32)
        reg_value.setText(n_digits * '0')
        font = QFont('Monospace')
        font.setStyleHint(QFont.TypeWriter)
        font.setPointSize(10)
        reg_value.setFont(font)
        reg_value.setAlignment(Qt.AlignCenter)
        lv_layout.addWidget(reg_value)

        # Create a frame to hold the register's bits
        bit_frame = QFrame(reg_widget)
        bit_layout = QHBoxLayout(bit_frame)
        bit_layout.setSpacing(1)
        bit_layout.setMargin(0)
        bit_frame.setLayout(bit_layout)
        bit_frame.setFrameStyle(QFrame.StyledPanel | QFrame.Raised)

        # Add indicators for each bit in the register, from MSB to LSB
        for i in range(width, 0, -1):
            ind = Indicator(bit_frame, color)
            ind.setFixedSize(20, 32)
            bit_layout.addWidget(ind)
            ind_list.insert(0, ind)

            # Add separators between each group of 3 bits
            if (i > 1) and ((i % 3) == 1):
                sep = QFrame(bit_frame)
                sep.setFrameStyle(QFrame.VLine | QFrame.Raised)
                bit_layout.addWidget(sep)

        reg_layout.addWidget(bit_frame)

        return reg_widget, reg_value

    def _create_status_light(self, name, parent, layout, col):
        label = QLabel(name, parent)
        label.setAlignment(Qt.AlignBottom | Qt.AlignCenter)
        label.setFixedSize(30, 20)
        font = label.font()
        font.setPointSize(8)
        label.setFont(font)
        layout.addWidget(label, 1, col)
        layout.setAlignment(label, Qt.AlignBottom)

        # Add an indicator to show inhibit state
        ind = Indicator(parent, QColor(0, 255, 255))
        ind.setFixedSize(20, 20)
        layout.addWidget(ind, 2, col)
        layout.setAlignment(ind, Qt.AlignCenter)

        return ind
Example #33
0
    def __init__(self,
                 subtitles_name,
                 subtitles_delay,
                 subtitles_language,
                 subtitles_track_name,
                 subtitles_set_default,
                 subtitles_set_forced,
                 subtitles_default_value_delay,
                 subtitles_default_value_language,
                 subtitles_default_value_track_name,
                 subtitles_default_value_set_default,
                 subtitles_default_value_set_forced,
                 subtitle_set_default_disabled=False,
                 subtitle_set_forced_disabled=False,
                 disable_edit=False,
                 parent=None):
        super().__init__(parent)
        self.window_title = "Subtitle Info"
        self.state = "no"
        self.subtitles_count = len(subtitles_delay)

        self.messageIcon = QLabel()
        self.subtitle_tab_comboBox = InfoCellDialogTabComboBox(
            hint="Subtitles Groups")
        for i in range(self.subtitles_count):
            self.subtitle_tab_comboBox.addItem("Subtitle #" + str(i + 1))
        self.subtitle_tab_comboBox.setCurrentIndex(0)
        self.subtitle_tab_comboBox.currentIndexChanged.connect(
            self.update_current_subtitle_index)
        self.current_subtitle_index = 0

        self.disable_edit = disable_edit
        self.current_subtitle_name = subtitles_name
        self.current_subtitle_language = subtitles_language
        self.current_subtitle_delay = subtitles_delay
        self.current_subtitle_track_name = subtitles_track_name
        self.current_subtitle_set_default = subtitles_set_default
        self.current_subtitle_set_forced = subtitles_set_forced

        self.default_subtitle_language = subtitles_default_value_language
        self.default_subtitle_delay = subtitles_default_value_delay
        self.default_subtitle_track_name = subtitles_default_value_track_name
        self.default_subtitle_set_default = subtitles_default_value_set_default
        self.default_subtitle_set_forced = subtitles_default_value_set_forced

        self.subtitle_set_default_disabled = subtitle_set_default_disabled
        self.subtitle_set_forced_disabled = subtitle_set_forced_disabled

        self.subtitle_name_label = QLabel("Subtitle Name:")
        self.subtitle_name_value = QLabel(
            str(self.current_subtitle_name[self.current_subtitle_index]))
        width_to_be_fixed = 0
        for i in range(len(self.current_subtitle_name)):
            width_to_be_fixed = max(
                width_to_be_fixed,
                self.subtitle_name_value.fontMetrics().boundingRect(
                    self.current_subtitle_name[i]).width())
        self.subtitle_name_value.setFixedWidth(width_to_be_fixed + 10)
        self.subtitle_delay_label = QLabel("Subtitle Delay:")
        self.subtitle_delay_spin = QDoubleSpinBox()
        self.setup_subtitle_delay_spin()

        self.subtitle_language_label = QLabel("Subtitle Language:")
        self.subtitle_language_comboBox = QComboBox()
        self.setup_subtitle_language_comboBox()

        self.subtitle_track_name_label = QLabel("Subtitle Track Name:")
        self.subtitle_track_name_lineEdit = QLineEdit()
        self.setup_subtitle_track_name_lineEdit()

        self.subtitle_set_forced_label = QLabel("Subtitle Forced State:")
        self.subtitle_set_forced_checkBox = QCheckBox()
        self.setup_subtitle_set_forced_checkBox()

        self.subtitle_set_default_label = QLabel("Subtitle Default State:")
        self.subtitle_set_default_checkBox = QCheckBox()
        self.setup_subtitle_set_default_checkBox()

        self.yes_button = QPushButton("OK")
        self.no_button = QPushButton("Cancel")
        self.reset_button = QPushButton("Reset To Default")

        self.buttons_layout = QHBoxLayout()
        self.subtitle_delay_layout = QHBoxLayout()
        self.subtitle_language_layout = QHBoxLayout()
        self.subtitle_track_name_layout = QHBoxLayout()
        self.subtitle_set_default_layout = QHBoxLayout()
        self.subtitle_set_forced_layout = QHBoxLayout()
        self.buttons_layout.addWidget(QLabel(""), stretch=3)
        self.buttons_layout.addWidget(self.reset_button, stretch=2)
        self.buttons_layout.addWidget(self.yes_button, stretch=2)
        self.buttons_layout.addWidget(self.no_button, stretch=2)
        self.buttons_layout.addWidget(QLabel(""), stretch=3)
        self.subtitle_setting_layout = QGridLayout()
        self.subtitle_editable_setting_layout = QFormLayout()
        self.subtitle_editable_setting_layout.addRow(self.subtitle_name_label,
                                                     self.subtitle_name_value)
        self.subtitle_editable_setting_layout.addRow(
            self.subtitle_track_name_label, self.subtitle_track_name_lineEdit)
        self.subtitle_editable_setting_layout.addRow(
            self.subtitle_language_label, self.subtitle_language_comboBox)
        self.subtitle_editable_setting_layout.addRow(self.subtitle_delay_label,
                                                     self.subtitle_delay_spin)
        self.subtitle_editable_setting_layout.addRow(
            self.subtitle_set_default_label,
            self.subtitle_set_default_checkBox)
        self.subtitle_editable_setting_layout.addRow(
            self.subtitle_set_forced_label, self.subtitle_set_forced_checkBox)
        self.subtitle_setting_layout.addWidget(self.subtitle_tab_comboBox, 0,
                                               0)
        self.subtitle_setting_layout.addLayout(
            self.subtitle_editable_setting_layout, 1, 0, 5, 2)
        self.subtitle_setting_layout.addWidget(self.messageIcon, 1, 3, 5, -1)

        self.main_layout = QGridLayout()
        self.main_layout.addLayout(self.subtitle_setting_layout, 0, 0, 2, 3)
        self.main_layout.addLayout(self.buttons_layout, 2, 0, 1, -1)
        self.main_layout.setContentsMargins(20, 20, 20, 20)
        self.setLayout(self.main_layout)

        self.setup_ui()
        self.signal_connect()
Example #34
0
    def _setup_ui(self, color):
        # Set up our basic layout
        layout = QHBoxLayout(self)
        self.setLayout(layout)
        layout.setSpacing(3)
        layout.setMargin(1)

        # Construct register groups for BR, ST, and SQ
        br_frame, self._br_value = self._create_reg(self._br_inds, 'BR', 2,
                                                    color)
        st_frame, self._st_value = self._create_reg(self._st_inds, 'ST', 3,
                                                    color)
        sq_frame, self._sq_value = self._create_reg(self._sq_inds, 'SQ', 7,
                                                    color)
        layout.addWidget(br_frame)
        layout.addWidget(st_frame)
        layout.addWidget(sq_frame)

        stat_group = QWidget(self)
        layout.addWidget(stat_group)
        stat_layout = QGridLayout(stat_group)
        stat_layout.setMargin(0)
        stat_layout.setSpacing(0)

        col = 0
        for name, label in STATUS_INDS.items():
            self._status_inds[name] = self._create_status_light(
                label, stat_group, stat_layout, col)
            col += 1

        # Create a grouping widget for the I label and decoded instruction value box
        label_value = QWidget(self)
        lv_layout = QHBoxLayout(label_value)
        lv_layout.setSpacing(3)
        lv_layout.setMargin(1)
        lv_layout.setContentsMargins(0, 32, 0, 0)
        label_value.setLayout(lv_layout)
        layout.addWidget(label_value)

        # Create a value box for displaying the overall decoded instruction
        self._inst_value = QLineEdit(label_value)
        self._inst_value.setReadOnly(True)
        self._inst_value.setMaximumSize(65, 32)
        self._inst_value.setText('TC0')
        font = QFont('Monospace')
        font.setStyleHint(QFont.TypeWriter)
        font.setPointSize(10)
        self._inst_value.setFont(font)
        self._inst_value.setAlignment(Qt.AlignCenter)
        lv_layout.addWidget(self._inst_value)

        # Create a label to show 'I'
        label = QLabel('I', label_value)
        font = label.font()
        font.setPointSize(14)
        font.setBold(True)
        label.setFont(font)
        lv_layout.addWidget(label)

        # Add some spacing to account for lack of parity indicators
        layout.addSpacing(52)
Example #35
0
 def __init__(self, prop, parent=None):
     super().__init__(prop, parent)
     self.edit_widget = QLineEdit()
     self.add_subwidget(self.edit_widget)
     self.edit_widget.editingFinished.connect(self.on_text_edited)
Example #36
0
class Widget(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.items = 0

        # Example data
        self._data = {
            "Water": 24.5,
            "Electricity": 55.1,
            "Rent": 850.0,
            "Supermarket": 230.4,
            "Internet": 29.99,
            "Bars": 21.85,
            "Public transportation": 60.0,
            "Coffee": 22.45,
            "Restaurants": 120
        }

        # Left
        self.table = QTableWidget()
        self.table.setColumnCount(2)
        self.table.setHorizontalHeaderLabels(["Description", "Price"])
        self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        # Chart
        self.chart_view = QtCharts.QChartView()
        self.chart_view.setRenderHint(QPainter.Antialiasing)

        # Right
        self.description = QLineEdit()
        self.price = QLineEdit()
        self.add = QPushButton("Add")
        self.clear = QPushButton("Clear")
        self.quit = QPushButton("Quit")
        self.plot = QPushButton("Plot")

        # Disabling 'Add' button
        self.add.setEnabled(False)

        self.right = QVBoxLayout()
        self.right.setMargin(10)
        self.right.addWidget(QLabel("Description"))
        self.right.addWidget(self.description)
        self.right.addWidget(QLabel("Price"))
        self.right.addWidget(self.price)
        self.right.addWidget(self.add)
        self.right.addWidget(self.plot)
        self.right.addWidget(self.chart_view)
        self.right.addWidget(self.clear)
        self.right.addWidget(self.quit)

        # QWidget Layout
        self.layout = QHBoxLayout()

        #self.table_view.setSizePolicy(size)
        self.layout.addWidget(self.table)
        self.layout.addLayout(self.right)

        # Set the layout to the QWidget
        self.setLayout(self.layout)

        # Signals and Slots
        self.add.clicked.connect(self.add_element)
        self.quit.clicked.connect(self.quit_application)
        self.plot.clicked.connect(self.plot_data)
        self.clear.clicked.connect(self.clear_table)
        self.description.textChanged[str].connect(self.check_disable)
        self.price.textChanged[str].connect(self.check_disable)

        # Fill example data
        self.fill_table()

    @Slot()
    def add_element(self):
        des = self.description.text()
        price = self.price.text()

        self.table.insertRow(self.items)
        description_item = QTableWidgetItem(des)
        price_item = QTableWidgetItem("{:.2f}".format(float(price)))
        price_item.setTextAlignment(Qt.AlignRight)

        self.table.setItem(self.items, 0, description_item)
        self.table.setItem(self.items, 1, price_item)

        self.description.setText("")
        self.price.setText("")

        self.items += 1

    @Slot()
    def check_disable(self, s):
        if not self.description.text() or not self.price.text():
            self.add.setEnabled(False)
        else:
            self.add.setEnabled(True)

    @Slot()
    def plot_data(self):
        # Get table information
        series = QtCharts.QPieSeries()
        for i in range(self.table.rowCount()):
            text = self.table.item(i, 0).text()
            number = float(self.table.item(i, 1).text())
            series.append(text, number)

        chart = QtCharts.QChart()
        chart.addSeries(series)
        chart.legend().setAlignment(Qt.AlignLeft)
        self.chart_view.setChart(chart)

    @Slot()
    def quit_application(self):
        QApplication.quit()

    def fill_table(self, data=None):
        data = self._data if not data else data
        for desc, price in data.items():
            description_item = QTableWidgetItem(desc)
            price_item = QTableWidgetItem("{:.2f}".format(price))
            price_item.setTextAlignment(Qt.AlignRight)
            self.table.insertRow(self.items)
            self.table.setItem(self.items, 0, description_item)
            self.table.setItem(self.items, 1, price_item)
            self.items += 1

    @Slot()
    def clear_table(self):
        self.table.setRowCount(0)
        self.items = 0
Example #37
0
class PaperStatsPlots(PBDialog):
    """Class that constructs a window
    to show the results of `paperStats`
    """
    def __init__(self, fig, title=None, parent=None):
        """Constructor.
        Defines some properties and buttons

        Parameters:
            fig: the figure to be shown
            title (optional): the window title
            parent (default None): the parent object,
                which should have a property lastPaperStats
        """
        super(PaperStatsPlots, self).__init__(parent)
        self.fig = fig
        self.canvas = None
        if title is not None:
            self.setWindowTitle(title)
        layout = QGridLayout(self)
        layout.setSpacing(1)
        self.setLayout(layout)
        self.updatePlots()

        nlines = 1
        self.layout().addWidget(PBLabel(igstr.lineMoreInfo), nlines + 1, 0)

        self.textBox = QLineEdit("")
        self.textBox.setReadOnly(True)
        self.layout().addWidget(self.textBox, nlines + 2, 0, 1, 2)
        self.saveButton = QPushButton(igstr.save, self)
        self.saveButton.clicked.connect(self.saveAction)
        self.layout().addWidget(self.saveButton, nlines + 3, 0)

        self.clButton = QPushButton(igstr.close, self)
        self.clButton.clicked.connect(self.onClose)
        self.clButton.setAutoDefault(True)
        self.layout().addWidget(self.clButton, nlines + 3, 1)

    def onClose(self):
        """Close dialog"""
        QDialog.close(self)

    def saveAction(self):
        """Save the plot into a file,
        after asking the directory where to save them
        """
        savePath = askDirName(self, igstr.whereSavePlot)
        if savePath != "":
            try:
                self.parent().lastPaperStats["fig"] = pBStats.plotStats(
                    paper=True, save=True, path=savePath)
            except AttributeError:
                pBGUILogger.warning("", exc_info=True)
            else:
                infoMessage(igstr.plotSaved)
                self.saveButton.setDisabled(True)

    def pickEvent(self, event):
        """Save into `self.textBox` the coordinates
        of the clicked object (`Line2D`) in the plot.

        Parameter:
            a `matplotlib.backend_bases.Event`
        """
        ob = event.artist
        ix = -1
        if isinstance(ob, Line2D):
            xdata = ob.get_xdata()
            ydata = ob.get_ydata()
            ind = event.ind
            formatString = igstr.xInDateIsD
            self.textBox.setText(formatString % (
                igstr.citations,
                np.take(xdata, ind)[0].strftime(igstr.datefmt),
                np.take(ydata, ind)[0],
            ))

    def updatePlots(self):
        """Reset the dialog window removing all the previous items
        and create a new canvas for the figure.
        """
        i = 0
        while True:
            item = self.layout().takeAt(i)
            if item is None:
                break
            del item
        if hasattr(self, "canvas"):
            del self.canvas
        if self.fig is not None:
            self.canvas = FigureCanvas(self.fig)
            self.layout().addWidget(self.canvas, 0, 0, 1, 2)
            self.canvas.mpl_connect("pick_event", self.pickEvent)
            self.canvas.draw()
Example #38
0
 def testWithoutValidator(self):
     edit = QLineEdit()
     self.assertEqual(edit.text(), '')
     edit.insert('1')
     self.assertEqual(edit.text(), '1')
     edit.insert('a')
     self.assertEqual(edit.text(), '1a')
     edit.insert('2')
     self.assertEqual(edit.text(), '1a2')
Example #39
0
 def add_line(self, key):
     layout = QHBoxLayout()
     label = QLabel(self)
     name =str(key)
     label.setText(name)
     layout.addWidget(label)
     value = self.properties[key]
     if isinstance(value, (bool)):
         checkbox = QCheckBox(self)
         checkbox.setChecked(bool(value))
         layout.addWidget(checkbox)
         checkbox.stateChanged.connect(partial(self.update_value, key=key, type_func=bool))
         #self.connect(checkbox, QtCore.SIGNAL('stateChanged(int)'), partial(self.update_value, key=key, type_func=bool))
     elif isinstance(value, (int, float, complex)):
         value = str(value)
         line_edit = QLineEdit(self)
         line_edit.setText(value)
         layout.addWidget(line_edit)
         line_edit.textChanged.connect(partial(self.update_value, key=key, type_func=float))
         #self.connect(line_edit, QtCore.SIGNAL('textChanged(QString)'), partial(self.update_value, key=key, type_func=float))
     elif isinstance(value, (int)):
         value = str(value)
         line_edit = QLineEdit(self)
         line_edit.setText(value)
         layout.addWidget(line_edit)
         line_edit.textChanged.connect(partial(self.update_value, key=key, type_func=int))
         #self.connect(line_edit, QtCore.SIGNAL('textChanged(QString)'), partial(self.update_value, key=key, type_func=int))
     elif isinstance(value, (str)):
         value = str(value)
         line_edit = QLineEdit(self)
         line_edit.setText(value)
         layout.addWidget(line_edit)
         line_edit.textChanged.connect(partial(self.update_value, key=key, type_func=str))
         #self.connect(line_edit, QtCore.SIGNAL('textChanged(QString)'), partial(self.update_value, key=key, type_func=str))
     elif isinstance(value, dict):
         button = QPushButton(self)
         button.setText("Set Values")
         button.setObjectName(key)
         button.clicked.connect(self.update_dictionary)
         #self.connect(button, QtCore.SIGNAL("clicked()"), self.update_dictionary)
         layout.addWidget(button)
     self.settingsVerticalLayout.addLayout(layout)
Example #40
0
class InputWindow(QDialog):
    """Window where user can enter new data into a table.
       It returns the data formatted into a dictionary.
       platforms: the platforms from the currently loaded
                  collection."""

    def __init__(self, platforms, parent=None):
        super(InputWindow, self).__init__(parent=parent)

        self.setContentsMargins(5, 5, 5, 5)

        self._platforms = ['1292 Advanced Programmable Video System',
                           '3DO',
                           'APF MP1000/Imagination Machine',
                           'Acorn 32-bit',
                           'Adventure Vision',
                           'Alice 32/90',
                           'Altair 680',
                           'Altair 8800',
                           'Amazon Alexa',
                           'Amiga',
                           'Amiga CD32',
                           'Amstrad CPC',
                           'Amstrad PCW',
                           'Android',
                           'Apple I',
                           'Apple II',
                           'Apple IIgs',
                           'Arcade',
                           'Arcadia 2001',
                           'Arduboy',
                           'Astral 2000',
                           'Atari 2600',
                           'Atari 5200',
                           'Atari 7800',
                           'Atari 8-bit',
                           'Atari ST',
                           'Atom',
                           'BBC Micro',
                           'BREW',
                           'Bally Astrocade',
                           'BeOS',
                           'BlackBerry',
                           'Blu-ray Disc Player',
                           'Browser',
                           'Bubble',
                           'CD-i',
                           'CDTV',
                           'CP/M',
                           'Camputers Lynx',
                           'Casio Loopy',
                           'Casio PV-1000',
                           'ClickStart',
                           'Coleco Adam',
                           'ColecoVision',
                           'Colour Genie',
                           'Commodore 128',
                           'Commodore 16, Plus/4',
                           'Commodore 64',
                           'Commodore PET/CBM',
                           'Compal 80',
                           'Compucolor I',
                           'Compucolor II',
                           'Compucorp Programmable Calculator',
                           'CreatiVision',
                           'DOS',
                           'DVD Player',
                           'Dedicated console',
                           'Dedicated handheld',
                           'Didj',
                           'DoJa',
                           'Dragon 32/64',
                           'ECD Micromind',
                           'Electron',
                           'Enterprise',
                           'Epoch Cassette Vision',
                           'Epoch Game Pocket Computer',
                           'Epoch Super Cassette Vision',
                           'ExEn',
                           'Exelvision',
                           'Exidy Sorcerer',
                           'Fairchild Channel F',
                           'Famicom Disk System',
                           'FM Towns',
                           'FM-7',
                           'FRED/COSMAC',
                           'Fire OS',
                           'Freebox',
                           'GIMINI',
                           'GNEX',
                           'GP2X',
                           'GP2X Wiz',
                           'GP32',
                           'GVM',
                           'Galaksija',
                           'Game Boy',
                           'Game Boy Advance',
                           'Game Boy Color',
                           'Game Gear',
                           'Game Wave',
                           'Game.Com',
                           'GameCube',
                           'GameStick',
                           'Genesis',
                           'Gizmondo',
                           'Glulx',
                           'HD DVD Player',
                           'HP 9800',
                           'HP Programmable Calculator',
                           'Heath/Zenith H8/H89',
                           'Heathkit H11',
                           'Hitachi S1',
                           'Hugo',
                           'HyperScan',
                           'IBM 5100',
                           'Ideal-Computer',
                           'Intel 8008',
                           'Intel 8080',
                           'Intellivision',
                           'Interton Video 2000',
                           'J2ME',
                           'Jaguar',
                           'Jolt',
                           'Jupiter Ace',
                           'KIM-1',
                           'Kindle Classic',
                           'Laser 200',
                           'LaserActive',
                           'LeapFrog Explorer',
                           'LeapTV',
                           'Leapster',
                           'Linux',
                           'Lynx',
                           'MOS Technology 6502',
                           'MRE',
                           'MSX',
                           'MSX 2',
                           'Macintosh',
                           'Maemo',
                           'Mainframe',
                           'Mattel Aquarius',
                           'MeeGo',
                           'Mega Drive',
                           'Memotech MTX',
                           'Microbee',
                           'Microtan 65',
                           'Microvision',
                           'Mophun',
                           'Motorola 6800',
                           'Motorola 68k',
                           'N-Gage',
                           'N-Gage (service)',
                           'NES',
                           'Nascom',
                           'Neo Geo AES',
                           'Neo Geo CD',
                           'Neo Geo MVS',
                           'Neo Geo Pocket',
                           'Neo Geo Pocket Color',
                           'Neo Geo X',
                           'New Nintendo 3DS',
                           'NewBrain',
                           'Newton',
                           'Nintendo 3DS',
                           'Nintendo 64',
                           'Nintendo DS',
                           'Nintendo DSi',
                           'Nintendo Switch',
                           'North Star',
                           'Noval 760',
                           'Nuon',
                           'OS/2',
                           'Oculus Go',
                           'Oculus Quest',
                           'Odyssey',
                           'Odyssey 2',
                           'Ohio Scientific',
                           'OnLive',
                           'Orao',
                           'Oric',
                           'Ouya',
                           'PC Booter',
                           'PC-6001',
                           'PC-8000',
                           'PC-88',
                           'PC-98',
                           'PC-FX',
                           'PS Vita',
                           'PSP',
                           'Palm OS',
                           'Philips VG 5000',
                           'Photo CD',
                           'Pippin',
                           'PlayStation',
                           'PlayStation 2',
                           'PlayStation 3',
                           'PlayStation 4',
                           'Playdia',
                           'Pokémon Mini',
                           'Pokitto',
                           'Poly-88',
                           'RCA Studio II',
                           'Roku',
                           'SAM Coupé',
                           'SC/MP',
                           'SD-200/270/290',
                           'SEGA 32X',
                           'SEGA CD',
                           'SEGA Dreamcast',
                           'SEGA Master System',
                           'SEGA Pico',
                           'SEGA Saturn',
                           'SG-1000',
                           'SK-VM',
                           'SMC-777',
                           'SNES',
                           'SRI-500/1000',
                           'SWTPC 6800',
                           'Sharp MZ-80B/2000/2500',
                           'Sharp MZ-80K/700/800/1500',
                           'Sharp X1',
                           'Sharp X68000',
                           'Sharp Zaurus',
                           'Signetics 2650',
                           'Sinclair QL',
                           'Sol-20',
                           'Sord M5',
                           'Spectravideo',
                           'Stadia',
                           "Super A'can",
                           'SuperGrafx',
                           'Supervision',
                           'Symbian',
                           'TADS',
                           'TI Programmable Calculator',
                           'TI-99/4A',
                           'TIM',
                           'TRS-80',
                           'TRS-80 CoCo',
                           'TRS-80 MC-10',
                           'Taito X-55',
                           'Tatung Einstein',
                           'Tektronix 4050',
                           'Tele-Spiel ES-2201',
                           'Telstar Arcade',
                           'Terminal',
                           'Thomson MO',
                           'Thomson TO',
                           'Tiki 100',
                           'Timex Sinclair 2068',
                           'Tizen',
                           'Tomahawk F1',
                           'Tomy Tutor',
                           'TurboGrafx CD',
                           'TurboGrafx-16',
                           'V.Flash',
                           'V.Smile',
                           'VIC-20',
                           'VIS',
                           'Vectrex',
                           'VideoBrain',
                           'Videopac+ G7400',
                           'Virtual Boy',
                           'WIPI',
                           'Wang 2200',
                           'Wii',
                           'Wii U',
                           'Windows',
                           'Windows 3.x',
                           'Windows Apps',
                           'Windows Mobile',
                           'Windows Phone',
                           'WonderSwan',
                           'WonderSwan Color',
                           'XaviXPORT',
                           'Xbox',
                           'Xbox 360',
                           'Xbox One',
                           'Xerox Alto',
                           'Z-machine',
                           'ZX Spectrum',
                           'ZX Spectrum Next',
                           'ZX80',
                           'ZX81',
                           'Zeebo',
                           'Zilog Z80',
                           'Zilog Z8000',
                           'Zodiac',
                           'Zune',
                           'bada',
                           'digiBlast',
                           'iPad',
                           'iPhone',
                           'iPod Classic',
                           'tvOS',
                           'watchOS',
                           'webOS']

        # Add any platforms in user's collection that doesn't exist in the platform list
        for platform in platforms:
            if platform not in self._platforms:
                self._platforms.append(platform)
        self._platforms.sort()

        # For holding the internal platforms column's data
        self._platformsData = ""

        self._dataTypes = ["Game", "Console", "Accessory"]
        self._dataTypeLabel = QLabel("Type\t ")
        self._dataType = QComboBox()
        self._dataType.addItems(self._dataTypes)
        self._dataType.currentIndexChanged.connect(self._changeWidgets)

        self._nameLabel = QLabel("Name\t ")
        self._name = QLineEdit()
        self._name.textChanged.connect(self._changeWidgets)

        self._platformLabel = QLabel("Platform\t ")
        self._platform = QComboBox()
        self._platform.view().setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        self._platform.addItems(["", "(New platform)"])
        self._platform.addItems(self._platforms)
        self._platform.currentIndexChanged.connect(self._addPlatform)

        self._autofillButton = QPushButton("Autofill")
        self._autofillButton.clicked.connect(self._autofill)
        self._autofillButton.setEnabled(False)

        self._regionLabel = QLabel("Region\t ")
        self._region = QComboBox()
        self._region.addItems(["NTSC (JP)", "NTSC (NA)", "PAL"])

        self._countryLabel = QLabel("Country\t ")
        self._countryLabel.setEnabled(True)
        self._country = QLineEdit()
        self._country.setEnabled(True)

        self._publisherLabel = QLabel("Publisher\t")
        self._publisherLabel.setEnabled(True)
        self._publisher = QLineEdit()
        self._publisher.setEnabled(True)

        self._developerLabel = QLabel("Developer")
        self._developer = QLineEdit()
        self._developer.setEnabled(True)

        self._codeLabel = QLabel("Code\t ")
        self._code = QLineEdit()

        self._itemLabel = QLabel("Game")
        self._item = QCheckBox()

        self._boxLabel = QLabel("Box")
        self._box = QCheckBox()

        self._manualLabel = QLabel("Manual")
        self._manual = QCheckBox()

        self._yearLabel = QLabel("Year\t ")
        self._year = QLineEdit()

        self._genreLabel = QLabel("Genre\t ")
        self._genre = QLineEdit()

        self._paidLabel = QLabel("Paid price ")
        self._paid = QLineEdit("$0")

        self._commentLabel = QLabel("Comment")
        self._comment = QLineEdit()

        self._okButton = QPushButton()
        self._okButton.setText("OK")
        self._okButton.setMaximumSize(self._okButton.sizeHint())
        self._okButton.clicked.connect(self.accept)
        self._cnclButton = QPushButton()
        self._cnclButton.setText("Cancel")
        self._cnclButton.setMaximumSize(self._cnclButton.sizeHint())
        self._cnclButton.clicked.connect(self.reject)

        self._vbox = QVBoxLayout()
        self._vbox.addStretch()
        self._hboxType = QHBoxLayout()
        self._hboxType.addStretch()
        self._hboxName = QHBoxLayout()
        self._hboxName.addStretch()
        self._hboxPlatform = QHBoxLayout()
        self._hboxRegion = QHBoxLayout()
        self._hboxRegion.addStretch()
        self._hboxCode = QHBoxLayout()
        self._hboxCode.addStretch()
        self._hboxCountry = QHBoxLayout()
        self._hboxCountry.addStretch()
        self._hboxPublisher = QHBoxLayout()
        self._hboxDeveloper = QHBoxLayout()
        self._hboxBoxMan = QHBoxLayout()
        self._hboxYear = QHBoxLayout()
        self._hboxGenre = QHBoxLayout()
        self._hboxPaid = QHBoxLayout()
        self._hboxComment = QHBoxLayout()
        self._hboxComment.addStretch()
        self._hboxBtn = QHBoxLayout()
        self._hboxBtn.addStretch()

        self._hboxType.addWidget(self._dataTypeLabel, 0)
        self._hboxType.addWidget(self._dataType, 1)
        self._hboxName.addWidget(self._nameLabel, 0)
        self._hboxName.addWidget(self._name, 1)
        self._hboxPlatform.addWidget(self._platformLabel, 0)
        self._hboxPlatform.addWidget(self._platform, 1)
        self._hboxRegion.addWidget(self._regionLabel, 0)
        self._hboxRegion.addWidget(self._region, 1)
        self._hboxCountry.addWidget(self._countryLabel, 0)
        self._hboxCountry.addWidget(self._country, 1)
        self._hboxPublisher.addWidget(self._publisherLabel, 0)
        self._hboxPublisher.addSpacing(5)
        self._hboxPublisher.addWidget(self._publisher, 1)
        self._hboxDeveloper.addWidget(self._developerLabel, 0)
        self._hboxDeveloper.addWidget(self._developer, 1)
        self._hboxCode.addWidget(self._codeLabel, 0)
        self._hboxCode.addWidget(self._code, 1)
        self._hboxYear.addWidget(self._yearLabel, 0)
        self._hboxYear.addWidget(self._year, 1)
        self._hboxGenre.addWidget(self._genreLabel, 0)
        self._hboxGenre.addWidget(self._genre, 1)
        self._hboxPaid.addWidget(self._paidLabel, 0)
        self._hboxPaid.addWidget(self._paid, 1)
        self._hboxComment.addWidget(self._commentLabel, 0)
        self._hboxComment.addSpacing(2)
        self._hboxComment.addWidget(self._comment, 1)
        self._hboxBoxMan.addStretch(10)
        self._hboxBoxMan.addWidget(self._itemLabel, 0)
        self._hboxBoxMan.addWidget(self._item, 1)
        self._hboxBoxMan.addStretch(5)
        self._hboxBoxMan.addWidget(self._boxLabel, 2)
        self._hboxBoxMan.addWidget(self._box, 3)
        self._hboxBoxMan.addStretch(5)
        self._hboxBoxMan.addWidget(self._manualLabel, 4)
        self._hboxBoxMan.addWidget(self._manual, 5)
        self._hboxBoxMan.addStretch(10)
        self._hboxBtn.addWidget(self._autofillButton, 0, Qt.AlignLeft)
        self._hboxBtn.addStretch(10)
        self._hboxBtn.addWidget(self._okButton, 1)
        self._hboxBtn.addWidget(self._cnclButton, 2)

        self._vbox.addLayout(self._hboxType, 0)
        self._vbox.addLayout(self._hboxName, 1)
        self._vbox.addLayout(self._hboxPlatform, 2)
        self._vbox.addLayout(self._hboxRegion, 3)
        self._vbox.addLayout(self._hboxPublisher, 4)
        self._vbox.addLayout(self._hboxDeveloper, 5)
        self._vbox.addLayout(self._hboxCountry, 6)
        self._vbox.addLayout(self._hboxCode, 7)
        self._vbox.addLayout(self._hboxYear, 8)
        self._vbox.addLayout(self._hboxGenre, 9)
        self._vbox.addLayout(self._hboxPaid, 10)
        self._vbox.addLayout(self._hboxComment, 11)
        self._vbox.addLayout(self._hboxBoxMan, 12)
        self._vbox.addLayout(self._hboxBtn, 13)

        self.setLayout(self._vbox)

        self.setWindowTitle("Add to collection")
        self.setFixedSize(QSize(500, 340))
        self._center()

    def _addPlatform(self):
        if (self._platform.currentText() not in ("", "(New platform)") and
                self._name.text() != "" and not self._name.text().isspace()):
            self._autofillButton.setEnabled(True)
        else:
            self._autofillButton.setEnabled(False)

        if self._platform.currentText() == "(New platform)":
            while True:
                platform, ok = QInputDialog.getText(self, "Add platform", "Platform name:")
                if ok:
                    if platform == "" or platform.isspace():
                        self._displayMsgBox(0)
                    else:
                        lastIndex = self._platform.count()
                        self._platform.addItem(platform)
                        self._platform.setCurrentIndex(lastIndex)
                        break
                else:
                    break

    def _autofill(self):
        name = self._name.text()
        platform = self._platform.currentText()
        country = self._country.text()
        region = self._region.currentText()

        if name == "" or platform == "" or name.isspace() or platform.isspace():
            self._displayMsgBox(1)
        else:
            # Fill in missing info
            info = getMobyRelease(name, platform, region, country)
            if info["publisher"] == "":
                self._displayMsgBox(2)
                return

            publisher = info["publisher"]
            developer = info["developer"]
            platforms = info["platforms"]
            genre = info["genre"]
            code = info["code"]
            year = info["year"]

            if year == "" and code == "" and country != "":
                # Can't find release for country
                self._displayMsgBox(3)
            elif year == "" and code == "":
                # Can't find release at all
                self._displayMsgBox(4)
            else:
                self._year.setText(year)
                self._code.setText(code)
                self._genre.setText(genre)
                self._publisher.setText(publisher)
                self._developer.setText(developer)
                self._platformsData = platforms

    def _center(self):
        """Centers window on screen"""

        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def _changeWidgets(self):
        """Changes the label widgets based on what type of data is being entered"""

        if self._dataType.currentIndex() == 0:
            self._codeLabel.setEnabled(True)
            self._code.setEnabled(True)
            self._countryLabel.setEnabled(True)
            self._country.setEnabled(True)
            self._codeLabel.setText("Code\t ")
            self._itemLabel.setText("Game")
            self._genreLabel.setEnabled(True)
            self._genre.setEnabled(True)
            if (self._name.text() != "" and not self._name.text().isspace() and
                    self._platform.currentText() not in ("", "(New platform)")):
                self._autofillButton.setEnabled(True)
            else:
                self._autofillButton.setEnabled(False)
        elif self._dataType.currentIndex() == 1:
            self._codeLabel.setEnabled(True)
            self._code.setEnabled(True)
            self._countryLabel.setEnabled(True)
            self._country.setEnabled(True)
            self._codeLabel.setText("Serial No\t ")
            self._itemLabel.setText("Console")
            self._genreLabel.setEnabled(False)
            self._genre.setEnabled(False)
            self._autofillButton.setEnabled(False)
        elif self._dataType.currentIndex() == 2:
            self._countryLabel.setEnabled(True)
            self._country.setEnabled(True)
            self._codeLabel.setEnabled(False)
            self._code.setEnabled(False)
            self._itemLabel.setText("Accessory")
            self._genreLabel.setEnabled(False)
            self._genre.setEnabled(False)
            self._autofillButton.setEnabled(False)

    def _displayMsgBox(self, value: int, level=QMessageBox.Warning):
        titles = ["Invalid platform",
                  "Missing data",
                  "No title found",
                  "No info found for country",
                  "No info found"]
        messages = ["Can't add empty string or whitespace.",
                    "Please enter both a name and a platform.",
                    "Couldn't find any info on that title. Is the spelling and platform correct?",
                    "Couldn't find any info for that country. Is the region correct?",
                    "Sorry, couldn't find any info about this title."]

        msgBox = QMessageBox()
        msgBox.setIcon(level)
        msgBox.setWindowTitle(titles[value])
        msgBox.setText("<h2>" + titles[value] + "</h2>")
        msgBox.setInformativeText(messages[value])
        msgBox.exec_()

    def returnData(self):
        data = None

        if self._dataType.currentIndex() == 0:
            data = {"platform":     self._platform.currentText(),
                    "name":         self._name.text(),
                    "region":       self._region.currentText(),
                    "code":         self._code.text(),
                    "game":         "Yes" if self._item.isChecked() else "No",
                    "box":          "Yes" if self._box.isChecked() else "No",
                    "manual":       "Yes" if self._manual.isChecked() else "No",
                    "year":         self._year.text(),
                    "genre":        self._genre.text(),
                    "price":        ",".join((self._paid.text(), "$0", "$0", "$0")),
                    "comment":      self._comment.text(),
                    "publisher":    self._publisher.text(),
                    "developer":    self._developer.text(),
                    "platforms":    self._platformsData
                    }

        elif self._dataType.currentIndex() == 1:
            data = {"platform":         self._platform.currentText(),
                    "name":             self._name.text(),
                    "region":           self._region.currentText(),
                    "country":          self._country.text(),
                    "serial number":    self._code.text(),
                    "console":          "Yes" if self._item.isChecked() else "No",
                    "box":              "Yes" if self._box.isChecked() else "No",
                    "manual":           "Yes" if self._manual.isChecked() else "No",
                    "year":             self._year.text(),
                    "price":            ",".join((self._paid.text(), "$0", "$0", "$0")),
                    "comment":          self._comment.text()
                    }

        elif self._dataType.currentIndex() == 2:
            data = {"platform":     self._platform.currentText(),
                    "name":         self._name.text(),
                    "region":       self._region.currentText(),
                    "country":      self._country.text(),
                    "accessory":    "Yes" if self._item.isChecked() else "No",
                    "box":          "Yes" if self._box.isChecked() else "No",
                    "manual":       "Yes" if self._manual.isChecked() else "No",
                    "year":         self._year.text(),
                    "price":        ",".join((self._paid.text(), "$0", "$0", "$0")),
                    "comment":      self._comment.text()
                    }

        return data
Example #41
0
    def initialise(self):
        self.settingsFile = os.path.join(self.findNukeHomeDir(),
                                         "deadline_settings.ini")
        print("Loading settings: " + self.settingsFile)

        # Initialize the submission settings.
        self.settings = QSettings(self.settingsFile, QSettings.IniFormat)

        print("Grabbing submitter info...")
        try:
            dcOutput = CallDeadlineCommand([
                "-prettyJSON",
                "-GetSubmissionInfo",
                "Pools",
                "Groups",
                "MaxPriority",
                "TaskLimit",
                "UserHomeDir",
                "RepoDir:submission/Hiero/Main",
                "RepoDir:submission/Integration/Main",
            ],
                                           useDeadlineBg=True)
            output = json.loads(dcOutput, encoding="utf-8")
        except ValueError as e:
            print("Unable to get submitter info from Deadline:\n\n" +
                  e.message)
            raise

        if output["ok"]:
            self.submissionInfo = output["result"]
        else:
            raise ValueError(
                "DeadlineCommand returned a bad result and was unable to grab the submitter info.\n\n"
                + output["result"])

        # Get the Deadline temp directory.
        deadlineHome = self.submissionInfo["UserHomeDir"].strip()
        self.deadlineTemp = os.path.join(deadlineHome, "temp")

        self.integrationDir = self.submissionInfo["RepoDirs"][
            "submission/Integration/Main"].strip()

        # Get maximum priority.
        maximumPriority = self.submissionInfo["MaxPriority"]

        # Collect the pools and groups.
        pools = self.submissionInfo["Pools"]

        secondaryPools = [""]
        secondaryPools.extend(pools)

        groups = self.submissionInfo["Groups"]

        # Set up the other default arrays.
        onJobComplete = ("Nothing", "Archive", "Delete")
        nukeVersions = ("6.0", "6.1", "6.2", "6.3", "6.4", "7.0", "7.1", "7.2",
                        "7.3", "7.4", "8.0", "8.1", "8.2", "8.3", "8.4", "9.0",
                        "9.1", "9.2", "9.3", "9.4", "10.0", "10.1", "10.2",
                        "10.3", "10.4", "11.0", "11.1", "11.2", "11.3")
        buildsToForce = ("None", "32bit", "64bit")

        # Main Window
        mainWindow = hiero.ui.mainWindow()
        dialog = QDialog(mainWindow)
        self.dialog = dialog
        dialog.setWindowTitle("Submit to Deadline (and render with Nuke)")

        # Main Layout
        topLayout = QVBoxLayout()
        dialog.setLayout(topLayout)
        tabWidget = QTabWidget(dialog)

        jobTab = QWidget()
        jobTabLayout = QVBoxLayout()
        jobTab.setLayout(jobTabLayout)

        # Job Info Layout
        jobInfoGroupBox = QGroupBox("Job Description")
        jobTabLayout.addWidget(jobInfoGroupBox)
        jobInfoLayout = QGridLayout()
        jobInfoGroupBox.setLayout(jobInfoLayout)

        # Job Name
        jobInfoLayout.addWidget(QLabel("Job Name"), 0, 0)
        jobNameWidget = QLineEdit(self.settings.value("JobName", ""))
        jobInfoLayout.addWidget(jobNameWidget, 0, 1)

        # Comment
        jobInfoLayout.addWidget(QLabel("Comment"), 1, 0)
        commentWidget = QLineEdit(self.settings.value("Comment", ""))
        jobInfoLayout.addWidget(commentWidget, 1, 1)

        # Department
        jobInfoLayout.addWidget(QLabel("Department"), 2, 0)
        departmentWidget = QLineEdit(self.settings.value("Department", ""))
        jobInfoLayout.addWidget(departmentWidget, 2, 1)

        # Job Options Layout
        jobOptionsGroupBox = QGroupBox("Job Options")
        jobTabLayout.addWidget(jobOptionsGroupBox)
        jobOptionsLayout = QGridLayout()
        jobOptionsGroupBox.setLayout(jobOptionsLayout)

        # Pool
        jobOptionsLayout.addWidget(QLabel("Pool"), 0, 0)
        poolWidget = QComboBox()
        for pool in pools:
            poolWidget.addItem(pool)

        defaultPool = self.settings.value("Pool", "none")
        defaultIndex = poolWidget.findText(defaultPool)
        if defaultIndex != -1:
            poolWidget.setCurrentIndex(defaultIndex)

        jobOptionsLayout.addWidget(poolWidget, 0, 1, 1, 3)

        # Secondary Pool
        jobOptionsLayout.addWidget(QLabel("Secondary Pool"), 1, 0)
        secondaryPoolWidget = QComboBox()
        for secondaryPool in secondaryPools:
            secondaryPoolWidget.addItem(secondaryPool)

        defaultSecondaryPool = self.settings.value("SecondaryPool", "")
        defaultIndex = secondaryPoolWidget.findText(defaultSecondaryPool)
        if defaultIndex != -1:
            secondaryPoolWidget.setCurrentIndex(defaultIndex)

        jobOptionsLayout.addWidget(secondaryPoolWidget, 1, 1, 1, 3)

        # Group
        jobOptionsLayout.addWidget(QLabel("Group"), 2, 0)
        groupWidget = QComboBox()
        for group in groups:
            groupWidget.addItem(group)

        defaultGroup = self.settings.value("Group", "none")
        defaultIndex = groupWidget.findText(defaultGroup)
        if defaultIndex != -1:
            groupWidget.setCurrentIndex(defaultIndex)

        jobOptionsLayout.addWidget(groupWidget, 2, 1, 1, 3)

        # Priority
        initPriority = int(self.settings.value("Priority", "50"))
        if initPriority > maximumPriority:
            initPriority = maximumPriority / 2

        jobOptionsLayout.addWidget(QLabel("Priority"), 3, 0)
        priorityWidget = QSpinBox()
        priorityWidget.setRange(0, maximumPriority)
        priorityWidget.setValue(initPriority)
        jobOptionsLayout.addWidget(priorityWidget, 3, 1)

        # Task Timeout
        jobOptionsLayout.addWidget(QLabel("Task Timeout"), 4, 0)
        taskTimeoutWidget = QSpinBox()
        taskTimeoutWidget.setRange(0, 1000000)
        taskTimeoutWidget.setValue(int(self.settings.value("TaskTimeout",
                                                           "0")))
        jobOptionsLayout.addWidget(taskTimeoutWidget, 4, 1)

        # Auto Task Timeout
        autoTaskTimeoutWidget = QCheckBox("Enable Auto Task Timeout")
        autoTaskTimeoutWidget.setChecked(
            strtobool(self.settings.value("AutoTaskTimeout", "False")))
        jobOptionsLayout.addWidget(autoTaskTimeoutWidget, 4, 2)

        # Concurrent Tasks
        jobOptionsLayout.addWidget(QLabel("Concurrent Tasks"), 5, 0)
        concurrentTasksWidget = QSpinBox()
        concurrentTasksWidget.setRange(1, 16)
        concurrentTasksWidget.setValue(
            int(self.settings.value("ConcurrentTasks", "1")))
        jobOptionsLayout.addWidget(concurrentTasksWidget, 5, 1)

        # Limit Tasks To Slave's Task Limit
        limitConcurrentTasksWidget = QCheckBox(
            "Limit Tasks To Slave's Task Limit")
        limitConcurrentTasksWidget.setChecked(
            strtobool(self.settings.value("LimitConcurrentTasks", "True")))
        jobOptionsLayout.addWidget(limitConcurrentTasksWidget, 5, 2)

        # Machine Limit
        jobOptionsLayout.addWidget(QLabel("Machine Limit"), 6, 0)
        machineLimitWidget = QSpinBox()
        machineLimitWidget.setRange(0, 1000000)
        machineLimitWidget.setValue(
            int(self.settings.value("MachineLimit", "1")))
        jobOptionsLayout.addWidget(machineLimitWidget, 6, 1)

        # Machine List Is A Blacklist
        isBlacklistWidget = QCheckBox("Machine List Is A Blacklist")
        isBlacklistWidget.setChecked(
            strtobool(self.settings.value("IsBlacklist", "False")))
        jobOptionsLayout.addWidget(isBlacklistWidget, 6, 2)

        # Machine List
        jobOptionsLayout.addWidget(QLabel("Machine List"), 7, 0)
        machineListWidget = QLineEdit(self.settings.value("MachineList", ""))
        jobOptionsLayout.addWidget(machineListWidget, 7, 1, 1, 2)

        def browseMachineList():
            output = CallDeadlineCommand(
                ["-selectmachinelist",
                 str(machineListWidget.text())], False)
            output = output.replace("\r", "").replace("\n", "")
            if output != "Action was cancelled by user":
                machineListWidget.setText(output)

        machineListButton = QPushButton("Browse")
        machineListButton.pressed.connect(browseMachineList)
        jobOptionsLayout.addWidget(machineListButton, 7, 3)

        # Limits
        jobOptionsLayout.addWidget(QLabel("Limits"), 8, 0)
        limitsWidget = QLineEdit(self.settings.value("Limits", ""))
        jobOptionsLayout.addWidget(limitsWidget, 8, 1, 1, 2)

        def browseLimitList():
            output = CallDeadlineCommand(
                ["-selectlimitgroups",
                 str(limitsWidget.text())], False)
            output = output.replace("\r", "").replace("\n", "")
            if output != "Action was cancelled by user":
                limitsWidget.setText(output)

        limitsButton = QPushButton("Browse")
        limitsButton.pressed.connect(browseLimitList)
        jobOptionsLayout.addWidget(limitsButton, 8, 3)

        # On Job Complete
        jobOptionsLayout.addWidget(QLabel("On Job Complete"), 9, 0)
        onJobCompleteWidget = QComboBox()
        for option in onJobComplete:
            onJobCompleteWidget.addItem(option)

        defaultOption = self.settings.value("OnJobComplete", "Nothing")
        defaultIndex = onJobCompleteWidget.findText(defaultOption)
        if defaultIndex != -1:
            onJobCompleteWidget.setCurrentIndex(defaultIndex)

        jobOptionsLayout.addWidget(onJobCompleteWidget, 9, 1)

        # Submit Job As Suspended
        submitSuspendedWidget = QCheckBox("Submit Job As Suspended")
        submitSuspendedWidget.setChecked(
            strtobool(self.settings.value("SubmitSuspended", "False")))
        jobOptionsLayout.addWidget(submitSuspendedWidget, 9, 2)

        # Nuke Options
        nukeOptionsGroupBox = QGroupBox("Nuke Options")
        jobTabLayout.addWidget(nukeOptionsGroupBox)
        nukeOptionsLayout = QGridLayout()
        nukeOptionsGroupBox.setLayout(nukeOptionsLayout)

        # Version
        nukeOptionsLayout.addWidget(QLabel("Version"), 0, 0)
        versionWidget = QComboBox()
        for version in nukeVersions:
            versionWidget.addItem(version)

        defaultVersion = self.settings.value("Version", "7.0")
        defaultIndex = versionWidget.findText(defaultVersion)
        if defaultIndex != -1:
            versionWidget.setCurrentIndex(defaultIndex)

        nukeOptionsLayout.addWidget(versionWidget, 0, 1)

        # Submit Nuke Script File With Job
        submitScriptWidget = QCheckBox("Submit Nuke Script File With Job")
        submitScriptWidget.setChecked(
            strtobool(self.settings.value("SubmitScript", "False")))
        nukeOptionsLayout.addWidget(submitScriptWidget, 0, 2)

        # Build To Force
        nukeOptionsLayout.addWidget(QLabel("Build To Force"), 1, 0)
        buildWidget = QComboBox()
        for build in buildsToForce:
            buildWidget.addItem(build)

        defaultBuild = self.settings.value("Build", "None")
        defaultIndex = buildWidget.findText(defaultBuild)
        if defaultIndex != -1:
            buildWidget.setCurrentIndex(defaultIndex)

        nukeOptionsLayout.addWidget(buildWidget, 1, 1)

        # Render With NukeX
        useNukeXWidget = QCheckBox("Render With NukeX")
        useNukeXWidget.setChecked(
            strtobool(self.settings.value("UseNukeX", "False")))
        nukeOptionsLayout.addWidget(useNukeXWidget, 1, 2)

        # Max RAM Usage (MB)
        nukeOptionsLayout.addWidget(QLabel("Max RAM Usage (MB)"), 2, 0)
        memoryWidget = QSpinBox()
        memoryWidget.setRange(0, 5000)
        memoryWidget.setValue(int(self.settings.value("Memory", "0")))
        nukeOptionsLayout.addWidget(memoryWidget, 2, 1)

        # Continue On Error
        continueOnErrorWidget = QCheckBox("Continue On Error")
        continueOnErrorWidget.setChecked(
            strtobool(self.settings.value("ContinueOnError", "False")))
        nukeOptionsLayout.addWidget(continueOnErrorWidget, 2, 2)

        # Threads
        nukeOptionsLayout.addWidget(QLabel("Threads"), 3, 0)
        threadsWidget = QSpinBox()
        threadsWidget.setRange(0, 256)
        threadsWidget.setValue(int(self.settings.value("Threads", "0")))
        nukeOptionsLayout.addWidget(threadsWidget, 3, 1)

        # Use Batch Mode
        batchModeWidget = QCheckBox("Use Batch Mode")
        batchModeWidget.setChecked(
            strtobool(self.settings.value("BatchMode", "False")))
        nukeOptionsLayout.addWidget(batchModeWidget, 3, 2)

        # Frames Per Task
        nukeOptionsLayout.addWidget(QLabel("Frames Per Task"), 4, 0)
        framesPerTaskWidget = QSpinBox()
        framesPerTaskWidget.setRange(1, 1000000)
        framesPerTaskWidget.setValue(
            int(self.settings.value("FramesPerTask", "1")))
        nukeOptionsLayout.addWidget(framesPerTaskWidget, 4, 1)
        nukeOptionsLayout.addWidget(
            QLabel("(this only affects non-movie jobs)"), 4, 2)

        tabWidget.addTab(jobTab, "Job Options")

        # Button Box (Extra work required to get the custom ordering we want)
        self.pipelineToolStatusLabel.setAlignment(Qt.AlignRight
                                                  | Qt.AlignVCenter)
        pipelineToolStatus = self.retrievePipelineToolStatus()
        self.updatePipelineToolStatusLabel(pipelineToolStatus)

        integrationButton = QPushButton("Pipeline Tools")
        integrationButton.clicked.connect(self.OpenIntegrationWindow)

        submitButton = QPushButton("Submit")
        submitButton.clicked.connect(dialog.accept)
        submitButton.setDefault(True)

        cancelButton = QPushButton("Cancel")
        cancelButton.clicked.connect(dialog.reject)

        buttonGroupBox = QGroupBox()
        buttonLayout = QGridLayout()
        buttonLayout.setColumnStretch(
            0, 1)  # Makes the pipeline status label expand, not the buttons
        buttonGroupBox.setLayout(buttonLayout)
        buttonGroupBox.setAlignment(Qt.AlignRight)
        buttonGroupBox.setFlat(True)
        buttonLayout.addWidget(self.pipelineToolStatusLabel, 0, 0)
        buttonLayout.addWidget(integrationButton, 0, 1)
        buttonLayout.addWidget(submitButton, 0, 2)
        buttonLayout.addWidget(cancelButton, 0, 3)

        topLayout.addWidget(tabWidget)
        topLayout.addWidget(buttonGroupBox)

        # Show the dialog.
        result = (dialog.exec_() == QDialog.DialogCode.Accepted)
        if result:
            # Need to pass integration dir path to render task
            self.settings.setValue("IntegrationDir", self.integrationDir)

            self.settings.setValue("JobName", jobNameWidget.text())
            self.settings.setValue("Comment", commentWidget.text())
            self.settings.setValue("Department", departmentWidget.text())
            self.settings.setValue("Pool", poolWidget.currentText())
            self.settings.setValue("SecondaryPool",
                                   secondaryPoolWidget.currentText())
            self.settings.setValue("Group", groupWidget.currentText())
            self.settings.setValue("Priority", priorityWidget.value())
            self.settings.setValue("TaskTimeout", taskTimeoutWidget.value())
            self.settings.setValue("AutoTaskTimeout",
                                   str(autoTaskTimeoutWidget.isChecked()))
            self.settings.setValue("ConcurrentTasks",
                                   concurrentTasksWidget.value())
            self.settings.setValue("LimitConcurrentTasks",
                                   str(limitConcurrentTasksWidget.isChecked()))
            self.settings.setValue("MachineLimit", machineLimitWidget.value())
            self.settings.setValue("IsBlacklist",
                                   str(isBlacklistWidget.isChecked()))
            self.settings.setValue("MachineList", machineListWidget.text())
            self.settings.setValue("Limits", limitsWidget.text())
            self.settings.setValue("OnJobComplete",
                                   onJobCompleteWidget.currentText())
            self.settings.setValue("SubmitSuspended",
                                   str(submitSuspendedWidget.isChecked()))
            self.settings.setValue("Version", versionWidget.currentText())
            self.settings.setValue("SubmitScript",
                                   str(submitScriptWidget.isChecked()))
            self.settings.setValue("Build", buildWidget.currentText())
            self.settings.setValue("UseNukeX", str(useNukeXWidget.isChecked()))
            self.settings.setValue("FramesPerTask",
                                   framesPerTaskWidget.value())
            self.settings.setValue("ContinueOnError",
                                   str(continueOnErrorWidget.isChecked()))
            self.settings.setValue("Threads", threadsWidget.value())
            self.settings.setValue("BatchMode",
                                   str(batchModeWidget.isChecked()))
            self.settings.setValue("Memory", memoryWidget.value())

            print("Saving settings: " + self.settingsFile)
            self.settings.sync()
        else:
            print("Submission canceled")
            self.settings = None
            # Not sure if there is a better way to stop the export process. This works, but it leaves all the tasks
            # in the Queued state.
            self.setError("Submission was canceled")
Example #42
0
class DependsOn(QDialog):
    def __init__(self, addr: int, operand, instr=None, func: Optional[Function]=None, parent=None):
        super().__init__(parent)

        self._addr = addr
        self._operand = operand
        self._instruction = instr
        self._function = func

        # output
        self.location: Optional[int] = None
        self.arg: Optional = None
        self.reg: Optional = None

        # UI widgets
        self._instr_layout: QHBoxLayout = None
        self._func_layout: QHBoxLayout = None
        self._arg_widget: QWidget = None
        self._reg_widget: QWidget = None

        self._before_radio: QRadioButton = None
        self._after_radio: QRadioButton = None
        self._arg_layout: QVBoxLayout = None
        self._arg_radiobox: QRadioButton = None
        self._arg_box: QLineEdit = None
        self._reg_layout: QVBoxLayout = None
        self._reg_radiobox: QRadioButton = None
        self._reg_box: QLineEdit = None

        self._init_widgets()

    def _init_widgets(self):

        # the instruction
        instr_lbl = QLabel("Instruction")
        instr_box = QLineEdit("TODO")
        instr_box.setReadOnly(True)

        self._instr_layout = QHBoxLayout()
        self._instr_layout.addWidget(instr_lbl)
        self._instr_layout.addWidget(instr_box)

        # the function
        func_lbl = QLabel("Function")
        func_box = QLineEdit("TODO")
        func_box.setReadOnly(True)

        self._func_layout = QHBoxLayout()
        self._func_layout.addWidget(func_lbl)
        self._func_layout.addWidget(func_box)

        #
        # location
        #
        location_group = QGroupBox("Location")

        self._before_radio = QRadioButton("Before the instruction")
        self._after_radio = QRadioButton("After the instruction")
        location_layout = QVBoxLayout()
        location_layout.addWidget(self._before_radio)
        location_layout.addWidget(self._after_radio)
        location_layout.addStretch(1)

        self._before_radio.setChecked(True)

        location_group.setLayout(location_layout)

        #
        # target atoms
        #

        # function argument
        self._arg_radiobox = QRadioButton("Function argument")
        self._arg_radiobox.clicked.connect(self._on_targetatoms_radiobutton_clicked)
        self._arg_box = QLineEdit("")

        # register
        self._reg_radiobox = QRadioButton("Register")
        self._reg_radiobox.clicked.connect(self._on_targetatoms_radiobutton_clicked)
        self._reg_box = QLineEdit("")

        atom_type_group = QGroupBox("Atom type")
        atom_type_layout = QVBoxLayout()
        atom_type_layout.addWidget(self._arg_radiobox)
        # atom_type_layout.addWidget(self._reg_radiobox)
        atom_type_layout.addStretch(1)
        atom_type_group.setLayout(atom_type_layout)

        atom_layout = QVBoxLayout()
        arg_layout = QHBoxLayout()
        arg_lbl = QLabel("Argument index")
        self._arg_widget = QWidget()
        self._arg_widget.setLayout(arg_layout)
        arg_layout.addWidget(arg_lbl)
        arg_layout.addWidget(self._arg_box)

        reg_layout = QHBoxLayout()
        reg_lbl = QLabel("Register name")
        self._reg_widget = QWidget()
        self._reg_widget.setLayout(reg_layout)
        reg_layout.addWidget(reg_lbl)
        reg_layout.addWidget(self._reg_box)

        atom_layout.addWidget(self._arg_widget)
        atom_layout.addWidget(self._reg_widget)

        self._arg_radiobox.setChecked(True)
        self._reg_widget.setHidden(True)

        #
        # buttons
        #
        ok_btn = QPushButton("OK")
        ok_btn.clicked.connect(self._on_ok_clicked)
        cancel_btn = QPushButton("Cancel")
        cancel_btn.clicked.connect(self._on_cancel_clicked)

        buttons_layout = QHBoxLayout()
        buttons_layout.addWidget(ok_btn)
        buttons_layout.addWidget(cancel_btn)

        layout = QVBoxLayout()
        if self._function is not None:
            func_box.setText(function_prototype_str(self._function))
            layout.addLayout(self._func_layout)
        else:
            layout.addLayout(self._instr_layout)
        layout.addWidget(location_group)
        layout.addWidget(atom_type_group)
        layout.addLayout(atom_layout)
        layout.addLayout(buttons_layout)

        self.setLayout(layout)

    #
    # Events
    #

    def _targetatoms_hide_all(self):
        self._arg_widget.setHidden(True)
        self._reg_widget.setHidden(True)

    def _on_targetatoms_radiobutton_clicked(self):
        self._targetatoms_hide_all()
        if self._arg_radiobox.isChecked():
            self._arg_widget.setHidden(False)
        elif self._reg_radiobox.isChecked():
            self._reg_widget.setHidden(False)

    def _on_ok_clicked(self):
        if self._before_radio.isChecked():
            self.location = OP_BEFORE
        else:
            self.location = OP_AFTER

        if self._arg_radiobox.isChecked():
            try:
                self.arg = int(self._arg_box.text())
            except ValueError:
                # invalid argument index
                QMessageBox(self).critical(self,
                            "Invalid argument index",
                            "The given function argument index \"%s\" is unsupported. Only integers are allowed." % self._arg_box.text(),
                            buttons=QMessageBox.Ok,
                            )
                return
        else:
            raise NotImplementedError()

        self.close()

    def _on_cancel_clicked(self):
        self.location = None
        self.arg = None
        self.reg = None
        self.close()
Example #43
0
    def _init_widgets(self):

        # the instruction
        instr_lbl = QLabel("Instruction")
        instr_box = QLineEdit("TODO")
        instr_box.setReadOnly(True)

        self._instr_layout = QHBoxLayout()
        self._instr_layout.addWidget(instr_lbl)
        self._instr_layout.addWidget(instr_box)

        # the function
        func_lbl = QLabel("Function")
        func_box = QLineEdit("TODO")
        func_box.setReadOnly(True)

        self._func_layout = QHBoxLayout()
        self._func_layout.addWidget(func_lbl)
        self._func_layout.addWidget(func_box)

        #
        # location
        #
        location_group = QGroupBox("Location")

        self._before_radio = QRadioButton("Before the instruction")
        self._after_radio = QRadioButton("After the instruction")
        location_layout = QVBoxLayout()
        location_layout.addWidget(self._before_radio)
        location_layout.addWidget(self._after_radio)
        location_layout.addStretch(1)

        self._before_radio.setChecked(True)

        location_group.setLayout(location_layout)

        #
        # target atoms
        #

        # function argument
        self._arg_radiobox = QRadioButton("Function argument")
        self._arg_radiobox.clicked.connect(self._on_targetatoms_radiobutton_clicked)
        self._arg_box = QLineEdit("")

        # register
        self._reg_radiobox = QRadioButton("Register")
        self._reg_radiobox.clicked.connect(self._on_targetatoms_radiobutton_clicked)
        self._reg_box = QLineEdit("")

        atom_type_group = QGroupBox("Atom type")
        atom_type_layout = QVBoxLayout()
        atom_type_layout.addWidget(self._arg_radiobox)
        # atom_type_layout.addWidget(self._reg_radiobox)
        atom_type_layout.addStretch(1)
        atom_type_group.setLayout(atom_type_layout)

        atom_layout = QVBoxLayout()
        arg_layout = QHBoxLayout()
        arg_lbl = QLabel("Argument index")
        self._arg_widget = QWidget()
        self._arg_widget.setLayout(arg_layout)
        arg_layout.addWidget(arg_lbl)
        arg_layout.addWidget(self._arg_box)

        reg_layout = QHBoxLayout()
        reg_lbl = QLabel("Register name")
        self._reg_widget = QWidget()
        self._reg_widget.setLayout(reg_layout)
        reg_layout.addWidget(reg_lbl)
        reg_layout.addWidget(self._reg_box)

        atom_layout.addWidget(self._arg_widget)
        atom_layout.addWidget(self._reg_widget)

        self._arg_radiobox.setChecked(True)
        self._reg_widget.setHidden(True)

        #
        # buttons
        #
        ok_btn = QPushButton("OK")
        ok_btn.clicked.connect(self._on_ok_clicked)
        cancel_btn = QPushButton("Cancel")
        cancel_btn.clicked.connect(self._on_cancel_clicked)

        buttons_layout = QHBoxLayout()
        buttons_layout.addWidget(ok_btn)
        buttons_layout.addWidget(cancel_btn)

        layout = QVBoxLayout()
        if self._function is not None:
            func_box.setText(function_prototype_str(self._function))
            layout.addLayout(self._func_layout)
        else:
            layout.addLayout(self._instr_layout)
        layout.addWidget(location_group)
        layout.addWidget(atom_type_group)
        layout.addLayout(atom_layout)
        layout.addLayout(buttons_layout)

        self.setLayout(layout)
Example #44
0
class JoinDialog(QDialog):
    def __init__(self, parent=None):
        super(JoinDialog, self).__init__(parent)

        # formatting
        self.setWindowTitle("Join room")

        # validator
        regexp = QtCore.QRegExp('[A-Za-z0-9_]+')
        validator = QtGui.QRegExpValidator(regexp)

        # widgets
        self.room_nameInput = QLineEdit()
        self.room_nameInput.setValidator(validator)

        self.passwordInput = QLineEdit()
        self.passwordInput.setValidator(validator)
        self.passwordInput.setEchoMode(QLineEdit.Password)

        # OK and Cancel buttons
        self.buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self)
        self.buttons.button(QDialogButtonBox.Ok).setText('Join')
        self.buttons.setCenterButtons(True)

        # signals
        self.room_nameInput.textChanged.connect(self.check_input)
        self.room_nameInput.textChanged.emit(self.room_nameInput.text())

        self.passwordInput.textChanged.connect(self.check_input)
        self.passwordInput.textChanged.emit(self.passwordInput.text())

        # layout
        self.mainLayout = QVBoxLayout(self)
        self.mainLayout.addWidget(self.room_nameInput)
        self.mainLayout.addWidget(self.passwordInput)
        self.mainLayout.addWidget(self.buttons)

        self.buttons.accepted.connect(self.accept)
        self.buttons.rejected.connect(self.reject)

        # self.buttons.setEnabled(False)
        self.room_nameInput.setFocus()

    def check_input(self, *args, **kwargs):
        sender = self.sender()
        validator = sender.validator()
        state = validator.validate(sender.text(), 0)[0]

        if state == QtGui.QValidator.Acceptable:
            color = '#ffffff'
        elif state == QtGui.QValidator.Intermediate:
            color = '#ffffff'
        else:
            color = '#f6989d' # red
        sender.setStyleSheet('QLineEdit { background-color: %s }' % color)

    # get current data from the dialog
    def get_room_nameInput(self):
        return self.room_nameInput.text()

    # get current data from the dialog
    def getPasswordInput(self):
        return self.passwordInput.text()

    # static method to create the dialog and return (date, time, accepted)
    @staticmethod
    def run(parent=None):
        dialog = JoinDialog(parent)
        result = dialog.exec_()
        room_name = dialog.get_room_nameInput()
        password = dialog.getPasswordInput()
        return room_name, password, result == QDialog.Accepted
Example #45
0
 def testWithIntValidator(self):
     edit = QLineEdit()
     edit.setValidator(BlankIntValidator(edit))
     self.assertEqual(edit.text(), '')
     edit.insert('1')
     self.assertEqual(edit.text(), '1')
     edit.insert('a')
     self.assertEqual(edit.text(), '1')
     edit.insert('2')
     self.assertEqual(edit.text(), '12')
Example #46
0
class ExportSrt(QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('输出.srt时间轴文件')
        self.resize(550, 350)
        self.layout = QGridLayout()
        self.setLayout(self.layout)

        self.startPos = QTimeEdit()
        self.startPos.setDisplayFormat('hh:mm:ss.zzz')
        self.layout.addWidget(QLabel('开始位置'), 0, 0, 1, 3)
        self.layout.addWidget(self.startPos, 0, 2, 1, 3)

        self.endPos = QTimeEdit()
        self.endPos.setDisplayFormat('hh:mm:ss.zzz')
        self.layout.addWidget(QLabel('结束位置'), 0, 6, 1, 3)
        self.layout.addWidget(self.endPos, 0, 8, 1, 3)

        self.timeMarkType = QComboBox()
        self.timeMarkType.addItems(['相对时间', '绝对时间'])
        self.layout.addWidget(QLabel('记录方式'), 1, 0, 1, 3)
        self.layout.addWidget(self.timeMarkType, 1, 2, 1, 3)

        self.offset = QTimeEdit()
        self.offset.setDisplayFormat('hh:mm:ss.zzz')
        self.layout.addWidget(QLabel('时间轴偏移'), 1, 6, 1, 4)
        self.layout.addWidget(self.offset, 1, 8, 1, 3)

        self.layout.addWidget(QLabel('最大无效时长(毫秒)'), 2, 0, 1, 6)
        self.maxIgnore = QLineEdit()
        self.layout.addWidget(self.maxIgnore, 2, 4, 1, 4)
        self.maxIgnore.setText("100")

        self.layout.addWidget(QLabel('最大合并间隔(毫秒)'), 3, 0, 1, 6)
        self.maxMerge = QLineEdit()
        self.layout.addWidget(self.maxMerge, 3, 4, 1, 4)
        self.maxMerge.setText("100")

        self.mergeOrIgnore = QComboBox()
        self.mergeOrIgnore.addItems(['优先合并', '优先忽略'])
        self.layout.addWidget(QLabel('合并&忽略优先设置'), 4, 0, 1, 6)
        self.layout.addWidget(self.mergeOrIgnore, 4, 4, 1, 3)

        self.isExportUnnumbering = QCheckBox()
        self.layout.addWidget(self.isExportUnnumbering, 5, 0, 1, 1)
        self.layout.addWidget(QLabel('同时导出无编号.srt文件'), 5, 1, 1, 6)

        self.saveDir = QLineEdit()
        self.layout.addWidget(self.saveDir, 6, 0, 1, 6)
        self.setPath = QPushButton('保存位置')
        self.layout.addWidget(self.setPath, 6, 6, 1, 1)
        self.setPath.clicked.connect(self.choosePath)

        self.exportSrt = QPushButton('导出文件')
        self.cancel = QPushButton('取消')
        self.help = QPushButton('帮助')
        self.layout.addWidget(self.exportSrt, 7, 0, 1, 2)
        self.layout.addWidget(self.cancel, 7, 2, 1, 2)
        self.layout.addWidget(self.help, 7, 4, 1, 2)
        self.exportSrt.clicked.connect(self.execExportSrt)

        self.cancel.clicked.connect(self.closeWindow)
        self.help.clicked.connect(self.dispHelp)

    def setDefault(self, autoSub, videoDuration):
        self.autoSub = autoSub
        self.endPos.setTime(ms2QTime(videoDuration))

    def closeWindow(self):
        self.destroy(True, True)

    def dispHelp(self):
        self.helpContents = '''- 开始位置 & 结束位置:.srt文件开始及结束的时间点
- 记录方式:记录原始视频的绝对时间,或是以开始位置为0记录相对时间
- 时间轴偏移:时间点位置整体调整
- 最大无效时长:语音段时长不超过这个值时,该语音段会被忽略。0:不忽略任何语音段
- 最大合并间隔:两个语音段之间的空白时长不超过这个值时,两个语音段将被合并。0:不合并任何语音段
- 合并&忽略优先设置:如果一个语音段同时可以被合并以及被忽略,设置指定进行哪个操作'''
        self.helpPage = QMessageBox()
        self.helpPage.setText(self.helpContents)
        self.helpPage.show()

    def choosePath(self):
        subtitlePath = QFileDialog.getSaveFileName(self, "选择文件夹", '',
                                                   "字幕文件 (*.srt)")[0]
        if subtitlePath:
            self.saveDir.setText(subtitlePath)

    def execExportSrt(self):
        voiceCntRaw = len(self.autoSub)
        if voiceCntRaw == 0:
            self.timeNotFound = QMessageBox()
            self.timeNotFound.setText("没有找到时间轴信息。")
            self.timeNotFound.show()
            return

        startPos = QTime2ms(self.startPos.time())
        endPos = QTime2ms(self.endPos.time())
Example #47
0
class MainWindow(QWidget):
    """
        Main UI Window
    """
    def __init__(self, parent=None):
        """
        Initialize the chess board.
        """
        super().__init__(parent)
        self.setWindowTitle("PyChess")
        self.resize(1280, 720)
        self.svgWidget = QSvgWidget(parent=self)
        self.svgWidget.setGeometry(10, 10, 700, 700)
        self.boardSize = min(self.svgWidget.width(), self.svgWidget.height())
        self.margin = 0.05 * self.boardSize
        self.squareSize = (self.boardSize - 2 * self.margin) / 8
        self.board = chess.Board()
        self.pieceToMove = [None, None]
        self.drawBoard()
        self.enginePath = "Use double \ instead of \ when on Windows system."
        self.time = 0.1

        self.maxtimelabel = QLabel("Max. time per move(in s):")
        self.engineLabel = QLabel("Enter path to engine:")
        self.engineButton = QPushButton("Find move")
        self.moveButton = QPushButton("Make move")
        self.undoButton = QPushButton("Undo move")
        self.undoButton.setMaximumWidth(175)
        self.pathField = QLineEdit()
        self.engineTime = QLineEdit()
        self.engineResult = QLineEdit()
        self.pathField.setText(
            "Use double \ instead of \ when on Windows system.")

        self.main_layout = QHBoxLayout()
        self.tool_layout = QGridLayout()

        self.tool_layout.addWidget(self.engineLabel, 0, 0)
        self.tool_layout.addWidget(self.pathField, 0, 1)
        self.tool_layout.addWidget(self.maxtimelabel, 1, 0)
        self.tool_layout.addWidget(self.engineTime, 1, 1)
        self.tool_layout.addWidget(self.engineButton, 2, 0)
        self.tool_layout.addWidget(self.engineResult, 2, 1)
        self.tool_layout.addWidget(self.moveButton, 3, 0)
        self.tool_layout.addWidget(self.undoButton, 3, 1)

        self.main_layout.addWidget(self.svgWidget, 55)
        self.main_layout.addLayout(self.tool_layout, 45)
        self.setLayout(self.main_layout)

        self.engineButton.clicked.connect(self.find_move)
        self.moveButton.clicked.connect(self.make_move)
        self.undoButton.clicked.connect(self.undo_move)

    @Slot(QWidget)
    def mousePressEvent(self, event):
        """
        Handles the left mouse click and enables moving the chess pieces by first clicking on the chess
        piece and then on the target square. 
        """
        if event.x() <= self.boardSize and event.y() <= self.boardSize:
            if self.margin < event.x(
            ) < self.boardSize - self.margin and self.margin < event.y(
            ) < self.boardSize - self.margin:
                if event.buttons() == Qt.LeftButton:
                    file = int((event.x() - self.margin) / self.squareSize)
                    rank = 7 - int((event.y() - self.margin) / self.squareSize)
                    square = chess.square(file, rank)
                    piece = self.board.piece_at(square)
                    coordinates = "{}{}".format(chr(file + 97), str(rank + 1))
                    if self.pieceToMove[0] is not None:
                        move = chess.Move.from_uci("{}{}".format(
                            self.pieceToMove[1], coordinates))
                        if move in self.board.legal_moves:
                            self.board.push(move)
                        piece = None
                        coordinates = None
                    self.pieceToMove = [piece, coordinates]
                    self.drawBoard()

    def drawBoard(self):
        """
        Draw a chess board for the starting position and then redraw it for every move.
        """
        self.svgBoard = self.board._repr_svg_().encode("UTF-8")
        self.svgDrawBoard = self.svgWidget.load(self.svgBoard)
        return self.svgDrawBoard

    def find_move(self):
        """
        Calculate the best move according to Stockfish
        """
        self.enginePath = self.pathField.text()
        self.time = float(self.engineTime.text())
        engine = chess.engine.SimpleEngine.popen_uci(self.enginePath)
        result = engine.play(self.board, chess.engine.Limit(time=self.time))
        self.engineResult.setText(str(result.move))
        engine.quit()
        return result.move

    def make_move(self):
        """
        Finds and plays the best move
        """
        move = self.find_move()
        self.board.push(move)
        self.drawBoard()

    def undo_move(self):
        """
        Undo the last move played on the board
        """
        self.board.pop()
        self.drawBoard()
Example #48
0
    def __init__(self):
        QWidget.__init__(self)
        self.items = 0

        # Example data
        self._data = {
            "Water": 24.5,
            "Electricity": 55.1,
            "Rent": 850.0,
            "Supermarket": 230.4,
            "Internet": 29.99,
            "Bars": 21.85,
            "Public transportation": 60.0,
            "Coffee": 22.45,
            "Restaurants": 120
        }

        # Left
        self.table = QTableWidget()
        self.table.setColumnCount(2)
        self.table.setHorizontalHeaderLabels(["Description", "Price"])
        self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        # Chart
        self.chart_view = QtCharts.QChartView()
        self.chart_view.setRenderHint(QPainter.Antialiasing)

        # Right
        self.description = QLineEdit()
        self.price = QLineEdit()
        self.add = QPushButton("Add")
        self.clear = QPushButton("Clear")
        self.quit = QPushButton("Quit")
        self.plot = QPushButton("Plot")

        # Disabling 'Add' button
        self.add.setEnabled(False)

        self.right = QVBoxLayout()
        self.right.setMargin(10)
        self.right.addWidget(QLabel("Description"))
        self.right.addWidget(self.description)
        self.right.addWidget(QLabel("Price"))
        self.right.addWidget(self.price)
        self.right.addWidget(self.add)
        self.right.addWidget(self.plot)
        self.right.addWidget(self.chart_view)
        self.right.addWidget(self.clear)
        self.right.addWidget(self.quit)

        # QWidget Layout
        self.layout = QHBoxLayout()

        #self.table_view.setSizePolicy(size)
        self.layout.addWidget(self.table)
        self.layout.addLayout(self.right)

        # Set the layout to the QWidget
        self.setLayout(self.layout)

        # Signals and Slots
        self.add.clicked.connect(self.add_element)
        self.quit.clicked.connect(self.quit_application)
        self.plot.clicked.connect(self.plot_data)
        self.clear.clicked.connect(self.clear_table)
        self.description.textChanged[str].connect(self.check_disable)
        self.price.textChanged[str].connect(self.check_disable)

        # Fill example data
        self.fill_table()
Example #49
0
    def __init__(self, platforms, parent=None):
        super(InputWindow, self).__init__(parent=parent)

        self.setContentsMargins(5, 5, 5, 5)

        self._platforms = ['1292 Advanced Programmable Video System',
                           '3DO',
                           'APF MP1000/Imagination Machine',
                           'Acorn 32-bit',
                           'Adventure Vision',
                           'Alice 32/90',
                           'Altair 680',
                           'Altair 8800',
                           'Amazon Alexa',
                           'Amiga',
                           'Amiga CD32',
                           'Amstrad CPC',
                           'Amstrad PCW',
                           'Android',
                           'Apple I',
                           'Apple II',
                           'Apple IIgs',
                           'Arcade',
                           'Arcadia 2001',
                           'Arduboy',
                           'Astral 2000',
                           'Atari 2600',
                           'Atari 5200',
                           'Atari 7800',
                           'Atari 8-bit',
                           'Atari ST',
                           'Atom',
                           'BBC Micro',
                           'BREW',
                           'Bally Astrocade',
                           'BeOS',
                           'BlackBerry',
                           'Blu-ray Disc Player',
                           'Browser',
                           'Bubble',
                           'CD-i',
                           'CDTV',
                           'CP/M',
                           'Camputers Lynx',
                           'Casio Loopy',
                           'Casio PV-1000',
                           'ClickStart',
                           'Coleco Adam',
                           'ColecoVision',
                           'Colour Genie',
                           'Commodore 128',
                           'Commodore 16, Plus/4',
                           'Commodore 64',
                           'Commodore PET/CBM',
                           'Compal 80',
                           'Compucolor I',
                           'Compucolor II',
                           'Compucorp Programmable Calculator',
                           'CreatiVision',
                           'DOS',
                           'DVD Player',
                           'Dedicated console',
                           'Dedicated handheld',
                           'Didj',
                           'DoJa',
                           'Dragon 32/64',
                           'ECD Micromind',
                           'Electron',
                           'Enterprise',
                           'Epoch Cassette Vision',
                           'Epoch Game Pocket Computer',
                           'Epoch Super Cassette Vision',
                           'ExEn',
                           'Exelvision',
                           'Exidy Sorcerer',
                           'Fairchild Channel F',
                           'Famicom Disk System',
                           'FM Towns',
                           'FM-7',
                           'FRED/COSMAC',
                           'Fire OS',
                           'Freebox',
                           'GIMINI',
                           'GNEX',
                           'GP2X',
                           'GP2X Wiz',
                           'GP32',
                           'GVM',
                           'Galaksija',
                           'Game Boy',
                           'Game Boy Advance',
                           'Game Boy Color',
                           'Game Gear',
                           'Game Wave',
                           'Game.Com',
                           'GameCube',
                           'GameStick',
                           'Genesis',
                           'Gizmondo',
                           'Glulx',
                           'HD DVD Player',
                           'HP 9800',
                           'HP Programmable Calculator',
                           'Heath/Zenith H8/H89',
                           'Heathkit H11',
                           'Hitachi S1',
                           'Hugo',
                           'HyperScan',
                           'IBM 5100',
                           'Ideal-Computer',
                           'Intel 8008',
                           'Intel 8080',
                           'Intellivision',
                           'Interton Video 2000',
                           'J2ME',
                           'Jaguar',
                           'Jolt',
                           'Jupiter Ace',
                           'KIM-1',
                           'Kindle Classic',
                           'Laser 200',
                           'LaserActive',
                           'LeapFrog Explorer',
                           'LeapTV',
                           'Leapster',
                           'Linux',
                           'Lynx',
                           'MOS Technology 6502',
                           'MRE',
                           'MSX',
                           'MSX 2',
                           'Macintosh',
                           'Maemo',
                           'Mainframe',
                           'Mattel Aquarius',
                           'MeeGo',
                           'Mega Drive',
                           'Memotech MTX',
                           'Microbee',
                           'Microtan 65',
                           'Microvision',
                           'Mophun',
                           'Motorola 6800',
                           'Motorola 68k',
                           'N-Gage',
                           'N-Gage (service)',
                           'NES',
                           'Nascom',
                           'Neo Geo AES',
                           'Neo Geo CD',
                           'Neo Geo MVS',
                           'Neo Geo Pocket',
                           'Neo Geo Pocket Color',
                           'Neo Geo X',
                           'New Nintendo 3DS',
                           'NewBrain',
                           'Newton',
                           'Nintendo 3DS',
                           'Nintendo 64',
                           'Nintendo DS',
                           'Nintendo DSi',
                           'Nintendo Switch',
                           'North Star',
                           'Noval 760',
                           'Nuon',
                           'OS/2',
                           'Oculus Go',
                           'Oculus Quest',
                           'Odyssey',
                           'Odyssey 2',
                           'Ohio Scientific',
                           'OnLive',
                           'Orao',
                           'Oric',
                           'Ouya',
                           'PC Booter',
                           'PC-6001',
                           'PC-8000',
                           'PC-88',
                           'PC-98',
                           'PC-FX',
                           'PS Vita',
                           'PSP',
                           'Palm OS',
                           'Philips VG 5000',
                           'Photo CD',
                           'Pippin',
                           'PlayStation',
                           'PlayStation 2',
                           'PlayStation 3',
                           'PlayStation 4',
                           'Playdia',
                           'Pokémon Mini',
                           'Pokitto',
                           'Poly-88',
                           'RCA Studio II',
                           'Roku',
                           'SAM Coupé',
                           'SC/MP',
                           'SD-200/270/290',
                           'SEGA 32X',
                           'SEGA CD',
                           'SEGA Dreamcast',
                           'SEGA Master System',
                           'SEGA Pico',
                           'SEGA Saturn',
                           'SG-1000',
                           'SK-VM',
                           'SMC-777',
                           'SNES',
                           'SRI-500/1000',
                           'SWTPC 6800',
                           'Sharp MZ-80B/2000/2500',
                           'Sharp MZ-80K/700/800/1500',
                           'Sharp X1',
                           'Sharp X68000',
                           'Sharp Zaurus',
                           'Signetics 2650',
                           'Sinclair QL',
                           'Sol-20',
                           'Sord M5',
                           'Spectravideo',
                           'Stadia',
                           "Super A'can",
                           'SuperGrafx',
                           'Supervision',
                           'Symbian',
                           'TADS',
                           'TI Programmable Calculator',
                           'TI-99/4A',
                           'TIM',
                           'TRS-80',
                           'TRS-80 CoCo',
                           'TRS-80 MC-10',
                           'Taito X-55',
                           'Tatung Einstein',
                           'Tektronix 4050',
                           'Tele-Spiel ES-2201',
                           'Telstar Arcade',
                           'Terminal',
                           'Thomson MO',
                           'Thomson TO',
                           'Tiki 100',
                           'Timex Sinclair 2068',
                           'Tizen',
                           'Tomahawk F1',
                           'Tomy Tutor',
                           'TurboGrafx CD',
                           'TurboGrafx-16',
                           'V.Flash',
                           'V.Smile',
                           'VIC-20',
                           'VIS',
                           'Vectrex',
                           'VideoBrain',
                           'Videopac+ G7400',
                           'Virtual Boy',
                           'WIPI',
                           'Wang 2200',
                           'Wii',
                           'Wii U',
                           'Windows',
                           'Windows 3.x',
                           'Windows Apps',
                           'Windows Mobile',
                           'Windows Phone',
                           'WonderSwan',
                           'WonderSwan Color',
                           'XaviXPORT',
                           'Xbox',
                           'Xbox 360',
                           'Xbox One',
                           'Xerox Alto',
                           'Z-machine',
                           'ZX Spectrum',
                           'ZX Spectrum Next',
                           'ZX80',
                           'ZX81',
                           'Zeebo',
                           'Zilog Z80',
                           'Zilog Z8000',
                           'Zodiac',
                           'Zune',
                           'bada',
                           'digiBlast',
                           'iPad',
                           'iPhone',
                           'iPod Classic',
                           'tvOS',
                           'watchOS',
                           'webOS']

        # Add any platforms in user's collection that doesn't exist in the platform list
        for platform in platforms:
            if platform not in self._platforms:
                self._platforms.append(platform)
        self._platforms.sort()

        # For holding the internal platforms column's data
        self._platformsData = ""

        self._dataTypes = ["Game", "Console", "Accessory"]
        self._dataTypeLabel = QLabel("Type\t ")
        self._dataType = QComboBox()
        self._dataType.addItems(self._dataTypes)
        self._dataType.currentIndexChanged.connect(self._changeWidgets)

        self._nameLabel = QLabel("Name\t ")
        self._name = QLineEdit()
        self._name.textChanged.connect(self._changeWidgets)

        self._platformLabel = QLabel("Platform\t ")
        self._platform = QComboBox()
        self._platform.view().setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        self._platform.addItems(["", "(New platform)"])
        self._platform.addItems(self._platforms)
        self._platform.currentIndexChanged.connect(self._addPlatform)

        self._autofillButton = QPushButton("Autofill")
        self._autofillButton.clicked.connect(self._autofill)
        self._autofillButton.setEnabled(False)

        self._regionLabel = QLabel("Region\t ")
        self._region = QComboBox()
        self._region.addItems(["NTSC (JP)", "NTSC (NA)", "PAL"])

        self._countryLabel = QLabel("Country\t ")
        self._countryLabel.setEnabled(True)
        self._country = QLineEdit()
        self._country.setEnabled(True)

        self._publisherLabel = QLabel("Publisher\t")
        self._publisherLabel.setEnabled(True)
        self._publisher = QLineEdit()
        self._publisher.setEnabled(True)

        self._developerLabel = QLabel("Developer")
        self._developer = QLineEdit()
        self._developer.setEnabled(True)

        self._codeLabel = QLabel("Code\t ")
        self._code = QLineEdit()

        self._itemLabel = QLabel("Game")
        self._item = QCheckBox()

        self._boxLabel = QLabel("Box")
        self._box = QCheckBox()

        self._manualLabel = QLabel("Manual")
        self._manual = QCheckBox()

        self._yearLabel = QLabel("Year\t ")
        self._year = QLineEdit()

        self._genreLabel = QLabel("Genre\t ")
        self._genre = QLineEdit()

        self._paidLabel = QLabel("Paid price ")
        self._paid = QLineEdit("$0")

        self._commentLabel = QLabel("Comment")
        self._comment = QLineEdit()

        self._okButton = QPushButton()
        self._okButton.setText("OK")
        self._okButton.setMaximumSize(self._okButton.sizeHint())
        self._okButton.clicked.connect(self.accept)
        self._cnclButton = QPushButton()
        self._cnclButton.setText("Cancel")
        self._cnclButton.setMaximumSize(self._cnclButton.sizeHint())
        self._cnclButton.clicked.connect(self.reject)

        self._vbox = QVBoxLayout()
        self._vbox.addStretch()
        self._hboxType = QHBoxLayout()
        self._hboxType.addStretch()
        self._hboxName = QHBoxLayout()
        self._hboxName.addStretch()
        self._hboxPlatform = QHBoxLayout()
        self._hboxRegion = QHBoxLayout()
        self._hboxRegion.addStretch()
        self._hboxCode = QHBoxLayout()
        self._hboxCode.addStretch()
        self._hboxCountry = QHBoxLayout()
        self._hboxCountry.addStretch()
        self._hboxPublisher = QHBoxLayout()
        self._hboxDeveloper = QHBoxLayout()
        self._hboxBoxMan = QHBoxLayout()
        self._hboxYear = QHBoxLayout()
        self._hboxGenre = QHBoxLayout()
        self._hboxPaid = QHBoxLayout()
        self._hboxComment = QHBoxLayout()
        self._hboxComment.addStretch()
        self._hboxBtn = QHBoxLayout()
        self._hboxBtn.addStretch()

        self._hboxType.addWidget(self._dataTypeLabel, 0)
        self._hboxType.addWidget(self._dataType, 1)
        self._hboxName.addWidget(self._nameLabel, 0)
        self._hboxName.addWidget(self._name, 1)
        self._hboxPlatform.addWidget(self._platformLabel, 0)
        self._hboxPlatform.addWidget(self._platform, 1)
        self._hboxRegion.addWidget(self._regionLabel, 0)
        self._hboxRegion.addWidget(self._region, 1)
        self._hboxCountry.addWidget(self._countryLabel, 0)
        self._hboxCountry.addWidget(self._country, 1)
        self._hboxPublisher.addWidget(self._publisherLabel, 0)
        self._hboxPublisher.addSpacing(5)
        self._hboxPublisher.addWidget(self._publisher, 1)
        self._hboxDeveloper.addWidget(self._developerLabel, 0)
        self._hboxDeveloper.addWidget(self._developer, 1)
        self._hboxCode.addWidget(self._codeLabel, 0)
        self._hboxCode.addWidget(self._code, 1)
        self._hboxYear.addWidget(self._yearLabel, 0)
        self._hboxYear.addWidget(self._year, 1)
        self._hboxGenre.addWidget(self._genreLabel, 0)
        self._hboxGenre.addWidget(self._genre, 1)
        self._hboxPaid.addWidget(self._paidLabel, 0)
        self._hboxPaid.addWidget(self._paid, 1)
        self._hboxComment.addWidget(self._commentLabel, 0)
        self._hboxComment.addSpacing(2)
        self._hboxComment.addWidget(self._comment, 1)
        self._hboxBoxMan.addStretch(10)
        self._hboxBoxMan.addWidget(self._itemLabel, 0)
        self._hboxBoxMan.addWidget(self._item, 1)
        self._hboxBoxMan.addStretch(5)
        self._hboxBoxMan.addWidget(self._boxLabel, 2)
        self._hboxBoxMan.addWidget(self._box, 3)
        self._hboxBoxMan.addStretch(5)
        self._hboxBoxMan.addWidget(self._manualLabel, 4)
        self._hboxBoxMan.addWidget(self._manual, 5)
        self._hboxBoxMan.addStretch(10)
        self._hboxBtn.addWidget(self._autofillButton, 0, Qt.AlignLeft)
        self._hboxBtn.addStretch(10)
        self._hboxBtn.addWidget(self._okButton, 1)
        self._hboxBtn.addWidget(self._cnclButton, 2)

        self._vbox.addLayout(self._hboxType, 0)
        self._vbox.addLayout(self._hboxName, 1)
        self._vbox.addLayout(self._hboxPlatform, 2)
        self._vbox.addLayout(self._hboxRegion, 3)
        self._vbox.addLayout(self._hboxPublisher, 4)
        self._vbox.addLayout(self._hboxDeveloper, 5)
        self._vbox.addLayout(self._hboxCountry, 6)
        self._vbox.addLayout(self._hboxCode, 7)
        self._vbox.addLayout(self._hboxYear, 8)
        self._vbox.addLayout(self._hboxGenre, 9)
        self._vbox.addLayout(self._hboxPaid, 10)
        self._vbox.addLayout(self._hboxComment, 11)
        self._vbox.addLayout(self._hboxBoxMan, 12)
        self._vbox.addLayout(self._hboxBtn, 13)

        self.setLayout(self._vbox)

        self.setWindowTitle("Add to collection")
        self.setFixedSize(QSize(500, 340))
        self._center()
Example #50
0
 def testTupleReturn(self):
     text = QLineEdit("PySide bug 632")
     text.setTextMargins(10, 20, 30, 40)
     (a, b, c, d) = text.getTextMargins()
     self.assert_((a, b, c, d), (10, 20, 30, 40))