diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index cfb582024d..b9c01a1b87 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -7,9 +7,10 @@ __docformat__ = 'restructuredtext en' import os, collections -from PyQt4.Qt import QLabel, QPixmap, QSize, QWidget, Qt, pyqtSignal, \ - QVBoxLayout, QScrollArea, QPropertyAnimation, QEasingCurve, \ - QSizePolicy, QPainter, QRect, pyqtProperty +from PyQt4.Qt import QPixmap, QSize, QWidget, Qt, pyqtSignal, \ + QPropertyAnimation, QEasingCurve, \ + QSizePolicy, QPainter, QRect, pyqtProperty, QLayout +from PyQt4.QtWebKit import QWebView from calibre import fit_image, prepare_string_for_xml from calibre.gui2.widgets import IMAGE_EXTENSIONS @@ -67,10 +68,7 @@ class CoverView(QWidget): # {{{ def __init__(self, vertical, parent=None): QWidget.__init__(self, parent) - self.setMaximumSize(QSize(120, 120)) - self.setMinimumSize(QSize(120 if vertical else 20, 120 if vertical else - 20)) - self._current_pixmap_size = self.maximumSize() + self._current_pixmap_size = QSize(120, 120) self.vertical = vertical self.animation = QPropertyAnimation(self, 'current_pixmap_size', self) @@ -79,8 +77,9 @@ class CoverView(QWidget): # {{{ self.animation.setStartValue(QSize(0, 0)) self.animation.valueChanged.connect(self.value_changed) - self.setSizePolicy(QSizePolicy.Expanding if vertical else - QSizePolicy.Minimum, QSizePolicy.Expanding) + self.setSizePolicy( + QSizePolicy.Expanding if vertical else QSizePolicy.Minimum, + QSizePolicy.Expanding) self.default_pixmap = QPixmap(I('book.png')) self.pixmap = self.default_pixmap @@ -109,20 +108,6 @@ class CoverView(QWidget): # {{{ self.current_pixmap_size = QSize(self.pwidth, self.pheight) self.animation.setEndValue(self.current_pixmap_size) - def relayout(self, parent_size): - if self.vertical: - self.setMaximumSize(parent_size.width(), - min(int(parent_size.height()/2.),int(4/3. * parent_size.width())+1)) - else: - self.setMaximumSize(1+int(3/4. * parent_size.height()), - parent_size.height()) - self.resize(self.maximumSize()) - self.animation.stop() - self.do_layout() - - def sizeHint(self): - return self.maximumSize() - def show_data(self, data): self.animation.stop() same_item = data.get('id', True) == self.data.get('id', False) @@ -165,46 +150,27 @@ class CoverView(QWidget): # {{{ # }}} # Book Info {{{ -class Label(QLabel): +class BookInfo(QWebView): - mr = pyqtSignal(object) link_clicked = pyqtSignal(object) - def __init__(self): - QLabel.__init__(self) - self.setTextFormat(Qt.RichText) - self.setText('') - self.setWordWrap(True) - self.setAlignment(Qt.AlignTop) - self.linkActivated.connect(self.link_activated) + def __init__(self, vertical, parent=None): + QWebView.__init__(self, parent) + self.vertical = vertical + self.page().setLinkDelegationPolicy(self.page().DelegateAllLinks) + self.linkClicked.connect(self.link_activated) self._link_clicked = False - self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) def link_activated(self, link): self._link_clicked = True - link = unicode(link) + link = unicode(link.toString()) self.link_clicked.emit(link) - def mouseReleaseEvent(self, ev): - QLabel.mouseReleaseEvent(self, ev) - if not self._link_clicked: - self.mr.emit(ev) - self._link_clicked = False - -class BookInfo(QScrollArea): - - def __init__(self, vertical, parent=None): - QScrollArea.__init__(self, parent) - self.vertical = vertical - self.setWidgetResizable(True) - self.label = Label() - self.setWidget(self.label) - self.link_clicked = self.label.link_clicked - self.mr = self.label.mr - self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + def turnoff_scrollbar(self, *args): + self.page().mainFrame().setScrollBarPolicy(Qt.Horizontal, Qt.ScrollBarAlwaysOff) def show_data(self, data): - self.label.setText('') + self.setHtml('') rows = render_rows(data) rows = u'\n'.join([u'
%s | %s |
'+_('Click to open Book Details window') + + self.cover_view.show_data(data) + self._layout.do_layout(self.rect()) + self.setToolTip('
'+_('Double-click to open Book Details window') +
'
' + _('Path') + ': ' + data.get(_('Path'), ''))
def reset_info(self):