Exemplo n.º 1
0
class SessionManager(QMainWindow):
    def __init__(self, parent=None):
        QListWidget.__init__(self, parent)
        self.setWindowTitle(tr("Saved Sessions"))
        self.setWindowFlags(Qt.Dialog)
        hideAction = QAction(self)
        hideAction.setShortcuts(["Esc", "Ctrl+W"])
        hideAction.triggered.connect(self.hide)
        self.addAction(hideAction)
        self.sessionList = QListWidget(self)
        self.sessionList.itemActivated.connect(self.loadSession)
        self.setCentralWidget(self.sessionList)
        self.toolBar = QToolBar(self)
        self.toolBar.setMovable(False)
        self.toolBar.setContextMenuPolicy(Qt.CustomContextMenu)
        self.addToolBar(Qt.BottomToolBarArea, self.toolBar)
        self.loadButton = QPushButton(tr("&Load"), self)
        self.loadButton.clicked.connect(
            lambda: self.loadSession(self.sessionList.currentItem()))
        self.toolBar.addWidget(self.loadButton)
        self.saveButton = QPushButton(tr("&Save"), self)
        self.saveButton.clicked.connect(saveSessionManually)
        self.saveButton.clicked.connect(self.refresh)
        self.toolBar.addWidget(self.saveButton)
        deleteAction = QAction(self)
        deleteAction.setShortcut("Del")
        deleteAction.triggered.connect(self.delete)
        self.addAction(deleteAction)

    def refresh(self):
        self.sessionList.clear()
        if os.path.exists(settings.session_folder):
            sessions = os.listdir(settings.session_folder)
            for session in sessions:
                self.sessionList.addItem(session)

    def delete(self):
        if self.sessionList.hasFocus():
            try:
                os.remove(
                    os.path.join(settings.session_folder,
                                 self.sessionList.currentItem().text()))
            except:
                pass
            self.refresh()

    def show(self):
        self.refresh()
        QMainWindow.show(self)

    def loadSession(self, item):
        if os.path.exists(settings.session_folder):
            loadSession(os.path.join(settings.session_folder, item.text()))
        self.hide()
Exemplo n.º 2
0
class JavaScriptExceptionsPanel(SettingsPanel):
    def __init__(self, parent=None):
        super(JavaScriptExceptionsPanel, self).__init__(parent)

        domainEntryRow = custom_widgets.LineEditRow(tr("Add domain:"), self)
        self.domainEntry = domainEntryRow.lineEdit
        self.domainEntry.returnPressed.connect(self.addDomain)
        self.layout().addWidget(domainEntryRow)

        self.addDomainButton = QPushButton(tr("Add"))
        self.addDomainButton.clicked.connect(self.addDomain)
        domainEntryRow.layout().addWidget(self.addDomainButton)

        self.domainList = QListWidget(self)
        self.layout().addWidget(self.domainList)

        self.removeDomainButton = QPushButton(tr("Remove"))
        self.removeDomainButton.clicked.connect(
            lambda: self.removeDomain(True))
        self.layout().addWidget(self.removeDomainButton)

        self.removeAction = QAction(self)
        self.removeAction.setShortcut("Del")
        self.removeAction.triggered.connect(self.removeDomain)
        self.addAction(self.removeAction)

    def removeDomain(self, forceFocus=False):
        if self.domainList.hasFocus() or forceFocus:
            self.domainList.takeItem(
                self.domainList.row(self.domainList.currentItem()))

    def addDomain(self):
        self.domainList.addItem(self.domainEntry.text())
        self.domainEntry.clear()

    def loadSettings(self):
        settings.js_exceptions = settings.setting_to_list(
            "content/JavaScriptExceptions")
        self.domainList.clear()
        for f in settings.js_exceptions:
            self.domainList.addItem(f)

    def saveSettings(self):
        settings.js_exceptions = [
            self.domainList.item(f).text()
            for f in range(0, self.domainList.count())
        ]
        settings.settings.setValue("content/JavaScriptExceptions",
                                   settings.js_exceptions)
        settings.settings.sync()
