示例#1
0
class MatchSelectionWindow(QtGui.QDialog):

    volume_id = 0

    def __init__(self, parent, matches, comic_archive):
        super(MatchSelectionWindow, self).__init__(parent)

        uic.loadUi(ComicTaggerSettings.getUIFile('matchselectionwindow.ui'),
                   self)

        self.altCoverWidget = CoverImageWidget(self.altCoverContainer,
                                               CoverImageWidget.AltCoverMode)
        gridlayout = QtGui.QGridLayout(self.altCoverContainer)
        gridlayout.addWidget(self.altCoverWidget)
        gridlayout.setContentsMargins(0, 0, 0, 0)

        self.archiveCoverWidget = CoverImageWidget(
            self.archiveCoverContainer, CoverImageWidget.ArchiveMode)
        gridlayout = QtGui.QGridLayout(self.archiveCoverContainer)
        gridlayout.addWidget(self.archiveCoverWidget)
        gridlayout.setContentsMargins(0, 0, 0, 0)

        utils.reduceWidgetFontSize(self.twList)
        utils.reduceWidgetFontSize(self.teDescription, 1)

        self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowSystemMenuHint
                            | QtCore.Qt.WindowMaximizeButtonHint)

        self.matches = matches
        self.comic_archive = comic_archive

        self.twList.currentItemChanged.connect(self.currentItemChanged)
        self.twList.cellDoubleClicked.connect(self.cellDoubleClicked)

        self.updateData()

    def updateData(self):

        self.setCoverImage()
        self.populateTable()
        self.twList.resizeColumnsToContents()
        self.twList.selectRow(0)

        path = self.comic_archive.path
        self.setWindowTitle(u"Select correct match: {0}".format(
            os.path.split(path)[1]))

    def populateTable(self):

        while self.twList.rowCount() > 0:
            self.twList.removeRow(0)

        self.twList.setSortingEnabled(False)

        row = 0
        for match in self.matches:
            self.twList.insertRow(row)

            item_text = match['series']
            item = QtGui.QTableWidgetItem(item_text)
            item.setData(QtCore.Qt.ToolTipRole, item_text)
            item.setData(QtCore.Qt.UserRole, (match, ))
            item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
            self.twList.setItem(row, 0, item)

            if match['publisher'] is not None:
                item_text = u"{0}".format(match['publisher'])
            else:
                item_text = u"Unknown"
            item = QtGui.QTableWidgetItem(item_text)
            item.setData(QtCore.Qt.ToolTipRole, item_text)
            item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
            self.twList.setItem(row, 1, item)

            month_str = u""
            year_str = u"????"
            if match['month'] is not None:
                month_str = u"-{0:02d}".format(int(match['month']))
            if match['year'] is not None:
                year_str = u"{0}".format(match['year'])

            item_text = year_str + month_str
            item = QtGui.QTableWidgetItem(item_text)
            item.setData(QtCore.Qt.ToolTipRole, item_text)
            item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
            self.twList.setItem(row, 2, item)

            item_text = match['issue_title']
            if item_text is None:
                item_text = ""
            item = QtGui.QTableWidgetItem(item_text)
            item.setData(QtCore.Qt.ToolTipRole, item_text)
            item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
            self.twList.setItem(row, 3, item)

            row += 1

        self.twList.resizeColumnsToContents()
        self.twList.setSortingEnabled(True)
        self.twList.sortItems(2, QtCore.Qt.AscendingOrder)
        self.twList.selectRow(0)
        self.twList.resizeColumnsToContents()
        self.twList.horizontalHeader().setStretchLastSection(True)

    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.altCoverWidget.setIssueID(self.currentMatch()['issue_id'])
        if self.currentMatch()['description'] is None:
            self.teDescription.setText("")
        else:
            self.teDescription.setText(self.currentMatch()['description'])

    def setCoverImage(self):
        self.archiveCoverWidget.setArchive(self.comic_archive)

    def currentMatch(self):
        row = self.twList.currentRow()
        match = self.twList.item(row,
                                 0).data(QtCore.Qt.UserRole).toPyObject()[0]
        return match
