mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Ensure a blank date in the GUI shows up as blank in the custom columns and templates.
This commit is contained in:
commit
f1edff8065
@ -3,8 +3,11 @@ __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
|
|||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
__license__ = 'GPL v3'
|
__license__ = 'GPL v3'
|
||||||
|
|
||||||
|
import json
|
||||||
|
|
||||||
from PyQt4.Qt import Qt, QDialog, QDialogButtonBox
|
from PyQt4.Qt import Qt, QDialog, QDialogButtonBox
|
||||||
from calibre.gui2.dialogs.template_dialog_ui import Ui_TemplateDialog
|
from calibre.gui2.dialogs.template_dialog_ui import Ui_TemplateDialog
|
||||||
|
from calibre.utils.formatter_functions import formatter_functions
|
||||||
|
|
||||||
class TemplateDialog(QDialog, Ui_TemplateDialog):
|
class TemplateDialog(QDialog, Ui_TemplateDialog):
|
||||||
|
|
||||||
@ -17,9 +20,41 @@ class TemplateDialog(QDialog, Ui_TemplateDialog):
|
|||||||
self.setWindowFlags(self.windowFlags()&(~Qt.WindowContextHelpButtonHint))
|
self.setWindowFlags(self.windowFlags()&(~Qt.WindowContextHelpButtonHint))
|
||||||
self.setWindowIcon(icon)
|
self.setWindowIcon(icon)
|
||||||
|
|
||||||
|
self.textbox.setTabStopWidth(10)
|
||||||
|
self.source_code.setTabStopWidth(10)
|
||||||
|
self.documentation.setReadOnly(True)
|
||||||
|
self.source_code.setReadOnly(True)
|
||||||
|
|
||||||
if text is not None:
|
if text is not None:
|
||||||
self.textbox.setPlainText(text)
|
self.textbox.setPlainText(text)
|
||||||
self.textbox.setTabStopWidth(50)
|
|
||||||
self.buttonBox.button(QDialogButtonBox.Ok).setText(_('&OK'))
|
self.buttonBox.button(QDialogButtonBox.Ok).setText(_('&OK'))
|
||||||
self.buttonBox.button(QDialogButtonBox.Cancel).setText(_('&Cancel'))
|
self.buttonBox.button(QDialogButtonBox.Cancel).setText(_('&Cancel'))
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(P('template-functions.json'), 'rb') as f:
|
||||||
|
self.builtin_source_dict = json.load(f, encoding='utf-8')
|
||||||
|
except:
|
||||||
|
self.builtin_source_dict = {}
|
||||||
|
|
||||||
|
self.funcs = formatter_functions.get_functions()
|
||||||
|
self.builtins = formatter_functions.get_builtins()
|
||||||
|
|
||||||
|
func_names = sorted(self.funcs)
|
||||||
|
self.function.clear()
|
||||||
|
self.function.addItem('')
|
||||||
|
self.function.addItems(func_names)
|
||||||
|
self.function.setCurrentIndex(0)
|
||||||
|
self.function.currentIndexChanged[str].connect(self.function_changed)
|
||||||
|
|
||||||
|
def function_changed(self, toWhat):
|
||||||
|
name = unicode(toWhat)
|
||||||
|
self.source_code.clear()
|
||||||
|
self.documentation.clear()
|
||||||
|
if name in self.funcs:
|
||||||
|
self.documentation.setPlainText(self.funcs[name].doc)
|
||||||
|
if name in self.builtins:
|
||||||
|
if name in self.builtin_source_dict:
|
||||||
|
self.source_code.setPlainText(self.builtin_source_dict[name])
|
||||||
|
else:
|
||||||
|
self.source_code.setPlainText(self.funcs[name].program_text)
|
||||||
|
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>500</width>
|
<width>588</width>
|
||||||
<height>235</height>
|
<height>546</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
@ -19,21 +19,77 @@
|
|||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Edit Comments</string>
|
<string>Edit Comments</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPlainTextEdit" name="textbox"/>
|
<widget class="QPlainTextEdit" name="textbox"/>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QDialogButtonBox" name="buttonBox">
|
<widget class="QDialogButtonBox" name="buttonBox">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="standardButtons">
|
<property name="standardButtons">
|
||||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
<item>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Function &name:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>function</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QComboBox" name="function"/>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>&Documentation:</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>documentation</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="label_3">
|
||||||
|
<property name="text">
|
||||||
|
<string>Python &code:</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>source_code</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QPlainTextEdit" name="documentation">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>75</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QPlainTextEdit" name="source_code"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections>
|
<connections>
|
||||||
|
@ -5,7 +5,7 @@ __license__ = 'GPL v3'
|
|||||||
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
|
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
|
||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
import traceback
|
import json, traceback
|
||||||
|
|
||||||
from calibre.gui2 import error_dialog
|
from calibre.gui2 import error_dialog
|
||||||
from calibre.gui2.preferences import ConfigWidgetBase, test_widget
|
from calibre.gui2.preferences import ConfigWidgetBase, test_widget
|
||||||
@ -73,6 +73,12 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form):
|
|||||||
self.textBrowser.setHtml(help_text)
|
self.textBrowser.setHtml(help_text)
|
||||||
|
|
||||||
def initialize(self):
|
def initialize(self):
|
||||||
|
try:
|
||||||
|
with open(P('template-functions.json'), 'rb') as f:
|
||||||
|
self.builtin_source_dict = json.load(f, encoding='utf-8')
|
||||||
|
except:
|
||||||
|
self.builtin_source_dict = {}
|
||||||
|
|
||||||
self.funcs = formatter_functions.get_functions()
|
self.funcs = formatter_functions.get_functions()
|
||||||
self.builtins = formatter_functions.get_builtins()
|
self.builtins = formatter_functions.get_builtins()
|
||||||
|
|
||||||
@ -179,8 +185,13 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form):
|
|||||||
func = self.funcs[txt]
|
func = self.funcs[txt]
|
||||||
self.argument_count.setValue(func.arg_count)
|
self.argument_count.setValue(func.arg_count)
|
||||||
self.documentation.setText(func.doc)
|
self.documentation.setText(func.doc)
|
||||||
self.program.setPlainText(func.program_text)
|
|
||||||
if txt in self.builtins:
|
if txt in self.builtins:
|
||||||
|
if hasattr(func, 'program_text'):
|
||||||
|
self.program.setPlainText(func.program_text)
|
||||||
|
elif txt in self.builtin_source_dict:
|
||||||
|
self.program.setPlainText(self.builtin_source_dict[txt])
|
||||||
|
else:
|
||||||
|
self.program.setPlainText(_('function source code not available'))
|
||||||
self.documentation.setReadOnly(True)
|
self.documentation.setReadOnly(True)
|
||||||
self.argument_count.setReadOnly(True)
|
self.argument_count.setReadOnly(True)
|
||||||
self.program.setReadOnly(True)
|
self.program.setReadOnly(True)
|
||||||
|
@ -100,7 +100,7 @@ class AumSortedConcatenate(object):
|
|||||||
keys = self.ans.keys()
|
keys = self.ans.keys()
|
||||||
l = len(keys)
|
l = len(keys)
|
||||||
if l == 0:
|
if l == 0:
|
||||||
return 'Unknown:::Unknown'
|
return None
|
||||||
if l == 1:
|
if l == 1:
|
||||||
return self.ans[keys[0]]
|
return self.ans[keys[0]]
|
||||||
return ':#:'.join([self.ans[v] for v in sorted(keys)])
|
return ':#:'.join([self.ans[v] for v in sorted(keys)])
|
||||||
|
@ -148,6 +148,9 @@ def format_date(dt, format, assume_utc=False, as_utc=False):
|
|||||||
if len(mo.group(0)) == 2: return '%02d'%(dt.year % 100)
|
if len(mo.group(0)) == 2: return '%02d'%(dt.year % 100)
|
||||||
return '%04d'%dt.year
|
return '%04d'%dt.year
|
||||||
|
|
||||||
|
if dt == UNDEFINED_DATE:
|
||||||
|
return ''
|
||||||
|
|
||||||
format = re.sub('d{1,4}', format_day, format)
|
format = re.sub('d{1,4}', format_day, format)
|
||||||
format = re.sub('M{1,4}', format_month, format)
|
format = re.sub('M{1,4}', format_month, format)
|
||||||
return re.sub('yyyy|yy', format_year, format)
|
return re.sub('yyyy|yy', format_year, format)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user