Exemplo n.º 3
0
class SearchWidget(QWidget):

    def __init__(self, backEnd, parent: QWidget = None):
        super().__init__(parent)
        self._parent = parent
        self.__createWidgets()
        self._model = SearchModel(backEnd, self._optionList)
        self.__createConnections()

    def __createWidgets(self) -> NoReturn:
        bar = QWidget(self)
        barLayout = QHBoxLayout()
        self._searchBar = QLineEdit(parent=self)
        self._searchButton = QPushButton("Go")
        barLayout.addWidget(self._searchBar)
        barLayout.addWidget(self._searchButton)
        bar.setLayout(barLayout)
        #
        l = QVBoxLayout()
        self._optionList = QListWidget(parent=self)
        l.addWidget(bar)
        l.addWidget(self._optionList)
        self.setLayout(l)
        #
        self._searchBar.setFocus()

    def __createConnections(self) -> NoReturn:
        self._searchBar.returnPressed.connect(self.__returnResult)
        self._searchButton.clicked.connect(self.__returnResult)
        self._optionList.itemClicked.connect(self.__optionChosen)
        self._optionList.itemActivated.connect(self.__optionChosen)

    def keyPressEvent(self, keyEvent: QKeyEvent) -> NoReturn:
        if keyEvent.key() == Qt.Key_Escape:
            self._parent.goBack()
        elif self._searchBar.hasFocus():
            if keyEvent.key() == Qt.Key_Down:
                self._optionList.setFocus()
        elif self._optionList.hasFocus() and self._optionList.currentRow() == 0:
            if keyEvent.key() == Qt.Key_Up:
                self._searchBar.setFocus()
        super().keyPressEvent(keyEvent)

    def __returnResult(self) -> NoReturn:
        queue = self._searchBar.text()
        self._model.search(queue)

    def __optionChosen(self, item: QListWidgetItem) -> NoReturn:
        selectedTitle = item.tags()['link']
        self._parent.goTo(MangaDetailsWidget(selectedTitle, self._model.backEnd, parent=self._parent))
Exemplo n.º 4
0
class AdremoverSettingsPanel(SettingsPanel):
    def __init__(self, parent=None):
        super(AdremoverSettingsPanel, self).__init__(parent)

        filterEntryRow = custom_widgets.LineEditRow(tr("Add filter:"), self)
        self.filterEntry = filterEntryRow.lineEdit
        self.filterEntry.returnPressed.connect(self.addFilter)
        self.layout().addWidget(filterEntryRow)

        self.addFilterButton = QPushButton(tr("Add"))
        self.addFilterButton.clicked.connect(self.addFilter)
        filterEntryRow.layout().addWidget(self.addFilterButton)

        # Ad Remover filter list.
        self.filterList = QListWidget(self)
        self.layout().addWidget(self.filterList)

        self.removeFilterButton = QPushButton(tr("Remove"))
        self.removeFilterButton.clicked.connect(
            lambda: self.removeFilter(True))
        self.layout().addWidget(self.removeFilterButton)

        self.removeAction = QAction(self)
        self.removeAction.setShortcut("Del")
        self.removeAction.triggered.connect(self.removeFilter)
        self.addAction(self.removeAction)

    def removeFilter(self, forceFocus=False):
        if self.filterList.hasFocus() or forceFocus:
            self.filterList.takeItem(
                self.filterList.row(self.filterList.currentItem()))

    def addFilter(self):
        self.filterList.addItem(self.filterEntry.text())
        self.filterEntry.clear()

    def loadSettings(self):
        settings.load_adremover_filters()
        self.filterList.clear()
        for f in settings.adremover_filters:
            self.filterList.addItem(f)

    def saveSettings(self):
        settings.adremover_filters = [
            self.filterList.item(f).text()
            for f in range(0, self.filterList.count())
        ]
        settings.save_adremover_filters()
Exemplo n.º 5
0
class SessionManager(QMainWindow):
    def __init__(self, parent=None):
        QListWidget.__init__(self, parent)
        self.setWindowTitle(tr("Saved Sessions"))
        self.setWindowFlags(Qt.Dialog)
        hideAction = QAction(self)
        hideAction.setShortcuts(["Esc", "Ctrl+W"])
        hideAction.triggered.connect(self.hide)
        self.addAction(hideAction)
        self.sessionList = QListWidget(self)
        self.sessionList.itemActivated.connect(self.loadSession)
        self.setCentralWidget(self.sessionList)
        self.toolBar = QToolBar(self)
        self.toolBar.setMovable(False)
        self.toolBar.setContextMenuPolicy(Qt.CustomContextMenu)
        self.addToolBar(Qt.BottomToolBarArea, self.toolBar)
        self.loadButton = QPushButton(tr("&Load"), self)
        self.loadButton.clicked.connect(lambda: self.loadSession(self.sessionList.currentItem()))
        self.toolBar.addWidget(self.loadButton)
        self.saveButton = QPushButton(tr("&Save"), self)
        self.saveButton.clicked.connect(saveSessionManually)
        self.saveButton.clicked.connect(self.refresh)
        self.toolBar.addWidget(self.saveButton)
        deleteAction = QAction(self)
        deleteAction.setShortcut("Del")
        deleteAction.triggered.connect(self.delete)
        self.addAction(deleteAction)
    def refresh(self):
        self.sessionList.clear()
        if os.path.exists(settings.session_folder):
            sessions = os.listdir(settings.session_folder)
            for session in sessions:
                self.sessionList.addItem(session)
    def delete(self):
        if self.sessionList.hasFocus():
            try: os.remove(os.path.join(settings.session_folder, self.sessionList.currentItem().text()))
            except: pass
            self.refresh()
    def show(self):
        self.refresh()
        QMainWindow.show(self)
    def loadSession(self, item):
        if os.path.exists(settings.session_folder):
            loadSession(os.path.join(settings.session_folder, item.text()))
        self.hide()
