From a6a150a52651e3c17dca58507dd326eef6e4e5b6 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 21 Jan 2011 15:38:53 +0000 Subject: [PATCH 1/6] Trial using new metadata dialog layout facilities. --- src/calibre/gui2/comments_editor.py | 16 +- src/calibre/gui2/metadata/single.py | 356 +++++++++++++++++++--------- 2 files changed, 260 insertions(+), 112 deletions(-) diff --git a/src/calibre/gui2/comments_editor.py b/src/calibre/gui2/comments_editor.py index 04bc5284ed..c7f7d8b94a 100644 --- a/src/calibre/gui2/comments_editor.py +++ b/src/calibre/gui2/comments_editor.py @@ -12,7 +12,8 @@ from lxml.html import soupparser from PyQt4.Qt import QApplication, QFontInfo, QSize, QWidget, QPlainTextEdit, \ QToolBar, QVBoxLayout, QAction, QIcon, Qt, QTabWidget, QUrl, \ - QSyntaxHighlighter, QColor, QChar, QColorDialog, QMenu, QInputDialog + QSyntaxHighlighter, QColor, QChar, QColorDialog, QMenu, QInputDialog, \ + QHBoxLayout from PyQt4.QtWebKit import QWebView, QWebPage from calibre.ebooks.chardet import xml_to_unicode @@ -488,7 +489,7 @@ class Highlighter(QSyntaxHighlighter): class Editor(QWidget): # {{{ - def __init__(self, parent=None): + def __init__(self, parent=None, one_line_toolbar=False): QWidget.__init__(self, parent) self.toolbar1 = QToolBar(self) self.toolbar2 = QToolBar(self) @@ -508,9 +509,14 @@ class Editor(QWidget): # {{{ self.wyswyg.layout = l = QVBoxLayout(self.wyswyg) self.setLayout(self._layout) l.setContentsMargins(0, 0, 0, 0) - l.addWidget(self.toolbar1) - l.addWidget(self.toolbar2) - l.addWidget(self.toolbar3) + if one_line_toolbar: + tb = QHBoxLayout() + l.addLayout(tb) + else: + tb = l + tb.addWidget(self.toolbar1) + tb.addWidget(self.toolbar2) + tb.addWidget(self.toolbar3) l.addWidget(self.editor) self._layout.addWidget(self.tabs) self.tabs.addTab(self.wyswyg, _('Normal view')) diff --git a/src/calibre/gui2/metadata/single.py b/src/calibre/gui2/metadata/single.py index 32fa6ea4f3..76cddc2f3c 100644 --- a/src/calibre/gui2/metadata/single.py +++ b/src/calibre/gui2/metadata/single.py @@ -11,7 +11,7 @@ from functools import partial from PyQt4.Qt import Qt, QVBoxLayout, QHBoxLayout, QWidget, QPushButton, \ QGridLayout, pyqtSignal, QDialogButtonBox, QScrollArea, QFont, \ QTabWidget, QIcon, QToolButton, QSplitter, QGroupBox, QSpacerItem, \ - QSizePolicy + QSizePolicy, QPalette, QFrame from calibre.ebooks.metadata import authors_to_string, string_to_authors from calibre.gui2 import ResizableDialog, error_dialog, gprefs @@ -22,7 +22,7 @@ from calibre.gui2.metadata.basic_widgets import TitleEdit, AuthorsEdit, \ from calibre.gui2.custom_column_widgets import populate_metadata_page from calibre.utils.config import tweaks -class MetadataSingleDialog(ResizableDialog): +class MetadataSingleDialogBase(ResizableDialog): view_format = pyqtSignal(object) @@ -127,7 +127,7 @@ class MetadataSingleDialog(ResizableDialog): self.cover = Cover(self) self.basic_metadata_widgets.append(self.cover) - self.comments = CommentsEdit(self) + self.comments = CommentsEdit(self, self.one_line_comments_toolbar) self.basic_metadata_widgets.append(self.comments) self.rating = RatingEdit(self) @@ -166,7 +166,7 @@ class MetadataSingleDialog(ResizableDialog): w.setLayout(layout) self.custom_metadata_widgets, self.__cc_spacers = \ populate_metadata_page(layout, self.db, None, parent=w, bulk=False, - two_column=tweaks['metadata_single_use_2_cols_for_custom_fields']) + two_column=self.cc_two_column) self.__custom_col_layouts = [layout] ans = self.custom_metadata_widgets for i in range(len(ans)-1): @@ -179,109 +179,7 @@ class MetadataSingleDialog(ResizableDialog): # }}} def do_layout(self): # {{{ - self.central_widget.clear() - self.tabs = [] - self.labels = [] - self.tabs.append(QWidget(self)) - self.central_widget.addTab(self.tabs[0], _("&Basic metadata")) - self.tabs[0].l = l = QVBoxLayout() - self.tabs[0].tl = tl = QGridLayout() - self.tabs[0].setLayout(l) - w = getattr(self, 'custom_metadata_widgets_parent', None) - if w is not None: - self.tabs.append(w) - self.central_widget.addTab(w, _('&Custom metadata')) - l.addLayout(tl) - l.addItem(QSpacerItem(10, 15, QSizePolicy.Expanding, - QSizePolicy.Fixed)) - - sto = QWidget.setTabOrder - sto(self.button_box, self.fetch_metadata_button) - sto(self.fetch_metadata_button, self.title) - - def create_row(row, one, two, three, col=1, icon='forward.png'): - ql = BuddyLabel(one) - tl.addWidget(ql, row, col+0, 1, 1) - self.labels.append(ql) - tl.addWidget(one, row, col+1, 1, 1) - if two is not None: - tl.addWidget(two, row, col+2, 1, 1) - two.setIcon(QIcon(I(icon))) - ql = BuddyLabel(three) - tl.addWidget(ql, row, col+3, 1, 1) - self.labels.append(ql) - tl.addWidget(three, row, col+4, 1, 1) - sto(one, two) - sto(two, three) - - tl.addWidget(self.swap_title_author_button, 0, 0, 2, 1) - - create_row(0, self.title, self.deduce_title_sort_button, self.title_sort) - sto(self.title_sort, self.authors) - create_row(1, self.authors, self.deduce_author_sort_button, self.author_sort) - sto(self.author_sort, self.series) - create_row(2, self.series, self.remove_unused_series_button, - self.series_index, icon='trash.png') - sto(self.series_index, self.swap_title_author_button) - - tl.addWidget(self.formats_manager, 0, 6, 3, 1) - - self.splitter = QSplitter(Qt.Horizontal, self) - self.splitter.addWidget(self.cover) - l.addWidget(self.splitter) - self.tabs[0].gb = gb = QGroupBox(_('Change cover'), self) - gb.l = l = QGridLayout() - gb.setLayout(l) - sto(self.swap_title_author_button, self.cover.buttons[0]) - for i, b in enumerate(self.cover.buttons[:3]): - l.addWidget(b, 0, i, 1, 1) - sto(b, self.cover.buttons[i+1]) - gb.hl = QHBoxLayout() - for b in self.cover.buttons[3:]: - gb.hl.addWidget(b) - sto(self.cover.buttons[-2], self.cover.buttons[-1]) - l.addLayout(gb.hl, 1, 0, 1, 3) - self.tabs[0].middle = w = QWidget(self) - w.l = l = QGridLayout() - w.setLayout(w.l) - l.setMargin(0) - self.splitter.addWidget(w) - def create_row2(row, widget, button=None): - row += 1 - ql = BuddyLabel(widget) - l.addWidget(ql, row, 0, 1, 1) - l.addWidget(widget, row, 1, 1, 2 if button is None else 1) - if button is not None: - l.addWidget(button, row, 2, 1, 1) - if button is not None: - sto(widget, button) - - l.addWidget(gb, 0, 0, 1, 3) - self.tabs[0].spc_one = QSpacerItem(10, 10, QSizePolicy.Expanding, - QSizePolicy.Expanding) - l.addItem(self.tabs[0].spc_one, 1, 0, 1, 3) - sto(self.cover.buttons[-1], self.rating) - create_row2(1, self.rating) - sto(self.rating, self.tags) - create_row2(2, self.tags, self.tags_editor_button) - sto(self.tags_editor_button, self.isbn) - create_row2(3, self.isbn) - sto(self.isbn, self.timestamp) - create_row2(4, self.timestamp, self.timestamp.clear_button) - sto(self.timestamp.clear_button, self.pubdate) - create_row2(5, self.pubdate, self.pubdate.clear_button) - sto(self.pubdate.clear_button, self.publisher) - create_row2(6, self.publisher) - self.tabs[0].spc_two = QSpacerItem(10, 10, QSizePolicy.Expanding, - QSizePolicy.Expanding) - l.addItem(self.tabs[0].spc_two, 8, 0, 1, 3) - l.addWidget(self.fetch_metadata_button, 9, 0, 1, 3) - - self.tabs[0].gb2 = gb = QGroupBox(_('Co&mments'), self) - gb.l = l = QVBoxLayout() - gb.setLayout(l) - l.addWidget(self.comments) - self.splitter.addWidget(gb) + raise NotImplementedError() # }}} @@ -459,6 +357,250 @@ class MetadataSingleDialog(ResizableDialog): if x is not None: disconnect(x.clicked) +class MetadataSingleDialog(MetadataSingleDialogBase): + + cc_two_column = tweaks['metadata_single_use_2_cols_for_custom_fields'] + one_line_comments_toolbar = False + + def do_layout(self): # {{{ + self.central_widget.clear() + self.tabs = [] + self.labels = [] + self.tabs.append(QWidget(self)) + self.central_widget.addTab(self.tabs[0], _("&Basic metadata")) + self.tabs[0].l = l = QVBoxLayout() + self.tabs[0].tl = tl = QGridLayout() + self.tabs[0].setLayout(l) + w = getattr(self, 'custom_metadata_widgets_parent', None) + if w is not None: + self.tabs.append(w) + self.central_widget.addTab(w, _('&Custom metadata')) + l.addLayout(tl) + l.addItem(QSpacerItem(10, 15, QSizePolicy.Expanding, + QSizePolicy.Fixed)) + + sto = QWidget.setTabOrder + sto(self.button_box, self.fetch_metadata_button) + sto(self.fetch_metadata_button, self.title) + + def create_row(row, one, two, three, col=1, icon='forward.png'): + ql = BuddyLabel(one) + tl.addWidget(ql, row, col+0, 1, 1) + self.labels.append(ql) + tl.addWidget(one, row, col+1, 1, 1) + if two is not None: + tl.addWidget(two, row, col+2, 1, 1) + two.setIcon(QIcon(I(icon))) + ql = BuddyLabel(three) + tl.addWidget(ql, row, col+3, 1, 1) + self.labels.append(ql) + tl.addWidget(three, row, col+4, 1, 1) + sto(one, two) + sto(two, three) + + tl.addWidget(self.swap_title_author_button, 0, 0, 2, 1) + + create_row(0, self.title, self.deduce_title_sort_button, self.title_sort) + sto(self.title_sort, self.authors) + create_row(1, self.authors, self.deduce_author_sort_button, self.author_sort) + sto(self.author_sort, self.series) + create_row(2, self.series, self.remove_unused_series_button, + self.series_index, icon='trash.png') + sto(self.series_index, self.swap_title_author_button) + + tl.addWidget(self.formats_manager, 0, 6, 3, 1) + + self.splitter = QSplitter(Qt.Horizontal, self) + self.splitter.addWidget(self.cover) + l.addWidget(self.splitter) + self.tabs[0].gb = gb = QGroupBox(_('Change cover'), self) + gb.l = l = QGridLayout() + gb.setLayout(l) + sto(self.swap_title_author_button, self.cover.buttons[0]) + for i, b in enumerate(self.cover.buttons[:3]): + l.addWidget(b, 0, i, 1, 1) + sto(b, self.cover.buttons[i+1]) + gb.hl = QHBoxLayout() + for b in self.cover.buttons[3:]: + gb.hl.addWidget(b) + sto(self.cover.buttons[-2], self.cover.buttons[-1]) + l.addLayout(gb.hl, 1, 0, 1, 3) + self.tabs[0].middle = w = QWidget(self) + w.l = l = QGridLayout() + w.setLayout(w.l) + l.setMargin(0) + self.splitter.addWidget(w) + def create_row2(row, widget, button=None): + row += 1 + ql = BuddyLabel(widget) + l.addWidget(ql, row, 0, 1, 1) + l.addWidget(widget, row, 1, 1, 2 if button is None else 1) + if button is not None: + l.addWidget(button, row, 2, 1, 1) + if button is not None: + sto(widget, button) + + l.addWidget(gb, 0, 0, 1, 3) + self.tabs[0].spc_one = QSpacerItem(10, 10, QSizePolicy.Expanding, + QSizePolicy.Expanding) + l.addItem(self.tabs[0].spc_one, 1, 0, 1, 3) + sto(self.cover.buttons[-1], self.rating) + create_row2(1, self.rating) + sto(self.rating, self.tags) + create_row2(2, self.tags, self.tags_editor_button) + sto(self.tags_editor_button, self.isbn) + create_row2(3, self.isbn) + sto(self.isbn, self.timestamp) + create_row2(4, self.timestamp, self.timestamp.clear_button) + sto(self.timestamp.clear_button, self.pubdate) + create_row2(5, self.pubdate, self.pubdate.clear_button) + sto(self.pubdate.clear_button, self.publisher) + create_row2(6, self.publisher) + self.tabs[0].spc_two = QSpacerItem(10, 10, QSizePolicy.Expanding, + QSizePolicy.Expanding) + l.addItem(self.tabs[0].spc_two, 8, 0, 1, 3) + l.addWidget(self.fetch_metadata_button, 9, 0, 1, 3) + + self.tabs[0].gb2 = gb = QGroupBox(_('Co&mments'), self) + gb.l = l = QVBoxLayout() + gb.setLayout(l) + l.addWidget(self.comments) + self.splitter.addWidget(gb) + + # }}} + + +class MetadataSingleDialogAlt(MetadataSingleDialogBase): + + cc_two_column = False + one_line_comments_toolbar = True + + def tab_clicked(self, t): + print 'here', t + + def do_layout(self): # {{{ + self.central_widget.clear() + self.central_widget.currentChanged.connect(self.tab_clicked) + self.tabs = [] + self.labels = [] + sto = QWidget.setTabOrder + + self.tabs.append(QWidget(self)) + self.central_widget.addTab(self.tabs[0], _("&Basic metadata")) + self.tabs[0].l = QGridLayout() + self.tabs[0].setLayout(self.tabs[0].l) + + self.tabs.append(QWidget(self)) + self.central_widget.addTab(self.tabs[1], _("&Covers, etc")) + self.tabs[1].l = QGridLayout() + self.tabs[1].setLayout(self.tabs[1].l) + + # Tab 0 + tab0 = self.tabs[0] + + tl = QGridLayout() + gb = QGroupBox(_('&Basic metadata'), self.tabs[0]) + self.tabs[0].l.addWidget(gb, 0, 0, 1, 1) + gb.setLayout(tl) + + sto(self.button_box, self.title) + + def create_row(row, widget, tab_to, button=None, icon=None, span=1): + ql = BuddyLabel(widget) + tl.addWidget(ql, row, 1, 1, 1) + tl.addWidget(widget, row, 2, 1, 1) + if button is not None: + tl.addWidget(button, row, 3, span, 1) + if icon is not None: + button.setIcon(QIcon(I(icon))) + if tab_to is not None: + if button is not None: + sto(widget, button) + sto(button, tab_to) + else: + sto(widget, tab_to) + + tl.addWidget(self.swap_title_author_button, 0, 0, 2, 1) + + create_row(0, self.title, self.title_sort, + button=self.deduce_title_sort_button, span=2, + icon='auto_author_sort.png') + create_row(1, self.title_sort, self.authors) + create_row(2, self.authors, self.author_sort, + button=self.deduce_author_sort_button, + span=2, icon='auto_author_sort.png') + create_row(3, self.author_sort, self.series) + create_row(4, self.series, self.series_index, + button=self.remove_unused_series_button, icon='trash.png') + create_row(5, self.series_index, self.tags) + create_row(6, self.tags, self.rating, button=self.tags_editor_button) + create_row(7, self.rating, self.pubdate) + create_row(8, self.pubdate, self.publisher, + button=self.pubdate.clear_button, icon='trash.png') + create_row(9, self.publisher, self.timestamp) + create_row(10, self.timestamp, self.isbn, + button=self.timestamp.clear_button, icon='trash.png') + create_row(11, self.isbn, self.comments) + tl.addItem(QSpacerItem(1, 1, QSizePolicy.Fixed, QSizePolicy.Expanding), + 12, 1, 1 ,1) + + w = getattr(self, 'custom_metadata_widgets_parent', None) + if w is not None: + gb = QGroupBox(_('C&ustom metadata'), tab0) + gbl = QVBoxLayout() + gb.setLayout(gbl) + sr = QScrollArea(tab0) + sr.setWidgetResizable(True) + sr.setBackgroundRole(QPalette.Base) + sr.setFrameStyle(QFrame.NoFrame) + sr.setWidget(w) + gbl.addWidget(sr) + self.tabs[0].l.addWidget(gb, 0, 1, 1, 1) + sto(self.isbn, gb) + + w = QGroupBox(_('&Comments'), tab0) + sp = QSizePolicy() + sp.setVerticalStretch(10) + sp.setHorizontalPolicy(QSizePolicy.Expanding) + sp.setVerticalPolicy(QSizePolicy.Expanding) + w.setSizePolicy(sp) + l = QHBoxLayout() + w.setLayout(l) + l.addWidget(self.comments) + tab0.l.addWidget(w, 1, 0, 1, 2) + + # Tab 1 + tab1 = self.tabs[1] + + wsp = QWidget(tab1) + wgl = QVBoxLayout() + wsp.setLayout(wgl) + + # right-hand side of splitter + gb = QGroupBox(_('Change cover'), tab1) + l = QGridLayout() + gb.setLayout(l) + sto(self.swap_title_author_button, self.cover.buttons[0]) + for i, b in enumerate(self.cover.buttons[:3]): + l.addWidget(b, 0, i, 1, 1) + sto(b, self.cover.buttons[i+1]) + hl = QHBoxLayout() + for b in self.cover.buttons[3:]: + hl.addWidget(b) + sto(self.cover.buttons[-2], self.cover.buttons[-1]) + l.addLayout(hl, 1, 0, 1, 3) + wgl.addWidget(gb) + wgl.addWidget(self.fetch_metadata_button) + wgl.addWidget(self.formats_manager) + + self.splitter = QSplitter(Qt.Horizontal, tab1) + tab1.l.addWidget(self.splitter) + self.splitter.addWidget(self.cover) + self.splitter.addWidget(wsp) + + # }}} + + def edit_metadata(db, row_list, current_row, parent=None, view_slot=None): d = MetadataSingleDialog(db, parent) d.start(row_list, current_row, view_slot=view_slot) From fea18021b8ab4e36f8afbbcc406485e0b21e4a89 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Fri, 21 Jan 2011 20:01:16 +0000 Subject: [PATCH 2/6] Take out some debug prints and connects --- src/calibre/gui2/metadata/single.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/calibre/gui2/metadata/single.py b/src/calibre/gui2/metadata/single.py index 76cddc2f3c..d4d85517ee 100644 --- a/src/calibre/gui2/metadata/single.py +++ b/src/calibre/gui2/metadata/single.py @@ -475,12 +475,8 @@ class MetadataSingleDialogAlt(MetadataSingleDialogBase): cc_two_column = False one_line_comments_toolbar = True - def tab_clicked(self, t): - print 'here', t - def do_layout(self): # {{{ self.central_widget.clear() - self.central_widget.currentChanged.connect(self.tab_clicked) self.tabs = [] self.labels = [] sto = QWidget.setTabOrder @@ -602,7 +598,7 @@ class MetadataSingleDialogAlt(MetadataSingleDialogBase): def edit_metadata(db, row_list, current_row, parent=None, view_slot=None): - d = MetadataSingleDialog(db, parent) + d = MetadataSingleDialogAlt(db, parent) d.start(row_list, current_row, view_slot=view_slot) return d.changed From ab87388e07932140590d5280771afec002bf2c1f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 21 Jan 2011 14:03:25 -0700 Subject: [PATCH 3/6] ... --- src/calibre/gui2/metadata/single.py | 39 +++++++++++++++++------------ 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/src/calibre/gui2/metadata/single.py b/src/calibre/gui2/metadata/single.py index 7e8458657a..0297f130a4 100644 --- a/src/calibre/gui2/metadata/single.py +++ b/src/calibre/gui2/metadata/single.py @@ -170,6 +170,22 @@ class MetadataSingleDialogBase(ResizableDialog): self.__custom_col_layouts = [layout] # }}} + def set_custom_metadata_tab_order(self, before=None, after=None): + sto = QWidget.setTabOrder + if getattr(self, 'custom_metadata_widgets', []): + ans = self.custom_metadata_widgets + for i in range(len(ans)-1): + if before is not None and i == 0: + pass# Do something + if len(ans[i+1].widgets) == 2: + sto(ans[i].widgets[-1], ans[i+1].widgets[1]) + else: + sto(ans[i].widgets[-1], ans[i+1].widgets[0]) + for c in range(2, len(ans[i].widgets), 2): + sto(ans[i].widgets[c-1], ans[i].widgets[c+1]) + if after is not None: + pass # Do something + def do_layout(self): # {{{ raise NotImplementedError() @@ -349,9 +365,9 @@ class MetadataSingleDialogBase(ResizableDialog): if x is not None: disconnect(x.clicked) -class MetadataSingleDialog(MetadataSingleDialogBase): +class MetadataSingleDialog(MetadataSingleDialogBase): # {{{ - def do_layout(self): # {{{ + def do_layout(self): if len(self.db.custom_column_label_map) == 0: self.central_widget.tabBar().setVisible(False) self.central_widget.clear() @@ -458,25 +474,16 @@ class MetadataSingleDialog(MetadataSingleDialogBase): l.addWidget(self.comments) self.splitter.addWidget(gb) - if getattr(self, 'custom_metadata_widgets', []): - ans = self.custom_metadata_widgets - for i in range(len(ans)-1): - if len(ans[i+1].widgets) == 2: - sto(ans[i].widgets[-1], ans[i+1].widgets[1]) - else: - sto(ans[i].widgets[-1], ans[i+1].widgets[0]) - for c in range(2, len(ans[i].widgets), 2): - sto(ans[i].widgets[c-1], ans[i].widgets[c+1]) + self.set_custom_metadata_tab_order() - # }}} +# }}} - -class MetadataSingleDialogAlt(MetadataSingleDialogBase): +class MetadataSingleDialogAlt(MetadataSingleDialogBase): # {{{ cc_two_column = False one_line_comments_toolbar = True - def do_layout(self): # {{{ + def do_layout(self): self.central_widget.clear() self.tabs = [] self.labels = [] @@ -602,7 +609,7 @@ class MetadataSingleDialogAlt(MetadataSingleDialogBase): self.formats_manager.formats.setMaximumWidth(10000) self.formats_manager.formats.setIconSize(QSize(64, 64)) - # }}} +# }}} def edit_metadata(db, row_list, current_row, parent=None, view_slot=None): From ff97a9279f58b593e17e7ce2cee4e218337ad33d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 21 Jan 2011 14:06:36 -0700 Subject: [PATCH 4/6] ... --- src/calibre/gui2/metadata/single.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/calibre/gui2/metadata/single.py b/src/calibre/gui2/metadata/single.py index 0297f130a4..3b163d84f7 100644 --- a/src/calibre/gui2/metadata/single.py +++ b/src/calibre/gui2/metadata/single.py @@ -170,7 +170,7 @@ class MetadataSingleDialogBase(ResizableDialog): self.__custom_col_layouts = [layout] # }}} - def set_custom_metadata_tab_order(self, before=None, after=None): + def set_custom_metadata_tab_order(self, before=None, after=None): # {{{ sto = QWidget.setTabOrder if getattr(self, 'custom_metadata_widgets', []): ans = self.custom_metadata_widgets @@ -185,12 +185,11 @@ class MetadataSingleDialogBase(ResizableDialog): sto(ans[i].widgets[c-1], ans[i].widgets[c+1]) if after is not None: pass # Do something - - def do_layout(self): # {{{ - raise NotImplementedError() - # }}} + def do_layout(self): + raise NotImplementedError() + def __call__(self, id_): self.book_id = id_ for widget in self.basic_metadata_widgets: @@ -201,6 +200,7 @@ class MetadataSingleDialogBase(ResizableDialog): #self.fetch_metadata_button.setFocus(Qt.OtherFocusReason) + # Miscellaneous interaction methods {{{ def update_window_title(self, *args): title = self.title.current_val if len(title) > 50: @@ -287,6 +287,7 @@ class MetadataSingleDialogBase(ResizableDialog): def fetch_metadata(self, *args): pass # TODO: fetch metadata + # }}} def apply_changes(self): self.changed.add(self.book_id) @@ -323,6 +324,7 @@ class MetadataSingleDialogBase(ResizableDialog): def save_state(self): gprefs['metasingle_window_geometry3'] = bytearray(self.saveGeometry()) + # Dialog use methods {{{ def start(self, row_list, current_row, view_slot=None): self.row_list = row_list self.current_row = current_row @@ -364,6 +366,7 @@ class MetadataSingleDialogBase(ResizableDialog): x = getattr(self, b, None) if x is not None: disconnect(x.clicked) + # }}} class MetadataSingleDialog(MetadataSingleDialogBase): # {{{ From b27a2625cb69643b259ba586da5495418a3cebd4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 21 Jan 2011 14:43:43 -0700 Subject: [PATCH 5/6] Fix regression that broke MOBI output in the GUI --- src/calibre/ebooks/mobi/writer.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/calibre/ebooks/mobi/writer.py b/src/calibre/ebooks/mobi/writer.py index ed102ecc80..2a71ecd43b 100644 --- a/src/calibre/ebooks/mobi/writer.py +++ b/src/calibre/ebooks/mobi/writer.py @@ -1541,7 +1541,10 @@ class MobiWriter(object): exth.write(data) nrecs += 1 if term == 'rights' : - rights = unicode(oeb.metadata.rights[0]).encode('utf-8') + try: + rights = unicode(oeb.metadata.rights[0]).encode('utf-8') + except: + rights = 'Unknown' exth.write(pack('>II', EXTH_CODES['rights'], len(rights) + 8)) exth.write(rights) From 9c364533e43ccc9f0dc24d9052dbc145426938b3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 21 Jan 2011 14:44:41 -0700 Subject: [PATCH 6/6] version 0.7.42 --- Changelog.yaml | 2 +- src/calibre/constants.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Changelog.yaml b/Changelog.yaml index 4def62b6b2..6fc6714970 100644 --- a/Changelog.yaml +++ b/Changelog.yaml @@ -4,7 +4,7 @@ # for important features/bug fixes. # Also, each release can have new and improved recipes. -- version: 0.7.41 +- version: 0.7.42 date: 2011-01-21 new features: diff --git a/src/calibre/constants.py b/src/calibre/constants.py index 86b0f56315..e5792aeff8 100644 --- a/src/calibre/constants.py +++ b/src/calibre/constants.py @@ -2,7 +2,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' __appname__ = 'calibre' -__version__ = '0.7.41' +__version__ = '0.7.42' __author__ = "Kovid Goyal " import re