From baf697b919c648cb8445741018980196678e93b3 Mon Sep 17 00:00:00 2001 From: "beville@gmail.com" Date: Sun, 3 Feb 2013 18:13:18 +0000 Subject: [PATCH] New widget for managing the loading and displaying of archive pages and covers from Comic Vine git-svn-id: http://comictagger.googlecode.com/svn/trunk@396 6c5673fe-1810-88d6-992b-cd32ca31540c --- coverimagewidget.py | 168 ++++++++++++++++++++++++++++++++++++++++++++ coverimagewidget.ui | 108 ++++++++++++++++++++++++++++ 2 files changed, 276 insertions(+) create mode 100644 coverimagewidget.py create mode 100644 coverimagewidget.ui diff --git a/coverimagewidget.py b/coverimagewidget.py new file mode 100644 index 0000000..4f705a9 --- /dev/null +++ b/coverimagewidget.py @@ -0,0 +1,168 @@ +""" +A PyQt4 widget display cover images from either local archive, or from ComicVine +""" + +""" +Copyright 2012 Anthony Beville + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" + +import os + +from PyQt4.QtCore import * +from PyQt4.QtGui import * +from PyQt4 import uic + +from settings import ComicTaggerSettings +from genericmetadata import GenericMetadata, PageType +from options import MetaDataStyle +from comicvinetalker import ComicVineTalker, ComicVineTalkerException +from imagefetcher import ImageFetcher +from pageloader import PageLoader + +class CoverImageWidget(QWidget): + + ArchiveMode = 0 + AltCoverMode = 1 + + def __init__(self, parent, mode ): + super(CoverImageWidget, self).__init__(parent) + + uic.loadUi(os.path.join(ComicTaggerSettings.baseDir(), 'coverimagewidget.ui' ), self ) + + self.mode = mode + self.comic_archive = None + self.issue_id = None + self.url_list = [] + self.comicVine = ComicVineTalker() + self.page_loader = None + self.imageIndex = 0 + self.imageCount = 1 + + self.btnLeft.clicked.connect( self.decrementImage ) + self.btnRight.clicked.connect( self.incrementImage ) + + self.resetImage() + + def incrementImage( self ): + self.imageIndex += 1 + if self.imageIndex == self.imageCount: + self.imageIndex = 0 + self.updateImage() + + def decrementImage( self ): + self.imageIndex -= 1 + if self.imageIndex == -1: + self.imageIndex = self.imageCount -1 + self.updateImage() + + def setArchive( self, ca ): + if self.mode == CoverImageWidget.ArchiveMode: + self.comic_archive = ca + self.imageIndex = 0 + self.imageCount = ca.getNumberOfPages() + self.updateImage() + + def setIssueID( self, issue_id ): + if self.mode == CoverImageWidget.AltCoverMode: + self.issue_id = issue_id + self.url_list = [] + self.imageIndex = 0 + self.imageCount = 1 + + # get the URL list + try: + alt_img_url_list = self.comicVine.fetchAlternateCoverURLs( issue_id ) + primary_url, thumb_url = self.comicVine.fetchIssueCoverURLs( issue_id ) + except: + return + + self.url_list.append(primary_url) + self.url_list.extend(alt_img_url_list) + self.imageIndex = 0 + self.imageCount = len(self.url_list) + self.updateImage() + + def updateImage( self ): + if self.mode == CoverImageWidget.AltCoverMode: + if self.imageIndex == 0: + self.label.setText("Primary Cover") + else: + self.label.setText("Alt. Cover {0}".format(self.imageIndex)) + self.loadURL() + else: + self.label.setText("Page {0}".format(self.imageIndex+1)) + self.loadPage() + pass + + def loadURL( self ): + self.cover_fetcher = ImageFetcher( ) + self.cover_fetcher.fetchComplete.connect(self.coverRemoteFetchComplete) + self.cover_fetcher.fetch( self.url_list[self.imageIndex] ) + + # called when the image is done loading from internet + def coverRemoteFetchComplete( self, image_data, issue_id ): + img = QImage() + img.loadFromData( image_data ) + self.current_pixmap = QPixmap(img) + self.setDisplayPixmap( 0, 0) + QCoreApplication.processEvents() + + def loadPage( self ): + if self.comic_archive is not None: + if self.page_loader is not None: + self.page_loader.abandoned = True + self.page_loader = PageLoader( self.comic_archive, self.imageIndex ) + self.page_loader.loadComplete.connect( self.actualChangePageImage ) + self.page_loader.start() + + def actualChangePageImage( self, img ): + self.page_loader = None + self.current_pixmap = QPixmap(img) + self.setDisplayPixmap( 0, 0) + + def resetImage( self ): + self.current_pixmap = QPixmap(os.path.join(ComicTaggerSettings.baseDir(), 'graphics/nocover.png' )) + self.setDisplayPixmap( 0, 0) + + def resizeEvent( self, resize_event ): + if self.current_pixmap is not None: + delta_w = resize_event.size().width() - resize_event.oldSize().width() + delta_h = resize_event.size().height() - resize_event.oldSize().height() + self.setDisplayPixmap( delta_w , delta_h ) + + def setDisplayPixmap( self, delta_w , delta_h ): + # the deltas let us know what the new width and height of the label will be + new_h = self.frame.height() + delta_h + new_w = self.frame.width() + delta_w + frame_w = new_w + frame_h = new_h + + new_h -= 4 + new_w -= 4 + + if new_h < 0: + new_h = 0; + if new_w < 0: + new_w = 0; + + # scale the pixmap to fit in the frame + scaled_pixmap = self.current_pixmap.scaled(new_w, new_h, Qt.KeepAspectRatio) + self.lblImage.setPixmap( scaled_pixmap ) + + # move and resize the label to be centered in the fame + img_w = scaled_pixmap.width() + img_h = scaled_pixmap.height() + self.lblImage.resize( img_w, img_h ) + self.lblImage.move( (frame_w - img_w)/2, (frame_h - img_h)/2 ) diff --git a/coverimagewidget.ui b/coverimagewidget.ui new file mode 100644 index 0000000..2eabe3f --- /dev/null +++ b/coverimagewidget.ui @@ -0,0 +1,108 @@ + + + coverImageWidget + + + + 0 + 0 + 292 + 353 + + + + Form + + + + 0 + + + + + 0 + + + + + + 0 + 0 + + + + + 30 + 16777215 + + + + << + + + + + + + + 0 + 0 + + + + + + + Qt::AlignCenter + + + + + + + + 30 + 16777215 + + + + >> + + + + + + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 60 + 50 + 91 + 61 + + + + TextLabel + + + + + + + + +