Exemplo n.º 6
0
class AdremoverSettingsPanel(SettingsPanel):
    def __init__(self, parent=None):
        super(AdremoverSettingsPanel, self).__init__(parent)

        filterEntryRow = custom_widgets.LineEditRow(tr("Add filter:"), self)
        self.filterEntry = filterEntryRow.lineEdit
        self.filterEntry.returnPressed.connect(self.addFilter)
        self.layout().addWidget(filterEntryRow)

        self.addFilterButton = QPushButton(tr("Add"))
        self.addFilterButton.clicked.connect(self.addFilter)
        filterEntryRow.layout().addWidget(self.addFilterButton)

        # Ad Remover filter list.
        self.filterList = QListWidget(self)
        self.layout().addWidget(self.filterList)

        self.removeFilterButton = QPushButton(tr("Remove"))
        self.removeFilterButton.clicked.connect(lambda: self.removeFilter(True))
        self.layout().addWidget(self.removeFilterButton)

        self.removeAction = QAction(self)
        self.removeAction.setShortcut("Del")
        self.removeAction.triggered.connect(self.removeFilter)
        self.addAction(self.removeAction)

    def removeFilter(self, forceFocus=False):
        if self.filterList.hasFocus() or forceFocus:
            self.filterList.takeItem(self.filterList.row(self.filterList.currentItem()))

    def addFilter(self):
        self.filterList.addItem(self.filterEntry.text())
        self.filterEntry.clear()

    def loadSettings(self):
        settings.load_adremover_filters()
        self.filterList.clear()
        for f in settings.adremover_filters:
            self.filterList.addItem(f)

    def saveSettings(self):
        settings.adremover_filters = [self.filterList.item(f).text() for f in range(0, self.filterList.count())]
        settings.save_adremover_filters()
Exemplo n.º 7
0
class JavaScriptExceptionsPanel(SettingsPanel):
    def __init__(self, parent=None):
        super(JavaScriptExceptionsPanel, self).__init__(parent)

        domainEntryRow = custom_widgets.LineEditRow(tr("Add domain:"), self)
        self.domainEntry = domainEntryRow.lineEdit
        self.domainEntry.returnPressed.connect(self.addDomain)
        self.layout().addWidget(domainEntryRow)

        self.addDomainButton = QPushButton(tr("Add"))
        self.addDomainButton.clicked.connect(self.addDomain)
        domainEntryRow.layout().addWidget(self.addDomainButton)

        self.domainList = QListWidget(self)
        self.layout().addWidget(self.domainList)

        self.removeDomainButton = QPushButton(tr("Remove"))
        self.removeDomainButton.clicked.connect(lambda: self.removeDomain(True))
        self.layout().addWidget(self.removeDomainButton)

        self.removeAction = QAction(self)
        self.removeAction.setShortcut("Del")
        self.removeAction.triggered.connect(self.removeDomain)
        self.addAction(self.removeAction)

    def removeDomain(self, forceFocus=False):
        if self.domainList.hasFocus() or forceFocus:
            self.domainList.takeItem(self.domainList.row(self.domainList.currentItem()))

    def addDomain(self):
        self.domainList.addItem(self.domainEntry.text())
        self.domainEntry.clear()

    def loadSettings(self):
        settings.js_exceptions = settings.setting_to_list("content/JavaScriptExceptions")
        self.domainList.clear()
        for f in settings.js_exceptions:
            self.domainList.addItem(f)

    def saveSettings(self):
        settings.js_exceptions = [self.domainList.item(f).text() for f in range(0, self.domainList.count())]
        settings.settings.setValue("content/JavaScriptExceptions", settings.js_exceptions)
        settings.settings.sync()
