Implemented context menu for file list
git-svn-id: http://comictagger.googlecode.com/svn/trunk@309 6c5673fe-1810-88d6-992b-cd32ca31540c
This commit is contained in:
parent
41f730a558
commit
7a7adc1c3f
@ -58,6 +58,7 @@ class FileInfo( ):
|
||||
class FileSelectionList(QWidget):
|
||||
|
||||
selectionChanged = pyqtSignal(QVariant)
|
||||
listCleared = pyqtSignal()
|
||||
|
||||
def __init__(self, parent , settings ):
|
||||
super(FileSelectionList, self).__init__(parent)
|
||||
@ -71,7 +72,47 @@ class FileSelectionList(QWidget):
|
||||
self.setAcceptDrops(True)
|
||||
|
||||
self.twList.itemSelectionChanged.connect( self.itemSelectionChangedCB )
|
||||
|
||||
self.setContextMenuPolicy(Qt.ActionsContextMenu)
|
||||
|
||||
selectAllAction = QAction("Select All", self)
|
||||
invertSelectionAction = QAction("Invert Selection", self)
|
||||
removeAction = QAction("Remove Selected Items", self)
|
||||
|
||||
selectAllAction.triggered.connect(self.selectAll)
|
||||
removeAction.triggered.connect(self.removeSelection)
|
||||
|
||||
self.addAction(selectAllAction)
|
||||
self.addAction(removeAction)
|
||||
|
||||
def selectAll( self ):
|
||||
self.twList.setRangeSelected( QTableWidgetSelectionRange ( 0, 0, self.twList.rowCount()-1, 1 ), True )
|
||||
|
||||
def removeSelection( self ):
|
||||
row_list = []
|
||||
for item in self.twList.selectedItems():
|
||||
if item.column() == 0:
|
||||
row_list.append(item.row())
|
||||
|
||||
if len(row_list) == 0:
|
||||
return
|
||||
|
||||
row_list.sort()
|
||||
row_list.reverse()
|
||||
|
||||
self.twList.itemSelectionChanged.disconnect( self.itemSelectionChangedCB )
|
||||
|
||||
for i in row_list:
|
||||
self.twList.removeRow(i)
|
||||
|
||||
self.twList.itemSelectionChanged.connect( self.itemSelectionChangedCB )
|
||||
|
||||
if self.twList.rowCount() > 0:
|
||||
self.twList.selectRow(0)
|
||||
else:
|
||||
self.listCleared.emit()
|
||||
|
||||
|
||||
def dragEnterEvent(self, event):
|
||||
self.droppedFiles = None
|
||||
if event.mimeData().hasUrls():
|
||||
|
@ -19,6 +19,9 @@
|
||||
<property name="acceptDrops">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="selectionMode">
|
||||
<enum>QAbstractItemView::ExtendedSelection</enum>
|
||||
</property>
|
||||
<property name="selectionBehavior">
|
||||
<enum>QAbstractItemView::SelectRows</enum>
|
||||
</property>
|
||||
|
@ -82,8 +82,7 @@ class PageListEditor(QWidget):
|
||||
self.pages_list = None
|
||||
self.page_loader = None
|
||||
|
||||
self.current_pixmap = QPixmap(os.path.join(ComicTaggerSettings.baseDir(), 'graphics/nocover.png' ))
|
||||
self.setDisplayPixmap( 0, 0)
|
||||
self.resetPage()
|
||||
|
||||
# Add the entries to the manga combobox
|
||||
self.comboBox.addItem( "", "" )
|
||||
@ -107,6 +106,10 @@ class PageListEditor(QWidget):
|
||||
self.pre_move_row = -1
|
||||
self.first_front_page = None
|
||||
|
||||
def resetPage( self ):
|
||||
self.current_pixmap = QPixmap(os.path.join(ComicTaggerSettings.baseDir(), 'graphics/nocover.png' ))
|
||||
self.setDisplayPixmap( 0, 0)
|
||||
|
||||
def moveCurrentUp( self ):
|
||||
row = self.listWidget.currentRow()
|
||||
if row > 0:
|
||||
@ -238,7 +241,9 @@ class PageListEditor(QWidget):
|
||||
def setData( self, comic_archive, pages_list ):
|
||||
self.comic_archive = comic_archive
|
||||
self.pages_list = pages_list
|
||||
|
||||
|
||||
self.listWidget.itemSelectionChanged.disconnect( self.changePage )
|
||||
|
||||
self.listWidget.clear()
|
||||
for p in pages_list:
|
||||
item = QListWidgetItem( self.listEntryText( p ) )
|
||||
@ -246,8 +251,9 @@ class PageListEditor(QWidget):
|
||||
item.setData(Qt.UserRole, (p, ))
|
||||
|
||||
self.listWidget.addItem( item )
|
||||
self.listWidget.setCurrentRow ( 0 )
|
||||
self.first_front_page = self.getFirstFrontCover()
|
||||
self.listWidget.itemSelectionChanged.connect( self.changePage )
|
||||
self.listWidget.setCurrentRow ( 0 )
|
||||
|
||||
def listEntryText(self, page_dict):
|
||||
text = page_dict['Image']
|
||||
|
@ -105,10 +105,11 @@ class TaggerWindow( QtGui.QMainWindow):
|
||||
gridlayout.addWidget( self.fileSelectionList )
|
||||
|
||||
self.fileSelectionList.selectionChanged.connect( self.fileListSelectionChanged )
|
||||
self.fileSelectionList.listCleared.connect( self.fileListCleared )
|
||||
# ATB: Disable the list for now...
|
||||
self.splitter.setSizes([100,0])
|
||||
self.splitter.setHandleWidth(0)
|
||||
self.splitter.handle(1).setDisabled(True)
|
||||
#self.splitter.setSizes([100,0])
|
||||
#self.splitter.setHandleWidth(0)
|
||||
#self.splitter.handle(1).setDisabled(True)
|
||||
|
||||
#---------------------------
|
||||
|
||||
@ -117,26 +118,15 @@ class TaggerWindow( QtGui.QMainWindow):
|
||||
|
||||
self.lblCover.setPixmap(QtGui.QPixmap(os.path.join(ComicTaggerSettings.baseDir(), 'graphics/nocover.png' )))
|
||||
|
||||
#print platform.system(), platform.release()
|
||||
self.dirtyFlag = False
|
||||
self.data_style = settings.last_selected_data_style
|
||||
|
||||
#set up a default metadata object
|
||||
self.metadata = GenericMetadata()
|
||||
self.comic_archive = None
|
||||
|
||||
self.configMenus()
|
||||
self.statusBar()
|
||||
self.updateAppTitle()
|
||||
self.setAcceptDrops(True)
|
||||
self.updateMenus()
|
||||
self.droppedFile = None
|
||||
|
||||
self.page_browser = None
|
||||
self.page_loader = None
|
||||
|
||||
self.configMenus()
|
||||
self.statusBar()
|
||||
self.populateComboBoxes()
|
||||
|
||||
self.resetApp()
|
||||
|
||||
# set up some basic field validators
|
||||
validator = QtGui.QIntValidator(1900, 2099, self)
|
||||
self.lePubYear.setValidator(validator)
|
||||
@ -197,6 +187,24 @@ class TaggerWindow( QtGui.QMainWindow):
|
||||
# defer the actual close in the app loop thread
|
||||
QtCore.QTimer.singleShot(200, self.close)
|
||||
|
||||
def resetApp( self ):
|
||||
|
||||
self.lblCover.setPixmap(QtGui.QPixmap(os.path.join(ComicTaggerSettings.baseDir(), 'graphics/nocover.png' )))
|
||||
|
||||
self.comic_archive = None
|
||||
self.dirtyFlag = False
|
||||
self.clearForm()
|
||||
self.pageListEditor.resetPage()
|
||||
|
||||
self.updateAppTitle()
|
||||
self.updateMenus()
|
||||
self.updateInfoBox()
|
||||
|
||||
self.droppedFile = None
|
||||
self.page_browser = None
|
||||
self.page_loader = None
|
||||
|
||||
|
||||
def updateAppTitle( self ):
|
||||
|
||||
if self.comic_archive is None:
|
||||
@ -537,7 +545,14 @@ class TaggerWindow( QtGui.QMainWindow):
|
||||
def updateInfoBox( self ):
|
||||
|
||||
ca = self.comic_archive
|
||||
|
||||
|
||||
if ca is None:
|
||||
self.lblFilename.setText( "" )
|
||||
self.lblArchiveType.setText( "" )
|
||||
self.lblTagList.setText( "" )
|
||||
self.lblPageCount.setText( "" )
|
||||
return
|
||||
|
||||
filename = os.path.basename( ca.path )
|
||||
filename = os.path.splitext(filename)[0]
|
||||
filename = FileNameParser().fixSpaces(filename)
|
||||
@ -1430,3 +1445,6 @@ class TaggerWindow( QtGui.QMainWindow):
|
||||
self.metadata = GenericMetadata()
|
||||
|
||||
self.loadCurrentArchive()
|
||||
|
||||
def fileListCleared( self ):
|
||||
self.resetApp()
|
@ -322,7 +322,11 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="leSeries"/>
|
||||
<widget class="QLineEdit" name="leSeries">
|
||||
<property name="acceptDrops">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
@ -332,7 +336,11 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLineEdit" name="leTitle"/>
|
||||
<widget class="QLineEdit" name="leTitle">
|
||||
<property name="acceptDrops">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_8">
|
||||
@ -342,7 +350,11 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="lePublisher"/>
|
||||
<widget class="QLineEdit" name="lePublisher">
|
||||
<property name="acceptDrops">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_10">
|
||||
@ -352,7 +364,11 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QLineEdit" name="leImprint"/>
|
||||
<widget class="QLineEdit" name="leImprint">
|
||||
<property name="acceptDrops">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label_11">
|
||||
@ -368,7 +384,11 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QLineEdit" name="leSeriesGroup"/>
|
||||
<widget class="QLineEdit" name="leSeriesGroup">
|
||||
<property name="acceptDrops">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QLabel" name="label_25">
|
||||
@ -378,7 +398,11 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<widget class="QLineEdit" name="leStoryArc"/>
|
||||
<widget class="QLineEdit" name="leStoryArc">
|
||||
<property name="acceptDrops">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QLabel" name="label_24">
|
||||
@ -388,7 +412,11 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="1">
|
||||
<widget class="QLineEdit" name="leGenre"/>
|
||||
<widget class="QLineEdit" name="leGenre">
|
||||
<property name="acceptDrops">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="0">
|
||||
<widget class="QLabel" name="label_21">
|
||||
@ -398,7 +426,11 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="1">
|
||||
<widget class="QLineEdit" name="leAltSeries"/>
|
||||
<widget class="QLineEdit" name="leAltSeries">
|
||||
<property name="acceptDrops">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="1">
|
||||
<spacer name="verticalSpacer_4">
|
||||
@ -452,6 +484,9 @@
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="acceptDrops">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
@ -466,7 +501,11 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="leAltIssueCount"/>
|
||||
<widget class="QLineEdit" name="leAltIssueCount">
|
||||
<property name="acceptDrops">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
@ -1080,7 +1119,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>968</width>
|
||||
<height>28</height>
|
||||
<height>25</height>
|
||||
</rect>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuComicTagger">
|
||||
|
14
todo.txt
14
todo.txt
@ -5,7 +5,12 @@ Features
|
||||
Multi-file:
|
||||
Does the main UI need to have "View/Read Tag Style" and "Write Tag style" concept?
|
||||
|
||||
Edit functions on list: select, select all, delete,
|
||||
Select first dropped Item into list
|
||||
Turn off drop accept for edit lines/boxes
|
||||
Drop on app goes to list and selects it
|
||||
Accept multiple files on file open dialog
|
||||
Warn on moving selection list away from modified form
|
||||
ComicArchive: cache each metadata block? Need to make sure cache is cleared on file modify
|
||||
|
||||
Batch Functions:
|
||||
Auto-Select
|
||||
@ -18,14 +23,9 @@ Multi-file:
|
||||
|
||||
Copy Block
|
||||
Verify overwrites
|
||||
|
||||
Turn off drop accept for edit lines/boxes
|
||||
Drop on app goes to list and selects it
|
||||
Accept multiple files on file open dialog
|
||||
Warn on moving selection list away from modified form
|
||||
Delete
|
||||
|
||||
|
||||
ComicArchive: cache each metadata block? Need to make sure cache is cleared on file modify
|
||||
-----------------------------------------------------
|
||||
Bugs
|
||||
-----------------------------------------------------
|
||||
|
Loading…
x
Reference in New Issue
Block a user