Right click to export file from book to disk

This commit is contained in:
Kovid Goyal 2013-12-02 14:24:15 +05:30
parent 3bd8285429
commit 267a02fbed
2 changed files with 22 additions and 2 deletions

View File

@ -74,6 +74,7 @@ class Boss(QObject):
fl.edit_file.connect(self.edit_file_requested) fl.edit_file.connect(self.edit_file_requested)
fl.merge_requested.connect(self.merge_requested) fl.merge_requested.connect(self.merge_requested)
fl.mark_requested.connect(self.mark_requested) fl.mark_requested.connect(self.mark_requested)
fl.export_requested.connect(self.export_requested)
self.gui.central.current_editor_changed.connect(self.apply_current_editor_state) self.gui.central.current_editor_changed.connect(self.apply_current_editor_state)
self.gui.central.close_requested.connect(self.editor_close_requested) self.gui.central.close_requested.connect(self.editor_close_requested)
self.gui.central.search_panel.search_triggered.connect(self.search) self.gui.central.search_panel.search_triggered.connect(self.search)
@ -671,6 +672,13 @@ class Boss(QObject):
if master in editors: if master in editors:
self.show_editor(master) self.show_editor(master)
@in_thread_job
def export_requested(self, name, path):
if name in editors and not editors[name].is_synced_to_container:
self.commit_editor_to_container(name)
with current_container().open(name, 'rb') as src, open(path, 'wb') as dest:
shutil.copyfileobj(src, dest)
def sync_editor_to_preview(self, name, lnum): def sync_editor_to_preview(self, name, lnum):
editor = self.edit_file(name, 'html') editor = self.edit_file(name, 'html')
self.ignore_preview_to_editor_sync = True self.ignore_preview_to_editor_sync = True

View File

@ -20,7 +20,7 @@ from calibre.ebooks.oeb.base import OEB_STYLES, OEB_DOCS
from calibre.ebooks.oeb.polish.container import guess_type, OEB_FONTS from calibre.ebooks.oeb.polish.container import guess_type, OEB_FONTS
from calibre.ebooks.oeb.polish.cover import ( from calibre.ebooks.oeb.polish.cover import (
get_cover_page_name, get_raster_cover_name, is_raster_image) get_cover_page_name, get_raster_cover_name, is_raster_image)
from calibre.gui2 import error_dialog, choose_files, question_dialog, elided_text from calibre.gui2 import error_dialog, choose_files, question_dialog, elided_text, choose_save_file
from calibre.gui2.tweak_book import current_container from calibre.gui2.tweak_book import current_container
from calibre.gui2.tweak_book.editor import syntax_from_mime from calibre.gui2.tweak_book.editor import syntax_from_mime
from calibre.gui2.tweak_book.templates import template_for from calibre.gui2.tweak_book.templates import template_for
@ -85,6 +85,7 @@ class FileList(QTreeWidget):
edit_file = pyqtSignal(object, object, object) edit_file = pyqtSignal(object, object, object)
merge_requested = pyqtSignal(object, object, object) merge_requested = pyqtSignal(object, object, object)
mark_requested = pyqtSignal(object, object) mark_requested = pyqtSignal(object, object)
export_requested = pyqtSignal(object, object)
def __init__(self, parent=None): def __init__(self, parent=None):
QTreeWidget.__init__(self, parent) QTreeWidget.__init__(self, parent)
@ -305,6 +306,7 @@ class FileList(QTreeWidget):
num = len(sel) num = len(sel)
if num > 0: if num > 0:
m.addAction(QIcon(I('trash.png')), _('&Delete selected files'), self.request_delete) m.addAction(QIcon(I('trash.png')), _('&Delete selected files'), self.request_delete)
m.addSeparator()
ci = self.currentItem() ci = self.currentItem()
if ci is not None: if ci is not None:
cn = unicode(ci.data(0, NAME_ROLE).toString()) cn = unicode(ci.data(0, NAME_ROLE).toString())
@ -315,6 +317,9 @@ class FileList(QTreeWidget):
m.addAction(QIcon(I('default_cover.png')), _('Mark %s as cover image') % elided_text(cn), partial(self.mark_as_cover, cn)) m.addAction(QIcon(I('default_cover.png')), _('Mark %s as cover image') % elided_text(cn), partial(self.mark_as_cover, cn))
elif current_container().SUPPORTS_TITLEPAGES and mt in OEB_DOCS and cat == 'text': elif current_container().SUPPORTS_TITLEPAGES and mt in OEB_DOCS and cat == 'text':
m.addAction(QIcon(I('default_cover.png')), _('Mark %s as title/cover page') % elided_text(cn), partial(self.mark_as_titlepage, cn)) m.addAction(QIcon(I('default_cover.png')), _('Mark %s as title/cover page') % elided_text(cn), partial(self.mark_as_titlepage, cn))
m.addSeparator()
m.addAction(QIcon(I('save.png')), _('Export %s') % elided_text(cn), partial(self.export, cn))
m.addSeparator()
selected_map = defaultdict(list) selected_map = defaultdict(list)
for item in sel: for item in sel:
@ -442,6 +447,12 @@ class FileList(QTreeWidget):
ans['selected'][name] = syntax_from_mime(name, mime) ans['selected'][name] = syntax_from_mime(name, mime)
return ans return ans
def export(self, name):
path = choose_save_file(self, 'tweak_book_export_file', _('Choose location'), filters=[
(_('Files'), [name.rpartition('.')[-1].lower()])], all_files=False)
if path:
self.export_requested.emit(name, path)
class NewFileDialog(QDialog): # {{{ class NewFileDialog(QDialog): # {{{
def __init__(self, initial_choice='html', parent=None): def __init__(self, initial_choice='html', parent=None):
@ -566,6 +577,7 @@ class FileListWidget(QWidget):
edit_file = pyqtSignal(object, object, object) edit_file = pyqtSignal(object, object, object)
merge_requested = pyqtSignal(object, object, object) merge_requested = pyqtSignal(object, object, object)
mark_requested = pyqtSignal(object, object) mark_requested = pyqtSignal(object, object)
export_requested = pyqtSignal(object, object)
def __init__(self, parent=None): def __init__(self, parent=None):
QWidget.__init__(self, parent) QWidget.__init__(self, parent)
@ -573,7 +585,7 @@ class FileListWidget(QWidget):
self.file_list = FileList(self) self.file_list = FileList(self)
self.layout().addWidget(self.file_list) self.layout().addWidget(self.file_list)
self.layout().setContentsMargins(0, 0, 0, 0) self.layout().setContentsMargins(0, 0, 0, 0)
for x in ('delete_requested', 'reorder_spine', 'rename_requested', 'edit_file', 'merge_requested', 'mark_requested'): for x in ('delete_requested', 'reorder_spine', 'rename_requested', 'edit_file', 'merge_requested', 'mark_requested', 'export_requested'):
getattr(self.file_list, x).connect(getattr(self, x)) getattr(self.file_list, x).connect(getattr(self, x))
for x in ('delete_done', 'select_name'): for x in ('delete_done', 'select_name'):
setattr(self, x, getattr(self.file_list, x)) setattr(self, x, getattr(self.file_list, x))