From c824130633552df159c1f55c5a9ff5495885d33e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 13 Jun 2010 16:20:33 -0600 Subject: [PATCH] Work on the new wide layout --- src/calibre/gui2/book_details.py | 174 ++++++++++++++++++++----------- src/calibre/gui2/status.py | 3 +- 2 files changed, 114 insertions(+), 63 deletions(-) diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 485c1b2d19..a9e87973bd 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -8,71 +8,14 @@ __docformat__ = 'restructuredtext en' import os, collections from PyQt4.Qt import QLabel, QPixmap, QSize, QWidget, Qt, pyqtSignal, \ - QVBoxLayout, QScrollArea + QVBoxLayout, QScrollArea, QPropertyAnimation, QEasingCurve from calibre import fit_image, prepare_string_for_xml from calibre.gui2.widgets import IMAGE_EXTENSIONS from calibre.ebooks import BOOK_EXTENSIONS from calibre.constants import preferred_encoding -class CoverView(QLabel): - - def __init__(self, parent=None): - QLabel.__init__(self, parent) - self.default_pixmap = QPixmap(I('book.svg')) - self.max_width, self.max_height = 120, 120 - self.setScaledContents(True) - self.setPixmap(self.default_pixmap) - - def do_layout(self): - pixmap = self.pixmap() - pwidth, pheight = pixmap.width(), pixmap.height() - width, height = fit_image(pwidth, pheight, - self.max_width, self.max_height)[1:] - self.setMaximumWidth(width) - try: - aspect_ratio = pwidth/float(pheight) - except ZeroDivisionError: - aspect_ratio = 1 - mh = min(self.max_height, int(width/aspect_ratio)) - self.setMaximumHeight(mh) - - def setPixmap(self, pixmap): - QLabel.setPixmap(self, pixmap) - self.do_layout() - - - def sizeHint(self): - return QSize(self.maximumWidth(), self.maximumHeight()) - - def relayout(self, parent_size): - self.max_height = int(parent_size.height()/3.) - self.max_width = parent_size.width() - self.do_layout() - - def show_data(self, data): - if data.has_key('cover'): - self.setPixmap(QPixmap.fromImage(data.pop('cover'))) - else: - self.setPixmap(self.default_pixmap) - -class BookInfo(QScrollArea): - - def __init__(self, parent=None): - QScrollArea.__init__(self, parent) - self.setWidgetResizable(True) - self.label = QLabel() - self.label.setWordWrap(True) - self.setWidget(self.label) - - def show_data(self, data): - self.label.setText('') - self.data = data.copy() - rows = render_rows(self.data) - rows = u'\n'.join([u'%s:%s'%(k,t) for - k, t in rows]) - self.label.setText(u'%s
'%rows) - +# render_rows(data) {{{ WEIGHTS = collections.defaultdict(lambda : 100) WEIGHTS[_('Path')] = 0 WEIGHTS[_('Formats')] = 1 @@ -107,10 +50,104 @@ def render_rows(data): rows.append((key, txt)) return rows +# }}} + +class CoverView(QLabel): # {{{ + + def __init__(self, parent=None): + QLabel.__init__(self, parent) + self.animation = QPropertyAnimation(self, 'size', self) + self.animation.setEasingCurve(QEasingCurve(QEasingCurve.OutExpo)) + self.animation.setDuration(1000) + self.animation.setStartValue(QSize(0, 0)) + + self.default_pixmap = QPixmap(I('book.svg')) + self.max_width, self.max_height = 120, 120 + self.setScaledContents(True) + self.setPixmap(self.default_pixmap) + + def do_layout(self): + pixmap = self.pixmap() + pwidth, pheight = pixmap.width(), pixmap.height() + width, height = fit_image(pwidth, pheight, + self.max_width, self.max_height)[1:] + self.setMaximumWidth(width) + try: + aspect_ratio = pwidth/float(pheight) + except ZeroDivisionError: + aspect_ratio = 1 + mh = min(self.max_height, int(width/aspect_ratio)) + self.setMaximumHeight(mh) + self.animation.setEndValue(self.maximumSize()) + + def setPixmap(self, pixmap): + QLabel.setPixmap(self, pixmap) + self.do_layout() + self.animation.start() + + + def sizeHint(self): + return QSize(self.maximumWidth(), self.maximumHeight()) + + def relayout(self, parent_size): + self.max_height = int(parent_size.height()/3.) + self.max_width = parent_size.width() + self.do_layout() + + def show_data(self, data): + if data.has_key('cover'): + self.setPixmap(QPixmap.fromImage(data.pop('cover'))) + else: + self.setPixmap(self.default_pixmap) + + # }}} + +class Label(QLabel): + + mr = pyqtSignal(object) + link_clicked = pyqtSignal(object) + + def __init__(self): + self.setText('') + self.setWordWrap(True) + self.linkActivated.connect(self.link_activated) + self._link_clicked = False + + def link_activated(self, link): + self._link_clicked = True + link = unicode(link) + 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, parent=None): + QScrollArea.__init__(self, parent) + self.setWidgetResizable(True) + self.label = Label() + self.setWidget(self.label) + self.link_clicked = self.label.link_clicked + self.mr = self.label.mr + + def show_data(self, data): + self.label.setText('') + self.data = data.copy() + rows = render_rows(self.data) + rows = u'\n'.join([u'%s:%s'%(k,t) for + k, t in rows]) + self.label.setText(u'%s
'%rows) + class BookDetails(QWidget): resized = pyqtSignal(object) show_book_info = pyqtSignal() + open_containing_folder = pyqtSignal(int) + view_specific_format = pyqtSignal(int, object) # Drag 'n drop {{{ DROPABBLE_EXTENSIONS = IMAGE_EXTENSIONS+BOOK_EXTENSIONS @@ -154,18 +191,31 @@ class BookDetails(QWidget): self.cover_view.relayout() self.resized.connect(self.cover_view.relayout, type=Qt.QueuedConnection) self._layout.addWidget(self.cover_view) + self.book_info = BookInfo(self) + self._layout.addWidget(self.book_info) + self.book_info.link_clicked.connect(self._link_clicked) + self.book_info.mr.connect(self.mouseReleaseEvent) + def _link_clicked(self, link): + typ, _, val = link.partition(':') + if typ == 'path': + self.open_containing_folder.emit(int(val)) + if typ == 'format': + id_, fmt = val.split(':') + self.view_specific_format.emit(int(id_), fmt) + + def mouseReleaseEvent(self, ev): + ev.accept() + self.show_book_info.emit() def resizeEvent(self, ev): self.resized.emit(self.size()) def show_data(self, data): self.cover_view.show_data(data) + self.book_info.show_data(data) def reset_info(self): self.show_data({}) - def mouseReleaseEvent(self, ev): - self.show_book_info.emit() - diff --git a/src/calibre/gui2/status.py b/src/calibre/gui2/status.py index 377410cf86..bf28cd45fd 100644 --- a/src/calibre/gui2/status.py +++ b/src/calibre/gui2/status.py @@ -49,7 +49,7 @@ class BookInfoDisplay(QWidget): event.acceptProposedAction() - class BookCoverDisplay(QLabel): + class BookCoverDisplay(QLabel): # {{{ def __init__(self, coverpath=I('book.svg')): QLabel.__init__(self) @@ -90,6 +90,7 @@ class BookInfoDisplay(QWidget): self.statusbar_height = statusbar_size.height() self.do_layout() + # }}} class BookDataDisplay(QLabel):