Page list editor work
git-svn-id: http://comictagger.googlecode.com/svn/trunk@240 6c5673fe-1810-88d6-992b-cd32ca31540c
This commit is contained in:
parent
f7cb6e9d2b
commit
7f1ce793e3
@ -32,7 +32,6 @@ class PageType:
|
||||
Roundup = "Roundup"
|
||||
Story = "Story"
|
||||
Advertisment = "Advertisment"
|
||||
Story = "Story"
|
||||
Editorial = "Editorial"
|
||||
Letters = "Letters"
|
||||
Preview = "Preview"
|
||||
@ -169,7 +168,6 @@ class GenericMetadata:
|
||||
if len(new_md.tags) > 0:
|
||||
assign( "tags", new_md.tags )
|
||||
|
||||
print "MD overlay len of old pages = {0} len of new pages = {1}".format(len(self.pages), len(new_md.pages))
|
||||
if len(new_md.pages) > 0:
|
||||
assign( "pages", new_md.pages )
|
||||
|
||||
|
@ -25,12 +25,218 @@ from PyQt4.QtGui import *
|
||||
from PyQt4 import uic
|
||||
|
||||
from settings import ComicTaggerSettings
|
||||
from genericmetadata import GenericMetadata, PageType
|
||||
|
||||
|
||||
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.Advertisment: "Advertisment",
|
||||
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(os.path.join(ComicTaggerSettings.baseDir(), 'pagelisteditor.ui' ), self )
|
||||
|
||||
self.comic_archive = None
|
||||
self.pages_list = None
|
||||
|
||||
# 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.Advertisment], PageType.Advertisment )
|
||||
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 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'])
|
||||
|
||||
image_data = self.comic_archive.getPage( idx )
|
||||
|
||||
if image_data is not None:
|
||||
img = QImage()
|
||||
img.loadFromData( image_data )
|
||||
self.current_pixmap = QPixmap(QPixmap(img))
|
||||
|
||||
self.setDisplayPixmap( 0, 0)
|
||||
|
||||
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 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.label.height() + delta_h
|
||||
new_w = self.label.width() + delta_w
|
||||
|
||||
#account for the border
|
||||
new_h -= 4
|
||||
new_w -= 2
|
||||
|
||||
if new_h < 0:
|
||||
new_h = 0;
|
||||
if new_w < 0:
|
||||
new_w = 0;
|
||||
scaled_pixmap = self.current_pixmap.scaled(new_w, new_h, Qt.KeepAspectRatio)
|
||||
self.label.setPixmap( scaled_pixmap )
|
||||
|
||||
def setData( self, comic_archive, pages_list ):
|
||||
self.comic_archive = comic_archive
|
||||
self.pages_list = pages_list
|
||||
|
||||
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.listWidget.setCurrentRow ( 0 )
|
||||
self.first_front_page = self.getFirstFrontCover()
|
||||
|
||||
def listEntryText(self, page_dict):
|
||||
text = page_dict['Image']
|
||||
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 )
|
||||
|
||||
|
@ -6,93 +6,124 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>514</width>
|
||||
<height>328</height>
|
||||
<width>511</width>
|
||||
<height>294</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QListWidget" name="listWidget">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>150</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="dragEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="dragDropMode">
|
||||
<enum>QAbstractItemView::InternalMove</enum>
|
||||
</property>
|
||||
<property name="defaultDropAction">
|
||||
<enum>Qt::MoveAction</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QListWidget" name="listWidget">
|
||||
<widget class="QPushButton" name="btnUp">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Expanding">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>50</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>^</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>50</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<widget class="QPushButton" name="btnDown">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>50</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>v</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>^</string>
|
||||
<string>Page Type:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton_2">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>50</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>v</string>
|
||||
</property>
|
||||
</widget>
|
||||
<item row="0" column="1">
|
||||
<widget class="QComboBox" name="comboBox"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::Panel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Sunken</enum>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>TextLabel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="comboBox"/>
|
||||
</item>
|
||||
</layout>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>90</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::Panel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Sunken</enum>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>TextLabel</string>
|
||||
</property>
|
||||
<property name="scaledContents">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
<property name="indent">
|
||||
<number>0</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
|
@ -142,7 +142,12 @@ class TaggerWindow( QtGui.QMainWindow):
|
||||
self.btnRemoveCredit.clicked.connect(self.removeCredit)
|
||||
self.twCredits.cellDoubleClicked.connect(self.editCredit)
|
||||
clickable(self.lblCover).connect(self.showPageBrowser)
|
||||
|
||||
self.connectDirtyFlagSignals()
|
||||
self.pageListEditor.modified.connect(self.setDirtyFlag)
|
||||
|
||||
self.pageListEditor.firstFrontCoverChanged.connect( self.frontCoverChanged )
|
||||
self.pageListEditor.listOrderChanged.connect( self.pageListOrderChanged )
|
||||
|
||||
self.updateStyleTweaks()
|
||||
|
||||
@ -417,19 +422,14 @@ class TaggerWindow( QtGui.QMainWindow):
|
||||
self.metadata = self.comic_archive.metadataFromFilename( )
|
||||
self.metadata.setDefaultPageList( self.comic_archive.getNumberOfPages() )
|
||||
|
||||
cover_idx = self.metadata.getCoverPageIndexList()[0]
|
||||
image_data = self.comic_archive.getPage( cover_idx )
|
||||
if not image_data is None:
|
||||
img = QtGui.QImage()
|
||||
img.loadFromData( image_data )
|
||||
self.lblCover.setPixmap(QtGui.QPixmap(img))
|
||||
self.lblCover.setScaledContents(True)
|
||||
self.updateCoverImage()
|
||||
|
||||
if self.page_browser is not None:
|
||||
self.page_browser.setComicArchive( self.comic_archive )
|
||||
self.page_browser.metadata = self.metadata
|
||||
|
||||
self.metadataToForm()
|
||||
self.pageListEditor.setData( self.comic_archive, self.metadata.pages )
|
||||
self.clearDirtyFlag() # also updates the app title
|
||||
self.updateInfoBox()
|
||||
self.updateMenus()
|
||||
@ -438,6 +438,15 @@ class TaggerWindow( QtGui.QMainWindow):
|
||||
else:
|
||||
QtGui.QMessageBox.information(self, self.tr("Whoops!"), self.tr("That file doesn't appear to be a comic archive!"))
|
||||
|
||||
def updateCoverImage( self ):
|
||||
cover_idx = self.metadata.getCoverPageIndexList()[0]
|
||||
image_data = self.comic_archive.getPage( cover_idx )
|
||||
if not image_data is None:
|
||||
img = QtGui.QImage()
|
||||
img.loadFromData( image_data )
|
||||
self.lblCover.setPixmap(QtGui.QPixmap(img))
|
||||
self.lblCover.setScaledContents(True)
|
||||
|
||||
def updateMenus( self ):
|
||||
|
||||
# First just disable all the questionable items
|
||||
@ -514,39 +523,6 @@ class TaggerWindow( QtGui.QMainWindow):
|
||||
tag_info += u"• ComicBookLover tags"
|
||||
|
||||
self.lblTagList.setText( tag_info )
|
||||
|
||||
def updatePagesInfo( self ):
|
||||
|
||||
#tablemodel = PageTableModel( self.comic_archive, self )
|
||||
#self.tableView.setModel(tablemodel)
|
||||
|
||||
listmodel = PageListModel( self.comic_archive, self )
|
||||
self.listView.setModel(listmodel)
|
||||
|
||||
#self.listView.setDragDropMode(self.InternalMove)
|
||||
#listmodel.installEventFilter(self)
|
||||
|
||||
self.listView.setDragEnabled(True)
|
||||
self.listView.setAcceptDrops(True)
|
||||
self.listView.setDropIndicatorShown(True)
|
||||
|
||||
#listmodel.rowsMoved.connect( self.rowsMoved )
|
||||
#listmodel.rowsRemoved.connect( self.rowsRemoved )
|
||||
#listmodel.beginMoveRows.connect( self.beginMoveRows )
|
||||
|
||||
#def rowsMoved( self, b, c, d):
|
||||
# print "rowsMoved"
|
||||
#def rowsRemoved( self,b, c, d):
|
||||
# print "rowsRemoved"
|
||||
|
||||
|
||||
"""
|
||||
def eventFilter(self, sender, event):
|
||||
if (event.type() == QtCore.QEvent.ChildRemoved):
|
||||
print "QEvent::ChildRemoved"
|
||||
return False # don't actually interrupt anything
|
||||
"""
|
||||
|
||||
|
||||
def setDirtyFlag( self, param1=None, param2=None, param3=None ):
|
||||
if not self.dirtyFlag:
|
||||
@ -575,7 +551,8 @@ class TaggerWindow( QtGui.QMainWindow):
|
||||
|
||||
# recursive call on chillun
|
||||
for child in widget.children():
|
||||
self.connectChildDirtyFlagSignals( child )
|
||||
if child != self.pageListEditor:
|
||||
self.connectChildDirtyFlagSignals( child )
|
||||
|
||||
|
||||
def clearForm( self ):
|
||||
@ -590,7 +567,8 @@ class TaggerWindow( QtGui.QMainWindow):
|
||||
|
||||
# clear the dirty flag, since there is nothing in there now to lose
|
||||
self.clearDirtyFlag()
|
||||
|
||||
|
||||
self.pageListEditor.setData( self.comic_archive, self.metadata.pages )
|
||||
|
||||
def clearChildren (self, widget ):
|
||||
|
||||
@ -799,6 +777,8 @@ class TaggerWindow( QtGui.QMainWindow):
|
||||
md.addCredit( name, role, bool(primary_flag) )
|
||||
row += 1
|
||||
|
||||
md.pages = self.pageListEditor.getPageList()
|
||||
|
||||
def useFilename( self ):
|
||||
if self.comic_archive is not None:
|
||||
#copy the form onto metadata object
|
||||
@ -1364,4 +1344,11 @@ class TaggerWindow( QtGui.QMainWindow):
|
||||
|
||||
def showForum( self ):
|
||||
webbrowser.open("http://comictagger.forumotion.com/")
|
||||
|
||||
def frontCoverChanged( self, int ):
|
||||
self.metadata.pages = self.pageListEditor.getPageList()
|
||||
self.updateCoverImage()
|
||||
|
||||
def pageListOrderChanged( self ):
|
||||
self.metadata.pages = self.pageListEditor.getPageList()
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user