move "Look & Feel/Edit_metadata" to its own widget

This commit is contained in:
un-pogaz 2025-02-01 08:28:00 +01:00
parent b32e1beaf4
commit 78bfa97e03
4 changed files with 358 additions and 321 deletions

View File

@ -5,80 +5,20 @@ __license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'
from functools import partial
from qt.core import QIcon, QKeySequence, QListWidgetItem, Qt
from calibre.gui2 import gprefs
from calibre.gui2.custom_column_widgets import get_field_list as em_get_field_list
from calibre.gui2.preferences import ConfigWidgetBase, test_widget
from calibre.gui2.preferences.coloring import EditRules
from calibre.gui2.preferences.look_feel_tabs import (
DisplayedFields,
export_layout,
import_layout,
move_field_down,
move_field_up,
reset_layout,
selected_rows_metadatas,
)
from calibre.gui2.preferences.look_feel_tabs import selected_rows_metadatas
from calibre.gui2.preferences.look_feel_ui import Ui_Form
from calibre.gui2.widgets import BusyCursor
class EMDisplayedFields(DisplayedFields): # {{{
def __init__(self, db, parent=None):
DisplayedFields.__init__(self, db, parent)
def initialize(self, use_defaults=False, pref_data_override=None):
self.beginResetModel()
self.fields = [[x[0], x[1]] for x in
em_get_field_list(self.db, use_defaults=use_defaults, pref_data_override=pref_data_override)]
self.endResetModel()
self.changed = True
def commit(self):
if self.changed:
self.db.new_api.set_pref('edit_metadata_custom_columns_to_display', self.fields)
# }}}
class ConfigWidget(ConfigWidgetBase, Ui_Form):
def genesis(self, gui):
self.gui = gui
db = gui.library_view.model().db
r = self.register
choices = [(_('Default'), 'default'), (_('Compact metadata'), 'alt1'),
(_('All on 1 tab'), 'alt2')]
r('edit_metadata_single_layout', gprefs,
choices=[(_('Default'), 'default'), (_('Compact metadata'), 'alt1'),
(_('All on 1 tab'), 'alt2')])
r('edit_metadata_ignore_display_order', db.prefs)
r('edit_metadata_elision_point', gprefs,
choices=[(_('Left'), 'left'), (_('Middle'), 'middle'),
(_('Right'), 'right')])
r('edit_metadata_elide_labels', gprefs)
r('edit_metadata_single_use_2_cols_for_custom_fields', gprefs)
r('edit_metadata_bulk_cc_label_length', gprefs)
r('edit_metadata_single_cc_label_length', gprefs)
r('edit_metadata_templates_only_F2_on_booklist', gprefs)
self.em_display_model = EMDisplayedFields(self.gui.current_db, self.em_display_order)
self.em_display_model.dataChanged.connect(self.changed_signal)
self.em_display_order.setModel(self.em_display_model)
mu = partial(move_field_up, self.em_display_order, self.em_display_model)
md = partial(move_field_down, self.em_display_order, self.em_display_model)
self.em_display_order.set_movement_functions(mu, md)
self.em_up_button.clicked.connect(mu)
self.em_down_button.clicked.connect(md)
self.em_export_layout_button.clicked.connect(partial(export_layout, self, model=self.em_display_model))
self.em_import_layout_button.clicked.connect(partial(import_layout, self, model=self.em_display_model))
self.em_reset_layout_button.clicked.connect(partial(reset_layout, model=self.em_display_model))
self.edit_rules = EditRules(self.tabWidget)
self.edit_rules.changed.connect(self.changed_signal)
self.tabWidget.addTab(self.edit_rules, QIcon.ic('format-fill-color.png'), _('Column &coloring'))
@ -108,7 +48,6 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form):
def initialize(self):
ConfigWidgetBase.initialize(self)
self.em_display_model.initialize()
db = self.gui.current_db
mi = selected_rows_metadatas()
self.edit_rules.initialize(db.field_metadata, db.prefs, mi, 'column_color_rules')
@ -116,14 +55,12 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form):
def restore_defaults(self):
ConfigWidgetBase.restore_defaults(self)
self.em_display_model.restore_defaults()
self.edit_rules.clear()
self.icon_rules.clear()
self.changed_signal.emit()
def commit(self, *args):
with BusyCursor():
self.em_display_model.commit()
self.edit_rules.commit(self.gui.current_db.prefs)
self.icon_rules.commit(self.gui.current_db.prefs)

