class CategoryWidget(Shared): config = RequiredFeature("Config") filesystem = RequiredFeature("Filesystem") itemStrings = { "singularCaps": "Category", "singularLower": "category", "pluralCaps": "Categories", "pluralLower": "categories", } def __init__(self, parent=None): Shared.__init__(self, parent) self.setupLayout() def setupLayout(self): self.view = DeselectableTreeView() self.addButton = QtGui.QPushButton("Add category") self.addButton.clicked.connect(self.getItem) self.removeButton = QtGui.QPushButton("Remove category") self.removeButton.clicked.connect(self.removeItem) vbox = QtGui.QVBoxLayout() vbox.addWidget(self.view) vbox.addWidget(self.addButton) vbox.addWidget(self.removeButton) vbox.setContentsMargins(0, 0, 0, 0) self.setLayout(vbox) def setEvent(self, eventName): eventName = str(eventName) self.model = DirectoryModel(self, eventName) self.view.setModel(self.model) for col in range(1, 4): self.view.hideColumn(col) self.view.setHeaderHidden(True) # Needs to be absolute path for Windows: currentEventPath = self.filesystem.abs([self.config.getEventsDir(), eventName]) self.model.setRootPath(currentEventPath) currentPathIndex = self.model.index(currentEventPath) self.view.setRootIndex(currentPathIndex) def addItem(self, categoryName): selectedIndex = self.getSelectedIndex() if not selectedIndex: selectedIndex = self.view.rootIndex() success = self.model.addItem(selectedIndex, categoryName) if not success: print "CategoryWidget.addItem failed" def getSelectedPath(self): index = self.getSelectedIndex() if index: qVariant = self.model.data(index, QtGui.QFileSystemModel.FilePathRole) return qVariant.toString()
def setupLayout(self): self.view = QtGui.QListView() self.model = DirectoryModel(self) self.model.modelChanged.connect(self.updateLabelTimer) self.view.setModel(self.model) self.setRoot() self.eventsCountLabel = QtGui.QLabel() self.eventsCountLabel.setToolTip('Click to change directory') self.eventsCountLabel.linkActivated.connect(self.changeEventsDir) newEventButton = QtGui.QPushButton('New Event') newEventButton.clicked.connect(self.getItem) self.removeEventButton = QtGui.QPushButton('Remove Event') self.removeEventButton.clicked.connect(self.removeItem) self.continueButton = QtGui.QPushButton('Continue') self.continueButton.clicked.connect(self.sendIndexToNextPage) self.view.doubleClicked.connect(self.sendIndexToNextPage) vbox = QtGui.QVBoxLayout() vbox.addWidget(self.eventsCountLabel) vbox.addWidget(self.view) hbox = QtGui.QHBoxLayout() hbox.addWidget(newEventButton) hbox.addWidget(self.removeEventButton) hbox.addWidget(self.continueButton) vbox.addLayout(hbox) self.setLayout(vbox)
def setEvent(self, eventName): eventName = str(eventName) self.model = DirectoryModel(self, eventName) self.view.setModel(self.model) for col in range(1, 4): self.view.hideColumn(col) self.view.setHeaderHidden(True) # Needs to be absolute path for Windows: currentEventPath = self.filesystem.abs([self.config.getEventsDir(), eventName]) self.model.setRootPath(currentEventPath) currentPathIndex = self.model.index(currentEventPath) self.view.setRootIndex(currentPathIndex)
class EventsPage(Shared): config = RequiredFeature('Config') filesystem = RequiredFeature('Filesystem') setEvent = QtCore.pyqtSignal(str) nextPage = QtCore.pyqtSignal() itemStrings = {'singularCaps': 'Event', 'singularLower': 'event', 'pluralCaps': 'Events', 'pluralLower': 'events', } def __init__(self, parent=None): Shared.__init__(self, parent) self.timer = QtCore.QTimer(self) self.setupLayout() self.updateLabelTimer() self.eventErrorDialog = QtGui.QErrorMessage(self) def setupLayout(self): self.view = QtGui.QListView() self.model = DirectoryModel(self) self.model.modelChanged.connect(self.updateLabelTimer) self.view.setModel(self.model) self.setRoot() self.eventsCountLabel = QtGui.QLabel() self.eventsCountLabel.setToolTip('Click to change directory') self.eventsCountLabel.linkActivated.connect(self.changeEventsDir) newEventButton = QtGui.QPushButton('New Event') newEventButton.clicked.connect(self.getItem) self.removeEventButton = QtGui.QPushButton('Remove Event') self.removeEventButton.clicked.connect(self.removeItem) self.continueButton = QtGui.QPushButton('Continue') self.continueButton.clicked.connect(self.sendIndexToNextPage) self.view.doubleClicked.connect(self.sendIndexToNextPage) vbox = QtGui.QVBoxLayout() vbox.addWidget(self.eventsCountLabel) vbox.addWidget(self.view) hbox = QtGui.QHBoxLayout() hbox.addWidget(newEventButton) hbox.addWidget(self.removeEventButton) hbox.addWidget(self.continueButton) vbox.addLayout(hbox) self.setLayout(vbox) def setRoot(self, eventsDir=None): if not eventsDir: eventsDir = self.config.getEventsDir() self.model.setRootPath(eventsDir) self.eventsDirIndex = self.model.index(eventsDir) self.view.setRootIndex(self.eventsDirIndex) def updateLabelTimer(self): #updateLabel() has to happen in a different thread: self.timer.singleShot(0, self.updateLabel) #If it fires too soon, 100ms should be enough: self.timer.singleShot(100, self.updateLabel) def updateLabel(self): index = self.view.rootIndex() count = self.model.rowCount(index) if count > 1 or count == 0: s = 's' else: s = '' labelText = "{count} event{s} in <a href='change'>{eventsDir}</a>" labelText = labelText.format( count=count, s=s, eventsDir=self.config.getEventsDir()) self.eventsCountLabel.setText(labelText) def changeEventsDir(self): title = 'Choose new events directory' path = QtGui.QFileDialog.getExistingDirectory(self, title) path = str(path) if len(path) == 0: #no directory selected return self.config.setEventsDir(path) self.setRoot(path) self.updateLabel() def sendIndexToNextPage(self): eventName = self.getSelectedName() if eventName: self.setEvent.emit(eventName) self.nextPage.emit() else: title = 'No event selected' message = 'Please select an event.' QtGui.QMessageBox.warning(self, title, message) def enableButtons(self): self.removeEventButton.setEnabled(True) self.continueButton.setEnabled(True) def disableButtons(self): self.removeEventButton.setEnabled(False) self.continueButton.setEnabled(False)