Exemplo n.º 8
0
class ClippingsPanel(SettingsPanel):
    def __init__(self, parent=None):
        super(ClippingsPanel, self).__init__(parent)
        self.setWindowTitle(tr("Clippings Manager"))

        coreColumn = custom_widgets.Column(self)
        self.layout().addWidget(coreColumn)

        # Title
        self.title = QLabel(tr("<b>Clippings</b>"), self)
        coreColumn.addWidget(self.title)

        howToUse = QLabel(
            tr("To use Clippings, Shift+right click a textbox on the page."),
            self)
        coreColumn.addWidget(howToUse)

        row1 = custom_widgets.Row(self)
        coreColumn.addWidget(row1)

        column1 = custom_widgets.Column(self)
        column2 = custom_widgets.Column(self)
        row1.addWidget(column1)
        row1.addWidget(column2)

        # Clipping list.
        self.clippingList = QListWidget(self)
        self.clippingList.currentTextChanged.connect(self.loadClipping)
        column1.addWidget(self.clippingList)

        self.removeClippingButton = QPushButton(tr("Remove"))
        self.removeClippingButton.clicked.connect(
            lambda: self.removeClipping(True))
        column1.addWidget(self.removeClippingButton)

        self.removeAction = QAction(self)
        self.removeAction.setShortcut("Del")
        self.removeAction.triggered.connect(self.removeClipping)
        self.addAction(self.removeAction)

        clippingNameRow = custom_widgets.LineEditRow(tr("Name:"), self)
        self.nameEntry = clippingNameRow.lineEdit
        self.nameEntry.returnPressed.connect(self.addClipping)
        column2.addWidget(clippingNameRow)

        self.addClippingButton = QPushButton(tr("Add"))
        self.addClippingButton.clicked.connect(self.addClipping)
        clippingNameRow.layout().addWidget(self.addClippingButton)

        self.clippingEntry = QTextEdit(self)
        column2.addWidget(self.clippingEntry)

    def show(self):
        self.setVisible(True)
        self.loadSettings()

    def loadSettings(self):
        data.load_clippings()
        self.clippingList.clear()
        for item in sorted(list(data.clippings.keys())):
            self.clippingList.addItem(item)

    def saveSettings(self):
        data.save_clippings()

    def removeClipping(self, forceFocus=False):
        if self.clippingList.hasFocus() or forceFocus:
            name = self.clippingList.currentItem().text()
            del data.clippings[name]
            self.clippingList.takeItem(
                self.clippingList.row(self.clippingList.currentItem()))
            self.saveSettings()

    def loadClipping(self, text):
        try:
            self.nameEntry.setText(text)
            self.clippingEntry.setPlainText(data.clippings[text])
        except:
            pass

    def addClipping(self):
        data.clippings[
            self.nameEntry.text()] = self.clippingEntry.toPlainText()
        self.saveSettings()
        self.loadSettings()
Exemplo n.º 9
0
class DataSettingsPanel(SettingsPanel):
    def __init__(self, parent=None):
        super(DataSettingsPanel, self).__init__(parent)

        # Clear history dialog.
        self.clearHistoryDialog = clear_history_dialog.ClearHistoryDialog(self)
        self.clearHistoryDialog.hide()

        self.showClearHistoryDialogButton = QPushButton(tr("Clear Data"), self)
        self.showClearHistoryDialogButton.clicked.connect(
            self.clearHistoryDialog.exec_)
        self.layout().addWidget(self.showClearHistoryDialogButton)

        # Remember history checkbox.
        self.rememberHistoryToggle = QCheckBox(tr("Remember &history"), self)
        self.layout().addWidget(self.rememberHistoryToggle)

        # Maximum URL length spinbox.
        self.maximumURLLengthRow = custom_widgets.SpinBoxRow(
            tr("Maximum URL length:"), self)
        self.maximumURLLengthRow.expander.setText(tr("characters"))
        self.maximumURLLength = self.maximumURLLengthRow.spinBox
        self.maximumURLLength.setMaximum(9999)
        self.layout().addWidget(self.maximumURLLengthRow)

        # Maximum cache size spinbox.
        # The cache is gone because it f***s Nimbus with a chainsaw.
        #self.maximumCacheSizeRow = custom_widgets.SpinBoxRow(tr("Maximum cache size:"), self)
        #self.maximumCacheSizeRow.expander.setText(tr("MB"))
        #self.maximumCacheSize = self.maximumCacheSizeRow.spinBox
        #self.maximumCacheSize.setMaximum(20000)
        #self.layout().addWidget(self.maximumCacheSizeRow)

        # Checkbox to toggle geolocation.
        self.geolocationToggle = QCheckBox(tr("Enable geo&location"), self)
        self.layout().addWidget(self.geolocationToggle)

        self.geolocationPermissionsRow = custom_widgets.Row(self)
        self.layout().addWidget(self.geolocationPermissionsRow)

        self.geolocationWhitelistColumn = custom_widgets.Column(self)
        self.geolocationPermissionsRow.addWidget(
            self.geolocationWhitelistColumn)

        self.geolocationWhitelistLabel = QLabel(
            tr("Allow these sites to track my location:"), self)
        self.geolocationWhitelistColumn.addWidget(
            self.geolocationWhitelistLabel)

        self.geolocationWhitelist = QListWidget(self)
        self.geolocationWhitelistColumn.addWidget(self.geolocationWhitelist)

        self.removeFromWhitelistButton = QPushButton(tr("Remove"))
        self.removeFromWhitelistButton.clicked.connect(
            lambda: self.geolocationWhitelist.takeItem(
                self.geolocationWhitelist.row(self.geolocationWhitelist.
                                              currentItem())))
        self.geolocationWhitelistColumn.addWidget(
            self.removeFromWhitelistButton)

        self.geolocationBlacklistColumn = custom_widgets.Column(self)
        self.geolocationPermissionsRow.addWidget(
            self.geolocationBlacklistColumn)

        self.geolocationBlacklistLabel = QLabel(
            tr("Prevent these sites from tracking my location:"), self)
        self.geolocationBlacklistColumn.addWidget(
            self.geolocationBlacklistLabel)

        self.geolocationBlacklist = QListWidget(self)
        self.geolocationBlacklistColumn.addWidget(self.geolocationBlacklist)

        self.removeFromBlacklistButton = QPushButton(tr("Remove"))
        self.removeFromBlacklistButton.clicked.connect(
            lambda: self.geolocationBlacklist.takeItem(
                self.geolocationBlacklist.row(self.geolocationBlacklist.
                                              currentItem())))
        self.geolocationBlacklistColumn.addWidget(
            self.removeFromBlacklistButton)

        self.removeAction = QAction(self)
        self.removeAction.setShortcut("Del")
        self.removeAction.triggered.connect(
            lambda: self.geolocationWhitelist.takeItem(
                self.geolocationWhitelist.row(self.geolocationWhitelist.
                                              currentItem()))
            if self.geolocationWhitelist.hasFocus(
            ) else self.geolocationBlacklist.takeItem(
                self.geolocationBlacklist.row(self.geolocationBlacklist.
                                              currentItem())))
        self.addAction(self.removeAction)

        self.layout().addWidget(custom_widgets.Expander(self))

    def loadSettings(self):
        self.maximumURLLength.setValue(
            settings.setting_to_int("data/MaximumURLLength"))
        #self.maximumCacheSize.setValue(settings.setting_to_int("data/MaximumCacheSize"))
        self.rememberHistoryToggle.setChecked(
            settings.setting_to_bool("data/RememberHistory"))
        self.geolocationToggle.setChecked(
            settings.setting_to_bool("network/GeolocationEnabled"))
        self.geolocationWhitelist.clear()
        for url in data.geolocation_whitelist:
            self.geolocationWhitelist.addItem(url)
        self.geolocationBlacklist.clear()
        for url in data.geolocation_blacklist:
            self.geolocationBlacklist.addItem(url)

    def saveSettings(self):
        settings.settings.setValue("data/MaximumURLLength",
                                   self.maximumURLLength.value())
        #settings.settings.setValue("data/MaximumCacheSize", self.maximumCacheSize.value())
        settings.settings.setValue("data/RememberHistory",
                                   self.rememberHistoryToggle.isChecked())
        settings.settings.setValue("network/GeolocationEnabled",
                                   self.geolocationToggle.isChecked())
        data.geolocation_whitelist = [
            self.geolocationWhitelist.item(authority).text()
            for authority in range(0, self.geolocationWhitelist.count())
        ]
        data.geolocation_blacklist = [
            self.geolocationBlacklist.item(authority).text()
            for authority in range(0, self.geolocationBlacklist.count())
        ]
        data.saveData()
