diff --git a/include/AutomationTrack.h b/include/AutomationTrack.h index 64c2cc43aea..9bcb537f41e 100644 --- a/include/AutomationTrack.h +++ b/include/AutomationTrack.h @@ -50,8 +50,7 @@ class AutomationTrack : public Track gui::TrackView * createView( gui::TrackContainerView* ) override; Clip* createClip(const TimePos & pos) override; - void saveTrackSpecificSettings( QDomDocument & _doc, - QDomElement & _parent ) override; + void saveTrackSpecificSettings(QDomDocument& doc, QDomElement& parent, bool presetMode) override; void loadTrackSpecificSettings( const QDomElement & _this ) override; private: diff --git a/include/InstrumentTrack.h b/include/InstrumentTrack.h index 1e46fb0cb8c..689c962cdab 100644 --- a/include/InstrumentTrack.h +++ b/include/InstrumentTrack.h @@ -133,8 +133,7 @@ class LMMS_EXPORT InstrumentTrack : public Track, public MidiEventProcessor // called by track - void saveTrackSpecificSettings( QDomDocument & _doc, - QDomElement & _parent ) override; + void saveTrackSpecificSettings(QDomDocument& doc, QDomElement& parent, bool presetMode) override; void loadTrackSpecificSettings( const QDomElement & _this ) override; using Track::setJournalling; diff --git a/include/PatternTrack.h b/include/PatternTrack.h index 1c0c610d255..2568fc91e16 100644 --- a/include/PatternTrack.h +++ b/include/PatternTrack.h @@ -57,8 +57,7 @@ class LMMS_EXPORT PatternTrack : public Track gui::TrackView * createView( gui::TrackContainerView* tcv ) override; Clip* createClip(const TimePos & pos) override; - void saveTrackSpecificSettings( QDomDocument & _doc, - QDomElement & _parent ) override; + void saveTrackSpecificSettings(QDomDocument& doc, QDomElement& parent, bool presetMode) override; void loadTrackSpecificSettings( const QDomElement & _this ) override; static PatternTrack* findPatternTrack(int pattern_num); diff --git a/include/SampleTrack.h b/include/SampleTrack.h index f71f01cd1a7..e79df0c2c04 100644 --- a/include/SampleTrack.h +++ b/include/SampleTrack.h @@ -54,8 +54,7 @@ class SampleTrack : public Track Clip* createClip(const TimePos & pos) override; - void saveTrackSpecificSettings( QDomDocument & _doc, - QDomElement & _parent ) override; + void saveTrackSpecificSettings(QDomDocument& doc, QDomElement& parent, bool presetMode) override; void loadTrackSpecificSettings( const QDomElement & _this ) override; inline IntModel * mixerChannelModel() diff --git a/include/Track.h b/include/Track.h index db33900f5da..52d43f6e115 100644 --- a/include/Track.h +++ b/include/Track.h @@ -107,19 +107,17 @@ class LMMS_EXPORT Track : public Model, public JournallingObject virtual gui::TrackView * createView( gui::TrackContainerView * view ) = 0; virtual Clip * createClip( const TimePos & pos ) = 0; - virtual void saveTrackSpecificSettings( QDomDocument & doc, - QDomElement & parent ) = 0; + virtual void saveTrackSpecificSettings(QDomDocument& doc, QDomElement& parent, bool presetMode) = 0; virtual void loadTrackSpecificSettings( const QDomElement & element ) = 0; + // Saving and loading of presets which do not necessarily contain all the track information + void savePreset(QDomDocument & doc, QDomElement & element); + void loadPreset(const QDomElement & element); + // Saving and loading of full tracks void saveSettings( QDomDocument & doc, QDomElement & element ) override; void loadSettings( const QDomElement & element ) override; - void setSimpleSerializing() - { - m_simpleSerializingMode = true; - } - // -- for usage by Clip only --------------- Clip * addClip( Clip * clip ); void removeClip( Clip * clip ); @@ -209,6 +207,10 @@ public slots: void toggleSolo(); +private: + void saveTrack(QDomDocument& doc, QDomElement& element, bool presetMode); + void loadTrack(const QDomElement& element, bool presetMode); + private: TrackContainer* m_trackContainer; Type m_type; @@ -222,8 +224,6 @@ public slots: BoolModel m_soloModel; bool m_mutedBeforeSolo; - bool m_simpleSerializingMode; - clipVector m_clips; QMutex m_processingLock; diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 7ff73e71891..e44475d9374 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -63,7 +63,6 @@ Track::Track( Type type, TrackContainer * tc ) : m_name(), /*!< The track's name */ m_mutedModel( false, this, tr( "Mute" ) ), /*!< For controlling track muting */ m_soloModel( false, this, tr( "Solo" ) ), /*!< For controlling track soloing */ - m_simpleSerializingMode( false ), m_clips() /*!< The clips (segments) */ { m_trackContainer->addTrack( this ); @@ -174,10 +173,6 @@ Track* Track::clone() } - - - - /*! \brief Save this track's settings to file * * We save the track type and its muted state and solo state, then append the track- @@ -186,12 +181,13 @@ Track* Track::clone() * * \param doc The QDomDocument to use to save * \param element The The QDomElement to save into + * \param presetMode Describes whether to save the track as a preset or not. * \todo Does this accurately describe the parameters? I think not!? * \todo Save the track height */ -void Track::saveSettings( QDomDocument & doc, QDomElement & element ) +void Track::saveTrack(QDomDocument& doc, QDomElement& element, bool presetMode) { - if( !m_simpleSerializingMode ) + if (!presetMode) { element.setTagName( "track" ); } @@ -215,11 +211,10 @@ void Track::saveSettings( QDomDocument & doc, QDomElement & element ) QDomElement tsDe = doc.createElement( nodeName() ); // let actual track (InstrumentTrack, PatternTrack, SampleTrack etc.) save its settings element.appendChild( tsDe ); - saveTrackSpecificSettings( doc, tsDe ); + saveTrackSpecificSettings(doc, tsDe, presetMode); - if( m_simpleSerializingMode ) + if (presetMode) { - m_simpleSerializingMode = false; return; } @@ -230,9 +225,6 @@ void Track::saveSettings( QDomDocument & doc, QDomElement & element ) } } - - - /*! \brief Load the settings from a file * * We load the track's type and muted state and solo state, then clear out our @@ -243,9 +235,10 @@ void Track::saveSettings( QDomDocument & doc, QDomElement & element ) * one at a time. * * \param element the QDomElement to load track settings from + * \param presetMode Indicates if a preset or a full track is loaded * \todo Load the track height. */ -void Track::loadSettings( const QDomElement & element ) +void Track::loadTrack(const QDomElement& element, bool presetMode) { if( static_cast(element.attribute( "type" ).toInt()) != type() ) { @@ -267,7 +260,7 @@ void Track::loadSettings( const QDomElement & element ) setColor(QColor{element.attribute("color")}); } - if( m_simpleSerializingMode ) + if (presetMode) { QDomNode node = element.firstChild(); while( !node.isNull() ) @@ -279,7 +272,7 @@ void Track::loadSettings( const QDomElement & element ) } node = node.nextSibling(); } - m_simpleSerializingMode = false; + return; } @@ -316,6 +309,28 @@ void Track::loadSettings( const QDomElement & element ) } } +void Track::savePreset(QDomDocument & doc, QDomElement & element) +{ + saveTrack(doc, element, true); +} + +void Track::loadPreset(const QDomElement & element) +{ + loadTrack(element, true); +} + +void Track::saveSettings(QDomDocument& doc, QDomElement& element) +{ + // Assume that everything should be saved if we are called through SerializingObject::saveSettings + saveTrack(doc, element, false); +} + +void Track::loadSettings(const QDomElement& element) +{ + // Assume that everything should be loaded if we are called through SerializingObject::loadSettings + loadTrack(element, false); +} + diff --git a/src/gui/editors/TrackContainerView.cpp b/src/gui/editors/TrackContainerView.cpp index 39eb41f34db..e85f4e86666 100644 --- a/src/gui/editors/TrackContainerView.cpp +++ b/src/gui/editors/TrackContainerView.cpp @@ -417,8 +417,8 @@ void TrackContainerView::dropEvent( QDropEvent * _de ) { DataFile dataFile( value ); auto it = dynamic_cast(Track::create(Track::Type::Instrument, m_tc)); - it->setSimpleSerializing(); - it->loadSettings( dataFile.content().toElement() ); + it->loadPreset(dataFile.content().toElement()); + //it->toggledInstrumentTrackButton( true ); _de->accept(); } diff --git a/src/gui/instrument/InstrumentTrackWindow.cpp b/src/gui/instrument/InstrumentTrackWindow.cpp index 1c9c93a09f9..1d1d2d73cc2 100644 --- a/src/gui/instrument/InstrumentTrackWindow.cpp +++ b/src/gui/instrument/InstrumentTrackWindow.cpp @@ -424,8 +424,7 @@ void InstrumentTrackWindow::saveSettingsBtnClicked() DataFile dataFile(DataFile::Type::InstrumentTrackSettings); QDomElement& content(dataFile.content()); - m_track->setSimpleSerializing(); - m_track->saveSettings(dataFile, content); + m_track->savePreset(dataFile, content); //We don't want to save muted & solo settings when we're saving a preset content.setAttribute("muted", 0); content.setAttribute("solo", 0); diff --git a/src/tracks/AutomationTrack.cpp b/src/tracks/AutomationTrack.cpp index e353197f877..1ff30ac7680 100644 --- a/src/tracks/AutomationTrack.cpp +++ b/src/tracks/AutomationTrack.cpp @@ -66,8 +66,7 @@ Clip* AutomationTrack::createClip(const TimePos & pos) -void AutomationTrack::saveTrackSpecificSettings( QDomDocument & _doc, - QDomElement & _this ) +void AutomationTrack::saveTrackSpecificSettings(QDomDocument& doc, QDomElement& _this, bool presetMode) { } diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index be18fc9e4ca..66992bc4f6d 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -821,7 +821,7 @@ gui::TrackView* InstrumentTrack::createView( gui::TrackContainerView* tcv ) -void InstrumentTrack::saveTrackSpecificSettings( QDomDocument& doc, QDomElement & thisElement ) +void InstrumentTrack::saveTrackSpecificSettings(QDomDocument& doc, QDomElement& thisElement, bool presetMode) { m_volumeModel.saveSettings( doc, thisElement, "vol" ); m_panningModel.saveSettings( doc, thisElement, "pan" ); @@ -860,7 +860,7 @@ void InstrumentTrack::saveTrackSpecificSettings( QDomDocument& doc, QDomElement // Save the midi port info if we are not in song saving mode, e.g. in // track cloning mode or if we are in song saving mode and the user - // has chosen to discard the MIDI connections. + // has chosen not to discard the MIDI connections. if (!Engine::getSong()->isSavingProject() || !Engine::getSong()->getSaveOptions().discardMIDIConnections.value()) { @@ -868,7 +868,11 @@ void InstrumentTrack::saveTrackSpecificSettings( QDomDocument& doc, QDomElement bool hasAuto = m_hasAutoMidiDev; autoAssignMidiDevice(false); - m_midiPort.saveState( doc, thisElement ); + // Only save the MIDI port information if we are not saving a preset. + if (!presetMode) + { + m_midiPort.saveState(doc, thisElement); + } autoAssignMidiDevice(hasAuto); } @@ -1007,14 +1011,13 @@ void InstrumentTrack::replaceInstrument(DataFile dataFile) int mixerChannel = mixerChannelModel()->value(); InstrumentTrack::removeMidiPortNode(dataFile); - setSimpleSerializing(); //Replacing an instrument shouldn't change the solo/mute state. bool oldMute = isMuted(); bool oldSolo = isSolo(); bool oldMutedBeforeSolo = isMutedBeforeSolo(); - loadSettings(dataFile.content().toElement()); + loadPreset(dataFile.content().toElement()); setMuted(oldMute); setSolo(oldSolo); diff --git a/src/tracks/PatternTrack.cpp b/src/tracks/PatternTrack.cpp index bdde4780c50..697a7c2a8fb 100644 --- a/src/tracks/PatternTrack.cpp +++ b/src/tracks/PatternTrack.cpp @@ -154,7 +154,7 @@ Clip* PatternTrack::createClip(const TimePos & pos) -void PatternTrack::saveTrackSpecificSettings(QDomDocument& doc, QDomElement& _this) +void PatternTrack::saveTrackSpecificSettings(QDomDocument& doc, QDomElement& _this, bool presetMode) { // _this.setAttribute( "icon", m_trackLabel->pixmapFile() ); /* _this.setAttribute( "current", s_infoMap[this] == diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 13050285668..609043efe12 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -188,8 +188,7 @@ Clip * SampleTrack::createClip(const TimePos & pos) -void SampleTrack::saveTrackSpecificSettings( QDomDocument & _doc, - QDomElement & _this ) +void SampleTrack::saveTrackSpecificSettings(QDomDocument& _doc, QDomElement& _this, bool presetMode) { m_audioPort.effects()->saveState( _doc, _this ); #if 0