diff --git a/include/AutomationTrack.h b/include/AutomationTrack.h index 9bcb537f41e..11164b86c0c 100644 --- a/include/AutomationTrack.h +++ b/include/AutomationTrack.h @@ -48,16 +48,14 @@ class AutomationTrack : public Track } gui::TrackView * createView( gui::TrackContainerView* ) override; - Clip* createClip(const TimePos & pos) override; void saveTrackSpecificSettings(QDomDocument& doc, QDomElement& parent, bool presetMode) override; void loadTrackSpecificSettings( const QDomElement & _this ) override; private: + Clip* createClip() override; friend class AutomationTrackView; - -} ; - +}; } // namespace lmms diff --git a/include/InstrumentTrack.h b/include/InstrumentTrack.h index 17d3233da65..f47eb554c6c 100644 --- a/include/InstrumentTrack.h +++ b/include/InstrumentTrack.h @@ -128,10 +128,6 @@ class LMMS_EXPORT InstrumentTrack : public Track, public MidiEventProcessor // create new view for me gui::TrackView* createView( gui::TrackContainerView* tcv ) override; - // create new track-content-object = clip - Clip* createClip(const TimePos & pos) override; - - // called by track void saveTrackSpecificSettings(QDomDocument& doc, QDomElement& parent, bool presetMode) override; void loadTrackSpecificSettings( const QDomElement & _this ) override; @@ -265,6 +261,7 @@ protected slots: private: + Clip* createClip() override; void processCCEvent(int controller); MidiPort m_midiPort; diff --git a/include/PatternTrack.h b/include/PatternTrack.h index 2568fc91e16..a50e24f068c 100644 --- a/include/PatternTrack.h +++ b/include/PatternTrack.h @@ -55,7 +55,6 @@ class LMMS_EXPORT PatternTrack : public Track const f_cnt_t _frame_base, int _clip_num = -1 ) override; gui::TrackView * createView( gui::TrackContainerView* tcv ) override; - Clip* createClip(const TimePos & pos) override; void saveTrackSpecificSettings(QDomDocument& doc, QDomElement& parent, bool presetMode) override; void loadTrackSpecificSettings( const QDomElement & _this ) override; @@ -89,6 +88,8 @@ class LMMS_EXPORT PatternTrack : public Track private: + Clip* createClip() override; + QList m_disabledTracks; using infoMap = QMap; diff --git a/include/SampleTrack.h b/include/SampleTrack.h index d333cd59394..15c055806f3 100644 --- a/include/SampleTrack.h +++ b/include/SampleTrack.h @@ -51,8 +51,6 @@ class SampleTrack : public Track bool play( const TimePos & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _clip_num = -1 ) override; gui::TrackView * createView( gui::TrackContainerView* tcv ) override; - Clip* createClip(const TimePos & pos) override; - void saveTrackSpecificSettings(QDomDocument& doc, QDomElement& parent, bool presetMode) override; void loadTrackSpecificSettings( const QDomElement & _this ) override; @@ -92,6 +90,8 @@ public slots: void updateMixerChannel(); private: + Clip* createClip() override; + FloatModel m_volumeModel; FloatModel m_panningModel; IntModel m_mixerChannelModel; diff --git a/include/Track.h b/include/Track.h index 52d43f6e115..8677bbc1cfb 100644 --- a/include/Track.h +++ b/include/Track.h @@ -102,11 +102,7 @@ class LMMS_EXPORT Track : public Model, public JournallingObject virtual bool play( const TimePos & start, const fpp_t frames, const f_cnt_t frameBase, int clipNum = -1 ) = 0; - - virtual gui::TrackView * createView( gui::TrackContainerView * view ) = 0; - virtual Clip * createClip( const TimePos & pos ) = 0; - virtual void saveTrackSpecificSettings(QDomDocument& doc, QDomElement& parent, bool presetMode) = 0; virtual void loadTrackSpecificSettings( const QDomElement & element ) = 0; @@ -118,10 +114,8 @@ class LMMS_EXPORT Track : public Model, public JournallingObject void saveSettings( QDomDocument & doc, QDomElement & element ) override; void loadSettings( const QDomElement & element ) override; - // -- for usage by Clip only --------------- - Clip * addClip( Clip * clip ); + virtual Clip* addNewClip(); void removeClip( Clip * clip ); - // ------------------------------------------------------- void deleteClips(); int numOfClips(); @@ -208,6 +202,7 @@ public slots: void toggleSolo(); private: + virtual Clip * createClip() = 0; void saveTrack(QDomDocument& doc, QDomElement& element, bool presetMode); void loadTrack(const QDomElement& element, bool presetMode); diff --git a/src/core/Track.cpp b/src/core/Track.cpp index c63b0ec5e3a..7db5fab1812 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -291,8 +291,8 @@ void Track::loadTrack(const QDomElement& element, bool presetMode) && node.nodeName() != "solo" && !node.toElement().attribute( "metadata" ).toInt() ) { - Clip * clip = createClip( - TimePos( 0 ) ); + Clip * clip = createClip(); + clip->movePosition(0); clip->restoreState( node.toElement() ); } } @@ -328,25 +328,14 @@ void Track::loadSettings(const QDomElement& element) loadTrack(element, false); } - - - -/*! \brief Add another Clip into this track - * - * \param clip The Clip to attach to this track. - */ -Clip * Track::addClip( Clip * clip ) +Clip * Track::addNewClip() { - m_clips.push_back( clip ); - - emit clipAdded( clip ); - - return clip; // just for convenience + const auto clip = createClip(); + m_clips.push_back(clip); + emit clipAdded(clip); + return clip; } - - - /*! \brief Remove a given Clip from this track * * \param clip The Clip to remove from this track. @@ -408,8 +397,10 @@ auto Track::getClip(std::size_t clipNum) -> Clip* } printf( "called Track::getClip( %zu ), " "but Clip %zu doesn't exist\n", clipNum, clipNum ); - return createClip( clipNum * TimePos::ticksPerBar() ); - + + const auto clip = createClip(); + clip->movePosition(static_cast(clipNum) * TimePos::ticksPerBar()); + return clip; } @@ -496,7 +487,8 @@ void Track::createClipsForPattern(int pattern) while( numOfClips() < pattern + 1 ) { TimePos position = TimePos( numOfClips(), 0 ); - Clip * clip = createClip( position ); + Clip * clip = addNewClip(); + clip->movePosition(position); clip->changeLength( TimePos( 1, 0 ) ); } } diff --git a/src/gui/FileBrowser.cpp b/src/gui/FileBrowser.cpp index 5e8c84e3344..be03d0d822b 100644 --- a/src/gui/FileBrowser.cpp +++ b/src/gui/FileBrowser.cpp @@ -995,8 +995,11 @@ bool FileBrowserTreeWidget::openInNewSampleTrack(FileItem* item) // Add the sample clip to the track Engine::audioEngine()->requestChangeInModel(); - SampleClip* clip = static_cast(sampleTrack->createClip(0)); + + auto clip = dynamic_cast(sampleTrack->addNewClip()); + clip->movePosition(0); clip->setSampleFile(item->fullName()); + Engine::audioEngine()->doneChangeInModel(); return true; } diff --git a/src/gui/clips/ClipView.cpp b/src/gui/clips/ClipView.cpp index f98351f377d..ed98723f9ef 100644 --- a/src/gui/clips/ClipView.cpp +++ b/src/gui/clips/ClipView.cpp @@ -1279,13 +1279,15 @@ void ClipView::mergeClips(QVector clipvs) const TimePos earliestPos = (*earliestClipV)->getClip()->startPosition(); // Create a clip where all notes will be added - auto newMidiClip = dynamic_cast(track->createClip(earliestPos)); + auto newMidiClip = dynamic_cast(track->addNewClip()); + if (!newMidiClip) { qWarning("Warning: Failed to convert Clip to MidiClip on mergeClips"); return; } + newMidiClip->movePosition(earliestPos); newMidiClip->saveJournallingState(false); // Add the notes and remove the Clips that are being merged diff --git a/src/gui/tracks/AutomationTrackView.cpp b/src/gui/tracks/AutomationTrackView.cpp index 53e022c1513..f437d6ba9ec 100644 --- a/src/gui/tracks/AutomationTrackView.cpp +++ b/src/gui/tracks/AutomationTrackView.cpp @@ -77,7 +77,9 @@ void AutomationTrackView::dropEvent( QDropEvent * _de ) pos.setTicks( 0 ); } - Clip * clip = getTrack()->createClip( pos ); + auto clip = getTrack()->addNewClip(); + clip->movePosition(pos); + auto autoClip = dynamic_cast(clip); autoClip->addObject( mod ); } diff --git a/src/gui/tracks/SampleTrackView.cpp b/src/gui/tracks/SampleTrackView.cpp index 064cc5206ab..622733376b4 100644 --- a/src/gui/tracks/SampleTrackView.cpp +++ b/src/gui/tracks/SampleTrackView.cpp @@ -217,8 +217,11 @@ void SampleTrackView::dropEvent(QDropEvent *de) * TimePos::ticksPerBar()) + trackContainerView()->currentPosition() ).quantize(1.0); - auto sClip = static_cast(getTrack()->createClip(clipPos)); - if (sClip) { sClip->setSampleFile(value); } + if (auto sClip = dynamic_cast(getTrack()->addNewClip())) + { + sClip->movePosition(clipPos); + sClip->setSampleFile(value); + } } } diff --git a/src/gui/tracks/TrackContentWidget.cpp b/src/gui/tracks/TrackContentWidget.cpp index 1d39f97b3c8..8bb53edd4df 100644 --- a/src/gui/tracks/TrackContentWidget.cpp +++ b/src/gui/tracks/TrackContentWidget.cpp @@ -536,9 +536,11 @@ bool TrackContentWidget::pasteSelection( TimePos clipPos, const QMimeData * md, TimePos shift = TimePos::ticksPerBar() * getGUI()->songEditor()->m_editor->getSnapSize(); if (offset == 0 && initialTrackIndex == currentTrackIndex) { pos += shift; } - Clip * clip = t->createClip( pos ); + auto clip = t->addNewClip(); + clip->movePosition(pos); clip->restoreState( clipElement ); clip->movePosition(pos); // Because we restored the state, we need to move the Clip again. + if( wasSelection ) { clip->selectViewOnCreate( true ); @@ -600,7 +602,9 @@ void TrackContentWidget::mousePressEvent( QMouseEvent * me ) getTrack()->addJournalCheckPoint(); const TimePos pos = getPosition( me->x() ).getBar() * TimePos::ticksPerBar(); - getTrack()->createClip(pos); + + auto clip = getTrack()->addNewClip(); + clip->movePosition(pos); } } diff --git a/src/tracks/AutomationTrack.cpp b/src/tracks/AutomationTrack.cpp index 1ff30ac7680..003fa70ce26 100644 --- a/src/tracks/AutomationTrack.cpp +++ b/src/tracks/AutomationTrack.cpp @@ -56,11 +56,9 @@ gui::TrackView* AutomationTrack::createView( gui::TrackContainerView* tcv ) -Clip* AutomationTrack::createClip(const TimePos & pos) +Clip* AutomationTrack::createClip() { - auto p = new AutomationClip(this); - p->movePosition(pos); - return p; + return new AutomationClip(this); } diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 70ac7432ee8..7dcd0e00301 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -802,11 +802,9 @@ bool InstrumentTrack::play( const TimePos & _start, const fpp_t _frames, -Clip* InstrumentTrack::createClip(const TimePos & pos) +Clip* InstrumentTrack::createClip() { - auto p = new MidiClip(this); - p->movePosition(pos); - return p; + return new MidiClip(this); } diff --git a/src/tracks/PatternTrack.cpp b/src/tracks/PatternTrack.cpp index 697a7c2a8fb..00b5287771e 100644 --- a/src/tracks/PatternTrack.cpp +++ b/src/tracks/PatternTrack.cpp @@ -144,11 +144,9 @@ gui::TrackView* PatternTrack::createView(gui::TrackContainerView* tcv) -Clip* PatternTrack::createClip(const TimePos & pos) +Clip* PatternTrack::createClip() { - auto pc = new PatternClip(this); - pc->movePosition(pos); - return pc; + return new PatternClip(this); } diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index fe83b99e24e..15934078a25 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -178,11 +178,9 @@ gui::TrackView * SampleTrack::createView( gui::TrackContainerView* tcv ) -Clip * SampleTrack::createClip(const TimePos & pos) +Clip * SampleTrack::createClip() { - auto sClip = new SampleClip(this); - sClip->movePosition(pos); - return sClip; + return new SampleClip(this); }