Add configuration to example plugin

This commit is contained in:
Kovid Goyal 2011-03-27 13:12:07 -06:00
parent cc219f774f
commit 87c7fc9558
4 changed files with 97 additions and 3 deletions

View File

@ -32,3 +32,33 @@ class InterfacePluginDemo(InterfaceActionBase):
#: The specified class must be defined in the specified module. #: The specified class must be defined in the specified module.
actual_plugin = 'calibre_plugins.interface_demo.ui:InterfacePlugin' actual_plugin = 'calibre_plugins.interface_demo.ui:InterfacePlugin'
def config_widget(self):
'''
Implement this method and :meth:`save_settings` in your plugin to
use a custom configuration dialog.
This method, if implemented, must return a QWidget. The widget can have
an optional method validate() that takes no arguments and is called
immediately after the user clicks OK. Changes are applied if and only
if the method returns True.
If for some reason you cannot perform the configuration at this time,
return a tuple of two strings (message, details), these will be
displayed as a warning dialog to the user and the process will be
aborted.
The base class implementation of this method raises NotImplementedError
so by default no user configuration is possible.
'''
from calibre_plugins.interface_demo.config import ConfigWidget
return ConfigWidget()
def save_settings(self, config_widget):
'''
Save the settings specified by the user with config_widget.
:param config_widget: The widget returned by :meth:`config_widget`.
'''
config_widget.save_settings()

View File

@ -0,0 +1,42 @@
#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import (unicode_literals, division, absolute_import,
print_function)
__license__ = 'GPL v3'
__copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'
from PyQt4.Qt import QWidget, QHBoxLayout, QLabel, QLineEdit
from calibre.utils.config import JSONConfig
# This is where all preferences for this plugin will be stored
# Remember that this name is also ina global namespace, so make it as uniqie
# as possible.
# It is good etiquette, though not strictly required to always prefix your
# config file name with plugins/, so as to ensure you dont accidentally clobber
# a calibre config file
prefs = JSONConfig('plugins/interface_demo')
# Set defaults
prefs.defaults['hello_world_msg'] = 'Hello, World!'
class ConfigWidget(QWidget):
def __init__(self):
QWidget.__init__(self)
self.l = QHBoxLayout()
self.setLayout(self.l)
self.label = QLabel('Hello world &message:')
self.l.addWidget(self.label)
self.msg = QLineEdit(self)
self.msg.setText(prefs['hello_world_msg'])
self.l.addWidget(self.msg)
self.label.setBuddy(self.msg)
def save_settings(self):
prefs['hello_world_msg'] = unicode(self.msg.text())

View File

@ -13,13 +13,16 @@ if False:
# You do not need this code in your plugins # You do not need this code in your plugins
get_icons = get_resources = None get_icons = get_resources = None
from PyQt4.Qt import QDialog, QVBoxLayout, QPushButton, QMessageBox from PyQt4.Qt import QDialog, QVBoxLayout, QPushButton, QMessageBox, QLabel
from calibre_plugins.interface_demo.config import prefs
class DemoDialog(QDialog): class DemoDialog(QDialog):
def __init__(self, gui, icon): def __init__(self, gui, icon, do_user_config):
QDialog.__init__(self, gui) QDialog.__init__(self, gui)
self.gui = gui self.gui = gui
self.do_user_config = do_user_config
# The current database shown in the GUI # The current database shown in the GUI
# db is an instance of the class LibraryDatabase2 from database.py # db is an instance of the class LibraryDatabase2 from database.py
@ -30,6 +33,8 @@ class DemoDialog(QDialog):
self.l = QVBoxLayout() self.l = QVBoxLayout()
self.setLayout(self.l) self.setLayout(self.l)
self.label = QLabel(prefs['hello_world_msg'])
self.l.addWidget(self.label)
self.setWindowTitle('Interface Plugin Demo') self.setWindowTitle('Interface Plugin Demo')
self.setWindowIcon(icon) self.setWindowIcon(icon)
@ -48,6 +53,11 @@ class DemoDialog(QDialog):
self.view_button.clicked.connect(self.view) self.view_button.clicked.connect(self.view)
self.l.addWidget(self.view_button) self.l.addWidget(self.view_button)
self.conf_button = QPushButton(
'Configure this plugin', self)
self.conf_button.clicked.connect(self.config)
self.l.addWidget(self.conf_button)
self.resize(self.sizeHint()) self.resize(self.sizeHint())
def about(self): def about(self):
@ -99,4 +109,8 @@ class DemoDialog(QDialog):
# Ask the view plugin to launch the viewer for row_number # Ask the view plugin to launch the viewer for row_number
view_plugin._view_books([row_number]) view_plugin._view_books([row_number])
def config(self):
self.do_user_config(parent=self)
# Apply the changes
self.label.setText(prefs['hello_world_msg'])

View File

@ -50,10 +50,18 @@ class InterfacePlugin(InterfaceAction):
self.qaction.triggered.connect(self.show_dialog) self.qaction.triggered.connect(self.show_dialog)
def show_dialog(self): def show_dialog(self):
# The base plugin object defined in __init__.py
base_plugin_object = self.interface_action_base_plugin
# Show the config dialog
# The config dialog can also be shown from within
# Preferences->Plugins, which is why the do_user_config
# method is defined on the base plugin class
do_user_config = base_plugin_object.do_user_config
# self.gui is the main calibre GUI. It acts as the gateway to access # self.gui is the main calibre GUI. It acts as the gateway to access
# all the elements of the calibre user interface, it should also be the # all the elements of the calibre user interface, it should also be the
# parent of the dialog # parent of the dialog
d = DemoDialog(self.gui, self.qaction.icon()) d = DemoDialog(self.gui, self.qaction.icon(), do_user_config)
d.show() d.show()