Exemplo n.º 10
0
class AudioPlayerPage(QWidget):
    about_play_audio = pyqtSignal(str)

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

        self.audio_list_widget = QListWidget()
        self.audio_list_widget.installEventFilter(self)
        self.audio_list_widget.itemDoubleClicked.connect(self.play)

        # TODO: playlist объединить с audio_list_widget (см примеры работы с QMediaPlayer)
        self.playlist = QMediaPlaylist()
        self.playlist.currentIndexChanged.connect(
            lambda row: self.audio_list_widget.setCurrentRow(row))

        # TODO: обрабатывать сигналы плеера: http://doc.qt.io/qt-5/qmediaplayer.html#signals
        self.player = QMediaPlayer()
        self.player.setPlaylist(self.playlist)
        self.player.currentMediaChanged.connect(
            lambda media: self.about_play_audio.emit(self.audio_list_widget.
                                                     currentItem().text()))

        if not self.player.isAvailable():
            # TODO: перевод
            text = "The QMediaPlayer object does not have a valid service.\n" \
                   "Please check the media service plugins are installed."

            log.warning(text)
            QMessageBox.warning(self, "Service not available", text)

            quit()

        self.controls = PlayerControls(self.player)
        self.controls.set_state(self.player.state())
        self.controls.set_volume(self.player.volume())
        self.controls.set_muted(self.controls.is_muted())

        self.controls.play_signal.connect(self.play)
        self.controls.pause_signal.connect(self.player.pause)
        self.controls.stop_signal.connect(self.player.stop)
        self.controls.next_signal.connect(self.playlist.next)
        self.controls.previous_signal.connect(self.playlist.previous)
        self.controls.change_volume_signal.connect(self.player.setVolume)
        self.controls.change_muting_signal.connect(self.player.setMuted)

        self.progress = QProgressBar()
        self.progress.hide()

        layout = QVBoxLayout()
        layout.addWidget(self.controls)
        layout.addWidget(self.audio_list_widget)
        layout.addWidget(self.progress)

        self.setLayout(layout)

        self.thread = LoadAudioListThread()
        self.thread.about_add_audio.connect(self._add_audio)
        self.thread.about_progress.connect(self.progress.setValue)
        self.thread.about_range_progress.connect(self.progress.setRange)
        self.thread.started.connect(self._start)
        self.thread.finished.connect(self._finished)

    def _add_audio(self, title, url):
        item = QListWidgetItem(title)
        item.setData(Qt.UserRole, url)
        self.audio_list_widget.addItem(item)
        self.playlist.addMedia(QMediaContent(QUrl(url)))

        # При добавлении первой аудизаписи, вызываем воспроизведение
        if self.audio_list_widget.count() == 1:
            self.audio_list_widget.setCurrentRow(0)
            self.playlist.setCurrentIndex(0)
            self.play()

    def _start(self):
        self.audio_list_widget.clear()
        self.playlist.clear()

        self.progress.show()

    def _finished(self):
        self.progress.hide()

    def fill(self, vk):
        self.thread.vk = vk

        # Если поток запущен, останавливаем его, иначе -- запускаем
        if self.thread.isRunning():
            self.thread.exit()
        else:
            self.thread.start()

    def play(self):
        if self.playlist.currentIndex() != self.audio_list_widget.currentRow():
            self.playlist.setCurrentIndex(self.audio_list_widget.currentRow())

        self.player.play()

    def eventFilter(self, obj, event):
        # Воспроизведение видео при клике на кнопки Enter/Return в плейлисте
        if obj == self.audio_list_widget and event.type(
        ) == QKeyEvent.KeyPress:
            if self.audio_list_widget.hasFocus() and event.key(
            ) == Qt.Key_Return or event.key() == Qt.Key_Enter:
                item = self.audio_list_widget.currentItem()
                if item is not None:
                    self.play()

        return super().eventFilter(obj, event)
