If there is both an attribute validate_before_accept=True and a method validate() in the config_widget then calll validate() when the config dialog OK button is pressed.

This commit is contained in:
Charles Haley 2025-05-11 11:15:58 +01:00
parent ff4e978ce5
commit d4fdd34d74
3 changed files with 32 additions and 10 deletions

View File

@ -149,17 +149,35 @@ class Plugin: # {{{
from calibre.gui2 import gprefs from calibre.gui2 import gprefs
class ConfigDialog(QDialog):
def __init__(self, parent, config_widget):
super().__init__(parent)
self.config_widget = config_widget
def accept(self):
print('in accept')
if ((validate := getattr(self.config_widget, 'validate', None)) and
getattr(self.config_widget, 'validate_before_accept', False)):
print('have validate and validate_before_accept')
if not validate():
return
print('accepting')
super().accept()
try:
config_widget = self.config_widget()
except NotImplementedError:
config_widget = None
prefname = 'plugin config dialog:'+self.type + ':' + self.name prefname = 'plugin config dialog:'+self.type + ':' + self.name
config_dialog = QDialog(parent)
config_dialog = ConfigDialog(parent, config_widget)
button_box = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel) button_box = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel)
v = QVBoxLayout(config_dialog) v = QVBoxLayout(config_dialog)
button_box.accepted.connect(config_dialog.accept) button_box.accepted.connect(config_dialog.accept)
button_box.rejected.connect(config_dialog.reject) button_box.rejected.connect(config_dialog.reject)
config_dialog.setWindowTitle(_('Customize') + ' ' + self.name) config_dialog.setWindowTitle(_('Customize') + ' ' + self.name)
try:
config_widget = self.config_widget()
except NotImplementedError:
config_widget = None
if isinstance(config_widget, tuple): if isinstance(config_widget, tuple):
from calibre.gui2 import warning_dialog from calibre.gui2 import warning_dialog

View File

@ -54,11 +54,13 @@ class KOBOTOUCHConfig(TabbedDeviceConfig):
def __init__(self, device_settings, all_formats, supports_subdirs, def __init__(self, device_settings, all_formats, supports_subdirs,
must_read_metadata, supports_use_author_sort, must_read_metadata, supports_use_author_sort,
extra_customization_message, device, extra_customization_choices=None, parent=None): extra_customization_message, device, extra_customization_choices=None,
parent=None):
super().__init__(device_settings, all_formats, supports_subdirs, super().__init__(device_settings, all_formats, supports_subdirs,
must_read_metadata, supports_use_author_sort, must_read_metadata, supports_use_author_sort,
extra_customization_message, device, extra_customization_choices, parent) extra_customization_message, device, extra_customization_choices, parent,
validate_before_accept=True)
self.device_settings = device_settings self.device_settings = device_settings
self.all_formats = all_formats self.all_formats = all_formats
@ -570,7 +572,6 @@ class CollectionsGroupBox(DeviceOptionsGroupBox):
self.use_collections_template_checkbox.clicked.connect(self.use_collections_template_checkbox_clicked) self.use_collections_template_checkbox.clicked.connect(self.use_collections_template_checkbox_clicked)
self.use_collections_columns_checkbox_clicked(device.get_pref('use_collections_columns')) self.use_collections_columns_checkbox_clicked(device.get_pref('use_collections_columns'))
self.use_collections_template_checkbox_clicked(device.get_pref('use_collections_template')) self.use_collections_template_checkbox_clicked(device.get_pref('use_collections_template'))
self.collections_columns_edit.editingFinished.connect(self.validate_collections_columns)
def validate(self): def validate(self):
v = self.validate_collections_columns() v = self.validate_collections_columns()
@ -590,7 +591,6 @@ class CollectionsGroupBox(DeviceOptionsGroupBox):
error_dialog(self, _('Kobo configuration: Invalid collection column names'), error_dialog(self, _('Kobo configuration: Invalid collection column names'),
'<p>'+_("Collection column names that don't exist in the library: {0}").format(s), '<p>'+_("Collection column names that don't exist in the library: {0}").format(s),
show=True) show=True)
self.collections_columns_edit.setFocus(Qt.FocusReason.OtherFocusReason)
return False return False
return True return True

View File

@ -63,15 +63,19 @@ class TabbedDeviceConfig(QTabWidget):
DeviceConfigTab, for each set of options. Within the tabs, group boxes, subclassed DeviceConfigTab, for each set of options. Within the tabs, group boxes, subclassed
from DeviceOptionsGroupBox, are created to further group the options. The group from DeviceOptionsGroupBox, are created to further group the options. The group
boxes can be coded to support any control type and dependencies between them. boxes can be coded to support any control type and dependencies between them.
Set validate_before_accept to True if you want validation() to be called
when OK is pressed
''' '''
def __init__(self, device_settings, all_formats, supports_subdirs, def __init__(self, device_settings, all_formats, supports_subdirs,
must_read_metadata, supports_use_author_sort, must_read_metadata, supports_use_author_sort,
extra_customization_message, device, extra_customization_message, device,
extra_customization_choices=None, parent=None): extra_customization_choices=None, parent=None, validate_before_accept = False):
QTabWidget.__init__(self, parent) QTabWidget.__init__(self, parent)
self._device = weakref.ref(device) self._device = weakref.ref(device)
self.validate_before_accept = validate_before_accept
self.device_settings = device_settings self.device_settings = device_settings
self.all_formats = set(all_formats) self.all_formats = set(all_formats)
self.supports_subdirs = supports_subdirs self.supports_subdirs = supports_subdirs