diff options
Diffstat (limited to 'muse2/muse/part.h')
-rw-r--r-- | muse2/muse/part.h | 80 |
1 files changed, 40 insertions, 40 deletions
diff --git a/muse2/muse/part.h b/muse2/muse/part.h index 357ec1db..02056a2d 100644 --- a/muse2/muse/part.h +++ b/muse2/muse/part.h @@ -60,16 +60,13 @@ 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; int _sn; + int _clonemaster_sn; // the serial number of some clone in the chain. every member of the chain has the same value here. QString _name; bool _selected; @@ -78,22 +75,24 @@ 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(); - int sn() { return _sn; } - void setSn(int n) { _sn = n; } + virtual Part* duplicate() const; + virtual Part* duplicateEmpty() 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; } + int sn() const { return _sn; } 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,23 +101,26 @@ 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; } - Part* prevClone() { return _prevClone; } - Part* nextClone() { return _nextClone; } - void setPrevClone(Part* p) { _prevClone = p; } - void setNextClone(Part* p) { _nextClone = p; } + bool isCloneOf(const Part*) const; + bool hasClones() const { return _prevClone!=this || _nextClone!=this; } + int nClones() const; + Part* prevClone() const { return _prevClone; } // FINDMICHJETZT make it const Part*! + Part* nextClone() const { return _nextClone; } + Part* backupClone() const { return _backupClone; } + + 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; - // If repeated calls to hasHiddenEvents() are desired, then to avoid re-iteration of the event list, - // call this after hasHiddenEvents(). - int cachedHasHiddenEvents() const { return _hiddenEvents; } + virtual int hasHiddenEvents() 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 +136,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() const; + virtual MidiPart* duplicateEmpty() const; + virtual MidiPart* createNewClone() const; + + MidiTrack* track() const { return (MidiTrack*)Part::track(); } // Returns combination of HiddenEventsType enum. int hasHiddenEvents(); @@ -154,13 +158,14 @@ 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() const; + virtual WavePart* duplicateEmpty() const; + virtual WavePart* createNewClone() const; + WaveTrack* track() const { return (WaveTrack*)Part::track(); } // Returns combination of HiddenEventsType enum. int hasHiddenEvents(); @@ -182,7 +187,7 @@ class PartList : public std::multimap<int, Part*, std::less<unsigned> > { iPart findPart(unsigned tick); iPart add(Part*); void remove(Part* part); - int index(Part*); + int index(const Part*) const; Part* find(int idx); void clearDelete() { for (iPart i = begin(); i != end(); ++i) @@ -191,18 +196,13 @@ 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); +extern void unchainTrackParts(Track* t); +extern void chainTrackParts(Track* t); 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 |