mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Merge branch 'master' of https://github.com/cbhaley/calibre into master
This commit is contained in:
commit
c28a031735
@ -254,6 +254,7 @@ The following functions are available in addition to those described in single-f
|
|||||||
returns "yes" if the yes/no field ``"#bool"`` is either undefined (neither True nor False) or True. More than one of ``is_undefined``, ``is_false``, or ``is_true`` can be set to 1. This function is usually used by the ``test()`` or ``is_empty()`` functions.
|
returns "yes" if the yes/no field ``"#bool"`` is either undefined (neither True nor False) or True. More than one of ``is_undefined``, ``is_false``, or ``is_true`` can be set to 1. This function is usually used by the ``test()`` or ``is_empty()`` functions.
|
||||||
* ``ceiling(x)`` -- returns the smallest integer greater than or equal to x. Throws an exception if x is not a number.
|
* ``ceiling(x)`` -- returns the smallest integer greater than or equal to x. Throws an exception if x is not a number.
|
||||||
* ``cmp(x, y, lt, eq, gt)`` -- compares x and y after converting both to numbers. Returns ``lt`` if x < y. Returns ``eq`` if x == y. Otherwise returns ``gt``.
|
* ``cmp(x, y, lt, eq, gt)`` -- compares x and y after converting both to numbers. Returns ``lt`` if x < y. Returns ``eq`` if x == y. Otherwise returns ``gt``.
|
||||||
|
* ``connected_device_name(storage_location)`` -- if a device is connected then return the device name, otherwise return the empty string. Each storage location on a device can have a different name. The location names are 'main', 'carda' and 'cardb'. This function works only in the GUI.
|
||||||
* ``current_library_name()`` -- return the last name on the path to the current calibre library. This function can be called in template program mode using the template ``{:'current_library_name()'}``.
|
* ``current_library_name()`` -- return the last name on the path to the current calibre library. This function can be called in template program mode using the template ``{:'current_library_name()'}``.
|
||||||
* ``current_library_path()`` -- return the path to the current calibre library. This function can be called in template program mode using the template ``{:'current_library_path()'}``.
|
* ``current_library_path()`` -- return the path to the current calibre library. This function can be called in template program mode using the template ``{:'current_library_path()'}``.
|
||||||
* ``days_between(date1, date2)`` -- return the number of days between ``date1`` and ``date2``. The number is positive if ``date1`` is greater than ``date2``, otherwise negative. If either ``date1`` or ``date2`` are not dates, the function returns the empty string.
|
* ``days_between(date1, date2)`` -- return the number of days between ``date1`` and ``date2``. The number is positive if ``date1`` is greater than ``date2``, otherwise negative. If either ``date1`` or ``date2`` are not dates, the function returns the empty string.
|
||||||
|
@ -10,7 +10,7 @@ from threading import Thread, Event
|
|||||||
from PyQt5.Qt import (
|
from PyQt5.Qt import (
|
||||||
QMenu, QAction, QActionGroup, QIcon, Qt, pyqtSignal, QDialog,
|
QMenu, QAction, QActionGroup, QIcon, Qt, pyqtSignal, QDialog,
|
||||||
QObject, QVBoxLayout, QDialogButtonBox, QCursor, QCoreApplication,
|
QObject, QVBoxLayout, QDialogButtonBox, QCursor, QCoreApplication,
|
||||||
QApplication, QEventLoop)
|
QApplication, QEventLoop, QTimer)
|
||||||
|
|
||||||
from calibre.customize.ui import (available_input_formats, available_output_formats,
|
from calibre.customize.ui import (available_input_formats, available_output_formats,
|
||||||
device_plugins, disabled_device_plugins)
|
device_plugins, disabled_device_plugins)
|
||||||
@ -1100,7 +1100,12 @@ class DeviceMixin(object): # {{{
|
|||||||
# Empty any device view information
|
# Empty any device view information
|
||||||
for v in dviews:
|
for v in dviews:
|
||||||
v.set_database([])
|
v.set_database([])
|
||||||
self.refresh_ondevice()
|
# Use a singleShot timer to ensure that the job event queue has
|
||||||
|
# emptied before the ondevice column is removed from the booklist.
|
||||||
|
# This deals with race conditions when repainting the booklist
|
||||||
|
# causing incorrect evaluation of the connected_device_name
|
||||||
|
# formatter function
|
||||||
|
QTimer.singleShot(0, self.refresh_ondevice)
|
||||||
device_signals.device_connection_changed.emit(connected)
|
device_signals.device_connection_changed.emit(connected)
|
||||||
|
|
||||||
def info_read(self, job):
|
def info_read(self, job):
|
||||||
|
@ -1668,6 +1668,39 @@ class BuiltinAuthorSorts(BuiltinFormatterFunction):
|
|||||||
return val_sep.join(n for n in names)
|
return val_sep.join(n for n in names)
|
||||||
|
|
||||||
|
|
||||||
|
class BuiltinConnectedDeviceName(BuiltinFormatterFunction):
|
||||||
|
name = 'connected_device_name'
|
||||||
|
arg_count = 1
|
||||||
|
category = 'Get values from metadata'
|
||||||
|
__doc__ = doc = _("connected_device_name(storage_location) -- if a device is "
|
||||||
|
"connected then return the device name, otherwise return "
|
||||||
|
"the empty string. Each storage location on a device can "
|
||||||
|
"have a different name. The location names are 'main', "
|
||||||
|
"'carda' and 'cardb'. This function works only in the GUI.")
|
||||||
|
|
||||||
|
def evaluate(self, formatter, kwargs, mi, locals, storage_location):
|
||||||
|
if hasattr(mi, '_proxy_metadata'):
|
||||||
|
# Do the import here so that we don't entangle the GUI when using
|
||||||
|
# command line functions
|
||||||
|
from calibre.gui2.ui import get_gui
|
||||||
|
info = get_gui().device_manager.get_current_device_information()
|
||||||
|
if info is None:
|
||||||
|
return ''
|
||||||
|
try:
|
||||||
|
if storage_location not in {'main', 'carda', 'cardb'}:
|
||||||
|
raise ValueError(
|
||||||
|
_('connected_device_name: invalid storage location "{0}"'
|
||||||
|
.format(storage_location)))
|
||||||
|
info = info['info'][4]
|
||||||
|
if storage_location not in info:
|
||||||
|
return ''
|
||||||
|
return info[storage_location]['device_name']
|
||||||
|
except:
|
||||||
|
traceback.print_exc()
|
||||||
|
raise
|
||||||
|
return _('This function can be used only in the GUI')
|
||||||
|
|
||||||
|
|
||||||
class BuiltinCheckYesNo(BuiltinFormatterFunction):
|
class BuiltinCheckYesNo(BuiltinFormatterFunction):
|
||||||
name = 'check_yes_no'
|
name = 'check_yes_no'
|
||||||
arg_count = 4
|
arg_count = 4
|
||||||
@ -1754,7 +1787,7 @@ _formatter_builtins = [
|
|||||||
BuiltinAdd(), BuiltinAnd(), BuiltinApproximateFormats(), BuiltinAssign(),
|
BuiltinAdd(), BuiltinAnd(), BuiltinApproximateFormats(), BuiltinAssign(),
|
||||||
BuiltinAuthorLinks(), BuiltinAuthorSorts(), BuiltinBooksize(),
|
BuiltinAuthorLinks(), BuiltinAuthorSorts(), BuiltinBooksize(),
|
||||||
BuiltinCapitalize(), BuiltinCheckYesNo(), BuiltinCeiling(),
|
BuiltinCapitalize(), BuiltinCheckYesNo(), BuiltinCeiling(),
|
||||||
BuiltinCmp(), BuiltinContains(),
|
BuiltinCmp(), BuiltinConnectedDeviceName(), BuiltinContains(),
|
||||||
BuiltinCount(), BuiltinCurrentLibraryName(), BuiltinCurrentLibraryPath(),
|
BuiltinCount(), BuiltinCurrentLibraryName(), BuiltinCurrentLibraryPath(),
|
||||||
BuiltinDaysBetween(), BuiltinDivide(), BuiltinEval(), BuiltinFirstNonEmpty(),
|
BuiltinDaysBetween(), BuiltinDivide(), BuiltinEval(), BuiltinFirstNonEmpty(),
|
||||||
BuiltinField(), BuiltinFinishFormatting(), BuiltinFirstMatchingCmp(), BuiltinFloor(),
|
BuiltinField(), BuiltinFinishFormatting(), BuiltinFirstMatchingCmp(), BuiltinFloor(),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user