class IssueSelectionWindow(QtGui.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 = QtGui.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, b = self.twList.item(
                    r, 0).data(QtCore.Qt.UserRole).toInt()
                if (issue_id == self.initial_id):
                    self.twList.selectRow(r)
                    break

    def performQuery(self):

        QtGui.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:
            QtGui.QApplication.restoreOverrideCursor()
            if e.code == ComicVineTalkerException.RateLimit:
                QtGui.QMessageBox.critical(
                    self,
                    self.tr("Comic Vine Error"),
                    ComicVineTalker.getRateLimitMessage())
            else:
                QtGui.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 = QtGui.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 = QtGui.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)

        QtGui.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, b = self.twList.item(
            curr.row(), 0).data(QtCore.Qt.UserRole).toInt()

        # 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
class AutoTagMatchWindow(QtGui.QDialog):
	
	volume_id = 0
	
	def __init__(self, parent, match_set_list, style, fetch_func):
		super(AutoTagMatchWindow, self).__init__(parent)
		
		uic.loadUi(ComicTaggerSettings.getUIFile('matchselectionwindow.ui' ), self)

		self.altCoverWidget = CoverImageWidget( self.altCoverContainer, CoverImageWidget.AltCoverMode )
		gridlayout = QtGui.QGridLayout( self.altCoverContainer )
		gridlayout.addWidget( self.altCoverWidget )
		gridlayout.setContentsMargins(0,0,0,0)

		self.archiveCoverWidget = CoverImageWidget( self.archiveCoverContainer, CoverImageWidget.ArchiveMode )
		gridlayout = QtGui.QGridLayout( self.archiveCoverContainer )
		gridlayout.addWidget( self.archiveCoverWidget )
		gridlayout.setContentsMargins(0,0,0,0)

		utils.reduceWidgetFontSize( self.twList )		
		utils.reduceWidgetFontSize( self.teDescription, 1 )

		self.setWindowFlags(self.windowFlags() |
									  QtCore.Qt.WindowSystemMenuHint |
									  QtCore.Qt.WindowMaximizeButtonHint)		
				
		self.skipButton = QtGui.QPushButton(self.tr("Skip to Next"))
		self.buttonBox.addButton(self.skipButton, QtGui.QDialogButtonBox.ActionRole)		
		self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText("Accept and Write Tags")		

		self.match_set_list = match_set_list
		self.style = style
		self.fetch_func = fetch_func

		self.current_match_set_idx = 0
		
		self.twList.currentItemChanged.connect(self.currentItemChanged)	
		self.twList.cellDoubleClicked.connect(self.cellDoubleClicked)
		self.skipButton.clicked.connect(self.skipToNext)
		
		self.updateData()		

	def updateData( self):

		self.current_match_set = self.match_set_list[ self.current_match_set_idx ]

		if self.current_match_set_idx + 1 == len( self.match_set_list ):
			self.buttonBox.button(QtGui.QDialogButtonBox.Cancel).setDisabled(True)	
			#self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText("Accept")		
			self.skipButton.setText(self.tr("Skip"))
			
		self.setCoverImage()
		self.populateTable()
		self.twList.resizeColumnsToContents()	
		self.twList.selectRow( 0 )
		
		path = self.current_match_set.ca.path
		self.setWindowTitle( u"Select correct match or skip ({0} of {1}): {2}".format(
						self.current_match_set_idx+1,
						len( self.match_set_list ),
						os.path.split(path)[1] ))
		
	def populateTable( self  ):

		while self.twList.rowCount() > 0:
			self.twList.removeRow(0)
		
		self.twList.setSortingEnabled(False)

		row = 0
		for match in self.current_match_set.matches: 
			self.twList.insertRow(row)
			
			item_text = match['series']  
			item = QtGui.QTableWidgetItem(item_text)			
			item.setData( QtCore.Qt.ToolTipRole, item_text )
			item.setData( QtCore.Qt.UserRole, (match,))
			item.setFlags(QtCore.Qt.ItemIsSelectable| QtCore.Qt.ItemIsEnabled)
			self.twList.setItem(row, 0, item)

			if match['publisher'] is not None:
				item_text = u"{0}".format(match['publisher'])
			else:
				item_text = u"Unknown"
			item = QtGui.QTableWidgetItem(item_text)
			item.setData( QtCore.Qt.ToolTipRole, item_text )
			item.setFlags(QtCore.Qt.ItemIsSelectable| QtCore.Qt.ItemIsEnabled)
			self.twList.setItem(row, 1, item)
			
			month_str = u""
			year_str = u"????"
			if match['month'] is not None:
				month_str = u"-{0:02d}".format(int(match['month']))
			if match['year'] is not None:
				year_str = u"{0}".format(match['year'])

			item_text = year_str + month_str			
			item = QtGui.QTableWidgetItem(item_text)			
			item.setData( QtCore.Qt.ToolTipRole, item_text )
			item.setFlags(QtCore.Qt.ItemIsSelectable| QtCore.Qt.ItemIsEnabled)
			self.twList.setItem(row, 2, item)

			item_text = match['issue_title']
			if item_text is None:
				item_text = ""
			item = QtGui.QTableWidgetItem(item_text)			
			item.setData( QtCore.Qt.ToolTipRole, item_text )
			item.setFlags(QtCore.Qt.ItemIsSelectable| QtCore.Qt.ItemIsEnabled)
			self.twList.setItem(row, 3, item)
			
			row += 1

		self.twList.resizeColumnsToContents()
		self.twList.setSortingEnabled(True)
		self.twList.sortItems( 2 , QtCore.Qt.AscendingOrder )
		self.twList.selectRow(0)
		self.twList.resizeColumnsToContents()
		self.twList.horizontalHeader().setStretchLastSection(True) 
			

	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.altCoverWidget.setIssueID( self.currentMatch()['issue_id'] )
		if self.currentMatch()['description'] is None:
			self.teDescription.setText ( "" )
		else:	
			self.teDescription.setText ( self.currentMatch()['description'] )
		
	def setCoverImage( self ):
		ca = self.current_match_set.ca
		self.archiveCoverWidget.setArchive(ca)

	def currentMatch( self ):
		row = self.twList.currentRow()
		match = self.twList.item(row, 0).data( QtCore.Qt.UserRole ).toPyObject()[0]
		return match
	
	def accept(self):

		self.saveMatch()
		self.current_match_set_idx += 1
		
		if self.current_match_set_idx == len( self.match_set_list ):
			# no more items
			QtGui.QDialog.accept(self)				
		else:
			self.updateData()

	def skipToNext( self ):
		self.current_match_set_idx += 1
		
		if self.current_match_set_idx == len( self.match_set_list ):
			# no more items
			QtGui.QDialog.reject(self)				
		else:
			self.updateData()
		
	def reject(self):
		reply = QtGui.QMessageBox.question(self, 
			 self.tr("Cancel Matching"), 
			 self.tr("Are you sure you wish to cancel the matching process?"),
			 QtGui.QMessageBox.Yes, QtGui.QMessageBox.No )
			 
		if reply == QtGui.QMessageBox.No:
			return

		QtGui.QDialog.reject(self)				
			
	def saveMatch( self ):
		
		match = self.currentMatch()
		ca = self.current_match_set.ca

		md = ca.readMetadata( self.style )
		if md.isEmpty:
			md = ca.metadataFromFilename()		
		
		# now get the particular issue data
		cv_md = self.fetch_func( match )
		if cv_md is None:
			QtGui.QMessageBox.critical(self, self.tr("Network Issue"), self.tr("Could not connect to ComicVine to get issue details!"))
			return

		QtGui.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))			
		md.overlay( cv_md )
		success = ca.writeMetadata( md, self.style )
		ca.loadCache( [ MetaDataStyle.CBI, MetaDataStyle.CIX ] )
	
		QtGui.QApplication.restoreOverrideCursor()
		
		if not success:		
			QtGui.QMessageBox.warning(self, self.tr("Write Error"), self.tr("Saving the tags to the archive seemed to fail!"))