View File

@ -46,7 +46,7 @@
<string>&amp;Book details</string>
</attribute>
</widget>
<widget class="QWidget" name="edit_metadata_tab">
<widget class="EditMetadataTab" name="edit_metadata_tab">
<attribute name="icon">
<iconset resource="../../../../resources/images.qrc">
<normaloff>:/images/edit_input.png</normaloff>:/images/edit_input.png</iconset>
@ -54,257 +54,6 @@
<attribute name="title">
<string>Edit &amp;metadata</string>
</attribute>
<layout class="QVBoxLayout" name="vbox_layout_61">
<item>
<layout class="QFormLayout">
<item row="0" column="0">
<widget class="QLabel" name="edit_metadata_single_label">
<property name="text">
<string>Edit metadata (single) &amp;layout:</string>
</property>
<property name="buddy">
<cstring>opt_edit_metadata_single_layout</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="opt_edit_metadata_single_layout">
<property name="toolTip">
<string>Choose a different layout for the Edit metadata dialog. The compact metadata layout favors editing custom metadata over changing covers and formats.</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Select the custom columns (for this library) to display in the edit metadata dialogs and their order:</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="3" column="1">
<widget class="QToolButton" name="em_down_button">
<property name="toolTip">
<string>Move down. Keyboard shortcut: Ctrl-Down arrow</string>
</property>
<property name="icon">
<iconset resource="../../../../resources/images.qrc">
<normaloff>:/images/arrow-down.png</normaloff>:/images/arrow-down.png</iconset>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QToolButton" name="em_up_button">
<property name="toolTip">
<string>Move up. Keyboard shortcut: Ctrl-Up arrow</string>
</property>
<property name="icon">
<iconset resource="../../../../resources/images.qrc">
<normaloff>:/images/arrow-up.png</normaloff>:/images/arrow-up.png</iconset>
</property>
</widget>
</item>
<item row="2" column="1">
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0" rowspan="3">
<widget class="ListViewWithMoveByKeyPress" name="em_display_order">
<property name="alternatingRowColors">
<bool>true</bool>
</property>
</widget>
</item>
<item row="5" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QPushButton" name="em_reset_layout_button">
<property name="toolTip">
<string>Click this button to reset the list to its default order.</string>
</property>
<property name="text">
<string>Reset list</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="em_import_layout_button">
<property name="toolTip">
<string>&lt;p&gt;Click this button to set the list to one
previously exported. This could be useful if you have several libraries with
similar structure and you want to use the same column order for each one. Columns
in the imported list that aren't in the current library are ignored. Columns in
the library that are not in the imported list are put at the end and marked
as displayable.&lt;/p&gt;</string>
</property>
<property name="text">
<string>Import list</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="em_export_layout_button">
<property name="toolTip">
<string>&lt;p&gt;Click this button to write the current display
settings to a file. This could be useful if you have several libraries with similar
structure and you want to use the same column order for each one.&lt;/p&gt;</string>
</property>
<property name="text">
<string>Export list</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout">
<item>
<layout class="QFormLayout">
<item row="0" column="0" colspan="2">
<widget class="QCheckBox" name="opt_edit_metadata_ignore_display_order">
<property name="toolTip">
<string>&lt;p&gt;Check this box to make the edit metadata dialogs ignore the
above specifications, showing all the columns in the default order. This is
useful for temporarily seeing all your columns in the dialogs without losing
the display and order specifications.&lt;/p&gt;</string>
</property>
<property name="text">
<string>Show &amp;all columns in default order when editing metadata</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QCheckBox" name="opt_edit_metadata_elide_labels">
<property name="toolTip">
<string>If checked then labels wider than the label width
will be elided, otherwise they will be word wrapped.</string>
</property>
<property name="text">
<string>&amp;Elide labels when editing custom columns</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_1023">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="1">
<layout class="QHBoxLayout">
<item>
<widget class="QLabel" name="label_102">
<property name="text">
<string>Elision point:</string>
</property>
<property name="buddy">
<cstring>opt_edit_metadata_elision_point</cstring>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="opt_edit_metadata_elision_point">
<property name="toolTip">
<string>Choose where in the label to put the...</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="0" colspan="2">
<widget class="QCheckBox" name="opt_edit_metadata_templates_only_F2_on_booklist">
<property name="toolTip">
<string>&lt;p&gt;Check this box to allow only the F2 (Edit) key to
open the template editor in the book list for a &quot;Column built from other
columns&quot;. Editing with mouse clicks and the Tab key will be disabled.&lt;/p&gt;</string>
</property>
<property name="text">
<string>Only the &amp;F2 (Edit) key edits column templates in the book list</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QFormLayout">
<item row="0" column="0" colspan="2">
<widget class="QCheckBox" name="opt_edit_metadata_single_use_2_cols_for_custom_fields">
<property name="text">
<string>Use &amp;two columns for custom columns in the Default layout</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_102">
<property name="text">
<string>&amp;Bulk edit custom column label length:</string>
</property>
<property name="buddy">
<cstring>opt_edit_metadata_bulk_cc_label_length</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="opt_edit_metadata_bulk_cc_label_length">
<property name="toolTip">
<string>The maximum width of a custom column label for the bulk metadata edit dialog in average characters.</string>
</property>
<property name="suffix">
<string> chars</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_1022">
<property name="text">
<string>&amp;Single edit custom column label length:</string>
</property>
<property name="buddy">
<cstring>opt_edit_metadata_single_cc_label_length</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="opt_edit_metadata_single_cc_label_length">
<property name="toolTip">
<string>The maximum width of a custom column label for the single metadata edit dialog in average characters.</string>
</property>
<property name="suffix">
<string> chars</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QTabWidget" name="tag_browser_tab">
<attribute name="icon">
@ -368,11 +117,6 @@ columns&quot;. Editing with mouse clicks and the Tab key will be disabled.&lt;/p
</layout>
</widget>
<customwidgets>
<customwidget>
<class>ListViewWithMoveByKeyPress</class>
<extends>QListView</extends>
<header>calibre/gui2/preferences.h</header>
</customwidget>
<customwidget>
<class>ScrollingTabWidget</class>
<extends>QTabWidget</extends>
@ -399,6 +143,11 @@ columns&quot;. Editing with mouse clicks and the Tab key will be disabled.&lt;/p
<extends>ConfigWidgetBase</extends>
<header>calibre/gui2/preferences/look_feel_tabs/book_details.h</header>
</customwidget>
<customwidget>
<class>EditMetadataTab</class>
<extends>ConfigWidgetBase</extends>
<header>calibre/gui2/preferences/look_feel_tabs/edit_metadata.h</header>
</customwidget>
<customwidget>
<class>TbDisplayTab</class>
<extends>ConfigWidgetBase</extends>

