"""A PyQT4 dialog to select specific issue from list""" # Copyright 2012-2014 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 sys # import os # import re from PyQt5 import QtCore, QtGui, QtWidgets, uic from comictaggerlib.ui.qtutils import reduceWidgetFontSize from .comicvinetalker import ComicVineTalker, ComicVineTalkerException from .coverimagewidget import CoverImageWidget from .issuestring import IssueString from .settings import ComicTaggerSettings # from PyQt5.QtCore import QUrl, pyqtSignal, QByteArray # from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest # from imagefetcher import ImageFetcher # import utils class IssueNumberTableWidgetItem(QtWidgets.QTableWidgetItem): def __lt__(self, other): selfStr = self.data(QtCore.Qt.DisplayRole) otherStr = other.data(QtCore.Qt.DisplayRole) return IssueString(selfStr).asFloat() < IssueString(otherStr).asFloat() class IssueSelectionWindow(QtWidgets.QDialog): volume_id = 0 def __init__(self, parent, settings, series_id, issue_number): super(IssueSelectionWindow, self).__init__(parent) uic.loadUi(ComicTaggerSettings.getUIFile("issueselectionwindow.ui"), self) self.coverWidget = CoverImageWidget(self.coverImageContainer, CoverImageWidget.AltCoverMode) gridlayout = QtWidgets.QGridLayout(self.coverImageContainer) gridlayout.addWidget(self.coverWidget) gridlayout.setContentsMargins(0, 0, 0, 0) reduceWidgetFontSize(self.twList) reduceWidgetFontSize(self.teDescription, 1) self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowMaximizeButtonHint) self.series_id = series_id self.settings = settings self.url_fetch_thread = None if issue_number is None or issue_number == "": self.issue_number = 1 else: self.issue_number = issue_number self.initial_id = None self.performQuery() self.twList.resizeColumnsToContents() self.twList.currentItemChanged.connect(self.currentItemChanged) self.twList.cellDoubleClicked.connect(self.cellDoubleClicked) # now that the list has been sorted, find the initial record, and # select it if self.initial_id is None: self.twList.selectRow(0) else: for r in range(0, self.twList.rowCount()): issue_id = self.twList.item(r, 0).data(QtCore.Qt.UserRole) if issue_id == self.initial_id: self.twList.selectRow(r) break def performQuery(self): QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor)) try: comicVine = ComicVineTalker() volume_data = comicVine.fetchVolumeData(self.series_id) self.issue_list = comicVine.fetchIssuesByVolume(self.series_id) except ComicVineTalkerException as e: QtWidgets.QApplication.restoreOverrideCursor() if e.code == ComicVineTalkerException.RateLimit: QtWidgets.QMessageBox.critical(self, self.tr("Comic Vine Error"), ComicVineTalker.getRateLimitMessage()) else: QtWidgets.QMessageBox.critical(self, self.tr("Network Issue"), self.tr("Could not connect to Comic Vine to list issues!")) return while self.twList.rowCount() > 0: self.twList.removeRow(0) self.twList.setSortingEnabled(False) row = 0 for record in self.issue_list: self.twList.insertRow(row) item_text = record["issue_number"] item = IssueNumberTableWidgetItem(item_text) item.setData(QtCore.Qt.ToolTipRole, item_text) item.setData(QtCore.Qt.UserRole, record["id"]) item.setData(QtCore.Qt.DisplayRole, item_text) item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) self.twList.setItem(row, 0, item) item_text = record["cover_date"] if item_text is None: item_text = "" # remove the day of "YYYY-MM-DD" parts = item_text.split("-") if len(parts) > 1: item_text = parts[0] + "-" + parts[1] item = QtWidgets.QTableWidgetItem(item_text) item.setData(QtCore.Qt.ToolTipRole, item_text) item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) self.twList.setItem(row, 1, item) item_text = record["name"] if item_text is None: item_text = "" item = QtWidgets.QTableWidgetItem(item_text) item.setData(QtCore.Qt.ToolTipRole, item_text) item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) self.twList.setItem(row, 2, item) if IssueString(record["issue_number"]).asString().lower() == IssueString(self.issue_number).asString().lower(): self.initial_id = record["id"] row += 1 self.twList.setSortingEnabled(True) self.twList.sortItems(0, QtCore.Qt.AscendingOrder) QtWidgets.QApplication.restoreOverrideCursor() def cellDoubleClicked(self, r, c): self.accept() def currentItemChanged(self, curr, prev): if curr is None: return if prev is not None and prev.row() == curr.row(): return self.issue_id = self.twList.item(curr.row(), 0).data(QtCore.Qt.UserRole) # list selection was changed, update the the issue cover for record in self.issue_list: if record["id"] == self.issue_id: self.issue_number = record["issue_number"] self.coverWidget.setIssueID(int(self.issue_id)) if record["description"] is None: self.teDescription.setText("") else: self.teDescription.setText(record["description"]) break