mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Kobo driver: Allow using templates to generate collections
Merge branch 'master' of https://github.com/davidfor/calibre
This commit is contained in:
commit
c1f6765fce
@ -9,6 +9,7 @@ from calibre.constants import preferred_encoding, DEBUG
|
|||||||
from calibre import isbytestring
|
from calibre import isbytestring
|
||||||
|
|
||||||
from calibre.ebooks.metadata.book.base import Metadata
|
from calibre.ebooks.metadata.book.base import Metadata
|
||||||
|
from calibre.ebooks.metadata.book.formatter import SafeFormat
|
||||||
from calibre.devices.usbms.books import Book as Book_, CollectionsBookList, none_cmp
|
from calibre.devices.usbms.books import Book as Book_, CollectionsBookList, none_cmp
|
||||||
from calibre.utils.config_base import prefs
|
from calibre.utils.config_base import prefs
|
||||||
from calibre.devices.usbms.driver import debug_print
|
from calibre.devices.usbms.driver import debug_print
|
||||||
@ -132,7 +133,7 @@ class KTCollectionsBookList(CollectionsBookList):
|
|||||||
super().__init__(oncard, prefix, settings)
|
super().__init__(oncard, prefix, settings)
|
||||||
self.set_device_managed_collections([])
|
self.set_device_managed_collections([])
|
||||||
|
|
||||||
def get_collections(self, collection_attributes):
|
def get_collections(self, collection_attributes, collections_template=None, template_globals=None):
|
||||||
debug_print("KTCollectionsBookList:get_collections - start - collection_attributes=", collection_attributes)
|
debug_print("KTCollectionsBookList:get_collections - start - collection_attributes=", collection_attributes)
|
||||||
|
|
||||||
collections = {}
|
collections = {}
|
||||||
@ -157,14 +158,17 @@ class KTCollectionsBookList(CollectionsBookList):
|
|||||||
lpath = getattr(book, 'lpath', None)
|
lpath = getattr(book, 'lpath', None)
|
||||||
if lpath is None:
|
if lpath is None:
|
||||||
continue
|
continue
|
||||||
# If the book is not in the current library, we don't want to use the metadtaa for the collections
|
# If the book is not in the current library, we don't want to use the metadata for the collections
|
||||||
if book.application_id is None:
|
# or it is a book that cannot be put in a collection (such as recommendations or previews)
|
||||||
# debug_print("KTCollectionsBookList:get_collections - Book not in current library")
|
if book.application_id is None or not book.can_put_on_shelves:
|
||||||
|
# debug_print("KTCollectionsBookList:get_collections - Book not in current library or cannot be put in a collection")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Decide how we will build the collections. The default: leave the
|
# Decide how we will build the collections. The default: leave the
|
||||||
# book in all existing collections. Do not add any new ones.
|
# book in all existing collections. Do not add any new ones.
|
||||||
attrs = ['device_collections']
|
attrs = ['device_collections']
|
||||||
if getattr(book, '_new_book', False):
|
if getattr(book, '_new_book', False):
|
||||||
|
debug_print("KTCollectionsBookList:get_collections - sending new book")
|
||||||
if prefs['manage_device_metadata'] == 'manual':
|
if prefs['manage_device_metadata'] == 'manual':
|
||||||
# Ensure that the book is in all the book's existing
|
# Ensure that the book is in all the book's existing
|
||||||
# collections plus all metadata collections
|
# collections plus all metadata collections
|
||||||
@ -173,11 +177,11 @@ class KTCollectionsBookList(CollectionsBookList):
|
|||||||
# For new books, both 'on_send' and 'on_connect' do the same
|
# For new books, both 'on_send' and 'on_connect' do the same
|
||||||
# thing. The book's existing collections are ignored. Put
|
# thing. The book's existing collections are ignored. Put
|
||||||
# the book in collections defined by its metadata.
|
# the book in collections defined by its metadata.
|
||||||
attrs = collection_attributes
|
attrs = list(collection_attributes)
|
||||||
elif prefs['manage_device_metadata'] == 'on_connect':
|
elif prefs['manage_device_metadata'] == 'on_connect':
|
||||||
# For existing books, modify the collections only if the user
|
# For existing books, modify the collections only if the user
|
||||||
# specified 'on_connect'
|
# specified 'on_connect'
|
||||||
attrs = collection_attributes
|
attrs = list(collection_attributes)
|
||||||
for cat_name in self.device_managed_collections:
|
for cat_name in self.device_managed_collections:
|
||||||
if cat_name in book.device_collections:
|
if cat_name in book.device_collections:
|
||||||
if cat_name not in collections:
|
if cat_name not in collections:
|
||||||
@ -185,17 +189,22 @@ class KTCollectionsBookList(CollectionsBookList):
|
|||||||
if show_debug:
|
if show_debug:
|
||||||
debug_print("KTCollectionsBookList:get_collections - Device Managed Collection:", cat_name)
|
debug_print("KTCollectionsBookList:get_collections - Device Managed Collection:", cat_name)
|
||||||
if lpath not in collections[cat_name]:
|
if lpath not in collections[cat_name]:
|
||||||
collections[cat_name][lpath] = (book, tsval, tsval)
|
collections[cat_name][lpath] = book
|
||||||
if show_debug:
|
if show_debug:
|
||||||
debug_print("KTCollectionsBookList:get_collections - Device Managed Collection -added book to cat_name", cat_name)
|
debug_print("KTCollectionsBookList:get_collections - Device Managed Collection -added book to cat_name", cat_name)
|
||||||
book.device_collections = []
|
book.device_collections = []
|
||||||
if show_debug:
|
if show_debug:
|
||||||
debug_print("KTCollectionsBookList:get_collections - attrs=", attrs)
|
debug_print("KTCollectionsBookList:get_collections - attrs=", attrs)
|
||||||
|
|
||||||
|
if collections_template is not None:
|
||||||
|
attrs.append('%template%')
|
||||||
|
|
||||||
for attr in attrs:
|
for attr in attrs:
|
||||||
|
fm = None
|
||||||
attr = attr.strip()
|
attr = attr.strip()
|
||||||
if show_debug:
|
if show_debug:
|
||||||
debug_print("KTCollectionsBookList:get_collections - attr='%s'"%attr)
|
debug_print("KTCollectionsBookList:get_collections - attr='%s'"%attr)
|
||||||
|
|
||||||
# If attr is device_collections, then we cannot use
|
# If attr is device_collections, then we cannot use
|
||||||
# format_field, because we don't know the fields where the
|
# format_field, because we don't know the fields where the
|
||||||
# values came from.
|
# values came from.
|
||||||
@ -204,10 +213,16 @@ class KTCollectionsBookList(CollectionsBookList):
|
|||||||
val = book.device_collections # is a list
|
val = book.device_collections # is a list
|
||||||
if show_debug:
|
if show_debug:
|
||||||
debug_print("KTCollectionsBookList:get_collections - adding book.device_collections", book.device_collections)
|
debug_print("KTCollectionsBookList:get_collections - adding book.device_collections", book.device_collections)
|
||||||
# If the book is not in the current library, we don't want to use the metadtaa for the collections
|
elif attr == '%template%':
|
||||||
elif book.application_id is None or not book.can_put_on_shelves:
|
doing_dc = False
|
||||||
# debug_print("KTCollectionsBookList:get_collections - Book not in current library")
|
val = ''
|
||||||
continue
|
if collections_template is not None:
|
||||||
|
nv = SafeFormat().safe_format(collections_template, book,
|
||||||
|
'KOBO', book, global_vars=template_globals)
|
||||||
|
if show_debug:
|
||||||
|
debug_print("KTCollectionsBookList:get_collections collections_template - result", nv)
|
||||||
|
if nv:
|
||||||
|
val = [v.strip() for v in nv.split(':@:') if v.strip()]
|
||||||
else:
|
else:
|
||||||
doing_dc = False
|
doing_dc = False
|
||||||
ign, val, orig_val, fm = book.format_field_extended(attr)
|
ign, val, orig_val, fm = book.format_field_extended(attr)
|
||||||
@ -216,6 +231,7 @@ class KTCollectionsBookList(CollectionsBookList):
|
|||||||
debug_print("KTCollectionsBookList:get_collections - not device_collections")
|
debug_print("KTCollectionsBookList:get_collections - not device_collections")
|
||||||
debug_print(' ign=', ign, ', val=', val, ' orig_val=', orig_val, 'fm=', fm)
|
debug_print(' ign=', ign, ', val=', val, ' orig_val=', orig_val, 'fm=', fm)
|
||||||
debug_print(' val=', val)
|
debug_print(' val=', val)
|
||||||
|
|
||||||
if not val:
|
if not val:
|
||||||
continue
|
continue
|
||||||
if isbytestring(val):
|
if isbytestring(val):
|
||||||
@ -246,26 +262,16 @@ class KTCollectionsBookList(CollectionsBookList):
|
|||||||
|
|
||||||
for category in val:
|
for category in val:
|
||||||
# debug_print("KTCollectionsBookList:get_collections - category=", category)
|
# debug_print("KTCollectionsBookList:get_collections - category=", category)
|
||||||
is_series = False
|
|
||||||
if doing_dc:
|
if doing_dc:
|
||||||
# Attempt to determine if this value is a series by
|
pass # No need to do anything with device_collections
|
||||||
# comparing it to the series name.
|
|
||||||
if category == book.series:
|
|
||||||
is_series = True
|
|
||||||
elif fm is not None and fm['is_custom']: # is a custom field
|
elif fm is not None and fm['is_custom']: # is a custom field
|
||||||
if fm['datatype'] == 'text' and len(category) > 1 and \
|
if fm['datatype'] == 'text' and len(category) > 1 and \
|
||||||
category[0] == '[' and category[-1] == ']':
|
category[0] == '[' and category[-1] == ']':
|
||||||
continue
|
continue
|
||||||
if fm['datatype'] == 'series':
|
|
||||||
is_series = True
|
|
||||||
else: # is a standard field
|
else: # is a standard field
|
||||||
if attr == 'tags' and len(category) > 1 and \
|
if attr == 'tags' and len(category) > 1 and \
|
||||||
category[0] == '[' and category[-1] == ']':
|
category[0] == '[' and category[-1] == ']':
|
||||||
continue
|
continue
|
||||||
if attr == 'series' or \
|
|
||||||
('series' in collection_attributes and
|
|
||||||
book.get('series', None) == category):
|
|
||||||
is_series = True
|
|
||||||
|
|
||||||
# The category should not be None, but, it has happened.
|
# The category should not be None, but, it has happened.
|
||||||
if not category:
|
if not category:
|
||||||
@ -278,15 +284,7 @@ class KTCollectionsBookList(CollectionsBookList):
|
|||||||
if show_debug:
|
if show_debug:
|
||||||
debug_print("KTCollectionsBookList:get_collections - created collection for cat_name", cat_name)
|
debug_print("KTCollectionsBookList:get_collections - created collection for cat_name", cat_name)
|
||||||
if lpath not in collections[cat_name]:
|
if lpath not in collections[cat_name]:
|
||||||
if is_series:
|
collections[cat_name][lpath] = book
|
||||||
if doing_dc:
|
|
||||||
collections[cat_name][lpath] = \
|
|
||||||
(book, book.get('series_index', sys.maxsize), tsval)
|
|
||||||
else:
|
|
||||||
collections[cat_name][lpath] = \
|
|
||||||
(book, book.get(attr+'_index', sys.maxsize), tsval)
|
|
||||||
else:
|
|
||||||
collections[cat_name][lpath] = (book, tsval, tsval)
|
|
||||||
if show_debug:
|
if show_debug:
|
||||||
debug_print("KTCollectionsBookList:get_collections - added book to collection for cat_name", cat_name)
|
debug_print("KTCollectionsBookList:get_collections - added book to collection for cat_name", cat_name)
|
||||||
if show_debug:
|
if show_debug:
|
||||||
@ -296,8 +294,7 @@ class KTCollectionsBookList(CollectionsBookList):
|
|||||||
result = {}
|
result = {}
|
||||||
|
|
||||||
for category, lpaths in collections.items():
|
for category, lpaths in collections.items():
|
||||||
books = sorted(lpaths.values(), key=cmp_to_key(none_cmp))
|
result[category] = lpaths.values()
|
||||||
result[category] = [x[0] for x in books]
|
|
||||||
# debug_print("KTCollectionsBookList:get_collections - result=", result.keys())
|
# debug_print("KTCollectionsBookList:get_collections - result=", result.keys())
|
||||||
debug_print("KTCollectionsBookList:get_collections - end")
|
debug_print("KTCollectionsBookList:get_collections - end")
|
||||||
return result
|
return result
|
||||||
|
@ -632,6 +632,7 @@ class KOBO(USBMS):
|
|||||||
book.size = os.stat(self.normalize_path(path)).st_size
|
book.size = os.stat(self.normalize_path(path)).st_size
|
||||||
b = booklists[blist].add_book(book, replace_metadata=True)
|
b = booklists[blist].add_book(book, replace_metadata=True)
|
||||||
if b:
|
if b:
|
||||||
|
debug_print("KoboTouch::add_books_to_metadata - have a new book - book=%s" % book)
|
||||||
b._new_book = True
|
b._new_book = True
|
||||||
self.report_progress(1.0, _('Adding books to device metadata listing...'))
|
self.report_progress(1.0, _('Adding books to device metadata listing...'))
|
||||||
|
|
||||||
@ -740,7 +741,7 @@ class KOBO(USBMS):
|
|||||||
' Doing so may require you to perform a Factory reset of'
|
' Doing so may require you to perform a Factory reset of'
|
||||||
' your Kobo.') + ((
|
' your Kobo.') + ((
|
||||||
'\nDevice database version: %s.'
|
'\nDevice database version: %s.'
|
||||||
'\nDevice firmware version: %s') % (self.dbversion, self.fwversion))
|
'\nDevice firmware version: %s') % (self.dbversion, self.display_fwversion))
|
||||||
, UserFeedback.WARN)
|
, UserFeedback.WARN)
|
||||||
|
|
||||||
return False
|
return False
|
||||||
@ -973,6 +974,12 @@ class KOBO(USBMS):
|
|||||||
opts = self.settings()
|
opts = self.settings()
|
||||||
return opts.extra_customization[self.OPT_SHOW_PREVIEWS] is False
|
return opts.extra_customization[self.OPT_SHOW_PREVIEWS] is False
|
||||||
|
|
||||||
|
@property
|
||||||
|
def display_fwversion(self):
|
||||||
|
if self.fwversion is None:
|
||||||
|
return ''
|
||||||
|
return '.'.join([str(v) for v in list(self.fwversion)])
|
||||||
|
|
||||||
def sync_booklists(self, booklists, end_session=True):
|
def sync_booklists(self, booklists, end_session=True):
|
||||||
debug_print('KOBO:sync_booklists - start')
|
debug_print('KOBO:sync_booklists - start')
|
||||||
paths = self.get_device_paths()
|
paths = self.get_device_paths()
|
||||||
@ -2464,6 +2471,7 @@ class KOBOTOUCH(KOBO):
|
|||||||
|
|
||||||
def update_device_database_collections(self, booklists, collections_attributes, oncard):
|
def update_device_database_collections(self, booklists, collections_attributes, oncard):
|
||||||
debug_print("KoboTouch:update_device_database_collections - oncard='%s'"%oncard)
|
debug_print("KoboTouch:update_device_database_collections - oncard='%s'"%oncard)
|
||||||
|
debug_print("KoboTouch:update_device_database_collections - device='%s'" % self)
|
||||||
if self.modify_database_check("update_device_database_collections") is False:
|
if self.modify_database_check("update_device_database_collections") is False:
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -2501,9 +2509,17 @@ class KOBOTOUCH(KOBO):
|
|||||||
booklists.set_debugging_title(debugging_title)
|
booklists.set_debugging_title(debugging_title)
|
||||||
booklists.set_device_managed_collections(self.ignore_collections_names)
|
booklists.set_device_managed_collections(self.ignore_collections_names)
|
||||||
|
|
||||||
bookshelf_attribute = len(collections_attributes) > 0
|
have_bookshelf_attributes = len(collections_attributes) > 0 and self.use_collections_template
|
||||||
|
|
||||||
collections = booklists.get_collections(collections_attributes) if bookshelf_attribute else None
|
collections = booklists.get_collections(collections_attributes,
|
||||||
|
collections_template=self.collections_template,
|
||||||
|
template_globals={
|
||||||
|
'serial_number': self.device_serial_no(),
|
||||||
|
'firmware_version': self.fwversion,
|
||||||
|
'display_firmware_version': self.display_fwversion,
|
||||||
|
'dbversion': self.dbversion,
|
||||||
|
}
|
||||||
|
) if have_bookshelf_attributes else None
|
||||||
# debug_print('KoboTouch:update_device_database_collections - Collections:', collections)
|
# debug_print('KoboTouch:update_device_database_collections - Collections:', collections)
|
||||||
|
|
||||||
# Create a connection to the sqlite database
|
# Create a connection to the sqlite database
|
||||||
@ -2514,7 +2530,7 @@ class KOBOTOUCH(KOBO):
|
|||||||
with closing(self.device_database_connection(use_row_factory=True)) as connection:
|
with closing(self.device_database_connection(use_row_factory=True)) as connection:
|
||||||
|
|
||||||
if self.manage_collections:
|
if self.manage_collections:
|
||||||
if collections:
|
if collections is not None:
|
||||||
# debug_print("KoboTouch:update_device_database_collections - length collections=" + str(len(collections)))
|
# debug_print("KoboTouch:update_device_database_collections - length collections=" + str(len(collections)))
|
||||||
|
|
||||||
# Need to reset the collections outside the particular loops
|
# Need to reset the collections outside the particular loops
|
||||||
@ -2595,7 +2611,7 @@ class KOBOTOUCH(KOBO):
|
|||||||
debug_print(' category not added to book.device_collections', book.device_collections)
|
debug_print(' category not added to book.device_collections', book.device_collections)
|
||||||
debug_print("KoboTouch:update_device_database_collections - end for category='%s'"%category)
|
debug_print("KoboTouch:update_device_database_collections - end for category='%s'"%category)
|
||||||
|
|
||||||
elif bookshelf_attribute: # No collections but have set the shelf option
|
elif have_bookshelf_attributes: # No collections but have set the shelf option
|
||||||
# Since no collections exist the ReadStatus needs to be reset to 0 (Unread)
|
# Since no collections exist the ReadStatus needs to be reset to 0 (Unread)
|
||||||
debug_print("No Collections - resetting ReadStatus")
|
debug_print("No Collections - resetting ReadStatus")
|
||||||
if self.dbversion < 53:
|
if self.dbversion < 53:
|
||||||
@ -2606,7 +2622,7 @@ class KOBOTOUCH(KOBO):
|
|||||||
|
|
||||||
# Set the series info and cleanup the bookshelves only if the firmware supports them and the user has set the options.
|
# Set the series info and cleanup the bookshelves only if the firmware supports them and the user has set the options.
|
||||||
if (self.supports_bookshelves and self.manage_collections or self.supports_series()) and (
|
if (self.supports_bookshelves and self.manage_collections or self.supports_series()) and (
|
||||||
bookshelf_attribute or update_series_details or update_core_metadata):
|
have_bookshelf_attributes or update_series_details or update_core_metadata):
|
||||||
debug_print("KoboTouch:update_device_database_collections - managing bookshelves and series.")
|
debug_print("KoboTouch:update_device_database_collections - managing bookshelves and series.")
|
||||||
|
|
||||||
self.series_set = 0
|
self.series_set = 0
|
||||||
@ -2631,7 +2647,7 @@ class KOBOTOUCH(KOBO):
|
|||||||
if show_debug:
|
if show_debug:
|
||||||
debug_print("KoboTouch:update_device_database_collections - calling set_core_metadata - series only")
|
debug_print("KoboTouch:update_device_database_collections - calling set_core_metadata - series only")
|
||||||
self.set_core_metadata(connection, book, series_only=True)
|
self.set_core_metadata(connection, book, series_only=True)
|
||||||
if self.manage_collections and bookshelf_attribute:
|
if self.manage_collections and have_bookshelf_attributes:
|
||||||
if show_debug:
|
if show_debug:
|
||||||
debug_print("KoboTouch:update_device_database_collections - about to remove a book from shelves book.title=%s" % book.title)
|
debug_print("KoboTouch:update_device_database_collections - about to remove a book from shelves book.title=%s" % book.title)
|
||||||
self.remove_book_from_device_bookshelves(connection, book)
|
self.remove_book_from_device_bookshelves(connection, book)
|
||||||
@ -3468,7 +3484,10 @@ class KOBOTOUCH(KOBO):
|
|||||||
c = super()._config()
|
c = super()._config()
|
||||||
|
|
||||||
c.add_opt('manage_collections', default=True)
|
c.add_opt('manage_collections', default=True)
|
||||||
|
c.add_opt('use_collections_columns', default=True)
|
||||||
c.add_opt('collections_columns', default='')
|
c.add_opt('collections_columns', default='')
|
||||||
|
c.add_opt('use_collections_template', default=False)
|
||||||
|
c.add_opt('collections_template', default='')
|
||||||
c.add_opt('create_collections', default=False)
|
c.add_opt('create_collections', default=False)
|
||||||
c.add_opt('delete_empty_collections', default=False)
|
c.add_opt('delete_empty_collections', default=False)
|
||||||
c.add_opt('ignore_collections_names', default='')
|
c.add_opt('ignore_collections_names', default='')
|
||||||
@ -3663,9 +3682,21 @@ class KOBOTOUCH(KOBO):
|
|||||||
def create_collections(self):
|
def create_collections(self):
|
||||||
return self.manage_collections and self.supports_bookshelves and self.get_pref('create_collections') and len(self.collections_columns) > 0
|
return self.manage_collections and self.supports_bookshelves and self.get_pref('create_collections') and len(self.collections_columns) > 0
|
||||||
|
|
||||||
|
@property
|
||||||
|
def use_collections_columns(self):
|
||||||
|
return self.get_pref('use_collections_columns') and self.manage_collections
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def collections_columns(self):
|
def collections_columns(self):
|
||||||
return self.get_pref('collections_columns') if self.manage_collections else ''
|
return self.get_pref('collections_columns') if self.use_collections_columns else ''
|
||||||
|
|
||||||
|
@property
|
||||||
|
def use_collections_template(self):
|
||||||
|
return self.get_pref('use_collections_template') and self.manage_collections
|
||||||
|
|
||||||
|
@property
|
||||||
|
def collections_template(self):
|
||||||
|
return self.get_pref('collections_template') if self.use_collections_template else ''
|
||||||
|
|
||||||
def get_collections_attributes(self):
|
def get_collections_attributes(self):
|
||||||
collections_str = self.collections_columns
|
collections_str = self.collections_columns
|
||||||
@ -3858,6 +3889,7 @@ class KOBOTOUCH(KOBO):
|
|||||||
def has_activity_table(self):
|
def has_activity_table(self):
|
||||||
return self.dbversion >= self.min_dbversion_activity
|
return self.dbversion >= self.min_dbversion_activity
|
||||||
|
|
||||||
|
|
||||||
def modify_database_check(self, function):
|
def modify_database_check(self, function):
|
||||||
# Checks to see whether the database version is supported
|
# Checks to see whether the database version is supported
|
||||||
# and whether the user has chosen to support the firmware version
|
# and whether the user has chosen to support the firmware version
|
||||||
@ -3888,7 +3920,7 @@ class KOBOTOUCH(KOBO):
|
|||||||
(
|
(
|
||||||
'\nDevice database version: %s.'
|
'\nDevice database version: %s.'
|
||||||
'\nDevice firmware version: %s'
|
'\nDevice firmware version: %s'
|
||||||
) % (self.dbversion, self.fwversion),
|
) % (self.dbversion, self.display_fwversion),
|
||||||
UserFeedback.WARN
|
UserFeedback.WARN
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -7,14 +7,15 @@ __docformat__ = 'restructuredtext en'
|
|||||||
|
|
||||||
import textwrap
|
import textwrap
|
||||||
|
|
||||||
from qt.core import (QWidget, QLabel, QGridLayout, QLineEdit, QVBoxLayout,
|
from qt.core import (QWidget, QLabel, QGridLayout, QLineEdit, QVBoxLayout, QDialog,
|
||||||
QDialog, QDialogButtonBox, QCheckBox, QPushButton)
|
QDialogButtonBox, QCheckBox, QPushButton)
|
||||||
|
|
||||||
from calibre.gui2.device_drivers.tabbed_device_config import TabbedDeviceConfig, DeviceConfigTab, DeviceOptionsGroupBox
|
from calibre.gui2.device_drivers.tabbed_device_config import TabbedDeviceConfig, DeviceConfigTab, DeviceOptionsGroupBox
|
||||||
from calibre.devices.usbms.driver import debug_print
|
from calibre.devices.usbms.driver import debug_print
|
||||||
from calibre.gui2 import error_dialog
|
from calibre.gui2 import error_dialog
|
||||||
from calibre.gui2.widgets2 import ColorButton
|
from calibre.gui2.widgets2 import ColorButton
|
||||||
from calibre.gui2.dialogs.template_dialog import TemplateDialog
|
from calibre.gui2.dialogs.template_dialog import TemplateDialog
|
||||||
|
from calibre.gui2.dialogs.template_line_editor import TemplateLineEditor
|
||||||
|
|
||||||
|
|
||||||
def wrap_msg(msg):
|
def wrap_msg(msg):
|
||||||
@ -98,7 +99,10 @@ class KOBOTOUCHConfig(TabbedDeviceConfig):
|
|||||||
|
|
||||||
p['manage_collections'] = self.manage_collections
|
p['manage_collections'] = self.manage_collections
|
||||||
p['create_collections'] = self.create_collections
|
p['create_collections'] = self.create_collections
|
||||||
|
p['use_collections_columns'] = self.use_collections_columns
|
||||||
p['collections_columns'] = self.collections_columns
|
p['collections_columns'] = self.collections_columns
|
||||||
|
p['use_collections_template'] = self.use_collections_template
|
||||||
|
p['collections_template'] = self.collections_template
|
||||||
p['ignore_collections_names'] = self.ignore_collections_names
|
p['ignore_collections_names'] = self.ignore_collections_names
|
||||||
p['delete_empty_collections'] = self.delete_empty_collections
|
p['delete_empty_collections'] = self.delete_empty_collections
|
||||||
|
|
||||||
@ -244,13 +248,30 @@ class CollectionsGroupBox(DeviceOptionsGroupBox):
|
|||||||
self.setChecked(device.get_pref('manage_collections'))
|
self.setChecked(device.get_pref('manage_collections'))
|
||||||
self.setToolTip(wrap_msg(_('Create new bookshelves on the Kobo if they do not exist. This is only for firmware V2.0.0 or later.')))
|
self.setToolTip(wrap_msg(_('Create new bookshelves on the Kobo if they do not exist. This is only for firmware V2.0.0 or later.')))
|
||||||
|
|
||||||
self.collections_columns_label = QLabel(_('Collections columns:'))
|
self.use_collections_columns_checkbox = create_checkbox(
|
||||||
|
_("Collections columns:"),
|
||||||
|
_('Use a columns to generate collections.'),
|
||||||
|
device.get_pref('use_collections_columns')
|
||||||
|
)
|
||||||
self.collections_columns_edit = QLineEdit(self)
|
self.collections_columns_edit = QLineEdit(self)
|
||||||
self.collections_columns_edit.setToolTip(_('The Kobo from firmware V2.0.0 supports bookshelves.'
|
self.collections_columns_edit.setToolTip(_('The Kobo from firmware V2.0.0 supports bookshelves.'
|
||||||
' These are created on the Kobo. '
|
' These are created on the Kobo. '
|
||||||
'Specify a tags type column for automatic management.'))
|
'Specify a tags type column for automatic management.'))
|
||||||
self.collections_columns_edit.setText(device.get_pref('collections_columns'))
|
self.collections_columns_edit.setText(device.get_pref('collections_columns'))
|
||||||
|
|
||||||
|
self.use_collections_template_checkbox = create_checkbox(
|
||||||
|
_("Collections template:"),
|
||||||
|
_('Use a template to generate collections.'),
|
||||||
|
device.get_pref('use_collections_template')
|
||||||
|
)
|
||||||
|
self.collections_template_edit = TemplateConfig(
|
||||||
|
device.get_pref('collections_template'),
|
||||||
|
tooltip=_("Enter a template to generate collections. "
|
||||||
|
"The result of the template will be combined with the values from Collections column."
|
||||||
|
"The template should return a list of collection names separated by ':@:' (without quotes)."
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
self.create_collections_checkbox = create_checkbox(
|
self.create_collections_checkbox = create_checkbox(
|
||||||
_("Create collections"),
|
_("Create collections"),
|
||||||
_('Create new bookshelves on the Kobo if they do not exist. This is only for firmware V2.0.0 or later.'),
|
_('Create new bookshelves on the Kobo if they do not exist. This is only for firmware V2.0.0 or later.'),
|
||||||
@ -269,21 +290,46 @@ class CollectionsGroupBox(DeviceOptionsGroupBox):
|
|||||||
'will not be changed. Names are separated by commas.'))
|
'will not be changed. Names are separated by commas.'))
|
||||||
self.ignore_collections_names_edit.setText(device.get_pref('ignore_collections_names'))
|
self.ignore_collections_names_edit.setText(device.get_pref('ignore_collections_names'))
|
||||||
|
|
||||||
self.options_layout.addWidget(self.collections_columns_label, 1, 0, 1, 1)
|
self.options_layout.addWidget(self.use_collections_columns_checkbox, 1, 0, 1, 1)
|
||||||
self.options_layout.addWidget(self.collections_columns_edit, 1, 1, 1, 1)
|
self.options_layout.addWidget(self.collections_columns_edit, 1, 1, 1, 1)
|
||||||
self.options_layout.addWidget(self.create_collections_checkbox, 2, 0, 1, 2)
|
self.options_layout.addWidget(self.use_collections_template_checkbox, 2, 0, 1, 1)
|
||||||
self.options_layout.addWidget(self.delete_empty_collections_checkbox, 3, 0, 1, 2)
|
self.options_layout.addWidget(self.collections_template_edit, 2, 1, 1, 1)
|
||||||
self.options_layout.addWidget(self.ignore_collections_names_label, 4, 0, 1, 1)
|
self.options_layout.addWidget(self.create_collections_checkbox, 3, 0, 1, 2)
|
||||||
self.options_layout.addWidget(self.ignore_collections_names_edit, 4, 1, 1, 1)
|
self.options_layout.addWidget(self.delete_empty_collections_checkbox, 4, 0, 1, 2)
|
||||||
|
self.options_layout.addWidget(self.ignore_collections_names_label, 5, 0, 1, 1)
|
||||||
|
self.options_layout.addWidget(self.ignore_collections_names_edit, 5, 1, 1, 1)
|
||||||
|
|
||||||
|
self.use_collections_columns_checkbox.clicked.connect(self.use_collections_columns_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_template_checkbox_clicked(device.get_pref('use_collections_template'))
|
||||||
|
|
||||||
|
def use_collections_columns_checkbox_clicked(self, checked):
|
||||||
|
self.collections_columns_edit.setEnabled(checked)
|
||||||
|
|
||||||
|
def use_collections_template_checkbox_clicked(self, checked):
|
||||||
|
self.collections_template_edit.setEnabled(checked)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def manage_collections(self):
|
def manage_collections(self):
|
||||||
return self.isChecked()
|
return self.isChecked()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def use_collections_columns(self):
|
||||||
|
return self.use_collections_columns_checkbox.isChecked()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def collections_columns(self):
|
def collections_columns(self):
|
||||||
return self.collections_columns_edit.text().strip()
|
return self.collections_columns_edit.text().strip()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def use_collections_template(self):
|
||||||
|
return self.use_collections_template_checkbox.isChecked()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def collections_template(self):
|
||||||
|
return self.collections_template_edit.template
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def create_collections(self):
|
def create_collections(self):
|
||||||
return self.create_collections_checkbox.isChecked()
|
return self.create_collections_checkbox.isChecked()
|
||||||
@ -733,7 +779,7 @@ class TemplateConfig(QWidget): # {{{
|
|||||||
b = self.b = QPushButton(_('&Template editor'))
|
b = self.b = QPushButton(_('&Template editor'))
|
||||||
l.addWidget(b, 0, col, 1, 1)
|
l.addWidget(b, 0, col, 1, 1)
|
||||||
b.clicked.connect(self.edit_template)
|
b.clicked.connect(self.edit_template)
|
||||||
self.setToolTip(tooltip)
|
self.setToolTip(wrap_msg(tooltip))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def template(self):
|
def template(self):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user