Windows: Fix drag and drop of long paths onto book list and book details panels

This commit is contained in:
Kovid Goyal 2020-10-23 20:51:27 +05:30
parent 758f3e1452
commit 687f9f056e
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 38 additions and 27 deletions

View File

@ -6,20 +6,24 @@ __license__ = 'GPL v3'
__copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>' __copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
import posixpath, os, re import os
import posixpath
import re
from PyQt5.Qt import (
QDialog, QDialogButtonBox, QImageReader, QLabel, QPixmap, QProgressBar, Qt,
QTimer, QUrl, QVBoxLayout
)
from threading import Thread from threading import Thread
from PyQt5.Qt import QPixmap, Qt, QDialog, QLabel, QVBoxLayout, \ from calibre import as_unicode, browser, prints
QDialogButtonBox, QProgressBar, QTimer, QUrl, QImageReader from calibre.constants import DEBUG, iswindows
from calibre.constants import DEBUG
from calibre.ptempfile import PersistentTemporaryFile
from calibre import browser, as_unicode, prints
from calibre.gui2 import error_dialog from calibre.gui2 import error_dialog
from calibre.ptempfile import PersistentTemporaryFile
from calibre.utils.filenames import make_long_path_useable
from calibre.utils.imghdr import what from calibre.utils.imghdr import what
from polyglot.builtins import unicode_type from polyglot.builtins import unicode_type
from polyglot.queue import Empty, Queue
from polyglot.urllib import unquote, urlparse from polyglot.urllib import unquote, urlparse
from polyglot.queue import Queue, Empty
def image_extensions(): def image_extensions():
@ -163,6 +167,10 @@ def urls_from_md(md):
def path_from_qurl(qurl, allow_remote=False): def path_from_qurl(qurl, allow_remote=False):
lf = qurl.toLocalFile() lf = qurl.toLocalFile()
if lf: if lf:
if iswindows:
from calibre_extensions.winutil import get_long_path_name
lf = get_long_path_name(lf)
lf = make_long_path_useable(lf)
return lf return lf
if not allow_remote: if not allow_remote:
return '' return ''

View File

@ -5,29 +5,33 @@
__license__ = 'GPL v3' __license__ = 'GPL v3'
__copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>' __copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'
import itertools, operator, os, math import itertools
from threading import Event, Thread import math
import operator
import os
from functools import wraps from functools import wraps
from textwrap import wrap
from PyQt5.Qt import ( from PyQt5.Qt import (
QListView, QSize, QStyledItemDelegate, QModelIndex, Qt, QImage, pyqtSignal, QAbstractItemView, QApplication, QBuffer, QByteArray, QColor, QDrag,
QTimer, QColor, QItemSelection, QPixmap, QApplication, QEasingCurve, QEvent, QFont, QHelpEvent, QIcon, QImage, QItemSelection,
QMimeData, QUrl, QDrag, QPoint, QPainter, QRect, pyqtProperty, QEvent, QItemSelectionModel, QListView, QMimeData, QModelIndex, QPainter, QPixmap,
QPropertyAnimation, QEasingCurve, pyqtSlot, QHelpEvent, QAbstractItemView, QPoint, QPropertyAnimation, QRect, QSize, QStyledItemDelegate,
QStyleOptionViewItem, QToolTip, QByteArray, QBuffer, qRed, qGreen, QStyleOptionViewItem, Qt, QTableView, QTimer, QToolTip, QTreeView, QUrl,
qBlue, QItemSelectionModel, QIcon, QFont, QTableView, QTreeView) pyqtProperty, pyqtSignal, pyqtSlot, qBlue, qGreen, qRed
)
from textwrap import wrap
from threading import Event, Thread
from calibre import fit_image, prints, prepare_string_for_xml, human_readable from calibre import fit_image, human_readable, prepare_string_for_xml, prints
from calibre.constants import DEBUG, config_dir, islinux from calibre.constants import DEBUG, config_dir, islinux
from calibre.gui2.pin_columns import PinContainer
from calibre.ebooks.metadata import fmt_sidx, rating_to_stars from calibre.ebooks.metadata import fmt_sidx, rating_to_stars
from calibre.utils import join_with_timeout from calibre.gui2 import config, empty_index, gprefs, rating_font
from calibre.gui2 import gprefs, config, rating_font, empty_index from calibre.gui2.dnd import path_from_qurl
from calibre.gui2.gestures import GestureManager from calibre.gui2.gestures import GestureManager
from calibre.gui2.library.caches import CoverCache, ThumbnailCache from calibre.gui2.library.caches import CoverCache, ThumbnailCache
from calibre.gui2.pin_columns import PinContainer
from calibre.utils import join_with_timeout
from calibre.utils.config import prefs, tweaks from calibre.utils.config import prefs, tweaks
from polyglot.builtins import itervalues, unicode_type, range from polyglot.builtins import itervalues, range, unicode_type
from polyglot.queue import LifoQueue from polyglot.queue import LifoQueue
CM_TO_INCH = 0.393701 CM_TO_INCH = 0.393701
@ -246,10 +250,9 @@ def paths_from_event(self, event):
and represent files with extensions. and represent files with extensions.
''' '''
md = event.mimeData() md = event.mimeData()
if md.hasFormat('text/uri-list') and not \ if md.hasFormat('text/uri-list') and not md.hasFormat('application/calibre+from_library'):
md.hasFormat('application/calibre+from_library'): urls = map(path_from_qurl, md.urls())
urls = [unicode_type(u.toLocalFile()) for u in md.urls()] return [u for u in urls if u and os.path.splitext(u)[1] and os.path.exists(u)]
return [u for u in urls if os.path.splitext(u)[1] and os.path.exists(u)]
def setup_dnd_interface(cls_or_self): def setup_dnd_interface(cls_or_self):