diff --git a/readability/__init__.py b/readability/__init__.py index 77702a8..97a40cf 100644 --- a/readability/__init__.py +++ b/readability/__init__.py @@ -19,6 +19,7 @@ import os from PySide2 import QtCore, QtGui from readability.settingsDialog import SettingsDialog from readability.button import Button +from readability.str2bool import str2bool class Readability(Falkon.PluginInterface, QtCore.QObject): @@ -29,7 +30,8 @@ class Readability(Falkon.PluginInterface, QtCore.QObject): def init(self, state, settingsPath): self.config = { "settingsFile": os.path.join(settingsPath, "readability", "settings.ini"), - "icon": "dark" + "icon": "dark", + "contextMenu": False } self.buttons = {} self.loadSettings() @@ -63,6 +65,9 @@ class Readability(Falkon.PluginInterface, QtCore.QObject): del self.buttons[window] def populateWebViewMenu(self, menu, view, hitTestResult): + if not self.config["contextMenu"]: + return + self.view = view if (hitTestResult.imageUrl().isEmpty() @@ -142,6 +147,7 @@ class Readability(Falkon.PluginInterface, QtCore.QObject): settings.beginGroup("Readability") settings.setValue("icon", self.config["icon"]) + settings.setValue("showInContextMenu", self.config["contextMenu"]) settings.endGroup() settings.sync() @@ -151,6 +157,9 @@ class Readability(Falkon.PluginInterface, QtCore.QObject): settings.beginGroup("Readability") self.config["icon"] = str(settings.value("icon", self.config["icon"])) + self.config["contextMenu"] = str2bool( + settings.value("showInContextMenu", self.config["contextMenu"]) + ) settings.endGroup() def onConfigUpdate(self): diff --git a/readability/settingsDialog.py b/readability/settingsDialog.py index 355f9ee..8e8c511 100644 --- a/readability/settingsDialog.py +++ b/readability/settingsDialog.py @@ -44,6 +44,7 @@ class SettingsDialog(QtWidgets.QDialog): self.ui.radioButtonLight.setChecked(self.config["icon"] == "light") self.ui.radioButtonDark.setChecked(self.config["icon"] == "dark") + self.ui.checkBoxContextMenu.setChecked(self.config["contextMenu"]) self.ui.buttonBoxConfirm.accepted.connect(self.accept) self.ui.buttonBoxConfirm.rejected.connect(self.reject) @@ -52,9 +53,11 @@ class SettingsDialog(QtWidgets.QDialog): self.setWindowTitle(i18n("Readability Settings")) self.ui.radioButtonLight.setText(i18n("Light")) self.ui.radioButtonDark.setText(i18n("Dark")) + self.ui.checkBoxContextMenu.setText(i18n("Show in context menu")) def updateData(self): self.config["icon"] = "light" if self.ui.radioButtonLight.isChecked() else "dark" + self.config["contextMenu"] = self.ui.checkBoxContextMenu.isChecked() def accept(self): self.updateData() diff --git a/readability/settingsDialog.ui b/readability/settingsDialog.ui index 9e00d5f..90550eb 100644 --- a/readability/settingsDialog.ui +++ b/readability/settingsDialog.ui @@ -42,6 +42,13 @@ + + + + Show in context menu + + + diff --git a/readability/str2bool.py b/readability/str2bool.py new file mode 100644 index 0000000..f55392f --- /dev/null +++ b/readability/str2bool.py @@ -0,0 +1,55 @@ +"""BSD 3-Clause License + +Copyright (c) 2017, SymonSoft +Copyright (c) 2019, Juraj Oravec +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.""" + +import sys + +_true_set = {'yes', 'true', 't', 'y', '1'} +_false_set = {'no', 'false', 'f', 'n', '0'} + + +def str2bool(value, raise_exc=False): + if isinstance(value, bool): + return value + + if isinstance(value, str) or sys.version_info[0] < 3 and isinstance(value, basestring): + value = value.lower() + if value in _true_set: + return True + if value in _false_set: + return False + + if raise_exc: + raise ValueError('Expected "%s"' % '", "'.join(_true_set | _false_set)) + return None + + +def str2bool_exc(value): + return str2bool(value, raise_exc=True)