diff --git a/src/calibre/gui2/convert/metadata.ui b/src/calibre/gui2/convert/metadata.ui
index 5d3cc432d7..ec5a913f18 100644
--- a/src/calibre/gui2/convert/metadata.ui
+++ b/src/calibre/gui2/convert/metadata.ui
@@ -20,36 +20,6 @@
Book Cover
- -
-
-
-
-
-
-
-
-
- :/images/book.svg
-
-
- true
-
-
- Qt::AlignCenter
-
-
-
-
-
- -
-
-
- Use cover from &source file
-
-
- true
-
-
-
-
@@ -101,6 +71,30 @@
+ -
+
+
+ Use cover from &source file
+
+
+ true
+
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+
+
opt_prefer_metadata_cover
@@ -308,11 +302,6 @@
-
- ImageView
- QLabel
-
-
EnLineEdit
QLineEdit
@@ -328,6 +317,12 @@
QLineEdit
+
+ ImageView
+ QWidget
+
+ 1
+
title
diff --git a/src/calibre/gui2/dialogs/metadata_single.py b/src/calibre/gui2/dialogs/metadata_single.py
index 1d62ad95ec..8be3774203 100644
--- a/src/calibre/gui2/dialogs/metadata_single.py
+++ b/src/calibre/gui2/dialogs/metadata_single.py
@@ -11,7 +11,7 @@ import re
import time
import traceback
-from PyQt4.Qt import SIGNAL, QObject, QCoreApplication, Qt, QTimer, QThread, QDate, \
+from PyQt4.Qt import SIGNAL, QObject, Qt, QTimer, QThread, QDate, \
QPixmap, QListWidgetItem, QDialog
from calibre.gui2 import error_dialog, file_icon_provider, dynamic, \
@@ -25,7 +25,6 @@ from calibre.ebooks import BOOK_EXTENSIONS
from calibre.ebooks.metadata import string_to_authors, \
authors_to_string, check_isbn
from calibre.ebooks.metadata.library_thing import cover_from_isbn
-from calibre import islinux, isfreebsd
from calibre.ebooks.metadata.meta import get_metadata
from calibre.utils.config import prefs, tweaks
from calibre.utils.date import qt_to_dt
@@ -311,7 +310,6 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
self.formats.setAcceptDrops(True)
self.cover_changed = False
self.cpixmap = None
- self.cover.setAcceptDrops(True)
self.pubdate.setMinimumDate(QDate(100,1,1))
pubdate_format = tweaks['gui_pubdate_display_format']
if pubdate_format is not None:
@@ -399,11 +397,6 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
self.series.lineEdit().editingFinished.connect(self.increment_series_index)
self.show()
- height_of_rest = self.frameGeometry().height() - self.cover.height()
- width_of_rest = self.frameGeometry().width() - self.cover.width()
- ag = QCoreApplication.instance().desktop().availableGeometry(self)
- self.cover.MAX_HEIGHT = ag.height()-(25 if (islinux or isfreebsd) else 0)-height_of_rest
- self.cover.MAX_WIDTH = ag.width()-(25 if (islinux or isfreebsd) else 0)-width_of_rest
pm = QPixmap()
if cover:
pm.loadFromData(cover)
diff --git a/src/calibre/gui2/dialogs/metadata_single.ui b/src/calibre/gui2/dialogs/metadata_single.ui
index 36375589a7..4efb48d870 100644
--- a/src/calibre/gui2/dialogs/metadata_single.ui
+++ b/src/calibre/gui2/dialogs/metadata_single.ui
@@ -576,22 +576,13 @@
-
-
+
0
- 0
+ 100
-
-
-
-
- :/images/book.svg
-
-
- true
-
-
@@ -707,11 +698,6 @@
-
- ImageView
- QLabel
-
-
EnLineEdit
QLineEdit
@@ -732,6 +718,12 @@
QListWidget
+
+ ImageView
+ QWidget
+
+ 1
+
title
diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py
index 9050c7dbd1..8857945027 100644
--- a/src/calibre/gui2/widgets.py
+++ b/src/calibre/gui2/widgets.py
@@ -13,7 +13,7 @@ from PyQt4.Qt import QListView, QIcon, QFont, QLabel, QListWidget, \
QRegExp, QSettings, QSize, QModelIndex, QSplitter, \
QAbstractButton, QPainter, QLineEdit, QComboBox, \
QMenu, QStringListModel, QCompleter, QStringList, \
- QTimer
+ QTimer, QRect
from calibre.gui2 import NONE, error_dialog, pixmap_to_data, gprefs
@@ -146,10 +146,15 @@ class FormatList(QListWidget):
return QListWidget.keyPressEvent(self, event)
-class ImageView(QLabel):
+class ImageView(QWidget):
- MAX_WIDTH = 600
- MAX_HEIGHT = 800
+ def __init__(self, parent=None):
+ QWidget.__init__(self, parent)
+ self._pixmap = QPixmap(self)
+ self.setMinimumSize(QSize(150, 200))
+ self.setAcceptDrops(True)
+
+ # Drag 'n drop {{{
DROPABBLE_EXTENSIONS = IMAGE_EXTENSIONS
@classmethod
@@ -186,13 +191,45 @@ class ImageView(QLabel):
def dragMoveEvent(self, event):
event.acceptProposedAction()
+ # }}}
def setPixmap(self, pixmap):
- QLabel.setPixmap(self, pixmap)
- width, height = fit_image(pixmap.width(), pixmap.height(), self.MAX_WIDTH, self.MAX_HEIGHT)[1:]
- self.setMaximumWidth(width)
- self.setMaximumHeight(height)
+ if not isinstance(pixmap, QPixmap):
+ raise TypeError('Must use a QPixmap')
+ self._pixmap = pixmap
+ self.updateGeometry()
+ self.update()
+ def pixmap(self):
+ return self._pixmap
+
+ def sizeHint(self):
+ if self._pixmap.isNull():
+ return self.minimumSize()
+ return self._pixmap.size()
+
+ def paintEvent(self, event):
+ QWidget.paintEvent(self, event)
+ pmap = self._pixmap
+ if pmap.isNull():
+ return
+ w, h = pmap.width(), pmap.height()
+ cw, ch = self.rect().width(), self.rect().height()
+ scaled, nw, nh = fit_image(w, h, cw, ch)
+ if scaled:
+ pmap = pmap.scaled(nw, nh, Qt.IgnoreAspectRatio,
+ Qt.SmoothTransformation)
+ w, h = pmap.width(), pmap.height()
+ x = int(abs(cw - w)/2.)
+ y = int(abs(ch - h)/2.)
+ target = QRect(x, y, w, h)
+ p = QPainter(self)
+ p.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform)
+ p.drawPixmap(target, pmap)
+ p.end()
+
+
+ # Clipboard copy/paste # {{{
def contextMenuEvent(self, ev):
cm = QMenu(self)
copy = cm.addAction(_('Copy Image'))
@@ -215,6 +252,7 @@ class ImageView(QLabel):
self.setPixmap(pmap)
self.emit(SIGNAL('cover_changed(PyQt_PyObject)'),
pixmap_to_data(pmap))
+ # }}}
class LocationModel(QAbstractListModel):