Ejemplo n.º 1
0
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()