diff options
Diffstat (limited to 'muse2/muse/part.h')
-rw-r--r-- | muse2/muse/part.h | 54 |
1 files changed, 28 insertions, 26 deletions
diff --git a/muse2/muse/part.h b/muse2/muse/part.h index 357ec1db..a9241807 100644 --- a/muse2/muse/part.h +++ b/muse2/muse/part.h @@ -60,12 +60,8 @@ typedef CloneList::iterator iClone; class Part : public PosLen { public: enum HiddenEventsType { NoEventsHidden = 0, LeftEventsHidden, RightEventsHidden }; - - // @@@@@@@@@@@ IMPORTANT @@@@@@@@@@@@ - // @@ when adding member variables @@ - // @@ here, don't forget to update @@ - // @@ the copy-constructor! @@ - // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + static Part* readFromXml(Xml&, Track*, bool doClone = false, bool toTrack = true); private: static int snGen; @@ -78,22 +74,23 @@ class Part : public PosLen { protected: Track* _track; - EventList* _events; + EventList _events; Part* _prevClone; Part* _nextClone; + Part* _backupClone; // when a part gets removed, it's still there; and for undo-ing the remove, it must know about where it was clone-chained to. int _hiddenEvents; // Combination of HiddenEventsType. - + public: Part(Track*); - Part(Track*, EventList*); - Part(const Part& p); virtual ~Part(); + virtual Part* duplicate() = 0; + virtual Part* duplicateEmpty() = 0; + virtual Part* createNewClone() = 0; + int sn() { return _sn; } void setSn(int n) { _sn = n; } int newSn() { return snGen++; } - virtual Part* clone() const = 0; - const QString& name() const { return _name; } void setName(const QString& s) { _name = s; } bool selected() const { return _selected; } @@ -102,15 +99,19 @@ class Part : public PosLen { void setMute(bool b) { _mute = b; } Track* track() const { return _track; } void setTrack(Track*t) { _track = t; } - EventList* events() const { return _events; } - const EventList* cevents() const { return _events; } + const EventList& events() const { return _events; } + EventList& nonconst_events() { return _events; } int colorIndex() const { return _colorIndex; } void setColorIndex(int idx) { _colorIndex = idx; } + bool hasClones() { return _prevClone!=this || _nextClone!=this; } + int nClones(); Part* prevClone() { return _prevClone; } Part* nextClone() { return _nextClone; } - void setPrevClone(Part* p) { _prevClone = p; } - void setNextClone(Part* p) { _nextClone = p; } + + void unchainClone(); + void chainClone(Part* p); // *this is made a sibling of p! p is not touched (except for its clone-chain), whereas this->events will get altered + void rechainClone(); // re-chains the part to the same clone chain it was unchained before // Returns combination of HiddenEventsType enum. virtual int hasHiddenEvents() = 0; @@ -118,7 +119,7 @@ class Part : public PosLen { // call this after hasHiddenEvents(). int cachedHasHiddenEvents() const { return _hiddenEvents; } - iEvent addEvent(Event& p); + iEvent addEvent(Event& p); // DEPRECATED. requires the part to be NOT a clone. FIXME remove! virtual void write(int, Xml&, bool isCopy = false, bool forceWavePaths = false) const; @@ -134,10 +135,12 @@ class MidiPart : public Part { public: MidiPart(MidiTrack* t) : Part((Track*)t) {} - MidiPart(MidiTrack* t, EventList* ev) : Part((Track*)t, ev) {} - MidiPart(const MidiPart& p); virtual ~MidiPart() {} - virtual MidiPart* clone() const; + virtual MidiPart* duplicate(); + virtual MidiPart* duplicateEmpty(); + virtual MidiPart* createNewClone(); + + MidiTrack* track() const { return (MidiTrack*)Part::track(); } // Returns combination of HiddenEventsType enum. int hasHiddenEvents(); @@ -154,13 +157,15 @@ class WavePart : public Part { // p3.3.31 AudioConvertMap _converters; - + public: WavePart(WaveTrack* t); WavePart(WaveTrack* t, EventList* ev); - WavePart(const WavePart& p); virtual ~WavePart() {} - virtual WavePart* clone() const; + virtual WavePart* duplicate(); + virtual WavePart* duplicateEmpty(); + virtual WavePart* createNewClone(); + WaveTrack* track() const { return (WaveTrack*)Part::track(); } // Returns combination of HiddenEventsType enum. int hasHiddenEvents(); @@ -191,10 +196,8 @@ class PartList : public std::multimap<int, Part*, std::less<unsigned> > { } }; -extern void chainClone(Part* p); extern void chainClone(Part* p1, Part* p2); extern void unchainClone(Part* p); -extern void replaceClone(Part* p1, Part* p2); extern void chainCheckErr(Part* p); extern void unchainTrackParts(Track* t, bool decRefCount); extern void chainTrackParts(Track* t, bool incRefCount); @@ -202,7 +205,6 @@ extern void addPortCtrlEvents(Part* part, bool doClones); extern void addPortCtrlEvents(Event& event, Part* part, bool doClones); extern void removePortCtrlEvents(Part* part, bool doClones); extern void removePortCtrlEvents(Event& event, Part* part, bool doClones); -extern Part* readXmlPart(Xml&, Track*, bool doClone = false, bool toTrack = true); } // namespace MusECore |