mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Right click to export file from book to disk
This commit is contained in:
parent
3bd8285429
commit
267a02fbed
@ -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
|
||||||
|
@ -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))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user