示例#4
0
class MatchSelectionWindow(QtGui.QDialog):
	
	volume_id = 0
	
	def __init__(self, parent, matches, comic_archive):
		super(MatchSelectionWindow, self).__init__(parent)
		
		uic.loadUi(ComicTaggerSettings.getUIFile('matchselectionwindow.ui' ), self)

		self.altCoverWidget = CoverImageWidget( self.altCoverContainer, CoverImageWidget.AltCoverMode )
		gridlayout = QtGui.QGridLayout( self.altCoverContainer )
		gridlayout.addWidget( self.altCoverWidget )
		gridlayout.setContentsMargins(0,0,0,0)

		self.archiveCoverWidget = CoverImageWidget( self.archiveCoverContainer, CoverImageWidget.ArchiveMode )
		gridlayout = QtGui.QGridLayout( self.archiveCoverContainer )
		gridlayout.addWidget( self.archiveCoverWidget )
		gridlayout.setContentsMargins(0,0,0,0)

		utils.reduceWidgetFontSize( self.twList )		
		utils.reduceWidgetFontSize( self.teDescription, 1 )

		self.setWindowFlags(self.windowFlags() |
									  QtCore.Qt.WindowSystemMenuHint |
									  QtCore.Qt.WindowMaximizeButtonHint)		

		self.matches = matches
		self.comic_archive = comic_archive
		
		self.twList.currentItemChanged.connect(self.currentItemChanged)	
		self.twList.cellDoubleClicked.connect(self.cellDoubleClicked)

		self.updateData()		

	def updateData( self):
			
		self.setCoverImage()
		self.populateTable()
		self.twList.resizeColumnsToContents()	
		self.twList.selectRow( 0 )
		
		path = self.comic_archive.path
		self.setWindowTitle( u"Select correct match: {0}".format(
						os.path.split(path)[1] ))
		
	def populateTable( self  ):

		while self.twList.rowCount() > 0:
			self.twList.removeRow(0)
		
		self.twList.setSortingEnabled(False)

		row = 0
		for match in self.matches: 
			self.twList.insertRow(row)
			
			item_text = match['series']  
			item = QtGui.QTableWidgetItem(item_text)			
			item.setData( QtCore.Qt.ToolTipRole, item_text )
			item.setData( QtCore.Qt.UserRole, (match,))
			item.setFlags(QtCore.Qt.ItemIsSelectable| QtCore.Qt.ItemIsEnabled)
			self.twList.setItem(row, 0, item)

			if match['publisher'] is not None:
				item_text = u"{0}".format(match['publisher'])
			else:
				item_text = u"Unknown"
			item = QtGui.QTableWidgetItem(item_text)
			item.setData( QtCore.Qt.ToolTipRole, item_text )
			item.setFlags(QtCore.Qt.ItemIsSelectable| QtCore.Qt.ItemIsEnabled)
			self.twList.setItem(row, 1, item)
			
			month_str = u""
			year_str = u"????"
			if match['month'] is not None:
				month_str = u"-{0:02d}".format(int(match['month']))
			if match['year'] is not None:
				year_str = u"{0}".format(match['year'])

			item_text = year_str + month_str			
			item = QtGui.QTableWidgetItem(item_text)			
			item.setData( QtCore.Qt.ToolTipRole, item_text )
			item.setFlags(QtCore.Qt.ItemIsSelectable| QtCore.Qt.ItemIsEnabled)
			self.twList.setItem(row, 2, item)

			item_text = match['issue_title']  
			if item_text is None:
				item_text = ""
			item = QtGui.QTableWidgetItem(item_text)			
			item.setData( QtCore.Qt.ToolTipRole, item_text )
			item.setFlags(QtCore.Qt.ItemIsSelectable| QtCore.Qt.ItemIsEnabled)
			self.twList.setItem(row, 3, item)
			
			row += 1

		self.twList.resizeColumnsToContents()
		self.twList.setSortingEnabled(True)
		self.twList.sortItems( 2 , QtCore.Qt.AscendingOrder )
		self.twList.selectRow(0)
		self.twList.resizeColumnsToContents()
		self.twList.horizontalHeader().setStretchLastSection(True) 
			

	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.altCoverWidget.setIssueID( self.currentMatch()['issue_id'] )
		if self.currentMatch()['description'] is None:
			self.teDescription.setText ( "" )
		else:	
			self.teDescription.setText ( self.currentMatch()['description'] )
			
	def setCoverImage( self ):
		self.archiveCoverWidget.setArchive( self.comic_archive)

	def currentMatch( self ):
		row = self.twList.currentRow()
		match = self.twList.item(row, 0).data( QtCore.Qt.UserRole ).toPyObject()[0]
		return match
