From 2dab246d4df0ddf6f28c0f2d9dedab3b0fb607ea Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 6 Oct 2010 16:21:29 -0600 Subject: [PATCH 1/3] Implement #7075 (possibility to move a book to another library) --- src/calibre/gui2/actions/copy_to_library.py | 19 +++++++++++++++++-- src/calibre/gui2/actions/delete.py | 21 +++++++++++++-------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/calibre/gui2/actions/copy_to_library.py b/src/calibre/gui2/actions/copy_to_library.py index 6b7654f644..513026f757 100644 --- a/src/calibre/gui2/actions/copy_to_library.py +++ b/src/calibre/gui2/actions/copy_to_library.py @@ -21,6 +21,7 @@ class Worker(Thread): def __init__(self, ids, db, loc, progress, done): Thread.__init__(self) self.ids = ids + self.processed = set([]) self.db = db self.loc = loc self.error = None @@ -71,6 +72,7 @@ class Worker(Thread): co = self.db.conversion_options(x, 'PIPE') if co is not None: newdb.set_conversion_options(x, 'PIPE', co) + self.processed.add(x) class CopyToLibraryAction(InterfaceAction): @@ -107,9 +109,13 @@ class CopyToLibraryAction(InterfaceAction): for name, loc in locations: self.menu.addAction(name, partial(self.copy_to_library, loc)) + self.menu.addAction(name + ' ' + _('(delete after copy)'), + partial(self.copy_to_library, loc, delete_after=True)) + self.menu.addSeparator() + self.qaction.setVisible(bool(locations)) - def copy_to_library(self, loc): + def copy_to_library(self, loc, delete_after=False): rows = self.gui.library_view.selectionModel().selectedRows() if not rows or len(rows) == 0: return error_dialog(self.gui, _('Cannot copy'), @@ -140,7 +146,16 @@ class CopyToLibraryAction(InterfaceAction): else: self.gui.status_bar.show_message(_('Copied %d books to %s') % (len(ids), loc), 2000) - + if delete_after and self.worker.processed: + v = self.gui.library_view + ci = v.currentIndex() + row = None + if ci.isValid(): + row = ci.row() + + v.model().delete_books_by_id(self.worker.processed) + self.gui.iactions['Remove Books'].library_ids_deleted( + self.worker.processed, row) diff --git a/src/calibre/gui2/actions/delete.py b/src/calibre/gui2/actions/delete.py index 406860e4ec..a541590fd1 100644 --- a/src/calibre/gui2/actions/delete.py +++ b/src/calibre/gui2/actions/delete.py @@ -149,6 +149,18 @@ class DeleteAction(InterfaceAction): self.gui.library_view.model().current_changed(self.gui.library_view.currentIndex(), self.gui.library_view.currentIndex()) + + def library_ids_deleted(self, ids_deleted, current_row=None): + view = self.gui.library_view + for v in (self.gui.memory_view, self.gui.card_a_view, self.gui.card_b_view): + if v is None: + continue + v.model().clear_ondevice(ids_deleted) + if current_row is not None: + ci = view.model().index(current_row, 0) + if ci.isValid(): + view.set_current_row(current_row) + def delete_books(self, *args): ''' Delete selected books from device or library. @@ -168,14 +180,7 @@ class DeleteAction(InterfaceAction): if ci.isValid(): row = ci.row() ids_deleted = view.model().delete_books(rows) - for v in (self.gui.memory_view, self.gui.card_a_view, self.gui.card_b_view): - if v is None: - continue - v.model().clear_ondevice(ids_deleted) - if row is not None: - ci = view.model().index(row, 0) - if ci.isValid(): - view.set_current_row(row) + self.library_ids_deleted(ids_deleted, row) else: if not confirm('