Exemplo n.º 11
0
class MangaDetailsWidget(QWidget):
    def __init__(self,
                 titleLink: str,
                 backEnd: object,
                 parent: QWidget = None):
        super().__init__(parent=parent)
        self._parent = parent
        self.__title = titleLink
        self.__backEnd = backEnd
        #
        self.__createWidgets()
        self.__loadDetails()
        self.__createConnections()

    def __createWidgets(self) -> NoReturn:
        details = QWidget(self)
        detailsLayout = QHBoxLayout()
        # Image.
        self._image = QLabel()
        # Info.
        self._infoScroll = QScrollArea()
        info = QWidget(details)
        infoLayout = QVBoxLayout()
        infoLayout.addWidget(QLabel('Loading... Please, wait.'))
        info.setLayout(infoLayout)
        self._infoScroll.setWidget(info)
        self._infoScroll.setVisible(True)
        # All details.
        detailsLayout.addWidget(self._image)
        detailsLayout.addWidget(self._infoScroll)
        details.setLayout(detailsLayout)
        # Chapters.
        l = QVBoxLayout()
        self._optionList = QListWidget(parent=self)
        l.addWidget(details)
        l.addWidget(self._optionList)
        self.setLayout(l)
        #
        self._optionList.setFocus()

    def __loadDetails(self) -> NoReturn:
        self.__detailsLoader = DetailsLoader(self.__backEnd, self.__title)
        self.__thread = QThread()
        self.__detailsLoader.moveToThread(self.__thread)
        self.__detailsLoader.sig_done.connect(self.__updateView)
        self.__thread.started.connect(self.__detailsLoader.work)
        self.__thread.start()

    @pyqtSlot()
    def __updateView(self) -> NoReturn:
        result = self.__detailsLoader.result
        self.__loadCover(result['cover'])
        self.__updateInfo(result['info'])
        self.__updateChapterList(result['chapters'])

    def __loadCover(self, link: str) -> NoReturn:
        self.__coverLoader = ImageLoader(link)
        self.__thread2 = QThread()
        self.__coverLoader.moveToThread(self.__thread2)
        self.__coverLoader.sig_done.connect(self.__updateCover)
        self.__thread2.started.connect(self.__coverLoader.load)
        self.__thread2.start()

    @pyqtSlot()
    def __updateCover(self) -> NoReturn:
        data = self.__coverLoader.result
        image = QImage()
        image.loadFromData(data)
        self._image.setPixmap(
            QPixmap.fromImage(image).scaled(IMAGE_WIDTH, IMAGE_HEIGHT))

    def __updateInfo(self, info: Dict[str, str]) -> NoReturn:
        # Clean info.
        self._infoScroll.takeWidget()
        # Add items.
        infoW = QWidget(parent=self._infoScroll)
        infoLayout = QVBoxLayout()
        for k in info:
            if k != 'Summary':
                l = QLabel(k + ": " + info[k], parent=infoW)
                l.setMaximumWidth(self._infoScroll.size().width())
                infoLayout.addWidget(l)
            else:
                l = QLabel(k + ":\n" + info[k], parent=infoW)
                l.setWordWrap(True)
                l.setMaximumWidth(self._infoScroll.size().width())
                infoLayout.addWidget(l)
        infoW.setLayout(infoLayout)
        self._infoScroll.setWidget(infoW)
        self._infoScroll.setWidgetResizable(True)

    def __updateChapterList(self, chapters: List[Dict[str, str]]) -> NoReturn:
        self._optionList.clear()
        for ch in chapters:
            it = ListItemWithTags(ch['title'], tags=ch)
            self._optionList.addItem(it)

    def __createConnections(self) -> NoReturn:
        self._optionList.itemClicked.connect(self.__optionChosen)
        self._optionList.itemActivated.connect(self.__optionChosen)

    def keyPressEvent(self, keyEvent: QKeyEvent) -> NoReturn:
        if keyEvent.key() == Qt.Key_Escape:
            self._parent.goBack()
        elif not self._optionList.hasFocus():
            self._optionList.setFocus()
        # Idk why it doesn't select option list elements.
        super().keyPressEvent(keyEvent)

    def __optionChosen(self, item: QListWidgetItem) -> NoReturn:
        selectedVolume = item.tags()['link']
        self._parent.goTo(
            ImageViewer(selectedVolume, self.__backEnd, parent=self._parent))
