From 7a7adc1c3f411614e745c46715ca3f3f4ccf2a33 Mon Sep 17 00:00:00 2001 From: beville Date: Thu, 17 Jan 2013 06:19:06 +0000 Subject: [PATCH] Implemented context menu for file list git-svn-id: http://comictagger.googlecode.com/svn/trunk@309 6c5673fe-1810-88d6-992b-cd32ca31540c --- fileselectionlist.py | 41 ++++++++++++++++++++++++++++++ fileselectionlist.ui | 3 +++ pagelisteditor.py | 14 ++++++++--- taggerwindow.py | 56 +++++++++++++++++++++++++++-------------- taggerwindow.ui | 59 ++++++++++++++++++++++++++++++++++++-------- todo.txt | 14 +++++------ 6 files changed, 147 insertions(+), 40 deletions(-) diff --git a/fileselectionlist.py b/fileselectionlist.py index af80e74..b588b72 100644 --- a/fileselectionlist.py +++ b/fileselectionlist.py @@ -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(): diff --git a/fileselectionlist.ui b/fileselectionlist.ui index 8bba869..2c3895e 100644 --- a/fileselectionlist.ui +++ b/fileselectionlist.ui @@ -19,6 +19,9 @@ true + + QAbstractItemView::ExtendedSelection + QAbstractItemView::SelectRows diff --git a/pagelisteditor.py b/pagelisteditor.py index 8e477b0..8e3ac30 100644 --- a/pagelisteditor.py +++ b/pagelisteditor.py @@ -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'] diff --git a/taggerwindow.py b/taggerwindow.py index f34310f..0196c81 100644 --- a/taggerwindow.py +++ b/taggerwindow.py @@ -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() \ No newline at end of file diff --git a/taggerwindow.ui b/taggerwindow.ui index 50beaf1..bcd79e2 100644 --- a/taggerwindow.ui +++ b/taggerwindow.ui @@ -322,7 +322,11 @@ - + + + false + + @@ -332,7 +336,11 @@ - + + + false + + @@ -342,7 +350,11 @@ - + + + false + + @@ -352,7 +364,11 @@ - + + + false + + @@ -368,7 +384,11 @@ - + + + false + + @@ -378,7 +398,11 @@ - + + + false + + @@ -388,7 +412,11 @@ - + + + false + + @@ -398,7 +426,11 @@ - + + + false + + @@ -452,6 +484,9 @@ 0 + + false + @@ -466,7 +501,11 @@ - + + + false + + @@ -1080,7 +1119,7 @@ 0 0 968 - 28 + 25 diff --git a/todo.txt b/todo.txt index 340fa35..c87ce03 100644 --- a/todo.txt +++ b/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 -----------------------------------------------------