Nils
2 years ago
9 changed files with 186 additions and 17 deletions
@ -0,0 +1,111 @@ |
|||||
|
#! /usr/bin/env python3 |
||||
|
# -*- coding: utf-8 -*- |
||||
|
""" |
||||
|
Copyright 2022, Nils Hilbricht, Germany ( https://www.hilbricht.net ) |
||||
|
|
||||
|
This file is part of the Laborejo Software Suite ( https://www.laborejo.org ), |
||||
|
|
||||
|
Laborejo2 is free software: you can redistribute it and/or modify |
||||
|
it under the terms of the GNU General Public License as published by |
||||
|
the Free Software Foundation, either version 3 of the License, or |
||||
|
(at your option) any later version. |
||||
|
|
||||
|
This program is distributed in the hope that it will be useful, |
||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
GNU General Public License for more details. |
||||
|
|
||||
|
You should have received a copy of the GNU General Public License |
||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
|
""" |
||||
|
|
||||
|
import logging; logger = logging.getLogger(__name__); logger.info("import") |
||||
|
|
||||
|
|
||||
|
#Third Party |
||||
|
from PyQt5 import QtCore, QtGui, QtWidgets |
||||
|
|
||||
|
#Template Modules |
||||
|
|
||||
|
#Our Modules |
||||
|
import engine.api as api |
||||
|
|
||||
|
|
||||
|
|
||||
|
class TrackListWidget(QtWidgets.QListWidget): |
||||
|
"""The TrackListWidget holds all tracks as text-only variants with cursor access. |
||||
|
It will show one track at a time, the current one. |
||||
|
|
||||
|
It is meant as alternative access for hard-to-reach items, such as zero-duration-items. |
||||
|
|
||||
|
The cursor decides which track is currently handled as items. |
||||
|
But track content changes can come it for any track at any time. |
||||
|
|
||||
|
In opposite to the ScoreScene we do not deal with deleted and hidden tracks. |
||||
|
We recreate the items on track change. |
||||
|
""" |
||||
|
|
||||
|
def __init__(self, mainWindow, parentSplitter): |
||||
|
|
||||
|
super().__init__(parentSplitter) |
||||
|
self.mainWindow = mainWindow |
||||
|
|
||||
|
self._lastCurrentTrack = None |
||||
|
self.tracks = {} # engineTrackId : engineExportData |
||||
|
|
||||
|
self.itemPressed.connect(self._react_itemPressed) |
||||
|
|
||||
|
api.callbacks.tracksChanged.append(self.syncTracks) |
||||
|
api.callbacks.updateTrack.append(self.updateTrack) |
||||
|
api.callbacks.setCursor.append(self.setCursor) |
||||
|
|
||||
|
|
||||
|
def setCursor(self, cursorExportObject): |
||||
|
if not self._lastCurrentTrack == cursorExportObject["trackId"]: |
||||
|
self._lastCurrentTrack == cursorExportObject["trackId"] |
||||
|
self.showTrack(cursorExportObject["trackId"]) |
||||
|
|
||||
|
self.blockSignals(True) |
||||
|
self.setCurrentRow(cursorExportObject["position"]) |
||||
|
self.blockSignals(False) |
||||
|
|
||||
|
|
||||
|
def _react_itemPressed(self, item): |
||||
|
"""This is gui->api cursor setting |
||||
|
It only happens when the mouse etc. actually pressed an item. |
||||
|
This list cannot be activated by cursor keys etc. directly. """ |
||||
|
|
||||
|
api.toPosition(self.currentRow()) #currentRow is calculated after we already are on the item. |
||||
|
|
||||
|
|
||||
|
def syncTracks(self, listOfStaticTrackRepresentations): |
||||
|
"""Handles the number of tracks and track meta-data changes, |
||||
|
but not track contents, which is handled by self.updateTrack through a different callback""" |
||||
|
|
||||
|
for trackExportObject in listOfStaticTrackRepresentations: |
||||
|
if not trackExportObject["id"] in self.tracks: |
||||
|
self.tracks[trackExportObject["id"]] = None |
||||
|
|
||||
|
|
||||
|
def updateTrack(self, trackId, staticRepresentationList): |
||||
|
"""Callback: The content of a single track has changed""" |
||||
|
if not trackId in self.tracks: |
||||
|
#hidden track. But this can still happen through the data editor |
||||
|
return |
||||
|
|
||||
|
self.tracks[trackId] = staticRepresentationList |
||||
|
if trackId == self._lastCurrentTrack: |
||||
|
self.showTrack(trackId) |
||||
|
|
||||
|
|
||||
|
|
||||
|
def showTrack(self, trackId): |
||||
|
"""Cursor moved to a different track. |
||||
|
This is essentially destroy-and-recreate in Qt """ |
||||
|
|
||||
|
self.clear() |
||||
|
staticRepresentationList = self.tracks[trackId] |
||||
|
count = 0 |
||||
|
for staticItem in staticRepresentationList: |
||||
|
self.addItem(staticItem["UIstring"]) |
||||
|
self.addItem("|") #Appending |
Loading…
Reference in new issue