Skip to content

Commit

Permalink
Replace addClip function with addNewClip, make createClip a private v…
Browse files Browse the repository at this point in the history
…irtual implementation function

Do not allow adding any kind of clip into any kind of track, and ensure that clips that need to be in tracks are added after construction of the clip has completed.
  • Loading branch information
sakertooth committed Mar 4, 2025
1 parent 1f851ff commit 2b35185
Show file tree
Hide file tree
Showing 15 changed files with 51 additions and 62 deletions.
6 changes: 2 additions & 4 deletions include/AutomationTrack.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
5 changes: 1 addition & 4 deletions include/InstrumentTrack.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -265,6 +261,7 @@ protected slots:


private:
Clip* createClip() override;
void processCCEvent(int controller);

MidiPort m_midiPort;
Expand Down
3 changes: 2 additions & 1 deletion include/PatternTrack.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -89,6 +88,8 @@ class LMMS_EXPORT PatternTrack : public Track


private:
Clip* createClip() override;

QList<Track *> m_disabledTracks;

using infoMap = QMap<PatternTrack*, int>;
Expand Down
4 changes: 2 additions & 2 deletions include/SampleTrack.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -92,6 +90,8 @@ public slots:
void updateMixerChannel();

private:
Clip* createClip() override;

FloatModel m_volumeModel;
FloatModel m_panningModel;
IntModel m_mixerChannelModel;
Expand Down
9 changes: 2 additions & 7 deletions include/Track.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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();
Expand Down Expand Up @@ -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);

Expand Down
34 changes: 13 additions & 21 deletions src/core/Track.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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() );
}
}
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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<int>(clipNum) * TimePos::ticksPerBar());
return clip;
}


Expand Down Expand Up @@ -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 ) );
}
}
Expand Down
5 changes: 4 additions & 1 deletion src/gui/FileBrowser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -995,8 +995,11 @@ bool FileBrowserTreeWidget::openInNewSampleTrack(FileItem* item)

// Add the sample clip to the track
Engine::audioEngine()->requestChangeInModel();
SampleClip* clip = static_cast<SampleClip*>(sampleTrack->createClip(0));

auto clip = dynamic_cast<SampleClip*>(sampleTrack->addNewClip());
clip->movePosition(0);
clip->setSampleFile(item->fullName());

Engine::audioEngine()->doneChangeInModel();
return true;
}
Expand Down
4 changes: 3 additions & 1 deletion src/gui/clips/ClipView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1279,13 +1279,15 @@ void ClipView::mergeClips(QVector<ClipView*> clipvs)
const TimePos earliestPos = (*earliestClipV)->getClip()->startPosition();

// Create a clip where all notes will be added
auto newMidiClip = dynamic_cast<MidiClip*>(track->createClip(earliestPos));
auto newMidiClip = dynamic_cast<MidiClip*>(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
Expand Down
4 changes: 3 additions & 1 deletion src/gui/tracks/AutomationTrackView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<AutomationClip*>(clip);
autoClip->addObject( mod );
}
Expand Down
7 changes: 5 additions & 2 deletions src/gui/tracks/SampleTrackView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -217,8 +217,11 @@ void SampleTrackView::dropEvent(QDropEvent *de)
* TimePos::ticksPerBar()) + trackContainerView()->currentPosition()
).quantize(1.0);

auto sClip = static_cast<SampleClip*>(getTrack()->createClip(clipPos));
if (sClip) { sClip->setSampleFile(value); }
if (auto sClip = dynamic_cast<SampleClip*>(getTrack()->addNewClip()))
{
sClip->movePosition(clipPos);
sClip->setSampleFile(value);
}
}
}

Expand Down
8 changes: 6 additions & 2 deletions src/gui/tracks/TrackContentWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
Expand Down Expand Up @@ -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);
}
}

Expand Down
6 changes: 2 additions & 4 deletions src/tracks/AutomationTrack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}


Expand Down
6 changes: 2 additions & 4 deletions src/tracks/InstrumentTrack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}


Expand Down
6 changes: 2 additions & 4 deletions src/tracks/PatternTrack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}


Expand Down
6 changes: 2 additions & 4 deletions src/tracks/SampleTrack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}


Expand Down

0 comments on commit 2b35185

Please sign in to comment.