示例#5
0
class IssueSelectionWindow(QtGui.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 = QtGui.QGridLayout(self.coverImageContainer)
        gridlayout.addWidget(self.coverWidget)
        gridlayout.setContentsMargins(0, 0, 0, 0)

        utils.reduceWidgetFontSize(self.twList)
        utils.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, b = self.twList.item(r, 0).data(
                    QtCore.Qt.UserRole).toInt()
                if (issue_id == self.initial_id):
                    self.twList.selectRow(r)
                    break

    def performQuery(self):

        QtGui.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:
            QtGui.QApplication.restoreOverrideCursor()
            if e.code == ComicVineTalkerException.RateLimit:
                QtGui.QMessageBox.critical(
                    self, self.tr("Comic Vine Error"),
                    ComicVineTalker.getRateLimitMessage())
            else:
                QtGui.QMessageBox.critical(
                    self, self.tr("Network Issue"),
                    self.tr("Could not connect to ComicVine 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 = QtGui.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 = QtGui.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)

        QtGui.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, b = self.twList.item(curr.row(), 0).data(
            QtCore.Qt.UserRole).toInt()

        # 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
示例#6
0
class AutoTagMatchWindow(QtGui.QDialog):
	
	volume_id = 0
	
	def __init__(self, parent, match_set_list, style, fetch_func):
		super(AutoTagMatchWindow, self).__init__(parent)
		
		uic.loadUi(ComicTaggerSettings.getUIFile('matchselectionwindow.ui' ), self)

		self.altCoverWidget = CoverImageWidget( self.altCoverContainer, CoverImageWidget.AltCoverMode )
		gridlayout = QtGui.QGridLayout( self.altCoverContainer )
		gridlayout.addWidget( self.altCoverWidget )
		gridlayout.setContentsMargins(0,0,0,0)

		self.archiveCoverWidget = CoverImageWidget( self.archiveCoverContainer, CoverImageWidget.ArchiveMode )
		gridlayout = QtGui.QGridLayout( self.archiveCoverContainer )
		gridlayout.addWidget( self.archiveCoverWidget )
		gridlayout.setContentsMargins(0,0,0,0)

		utils.reduceWidgetFontSize( self.twList )		
		utils.reduceWidgetFontSize( self.teDescription, 1 )

		self.setWindowFlags(self.windowFlags() |
									  QtCore.Qt.WindowSystemMenuHint |
									  QtCore.Qt.WindowMaximizeButtonHint)		
				
		self.skipButton = QtGui.QPushButton(self.tr("Skip to Next"))
		self.buttonBox.addButton(self.skipButton, QtGui.QDialogButtonBox.ActionRole)		
		self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText("Accept and Write Tags")		

		self.match_set_list = match_set_list
		self.style = style
		self.fetch_func = fetch_func

		self.current_match_set_idx = 0
		
		self.twList.currentItemChanged.connect(self.currentItemChanged)	
		self.twList.cellDoubleClicked.connect(self.cellDoubleClicked)
		self.skipButton.clicked.connect(self.skipToNext)
		
		self.updateData()		

	def updateData( self):

		self.current_match_set = self.match_set_list[ self.current_match_set_idx ]

		if self.current_match_set_idx + 1 == len( self.match_set_list ):
			self.buttonBox.button(QtGui.QDialogButtonBox.Cancel).setDisabled(True)	
			#self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText("Accept")		
			self.skipButton.setText(self.tr("Skip"))
			
		self.setCoverImage()
		self.populateTable()
		self.twList.resizeColumnsToContents()	
		self.twList.selectRow( 0 )
		
		path = self.current_match_set.ca.path
		self.setWindowTitle( u"Select correct match or skip ({0} of {1}): {2}".format(
						self.current_match_set_idx+1,
						len( self.match_set_list ),
						os.path.split(path)[1] ))
		
	def populateTable( self  ):

		while self.twList.rowCount() > 0:
			self.twList.removeRow(0)
		
		self.twList.setSortingEnabled(False)

		row = 0
		for match in self.current_match_set.matches: 
			self.twList.insertRow(row)
			
			item_text = match['series']  
			item = QtGui.QTableWidgetItem(item_text)			
			item.setData( QtCore.Qt.ToolTipRole, item_text )
			item.setData( QtCore.Qt.UserRole, (match,))
			item.setFlags(QtCore.Qt.ItemIsSelectable| QtCore.Qt.ItemIsEnabled)
			self.twList.setItem(row, 0, item)

			if match['publisher'] is not None:
				item_text = u"{0}".format(match['publisher'])
			else:
				item_text = u"Unknown"
			item = QtGui.QTableWidgetItem(item_text)
			item.setData( QtCore.Qt.ToolTipRole, item_text )
			item.setFlags(QtCore.Qt.ItemIsSelectable| QtCore.Qt.ItemIsEnabled)
			self.twList.setItem(row, 1, item)
			
			month_str = u""
			year_str = u"????"
			if match['month'] is not None:
				month_str = u"-{0:02d}".format(int(match['month']))
			if match['year'] is not None:
				year_str = u"{0}".format(match['year'])

			item_text = year_str + month_str			
			item = QtGui.QTableWidgetItem(item_text)			
			item.setData( QtCore.Qt.ToolTipRole, item_text )
			item.setFlags(QtCore.Qt.ItemIsSelectable| QtCore.Qt.ItemIsEnabled)
			self.twList.setItem(row, 2, item)

			item_text = match['issue_title']
			if item_text is None:
				item_text = ""
			item = QtGui.QTableWidgetItem(item_text)			
			item.setData( QtCore.Qt.ToolTipRole, item_text )
			item.setFlags(QtCore.Qt.ItemIsSelectable| QtCore.Qt.ItemIsEnabled)
			self.twList.setItem(row, 3, item)
			
			row += 1

		self.twList.resizeColumnsToContents()
		self.twList.setSortingEnabled(True)
		self.twList.sortItems( 2 , QtCore.Qt.AscendingOrder )
		self.twList.selectRow(0)
		self.twList.resizeColumnsToContents()
		self.twList.horizontalHeader().setStretchLastSection(True) 
			

	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.altCoverWidget.setIssueID( self.currentMatch()['issue_id'] )
		if self.currentMatch()['description'] is None:
			self.teDescription.setText ( "" )
		else:	
			self.teDescription.setText ( self.currentMatch()['description'] )
		
	def setCoverImage( self ):
		ca = self.current_match_set.ca
		self.archiveCoverWidget.setArchive(ca)

	def currentMatch( self ):
		row = self.twList.currentRow()
		match = self.twList.item(row, 0).data( QtCore.Qt.UserRole ).toPyObject()[0]
		return match
	
	def accept(self):

		self.saveMatch()
		self.current_match_set_idx += 1
		
		if self.current_match_set_idx == len( self.match_set_list ):
			# no more items
			QtGui.QDialog.accept(self)				
		else:
			self.updateData()

	def skipToNext( self ):
		self.current_match_set_idx += 1
		
		if self.current_match_set_idx == len( self.match_set_list ):
			# no more items
			QtGui.QDialog.reject(self)				
		else:
			self.updateData()
		
	def reject(self):
		reply = QtGui.QMessageBox.question(self, 
			 self.tr("Cancel Matching"), 
			 self.tr("Are you sure you wish to cancel the matching process?"),
			 QtGui.QMessageBox.Yes, QtGui.QMessageBox.No )
			 
		if reply == QtGui.QMessageBox.No:
			return

		QtGui.QDialog.reject(self)				
			
	def saveMatch( self ):
		
		match = self.currentMatch()
		ca = self.current_match_set.ca

		md = ca.readMetadata( self.style )
		if md.isEmpty:
			md = ca.metadataFromFilename()		
		
		# now get the particular issue data
		cv_md = self.fetch_func( match )
		if cv_md is None:
			QtGui.QMessageBox.critical(self, self.tr("Network Issue"), self.tr("Could not connect to ComicVine to get issue details!"))
			return

		QtGui.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))			
		md.overlay( cv_md )
		success = ca.writeMetadata( md, self.style )
		ca.loadCache( [ MetaDataStyle.CBI, MetaDataStyle.CIX ] )
	
		QtGui.QApplication.restoreOverrideCursor()
		
		if not success:		
			QtGui.QMessageBox.warning(self, self.tr("Write Error"), self.tr("Saving the tags to the archive seemed to fail!"))