Exemplo n.º 12
0
class ClippingsPanel(SettingsPanel):
    def __init__(self, parent=None):
        super(ClippingsPanel, self).__init__(parent)
        self.setWindowTitle(tr("Clippings Manager"))

        coreColumn = custom_widgets.Column(self)
        self.layout().addWidget(coreColumn)
        
        # Title
        self.title = QLabel(tr("<b>Clippings</b>"), self)
        coreColumn.addWidget(self.title)
        
        howToUse = QLabel(tr("To use Clippings, Shift+right click a textbox on the page."), self)
        coreColumn.addWidget(howToUse)

        row1 = custom_widgets.Row(self)
        coreColumn.addWidget(row1)

        column1 = custom_widgets.Column(self)
        column2 = custom_widgets.Column(self)
        row1.addWidget(column1)
        row1.addWidget(column2)

        # Clipping list.
        self.clippingList = QListWidget(self)
        self.clippingList.currentTextChanged.connect(self.loadClipping)
        column1.addWidget(self.clippingList)

        self.removeClippingButton = QPushButton(tr("Remove"))
        self.removeClippingButton.clicked.connect(lambda: self.removeClipping(True))
        column1.addWidget(self.removeClippingButton)

        self.removeAction = QAction(self)
        self.removeAction.setShortcut("Del")
        self.removeAction.triggered.connect(self.removeClipping)
        self.addAction(self.removeAction)

        clippingNameRow = custom_widgets.LineEditRow(tr("Name:"), self)
        self.nameEntry = clippingNameRow.lineEdit
        self.nameEntry.returnPressed.connect(self.addClipping)
        column2.addWidget(clippingNameRow)

        self.addClippingButton = QPushButton(tr("Add"))
        self.addClippingButton.clicked.connect(self.addClipping)
        clippingNameRow.layout().addWidget(self.addClippingButton)

        self.clippingEntry = QTextEdit(self)
        column2.addWidget(self.clippingEntry)

    def show(self):
        self.setVisible(True)
        self.loadSettings()

    def loadSettings(self):
        data.load_clippings()
        self.clippingList.clear()
        for item in sorted(list(data.clippings.keys())):
            self.clippingList.addItem(item)

    def saveSettings(self):
        data.save_clippings()

    def removeClipping(self, forceFocus=False):
        if self.clippingList.hasFocus() or forceFocus:
            name = self.clippingList.currentItem().text()
            del data.clippings[name]
            self.clippingList.takeItem(self.clippingList.row(self.clippingList.currentItem()))
            self.saveSettings()

    def loadClipping(self, text):
        try:
            self.nameEntry.setText(text)
            self.clippingEntry.setPlainText(data.clippings[text])
        except:
            pass

    def addClipping(self):
        data.clippings[self.nameEntry.text()] = self.clippingEntry.toPlainText()
        self.saveSettings()
        self.loadSettings()