View File

@ -0,0 +1,77 @@
#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2025, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'
from functools import partial
from calibre.gui2 import gprefs
from calibre.gui2.custom_column_widgets import get_field_list as em_get_field_list
from calibre.gui2.preferences import LazyConfigWidgetBase
from calibre.gui2.preferences.look_feel_tabs import DisplayedFields, export_layout, import_layout, move_field_down, move_field_up, reset_layout
from calibre.gui2.preferences.look_feel_tabs.edit_metadata_ui import Ui_Form
from calibre.gui2.widgets import BusyCursor
class EMDisplayedFields(DisplayedFields):
def __init__(self, db, parent=None):
DisplayedFields.__init__(self, db, parent)
def initialize(self, use_defaults=False, pref_data_override=None):
self.beginResetModel()
self.fields = [[x[0], x[1]] for x in
em_get_field_list(self.db, use_defaults=use_defaults, pref_data_override=pref_data_override)]
self.endResetModel()
self.changed = True
def commit(self):
if self.changed:
self.db.new_api.set_pref('edit_metadata_custom_columns_to_display', self.fields)
class EditMetadataTab(LazyConfigWidgetBase, Ui_Form):
def genesis(self, gui):
self.gui = gui
db = self.gui.library_view.model().db
r = self.register
r('edit_metadata_single_layout', gprefs,
choices=[(_('Default'), 'default'), (_('Compact metadata'), 'alt1'),
(_('All on 1 tab'), 'alt2')])
r('edit_metadata_ignore_display_order', db.prefs)
r('edit_metadata_elision_point', gprefs,
choices=[(_('Left'), 'left'), (_('Middle'), 'middle'),
(_('Right'), 'right')])
r('edit_metadata_elide_labels', gprefs)
r('edit_metadata_single_use_2_cols_for_custom_fields', gprefs)
r('edit_metadata_bulk_cc_label_length', gprefs)
r('edit_metadata_single_cc_label_length', gprefs)
r('edit_metadata_templates_only_F2_on_booklist', gprefs)
self.em_display_model = EMDisplayedFields(self.gui.current_db, self.em_display_order)
self.em_display_model.dataChanged.connect(self.changed_signal)
self.em_display_order.setModel(self.em_display_model)
mu = partial(move_field_up, self.em_display_order, self.em_display_model)
md = partial(move_field_down, self.em_display_order, self.em_display_model)
self.em_display_order.set_movement_functions(mu, md)
self.em_up_button.clicked.connect(mu)
self.em_down_button.clicked.connect(md)
self.em_export_layout_button.clicked.connect(partial(export_layout, self, model=self.em_display_model))
self.em_import_layout_button.clicked.connect(partial(import_layout, self, model=self.em_display_model))
self.em_reset_layout_button.clicked.connect(partial(reset_layout, model=self.em_display_model))
def lazy_initialize(self):
self.em_display_model.initialize()
def commit(self):
with BusyCursor():
self.em_display_model.commit()
return LazyConfigWidgetBase.commit(self)
def restore_defaults(self):
LazyConfigWidgetBase.restore_defaults(self)
self.em_display_model.restore_defaults()
self.changed_signal.emit()

