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()
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()
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))
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()
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()
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()
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()
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()
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()
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)
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))
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()
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()