Exemplo n.º 13
0
class DataSettingsPanel(SettingsPanel):
    def __init__(self, parent=None):
        super(DataSettingsPanel, self).__init__(parent)

        # Clear history dialog.
        self.clearHistoryDialog = clear_history_dialog.ClearHistoryDialog(self)
        self.clearHistoryDialog.hide()

        self.showClearHistoryDialogButton = QPushButton(tr("Clear Data"), self)
        self.showClearHistoryDialogButton.clicked.connect(self.clearHistoryDialog.exec_)
        self.layout().addWidget(self.showClearHistoryDialogButton)

        # Remember history checkbox.
        self.rememberHistoryToggle = QCheckBox(tr("Remember &history"), self)
        self.layout().addWidget(self.rememberHistoryToggle)

        # Maximum URL length spinbox.
        self.maximumURLLengthRow = custom_widgets.SpinBoxRow(tr("Maximum URL length:"), self)
        self.maximumURLLengthRow.expander.setText(tr("characters"))
        self.maximumURLLength = self.maximumURLLengthRow.spinBox
        self.maximumURLLength.setMaximum(9999)
        self.layout().addWidget(self.maximumURLLengthRow)

        # Maximum cache size spinbox.
        # The cache is gone because it f***s Nimbus with a chainsaw.
        #self.maximumCacheSizeRow = custom_widgets.SpinBoxRow(tr("Maximum cache size:"), self)
        #self.maximumCacheSizeRow.expander.setText(tr("MB"))
        #self.maximumCacheSize = self.maximumCacheSizeRow.spinBox
        #self.maximumCacheSize.setMaximum(20000)
        #self.layout().addWidget(self.maximumCacheSizeRow)

        # Checkbox to toggle geolocation.
        self.geolocationToggle = QCheckBox(tr("Enable geo&location"), self)
        self.layout().addWidget(self.geolocationToggle)

        self.geolocationPermissionsRow = custom_widgets.Row(self)
        self.layout().addWidget(self.geolocationPermissionsRow)

        self.geolocationWhitelistColumn = custom_widgets.Column(self)
        self.geolocationPermissionsRow.addWidget(self.geolocationWhitelistColumn)

        self.geolocationWhitelistLabel = QLabel(tr("Allow these sites to track my location:"), self)
        self.geolocationWhitelistColumn.addWidget(self.geolocationWhitelistLabel)

        self.geolocationWhitelist = QListWidget(self)
        self.geolocationWhitelistColumn.addWidget(self.geolocationWhitelist)

        self.removeFromWhitelistButton = QPushButton(tr("Remove"))
        self.removeFromWhitelistButton.clicked.connect(lambda: self.geolocationWhitelist.takeItem(self.geolocationWhitelist.row(self.geolocationWhitelist.currentItem())))
        self.geolocationWhitelistColumn.addWidget(self.removeFromWhitelistButton)

        self.geolocationBlacklistColumn = custom_widgets.Column(self)
        self.geolocationPermissionsRow.addWidget(self.geolocationBlacklistColumn)

        self.geolocationBlacklistLabel = QLabel(tr("Prevent these sites from tracking my location:"), self)
        self.geolocationBlacklistColumn.addWidget(self.geolocationBlacklistLabel)

        self.geolocationBlacklist = QListWidget(self)
        self.geolocationBlacklistColumn.addWidget(self.geolocationBlacklist)

        self.removeFromBlacklistButton = QPushButton(tr("Remove"))
        self.removeFromBlacklistButton.clicked.connect(lambda: self.geolocationBlacklist.takeItem(self.geolocationBlacklist.row(self.geolocationBlacklist.currentItem())))
        self.geolocationBlacklistColumn.addWidget(self.removeFromBlacklistButton)

        self.removeAction = QAction(self)
        self.removeAction.setShortcut("Del")
        self.removeAction.triggered.connect(lambda: self.geolocationWhitelist.takeItem(self.geolocationWhitelist.row(self.geolocationWhitelist.currentItem())) if self.geolocationWhitelist.hasFocus() else self.geolocationBlacklist.takeItem(self.geolocationBlacklist.row(self.geolocationBlacklist.currentItem())))
        self.addAction(self.removeAction)

        self.layout().addWidget(custom_widgets.Expander(self))
    def loadSettings(self):
        self.maximumURLLength.setValue(settings.setting_to_int("data/MaximumURLLength"))
        #self.maximumCacheSize.setValue(settings.setting_to_int("data/MaximumCacheSize"))
        self.rememberHistoryToggle.setChecked(settings.setting_to_bool("data/RememberHistory"))
        self.geolocationToggle.setChecked(settings.setting_to_bool("network/GeolocationEnabled"))
        self.geolocationWhitelist.clear()
        for url in data.geolocation_whitelist:
            self.geolocationWhitelist.addItem(url)
        self.geolocationBlacklist.clear()
        for url in data.geolocation_blacklist:
            self.geolocationBlacklist.addItem(url)
    def saveSettings(self):
        settings.settings.setValue("data/MaximumURLLength", self.maximumURLLength.value())
        #settings.settings.setValue("data/MaximumCacheSize", self.maximumCacheSize.value())
        settings.settings.setValue("data/RememberHistory", self.rememberHistoryToggle.isChecked())
        settings.settings.setValue("network/GeolocationEnabled", self.geolocationToggle.isChecked())
        data.geolocation_whitelist = [self.geolocationWhitelist.item(authority).text() for authority in range(0, self.geolocationWhitelist.count())]
        data.geolocation_blacklist = [self.geolocationBlacklist.item(authority).text() for authority in range(0, self.geolocationBlacklist.count())]
        data.saveData()