Edit book: Fix pasting files from another editor instance causing unsaved changes in open editors to be lost. Fixes #1885455 [Unsaved edits lost on paste from another editor instance](https://bugs.launchpad.net/calibre/+bug/1885455)

This commit is contained in:
Kovid Goyal 2020-06-30 14:19:09 +05:30
parent 9d3de69829
commit be90c08642
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -70,7 +70,7 @@ from calibre.utils.icu import numeric_sort_key
from calibre.utils.imghdr import identify from calibre.utils.imghdr import identify
from calibre.utils.tdir_in_cache import tdir_in_cache from calibre.utils.tdir_in_cache import tdir_in_cache
from polyglot.builtins import ( from polyglot.builtins import (
iteritems, itervalues, map, string_or_bytes, unicode_type as_bytes, iteritems, itervalues, map, string_or_bytes, unicode_type
) )
from polyglot.urllib import urlparse from polyglot.urllib import urlparse
@ -1403,9 +1403,9 @@ class Boss(QObject):
} }
md.setUrls(list(map(QUrl.fromLocalFile, list(url_map.values())))) md.setUrls(list(map(QUrl.fromLocalFile, list(url_map.values()))))
import json import json
md.setData(FILE_COPY_MIME, json.dumps({ md.setData(FILE_COPY_MIME, as_bytes(json.dumps({
name: (url_map[name], container.mime_map.get(name)) for name in names name: (url_map[name], container.mime_map.get(name)) for name in names
})) })))
QApplication.instance().clipboard().setMimeData(md) QApplication.instance().clipboard().setMimeData(md)
@in_thread_job @in_thread_job
@ -1413,6 +1413,7 @@ class Boss(QObject):
md = QApplication.instance().clipboard().mimeData() md = QApplication.instance().clipboard().mimeData()
if md.hasUrls() and md.hasFormat(FILE_COPY_MIME): if md.hasUrls() and md.hasFormat(FILE_COPY_MIME):
import json import json
self.commit_all_editors_to_container()
name_map = json.loads(bytes(md.data(FILE_COPY_MIME))) name_map = json.loads(bytes(md.data(FILE_COPY_MIME)))
container = current_container() container = current_container()
for name, (path, mt) in iteritems(name_map): for name, (path, mt) in iteritems(name_map):