From 310a219b0f08e52c3cd4e1659fcd21c15679fde5 Mon Sep 17 00:00:00 2001 From: Nils Date: Sat, 14 May 2022 23:51:50 +0200 Subject: [PATCH] Add option to lilypond metadata to not print tempo markings, because laborejo always has them but you don't need them sometimes --- engine/api.py | 1 + engine/main.py | 7 ++++--- qtgui/submenus.py | 31 ++++--------------------------- template/qtgui/helper.py | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 30 deletions(-) diff --git a/engine/api.py b/engine/api.py index 0849eac..93ac31f 100644 --- a/engine/api.py +++ b/engine/api.py @@ -309,6 +309,7 @@ def startEngine(nsmClient, additionalData:dict={}): #General and abstract Commands def getMetadata(): + """Do not confuse with template/config METADATA. This is Lilypond title, composer etc.""" return session.data.metaData def setMetadata(data): diff --git a/engine/main.py b/engine/main.py index e63a995..76e0f21 100644 --- a/engine/main.py +++ b/engine/main.py @@ -44,8 +44,10 @@ class Data(template.engine.sequencer.Score): self.hiddenTracks = {} #track-instance:original Position. The value can exist multiple times. These still create a playback representation but are read-only and do not react to editing or GUI requests because you can't access them except through Track.allTrack (which is exactly the same for deleted tracks). Hidden tracks are saved though, deleted ones not. self.tempoTrack = TempoTrack(parentData = self) #The tempoTrack is a Laborejo class. TempoMap is a template.sequencer class that is used by TempoTrack internally - #Metadata has only strings as keys, even the numbers. + #Lilypond Properties that might be used elsewhere as well, e.g. JACK Pretty Names self.metaData = {key:"" for key in ("title", "subtitle", "dedication","composer","subsubtitle","instrument","meter","arranger", "poet","piece","opus","copyright","tagline", "subtext")} + self.metaData["metronome"] = True #show metronome in printout? + self.currentMetronomeTrack = self.tracks[0] #A Laborejo Track, indepedent of currentTrack. The metronome is in self.metronome, set by the template Score. self._processAfterInit() @@ -1046,7 +1048,7 @@ class Data(template.engine.sequencer.Score): Only visible tracks get exported. Each object controls what it exports. Overrides are possible at every level. """ - tempoStaff = self.tempoTrack.lilypond() + tempoStaff = self.tempoTrack.lilypond() if self.metaData["metronome"] else "" data = {track:track.lilypond() for track in self.tracks} #processed in the lilypond module return fromTemplate(session = self.parentSession, templateFile = "default.ly", data = data, meta = self.metaData, tempoStaff = tempoStaff) @@ -1087,4 +1089,3 @@ class Data(template.engine.sequencer.Score): "subdivisions" : self.subdivisions, "isTransportMaster" : self.tempoMap.export()["isTransportMaster"], } - diff --git a/qtgui/submenus.py b/qtgui/submenus.py index 30be079..bb15250 100644 --- a/qtgui/submenus.py +++ b/qtgui/submenus.py @@ -30,7 +30,7 @@ translate = QtCore.QCoreApplication.translate #Template import template.engine.pitch as pitch -from template.qtgui.helper import QHLine +from template.qtgui.helper import QHLine, makeValueWidget, getValueFromWidget from template.qtgui.submenus import * #Our own files @@ -417,13 +417,13 @@ class SecondaryProperties(Submenu): """Directly edits the backend score meta data. There is no api and no callbacks""" super().__init__(mainWindow, translate("submenus", "Meta Data"), hasOkCancelButtons=True) - dictionary = api.getMetadata() #TOOD: untranslated to keep relation to lilypond? + dictionary = api.getMetadata() #Do not confuse with template/config METADATA. This is Lilypond title, composer etc. test = set(type(key) for key in dictionary.keys()) assert len(test) == 1 assert list(test)[0] == str - self.widgets = {key:self.makeValueWidget(value) for key, value in dictionary.items()} + self.widgets = {key:makeValueWidget(value) for key, value in dictionary.items()} importantKeys = ("title", "composer", "instrument", "copyright") #Draw important metadata widgets first @@ -439,31 +439,8 @@ class SecondaryProperties(Submenu): self.__call__() - def makeValueWidget(self, value): - types = { - str : QtWidgets.QLineEdit, - int : QtWidgets.QSpinBox, - float : QtWidgets.QDoubleSpinBox, - } - typ = type(value) - widget = types[typ]() - - if typ == str: - widget.setText(value) - elif typ == int or typ == float: - widget.setValue(value) - - return widget - - def getValueFromWidget(self, widget): - typ = type(widget) - if typ == QtWidgets.QLineEdit: - return widget.text() - elif typ == QtWidgets.QSpinBox or typ == QtWidgets.QDoubleSpinBox: - return widget.value() - def process(self): - api.setMetadata({key:self.getValueFromWidget(widget) for key, widget in self.widgets.items()}) + api.setMetadata({key:getValueFromWidget(widget) for key, widget in self.widgets.items()}) self.done(True) #Instance gets killed afterwards. No need to save the new values. diff --git a/template/qtgui/helper.py b/template/qtgui/helper.py index 71f4cf1..21a9d7b 100644 --- a/template/qtgui/helper.py +++ b/template/qtgui/helper.py @@ -26,6 +26,41 @@ from PyQt5 import QtCore, QtGui, QtWidgets from hashlib import md5 + +def makeValueWidget(value:any): + """Create a widget just from a value. Needs an external label e.g. in a formLayout. + First usecase was laborejo lilypond metadata and properties where it edited an engine-dict + directly and inplace. + Use with getValueFromWidget""" + types = { + str : QtWidgets.QLineEdit, + int : QtWidgets.QSpinBox, + float : QtWidgets.QDoubleSpinBox, + bool : QtWidgets.QCheckBox, + } + typ = type(value) + widget = types[typ]() + + if typ == str: + widget.setText(value) + elif typ == int or typ == float: + widget.setValue(value) + elif typ == bool: + widget.setChecked(value) + return widget + + +def getValueFromWidget(widget): + """Use with makeValueWidget""" + typ = type(widget) + if typ == QtWidgets.QLineEdit: + return widget.text() + elif typ == QtWidgets.QSpinBox or typ == QtWidgets.QDoubleSpinBox: + return widget.value() + elif typ == QtWidgets.QCheckBox: + return widget.isChecked() + + def iconFromString(st, size=128): px = QtGui.QPixmap(size,size) color = stringToColor(st)