class BrowserList(Observation, QListWidget): def __init__(self, delegate, document, subject, powermode=False): self.templateManager = TrackTemplateManager(document, subject) self.delegate = delegate self.powermode = powermode Observation.__init__(self, subject) QListWidget.__init__(self) self.setStyleSheet(Theme.browser.style) self.templateEditor = TrackEditor(self.subject, self.powermode, True) self.templateEditor.onTemplateUpdate = self.onTemplateUpdate self.setFrameStyle(QFrame.NoFrame | QFrame.Plain) self.setHorizontalScrollBar(ScrollBar()) self.setVerticalScrollBar(ScrollBar()) self._initActions() [self.addTemplate(t) for t in self.templateManager.templates] self.add_responder(events.track.TrackTemplateSaved, self.trackTemplateSavedResponder) self.itemSelectionChanged.connect(self.onSelectionChanged) self.currentItemChanged.connect(self.onCurrentItemChanged) self.itemDoubleClicked.connect(self.onItemDoubleClicked) def _initActions(self): # as far as ownership of actions isn't transfered # to add action, we need to keep them by reference counter, # so we make them attributes self._newTrackAct = QAction("New Track (Return)") self._newTrackAct.setShortcut(self.tr("Return")) self._newTrackAct.triggered.connect(self.onTrackNewFromTemplate) self._newTrackAct.setShortcutContext(Qt.WidgetShortcut) self.addAction(self._newTrackAct) if self.powermode: self._deleteAct = QAction("Delete (Alt+Backspace)") self._deleteAct.setShortcut(self.tr("Alt+Backspace")) self._deleteAct.triggered.connect(self.onTemplateDelete) self._deleteAct.setShortcutContext(Qt.WidgetShortcut) self.addAction(self._deleteAct) self._editAct = QAction("Edit") self._editAct.triggered.connect(self.onTemplateEdit) self.addAction(self._editAct) def contextMenuEvent(self, event): menu = QMenu() menu.setStyleSheet(Theme.contextMenu.style) menu.setFont(Theme.contextMenu.font) menu.addActions(self.actions()) menu.exec_(event.globalPos()) def onTrackNewFromTemplate(self, e): if not self.currentItem(): return template = self.templateManager.templates[self.currentRow()] self.notify( events.view.browser.TrackNewFromTemplate(deepcopy(template))) def onTemplateDelete(self, e): if not self.currentItem(): return item = self.currentItem() name = self.itemWidget(item).template.backend_name confirmation = ConfirmationDialog( "Delete Track Template", f"Do you really want to delete {name} track template?") if confirmation.exec_() == ConfirmationDialog.Yes: self.templateManager.delete_at(self.currentRow()) self.takeItem(self.currentRow()) def onTemplateEdit(self, e): if not self.currentItem(): return template = self.templateManager.templates[self.currentRow()] self.templateEditor.setTemplate(template) self.templateEditor.show() def onTemplateUpdate(self): if not self.currentItem(): return template = self.templateManager.templates[self.currentRow()] itemWidget = self.itemWidget(self.currentItem()) itemWidget.deserialize(template) self.templateManager.save(template, template.path, False) def onSelectionChanged(self): if not self.currentItem(): self.delegate.onSelectionChanged(None) template = self.templateManager.templates[self.currentRow()] self.delegate.onSelectionChanged(template) self.itemWidget(self.currentItem()).setSelected(True) def onCurrentItemChanged(self, current, previous): if previous: self.itemWidget(previous).setSelected(False) def onItemDoubleClicked(self, item): self._newTrackAct.activate(QAction.Trigger) def addTemplate(self, template): item = QListWidgetItem() view = Item(template, self.subject) item.setSizeHint(view.sizeHint()) self.addItem(item) self.setItemWidget(item, view) def trackTemplateSavedResponder(self, e): self.addTemplate(e.template) def delete(self): self.templateEditor.delete() self.unregister() self.setParent(None) self.deleteLater() def closeEvent(self, e): self.delete()