mirror of https://github.com/evilhero/mylar
274 lines
8.5 KiB
Python
274 lines
8.5 KiB
Python
"""
|
|
A PyQt4 widget for editing the page list info
|
|
"""
|
|
|
|
"""
|
|
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 os
|
|
|
|
from PyQt4.QtCore import *
|
|
from PyQt4.QtGui import *
|
|
from PyQt4 import uic
|
|
|
|
from settings import ComicTaggerSettings
|
|
from genericmetadata import GenericMetadata, PageType
|
|
from comicarchive import MetaDataStyle
|
|
from pageloader import PageLoader
|
|
from coverimagewidget import CoverImageWidget
|
|
|
|
|
|
def itemMoveEvents( widget ):
|
|
|
|
class Filter(QObject):
|
|
|
|
mysignal = pyqtSignal( str )
|
|
|
|
def eventFilter(self, obj, event):
|
|
|
|
if obj == widget:
|
|
#print event.type()
|
|
if event.type() == QEvent.ChildRemoved:
|
|
#print "ChildRemoved"
|
|
self.mysignal.emit("finish")
|
|
if event.type() == QEvent.ChildAdded:
|
|
#print "ChildAdded"
|
|
self.mysignal.emit("start")
|
|
return True
|
|
|
|
return False
|
|
|
|
filter = Filter( widget )
|
|
widget.installEventFilter( filter )
|
|
return filter.mysignal
|
|
|
|
class PageListEditor(QWidget):
|
|
|
|
firstFrontCoverChanged = pyqtSignal( int )
|
|
listOrderChanged = pyqtSignal( )
|
|
modified = pyqtSignal( )
|
|
|
|
pageTypeNames = {
|
|
PageType.FrontCover: "Front Cover",
|
|
PageType.InnerCover: "Inner Cover",
|
|
PageType.Advertisement: "Advertisement",
|
|
PageType.Roundup: "Roundup",
|
|
PageType.Story: "Story",
|
|
PageType.Editorial: "Editorial",
|
|
PageType.Letters: "Letters",
|
|
PageType.Preview: "Preview",
|
|
PageType.BackCover: "Back Cover",
|
|
PageType.Other: "Other",
|
|
PageType.Deleted: "Deleted",
|
|
}
|
|
|
|
def __init__(self, parent ):
|
|
super(PageListEditor, self).__init__(parent)
|
|
|
|
uic.loadUi(ComicTaggerSettings.getUIFile('pagelisteditor.ui' ), self)
|
|
|
|
self.pageWidget = CoverImageWidget( self.pageContainer, CoverImageWidget.ArchiveMode )
|
|
gridlayout = QGridLayout( self.pageContainer )
|
|
gridlayout.addWidget( self.pageWidget )
|
|
gridlayout.setContentsMargins(0,0,0,0)
|
|
self.pageWidget.showControls = False
|
|
|
|
self.resetPage()
|
|
|
|
# Add the entries to the manga combobox
|
|
self.comboBox.addItem( "", "" )
|
|
self.comboBox.addItem( self.pageTypeNames[ PageType.FrontCover], PageType.FrontCover )
|
|
self.comboBox.addItem( self.pageTypeNames[ PageType.InnerCover], PageType.InnerCover )
|
|
self.comboBox.addItem( self.pageTypeNames[ PageType.Advertisement], PageType.Advertisement )
|
|
self.comboBox.addItem( self.pageTypeNames[ PageType.Roundup], PageType.Roundup )
|
|
self.comboBox.addItem( self.pageTypeNames[ PageType.Story], PageType.Story )
|
|
self.comboBox.addItem( self.pageTypeNames[ PageType.Editorial], PageType.Editorial )
|
|
self.comboBox.addItem( self.pageTypeNames[ PageType.Letters], PageType.Letters )
|
|
self.comboBox.addItem( self.pageTypeNames[ PageType.Preview], PageType.Preview )
|
|
self.comboBox.addItem( self.pageTypeNames[ PageType.BackCover], PageType.BackCover )
|
|
self.comboBox.addItem( self.pageTypeNames[ PageType.Other], PageType.Other )
|
|
self.comboBox.addItem( self.pageTypeNames[ PageType.Deleted], PageType.Deleted )
|
|
|
|
self.listWidget.itemSelectionChanged.connect( self.changePage )
|
|
itemMoveEvents(self.listWidget).connect(self.itemMoveEvent)
|
|
self.comboBox.activated.connect( self.changePageType )
|
|
self.btnUp.clicked.connect( self.moveCurrentUp )
|
|
self.btnDown.clicked.connect( self.moveCurrentDown )
|
|
self.pre_move_row = -1
|
|
self.first_front_page = None
|
|
|
|
def resetPage( self ):
|
|
self.pageWidget.clear()
|
|
self.comboBox.setDisabled(True)
|
|
self.comic_archive = None
|
|
self.pages_list = None
|
|
|
|
def moveCurrentUp( self ):
|
|
row = self.listWidget.currentRow()
|
|
if row > 0:
|
|
item = self.listWidget.takeItem ( row )
|
|
self.listWidget.insertItem( row-1, item )
|
|
self.listWidget.setCurrentRow( row-1 )
|
|
self.listOrderChanged.emit()
|
|
self.emitFrontCoverChange()
|
|
self.modified.emit()
|
|
|
|
def moveCurrentDown( self ):
|
|
row = self.listWidget.currentRow()
|
|
if row < self.listWidget.count()-1:
|
|
item = self.listWidget.takeItem ( row )
|
|
self.listWidget.insertItem( row+1, item )
|
|
self.listWidget.setCurrentRow( row+1 )
|
|
self.listOrderChanged.emit()
|
|
self.emitFrontCoverChange()
|
|
self.modified.emit()
|
|
|
|
def itemMoveEvent(self, s):
|
|
#print "move event: ", s, self.listWidget.currentRow()
|
|
if s == "start":
|
|
self.pre_move_row = self.listWidget.currentRow()
|
|
if s == "finish":
|
|
if self.pre_move_row != self.listWidget.currentRow():
|
|
self.listOrderChanged.emit()
|
|
self.emitFrontCoverChange()
|
|
self.modified.emit()
|
|
|
|
def changePageType( self , i):
|
|
new_type = self.comboBox.itemData(i).toString()
|
|
if self.getCurrentPageType() != new_type:
|
|
self.setCurrentPageType( new_type )
|
|
self.emitFrontCoverChange()
|
|
self.modified.emit()
|
|
|
|
def changePage( self ):
|
|
row = self.listWidget.currentRow()
|
|
pagetype = self.getCurrentPageType()
|
|
|
|
i = self.comboBox.findData( pagetype )
|
|
self.comboBox.setCurrentIndex( i )
|
|
|
|
#idx = int(str (self.listWidget.item( row ).text()))
|
|
idx = int(self.listWidget.item( row ).data(Qt.UserRole).toPyObject()[0]['Image'])
|
|
|
|
if self.comic_archive is not None:
|
|
self.pageWidget.setArchive( self.comic_archive, idx )
|
|
|
|
def getFirstFrontCover( self ):
|
|
frontCover = 0
|
|
for i in range( self.listWidget.count() ):
|
|
item = self.listWidget.item( i )
|
|
page_dict = item.data(Qt.UserRole).toPyObject()[0]
|
|
if 'Type' in page_dict and page_dict['Type'] == PageType.FrontCover:
|
|
frontCover = int(page_dict['Image'])
|
|
break
|
|
return frontCover
|
|
|
|
|
|
def getCurrentPageType( self ):
|
|
row = self.listWidget.currentRow()
|
|
page_dict = self.listWidget.item( row ).data(Qt.UserRole).toPyObject()[0]
|
|
if 'Type' in page_dict:
|
|
return page_dict['Type']
|
|
else:
|
|
return ""
|
|
|
|
def setCurrentPageType( self, t ):
|
|
row = self.listWidget.currentRow()
|
|
page_dict = self.listWidget.item( row ).data(Qt.UserRole).toPyObject()[0]
|
|
|
|
if t == "":
|
|
if 'Type' in page_dict:
|
|
del(page_dict['Type'])
|
|
else:
|
|
page_dict['Type'] = str(t)
|
|
|
|
item = self.listWidget.item( row )
|
|
# wrap the dict in a tuple to keep from being converted to QStrings
|
|
item.setData(Qt.UserRole, (page_dict,) )
|
|
item.setText( self.listEntryText( page_dict ) )
|
|
|
|
|
|
def setData( self, comic_archive, pages_list ):
|
|
self.comic_archive = comic_archive
|
|
self.pages_list = pages_list
|
|
if pages_list is not None and len(pages_list) > 0:
|
|
self.comboBox.setDisabled(False)
|
|
|
|
self.listWidget.itemSelectionChanged.disconnect( self.changePage )
|
|
|
|
self.listWidget.clear()
|
|
for p in pages_list:
|
|
item = QListWidgetItem( self.listEntryText( p ) )
|
|
# wrap the dict in a tuple to keep from being converted to QStrings
|
|
item.setData(Qt.UserRole, (p, ))
|
|
|
|
self.listWidget.addItem( item )
|
|
self.first_front_page = self.getFirstFrontCover()
|
|
self.listWidget.itemSelectionChanged.connect( self.changePage )
|
|
self.listWidget.setCurrentRow ( 0 )
|
|
|
|
def listEntryText(self, page_dict):
|
|
text = str(int(page_dict['Image']) + 1)
|
|
if 'Type' in page_dict:
|
|
text += " (" + self.pageTypeNames[page_dict['Type']] + ")"
|
|
return text
|
|
|
|
def getPageList( self ):
|
|
page_list = []
|
|
for i in range( self.listWidget.count() ):
|
|
item = self.listWidget.item( i )
|
|
page_list.append( item.data(Qt.UserRole).toPyObject()[0] )
|
|
return page_list
|
|
|
|
def emitFrontCoverChange( self ):
|
|
if self.first_front_page != self.getFirstFrontCover():
|
|
self.first_front_page = self.getFirstFrontCover()
|
|
self.firstFrontCoverChanged.emit( self.first_front_page )
|
|
|
|
def setMetadataStyle( self, data_style ):
|
|
|
|
# depending on the current data style, certain fields are disabled
|
|
|
|
inactive_color = QColor(255, 170, 150)
|
|
active_palette = self.comboBox.palette()
|
|
|
|
inactive_palette3 = self.comboBox.palette()
|
|
inactive_palette3.setColor(QPalette.Base, inactive_color)
|
|
|
|
|
|
if data_style == MetaDataStyle.CIX:
|
|
self.btnUp.setEnabled( True )
|
|
self.btnDown.setEnabled( True )
|
|
self.comboBox.setEnabled( True )
|
|
self.listWidget.setEnabled( True )
|
|
|
|
self.listWidget.setPalette(active_palette)
|
|
|
|
elif data_style == MetaDataStyle.CBI:
|
|
self.btnUp.setEnabled( False )
|
|
self.btnDown.setEnabled( False )
|
|
self.comboBox.setEnabled( False )
|
|
self.listWidget.setEnabled( False )
|
|
|
|
self.listWidget.setPalette(inactive_palette3)
|
|
|
|
elif data_style == MetaDataStyle.CoMet:
|
|
pass
|
|
|
|
# make sure combo is disabled when no list
|
|
if self.comic_archive is None:
|
|
self.comboBox.setEnabled( False )
|