View File

@ -0,0 +1,274 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="edit_metadata_tab">
<attribute name="icon">
<iconset resource="../../../../resources/images.qrc">
<normaloff>:/images/edit_input.png</normaloff>:/images/edit_input.png</iconset>
</attribute>
<attribute name="title">
<string>Edit &amp;metadata</string>
</attribute>
<layout class="QVBoxLayout" name="vbox_layout_61">
<item>
<layout class="QFormLayout">
<item row="0" column="0">
<widget class="QLabel" name="edit_metadata_single_label">
<property name="text">
<string>Edit metadata (single) &amp;layout:</string>
</property>
<property name="buddy">
<cstring>opt_edit_metadata_single_layout</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="opt_edit_metadata_single_layout">
<property name="toolTip">
<string>Choose a different layout for the Edit metadata dialog. The compact metadata layout favors editing custom metadata over changing covers and formats.</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Select the custom columns (for this library) to display in the edit metadata dialogs and their order:</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="3" column="1">
<widget class="QToolButton" name="em_down_button">
<property name="toolTip">
<string>Move down. Keyboard shortcut: Ctrl-Down arrow</string>
</property>
<property name="icon">
<iconset resource="../../../../resources/images.qrc">
<normaloff>:/images/arrow-down.png</normaloff>:/images/arrow-down.png</iconset>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QToolButton" name="em_up_button">
<property name="toolTip">
<string>Move up. Keyboard shortcut: Ctrl-Up arrow</string>
</property>
<property name="icon">
<iconset resource="../../../../resources/images.qrc">
<normaloff>:/images/arrow-up.png</normaloff>:/images/arrow-up.png</iconset>
</property>
</widget>
</item>
<item row="2" column="1">
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0" rowspan="3">
<widget class="ListViewWithMoveByKeyPress" name="em_display_order">
<property name="alternatingRowColors">
<bool>true</bool>
</property>
</widget>
</item>
<item row="5" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QPushButton" name="em_reset_layout_button">
<property name="toolTip">
<string>Click this button to reset the list to its default order.</string>
</property>
<property name="text">
<string>Reset list</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="em_import_layout_button">
<property name="toolTip">
<string>&lt;p&gt;Click this button to set the list to one
previously exported. This could be useful if you have several libraries with
similar structure and you want to use the same column order for each one. Columns
in the imported list that aren't in the current library are ignored. Columns in
the library that are not in the imported list are put at the end and marked
as displayable.&lt;/p&gt;</string>
</property>
<property name="text">
<string>Import list</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="em_export_layout_button">
<property name="toolTip">
<string>&lt;p&gt;Click this button to write the current display
settings to a file. This could be useful if you have several libraries with similar
structure and you want to use the same column order for each one.&lt;/p&gt;</string>
</property>
<property name="text">
<string>Export list</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout">
<item>
<layout class="QFormLayout">
<item row="0" column="0" colspan="2">
<widget class="QCheckBox" name="opt_edit_metadata_ignore_display_order">
<property name="toolTip">
<string>&lt;p&gt;Check this box to make the edit metadata dialogs ignore the
above specifications, showing all the columns in the default order. This is
useful for temporarily seeing all your columns in the dialogs without losing
the display and order specifications.&lt;/p&gt;</string>
</property>
<property name="text">
<string>Show &amp;all columns in default order when editing metadata</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QCheckBox" name="opt_edit_metadata_elide_labels">
<property name="toolTip">
<string>If checked then labels wider than the label width
will be elided, otherwise they will be word wrapped.</string>
</property>
<property name="text">
<string>&amp;Elide labels when editing custom columns</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_1023">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="1">
<layout class="QHBoxLayout">
<item>
<widget class="QLabel" name="label_102">
<property name="text">
<string>Elision point:</string>
</property>
<property name="buddy">
<cstring>opt_edit_metadata_elision_point</cstring>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="opt_edit_metadata_elision_point">
<property name="toolTip">
<string>Choose where in the label to put the...</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="0" colspan="2">
<widget class="QCheckBox" name="opt_edit_metadata_templates_only_F2_on_booklist">
<property name="toolTip">
<string>&lt;p&gt;Check this box to allow only the F2 (Edit) key to
open the template editor in the book list for a &quot;Column built from other
columns&quot;. Editing with mouse clicks and the Tab key will be disabled.&lt;/p&gt;</string>
</property>
<property name="text">
<string>Only the &amp;F2 (Edit) key edits column templates in the book list</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QFormLayout">
<item row="0" column="0" colspan="2">
<widget class="QCheckBox" name="opt_edit_metadata_single_use_2_cols_for_custom_fields">
<property name="text">
<string>Use &amp;two columns for custom columns in the Default layout</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_102">
<property name="text">
<string>&amp;Bulk edit custom column label length:</string>
</property>
<property name="buddy">
<cstring>opt_edit_metadata_bulk_cc_label_length</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="opt_edit_metadata_bulk_cc_label_length">
<property name="toolTip">
<string>The maximum width of a custom column label for the bulk metadata edit dialog in average characters.</string>
</property>
<property name="suffix">
<string> chars</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_1022">
<property name="text">
<string>&amp;Single edit custom column label length:</string>
</property>
<property name="buddy">
<cstring>opt_edit_metadata_single_cc_label_length</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="opt_edit_metadata_single_cc_label_length">
<property name="toolTip">
<string>The maximum width of a custom column label for the single metadata edit dialog in average characters.</string>
</property>
<property name="suffix">
<string> chars</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>ListViewWithMoveByKeyPress</class>
<extends>QListView</extends>
<header>calibre/gui2/preferences.h</header>
</customwidget>
</customwidgets>
<resources>
<include location="../../../../resources/images.qrc"/>
</resources>
</ui>