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)