From 3b165cb0e152d2514618c6e256bdb4f49ac7d867 Mon Sep 17 00:00:00 2001 From: Florian Jung Date: Thu, 22 Aug 2013 18:50:19 +0200 Subject: implemented missing functions of Part --- muse2/muse/event.h | 2 +- muse2/muse/eventlist.cpp | 2 +- muse2/muse/part.cpp | 97 ++++++++++++++++++++++++++++++++++++------------ muse2/muse/part.h | 4 +- 4 files changed, 78 insertions(+), 27 deletions(-) diff --git a/muse2/muse/event.h b/muse2/muse/event.h index ed1ddb87..e512e03d 100644 --- a/muse2/muse/event.h +++ b/muse2/muse/event.h @@ -137,7 +137,7 @@ class EventList : public EL { public: ciEvent find(const Event&) const; iEvent find(const Event&); - iEvent add(Event& event); + iEvent add(Event event); void move(Event& event, unsigned tick); void dump() const; void read(Xml& xml, const char* name, bool midi); diff --git a/muse2/muse/eventlist.cpp b/muse2/muse/eventlist.cpp index f499fd2d..ecc7f452 100644 --- a/muse2/muse/eventlist.cpp +++ b/muse2/muse/eventlist.cpp @@ -62,7 +62,7 @@ void EventList::read(Xml& xml, const char* name, bool midi) // add //--------------------------------------------------------- -iEvent EventList::add(Event& event) +iEvent EventList::add(Event event) { // Changed by Tim. An event list containing wave events should be sorted by // frames. WaveTrack::fetchData() relies on the sorting order, and diff --git a/muse2/muse/part.cpp b/muse2/muse/part.cpp index b6d1571a..9b869567 100644 --- a/muse2/muse/part.cpp +++ b/muse2/muse/part.cpp @@ -74,11 +74,8 @@ void Part::chainClone(Part* p) this->_nextClone->_prevClone = this; p->_nextClone = this; - // Synchronize this->_events to p->_events. Need to deep-copy, i.e. clone() the Events. - this->_events.clear(); - for (ciEvent it = p->_events.begin(); it!=p->_events.end(); it++) - this->_events.insert(std::pair(it->first, it->second.clone())); - + // we only chain clones. we must trust in the GUI thread that the eventlist is consistent. + this->_clonemaster_sn = p->_sn; } @@ -90,6 +87,22 @@ void Part::rechainClone() _backupClone = NULL; } +bool Part::isCloneOf(const Part* other) const +{ + return this->_clonemaster_sn == other->_clonemaster_sn; +} + +int Part::nClones() const +{ + int n=1; + + for(const Part* it = this->_nextClone; it!=this; it=it->_nextClone) + n++; + + return n; +} + + // FIXME FINDMICHJETZT TODO: weg damit! //--------------------------------------------------------- @@ -414,30 +427,68 @@ Part::Part(Track* t) _colorIndex = 0; } - -/* FINDMICHJETZT FIXME! -Part* Part::duplicate() const +WavePart* WavePart::duplicateEmpty() const { - Part* dup = duplicateEmpty(); + WavePart* part = new WavePart((WaveTrack*)this->_track); + part->setName(name()); + part->setColorIndex(colorIndex()); + + *(PosLen*)part = *(PosLen*)this; + part->setMute(mute()); + + return part; +} - // copy the eventlist; duplicate each Event(Ptr!). - for (MusECore::ciEvent i = _events.begin(); i != _events.end(); ++i) - dup->_events.add(i->second.clone()) - - return dup; +WavePart* WavePart::duplicate() const +{ + return (WavePart*)Part::duplicate(); } -Part* Part::duplicateEmpty() const +WavePart* WavePart::createNewClone() const { - MidiPart* part = new MidiPart(this->_track); - part->setName(name()); - part->setColorIndex(colorIndex()); + return (WavePart*)Part::createNewClone(); +} - *(PosLen*)part = *(PosLen*)this; - part->setMute(mute()); - - return part; -} */ +MidiPart* MidiPart::duplicateEmpty() const +{ + MidiPart* part = new MidiPart((MidiTrack*)this->_track); + part->setName(name()); + part->setColorIndex(colorIndex()); + + *(PosLen*)part = *(PosLen*)this; + part->setMute(mute()); + + return part; +} + +MidiPart* MidiPart::duplicate() const +{ + return (MidiPart*)Part::duplicate(); +} + +MidiPart* MidiPart::createNewClone() const +{ + return (MidiPart*)Part::createNewClone(); +} + + +Part* Part::createNewClone() const +{ + Part* clone = duplicate(); + clone->_backupClone=const_cast(this); + return clone; +} + +Part* Part::duplicate() const +{ + Part* dup = duplicateEmpty(); + + // copy the eventlist; duplicate each Event(Ptr!). + for (MusECore::ciEvent i = _events.begin(); i != _events.end(); ++i) + dup->_events.add(i->second.clone()); + + return dup; +} //--------------------------------------------------------- diff --git a/muse2/muse/part.h b/muse2/muse/part.h index 5523e71d..e579e64d 100644 --- a/muse2/muse/part.h +++ b/muse2/muse/part.h @@ -84,9 +84,9 @@ class Part : public PosLen { public: Part(Track*); virtual ~Part(); - virtual Part* duplicate() const = 0; + virtual Part* duplicate() const; virtual Part* duplicateEmpty() const = 0; - virtual Part* createNewClone() const = 0; + virtual Part* createNewClone() const; // this does NOT chain clones yet. Chain is updated only when the part is really added! virtual void splitPart(int tickpos, Part*& p1, Part*& p2) const; int clonemaster_sn() const { return _clonemaster_sn; } -- cgit v1.2.1