mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Merge from trunk
This commit is contained in:
commit
c145703c12
@ -83,7 +83,7 @@ class ISBNDBMetadata(Metadata):
|
|||||||
|
|
||||||
summ = tostring(book.find('summary'))
|
summ = tostring(book.find('summary'))
|
||||||
if summ:
|
if summ:
|
||||||
self.comments = 'SUMMARY:\n'+summ.string
|
self.comments = 'SUMMARY:\n'+summ
|
||||||
|
|
||||||
|
|
||||||
def build_isbn(base_url, opts):
|
def build_isbn(base_url, opts):
|
||||||
|
@ -21,6 +21,7 @@ class Worker(Thread):
|
|||||||
def __init__(self, ids, db, loc, progress, done):
|
def __init__(self, ids, db, loc, progress, done):
|
||||||
Thread.__init__(self)
|
Thread.__init__(self)
|
||||||
self.ids = ids
|
self.ids = ids
|
||||||
|
self.processed = set([])
|
||||||
self.db = db
|
self.db = db
|
||||||
self.loc = loc
|
self.loc = loc
|
||||||
self.error = None
|
self.error = None
|
||||||
@ -71,6 +72,7 @@ class Worker(Thread):
|
|||||||
co = self.db.conversion_options(x, 'PIPE')
|
co = self.db.conversion_options(x, 'PIPE')
|
||||||
if co is not None:
|
if co is not None:
|
||||||
newdb.set_conversion_options(x, 'PIPE', co)
|
newdb.set_conversion_options(x, 'PIPE', co)
|
||||||
|
self.processed.add(x)
|
||||||
|
|
||||||
|
|
||||||
class CopyToLibraryAction(InterfaceAction):
|
class CopyToLibraryAction(InterfaceAction):
|
||||||
@ -107,9 +109,13 @@ class CopyToLibraryAction(InterfaceAction):
|
|||||||
for name, loc in locations:
|
for name, loc in locations:
|
||||||
self.menu.addAction(name, partial(self.copy_to_library,
|
self.menu.addAction(name, partial(self.copy_to_library,
|
||||||
loc))
|
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))
|
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()
|
rows = self.gui.library_view.selectionModel().selectedRows()
|
||||||
if not rows or len(rows) == 0:
|
if not rows or len(rows) == 0:
|
||||||
return error_dialog(self.gui, _('Cannot copy'),
|
return error_dialog(self.gui, _('Cannot copy'),
|
||||||
@ -140,7 +146,16 @@ class CopyToLibraryAction(InterfaceAction):
|
|||||||
else:
|
else:
|
||||||
self.gui.status_bar.show_message(_('Copied %d books to %s') %
|
self.gui.status_bar.show_message(_('Copied %d books to %s') %
|
||||||
(len(ids), loc), 2000)
|
(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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -149,6 +149,18 @@ class DeleteAction(InterfaceAction):
|
|||||||
self.gui.library_view.model().current_changed(self.gui.library_view.currentIndex(),
|
self.gui.library_view.model().current_changed(self.gui.library_view.currentIndex(),
|
||||||
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):
|
def delete_books(self, *args):
|
||||||
'''
|
'''
|
||||||
Delete selected books from device or library.
|
Delete selected books from device or library.
|
||||||
@ -168,14 +180,7 @@ class DeleteAction(InterfaceAction):
|
|||||||
if ci.isValid():
|
if ci.isValid():
|
||||||
row = ci.row()
|
row = ci.row()
|
||||||
ids_deleted = view.model().delete_books(rows)
|
ids_deleted = view.model().delete_books(rows)
|
||||||
for v in (self.gui.memory_view, self.gui.card_a_view, self.gui.card_b_view):
|
self.library_ids_deleted(ids_deleted, row)
|
||||||
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)
|
|
||||||
else:
|
else:
|
||||||
if not confirm('<p>'+_('The selected books will be '
|
if not confirm('<p>'+_('The selected books will be '
|
||||||
'<b>permanently deleted</b> '
|
'<b>permanently deleted</b> '
|
||||||
|
@ -166,6 +166,8 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
|
|||||||
def __init__(self, pathtoebook=None, debug_javascript=False):
|
def __init__(self, pathtoebook=None, debug_javascript=False):
|
||||||
MainWindow.__init__(self, None)
|
MainWindow.__init__(self, None)
|
||||||
self.setupUi(self)
|
self.setupUi(self)
|
||||||
|
self.show_toc_on_open = False
|
||||||
|
self.current_book_has_toc = False
|
||||||
self.base_window_title = unicode(self.windowTitle())
|
self.base_window_title = unicode(self.windowTitle())
|
||||||
self.iterator = None
|
self.iterator = None
|
||||||
self.current_page = None
|
self.current_page = None
|
||||||
@ -214,11 +216,12 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
|
|||||||
self.action_metadata.setCheckable(True)
|
self.action_metadata.setCheckable(True)
|
||||||
self.action_metadata.setShortcut(Qt.CTRL+Qt.Key_I)
|
self.action_metadata.setShortcut(Qt.CTRL+Qt.Key_I)
|
||||||
self.action_table_of_contents.setCheckable(True)
|
self.action_table_of_contents.setCheckable(True)
|
||||||
|
self.toc.setMinimumWidth(80)
|
||||||
self.action_reference_mode.setCheckable(True)
|
self.action_reference_mode.setCheckable(True)
|
||||||
self.connect(self.action_reference_mode, SIGNAL('triggered(bool)'),
|
self.connect(self.action_reference_mode, SIGNAL('triggered(bool)'),
|
||||||
lambda x: self.view.reference_mode(x))
|
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_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_copy, SIGNAL('triggered(bool)'), self.copy)
|
||||||
self.connect(self.action_font_size_larger, SIGNAL('triggered(bool)'),
|
self.connect(self.action_font_size_larger, SIGNAL('triggered(bool)'),
|
||||||
self.font_size_larger)
|
self.font_size_larger)
|
||||||
@ -259,7 +262,6 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
|
|||||||
f = functools.partial(self.load_ebook, pathtoebook)
|
f = functools.partial(self.load_ebook, pathtoebook)
|
||||||
QTimer.singleShot(50, f)
|
QTimer.singleShot(50, f)
|
||||||
self.view.setMinimumSize(100, 100)
|
self.view.setMinimumSize(100, 100)
|
||||||
self.splitter.setSizes([1, 300])
|
|
||||||
self.toc.setCursor(Qt.PointingHandCursor)
|
self.toc.setCursor(Qt.PointingHandCursor)
|
||||||
self.tool_bar.setContextMenuPolicy(Qt.PreventContextMenu)
|
self.tool_bar.setContextMenuPolicy(Qt.PreventContextMenu)
|
||||||
self.tool_bar2.setContextMenuPolicy(Qt.PreventContextMenu)
|
self.tool_bar2.setContextMenuPolicy(Qt.PreventContextMenu)
|
||||||
@ -285,6 +287,12 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
|
|||||||
def save_state(self):
|
def save_state(self):
|
||||||
state = str(self.saveState(self.STATE_VERSION))
|
state = str(self.saveState(self.STATE_VERSION))
|
||||||
dynamic['viewer_toolbar_state'] = state
|
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):
|
def restore_state(self):
|
||||||
state = dynamic.get('viewer_toolbar_state', None)
|
state = dynamic.get('viewer_toolbar_state', None)
|
||||||
@ -609,10 +617,15 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
|
|||||||
title = self.iterator.opf.title
|
title = self.iterator.opf.title
|
||||||
if not title:
|
if not title:
|
||||||
title = os.path.splitext(os.path.basename(pathtoebook))[0]
|
title = os.path.splitext(os.path.basename(pathtoebook))[0]
|
||||||
self.action_table_of_contents.setDisabled(not self.iterator.toc)
|
|
||||||
if self.iterator.toc:
|
if self.iterator.toc:
|
||||||
self.toc_model = TOC(self.iterator.toc)
|
self.toc_model = TOC(self.iterator.toc)
|
||||||
self.toc.setModel(self.toc_model)
|
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.current_title = title
|
||||||
self.setWindowTitle(self.base_window_title+' - '+title)
|
self.setWindowTitle(self.base_window_title+' - '+title)
|
||||||
self.pos.setMaximum(sum(self.iterator.pages))
|
self.pos.setMaximum(sum(self.iterator.pages))
|
||||||
@ -656,22 +669,21 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
|
|||||||
return self
|
return self
|
||||||
|
|
||||||
def __exit__(self, *args):
|
def __exit__(self, *args):
|
||||||
self.write_settings()
|
|
||||||
if self.iterator is not None:
|
if self.iterator is not None:
|
||||||
self.save_current_position()
|
self.save_current_position()
|
||||||
self.iterator.__exit__(*args)
|
self.iterator.__exit__(*args)
|
||||||
|
|
||||||
def write_settings(self):
|
|
||||||
dynamic.set('viewer_window_geometry', self.saveGeometry())
|
|
||||||
|
|
||||||
def read_settings(self):
|
def read_settings(self):
|
||||||
c = config().parse()
|
c = config().parse()
|
||||||
wg = dynamic['viewer_window_geometry']
|
self.splitter.setSizes([1, 300])
|
||||||
if wg is not None and c.remember_window_size:
|
if c.remember_window_size:
|
||||||
self.restoreGeometry(wg)
|
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):
|
def config(defaults=None):
|
||||||
desc = _('Options to control the ebook viewer')
|
desc = _('Options to control the ebook viewer')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user