'+_('The selected books will be ' 'permanently deleted ' From e3f6049cf65d261cdcb9d5a0895374707f7082f5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 6 Oct 2010 17:33:26 -0600 Subject: [PATCH 2/3] Fix another regression in the isbndb plugin --- src/calibre/ebooks/metadata/isbndb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/ebooks/metadata/isbndb.py b/src/calibre/ebooks/metadata/isbndb.py index 6416dcdc39..07a054eeaa 100644 --- a/src/calibre/ebooks/metadata/isbndb.py +++ b/src/calibre/ebooks/metadata/isbndb.py @@ -83,7 +83,7 @@ class ISBNDBMetadata(Metadata): summ = tostring(book.find('summary')) if summ: - self.comments = 'SUMMARY:\n'+summ.string + self.comments = 'SUMMARY:\n'+summ def build_isbn(base_url, opts): From 217ea7a9a22ec243b1d19d332b478f357a77417d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 6 Oct 2010 20:31:40 -0600 Subject: [PATCH 3/3] Implement #7082 (Enhance viewer "Remember Last Used Window Size") --- src/calibre/gui2/viewer/main.py | 38 ++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index 79f4c29998..26fd2cadc9 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -166,6 +166,8 @@ class EbookViewer(MainWindow, Ui_EbookViewer): def __init__(self, pathtoebook=None, debug_javascript=False): MainWindow.__init__(self, None) self.setupUi(self) + self.show_toc_on_open = False + self.current_book_has_toc = False self.base_window_title = unicode(self.windowTitle()) self.iterator = None self.current_page = None @@ -214,11 +216,12 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.action_metadata.setCheckable(True) self.action_metadata.setShortcut(Qt.CTRL+Qt.Key_I) self.action_table_of_contents.setCheckable(True) + self.toc.setMinimumWidth(80) self.action_reference_mode.setCheckable(True) self.connect(self.action_reference_mode, SIGNAL('triggered(bool)'), lambda x: self.view.reference_mode(x)) self.connect(self.action_metadata, SIGNAL('triggered(bool)'), lambda x:self.metadata.setVisible(x)) - self.connect(self.action_table_of_contents, SIGNAL('triggered(bool)'), lambda x:self.toc.setVisible(x)) + self.connect(self.action_table_of_contents, SIGNAL('toggled(bool)'), lambda x:self.toc.setVisible(x)) self.connect(self.action_copy, SIGNAL('triggered(bool)'), self.copy) self.connect(self.action_font_size_larger, SIGNAL('triggered(bool)'), self.font_size_larger) @@ -259,7 +262,6 @@ class EbookViewer(MainWindow, Ui_EbookViewer): f = functools.partial(self.load_ebook, pathtoebook) QTimer.singleShot(50, f) self.view.setMinimumSize(100, 100) - self.splitter.setSizes([1, 300]) self.toc.setCursor(Qt.PointingHandCursor) self.tool_bar.setContextMenuPolicy(Qt.PreventContextMenu) self.tool_bar2.setContextMenuPolicy(Qt.PreventContextMenu) @@ -285,6 +287,12 @@ class EbookViewer(MainWindow, Ui_EbookViewer): def save_state(self): state = str(self.saveState(self.STATE_VERSION)) dynamic['viewer_toolbar_state'] = state + dynamic.set('viewer_window_geometry', self.saveGeometry()) + if self.current_book_has_toc: + dynamic.set('viewer_toc_isvisible', bool(self.toc.isVisible())) + if self.toc.isVisible(): + dynamic.set('viewer_splitter_state', + bytearray(self.splitter.saveState())) def restore_state(self): state = dynamic.get('viewer_toolbar_state', None) @@ -609,10 +617,15 @@ class EbookViewer(MainWindow, Ui_EbookViewer): title = self.iterator.opf.title if not title: title = os.path.splitext(os.path.basename(pathtoebook))[0] - self.action_table_of_contents.setDisabled(not self.iterator.toc) if self.iterator.toc: self.toc_model = TOC(self.iterator.toc) self.toc.setModel(self.toc_model) + if self.show_toc_on_open: + self.action_table_of_contents.setChecked(True) + else: + self.action_table_of_contents.setChecked(False) + self.action_table_of_contents.setDisabled(not self.iterator.toc) + self.current_book_has_toc = bool(self.iterator.toc) self.current_title = title self.setWindowTitle(self.base_window_title+' - '+title) self.pos.setMaximum(sum(self.iterator.pages)) @@ -656,22 +669,21 @@ class EbookViewer(MainWindow, Ui_EbookViewer): return self def __exit__(self, *args): - self.write_settings() if self.iterator is not None: self.save_current_position() self.iterator.__exit__(*args) - def write_settings(self): - dynamic.set('viewer_window_geometry', self.saveGeometry()) - def read_settings(self): c = config().parse() - wg = dynamic['viewer_window_geometry'] - if wg is not None and c.remember_window_size: - self.restoreGeometry(wg) - - - + self.splitter.setSizes([1, 300]) + if c.remember_window_size: + wg = dynamic.get('viewer_window_geometry', None) + if wg is not None: + self.restoreGeometry(wg) + ss = dynamic.get('viewer_splitter_state', None) + if ss is not None: + self.splitter.restoreState(ss) + self.show_toc_on_open = dynamic.get('viewer_toc_isvisible', False) def config(defaults=None): desc = _('Options to control the ebook viewer')