summaryrefslogtreecommitdiffstats
path: root/src/base/Staff.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/Staff.h')
-rw-r--r--src/base/Staff.h149
1 files changed, 149 insertions, 0 deletions
diff --git a/src/base/Staff.h b/src/base/Staff.h
new file mode 100644
index 0000000..ad06930
--- /dev/null
+++ b/src/base/Staff.h
@@ -0,0 +1,149 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _STAFF_H_
+#define _STAFF_H_
+
+#include "ViewElement.h"
+#include "Segment.h"
+
+#include <iostream>
+#include <cassert>
+
+namespace Rosegarden
+{
+
+class StaffObserver;
+
+/**
+ * Staff is the base class for classes which represent a Segment as an
+ * on-screen graphic. It manages the relationship between Segment/Event
+ * and specific implementations of ViewElement.
+ *
+ * The template argument T must be a subclass of ViewElement.
+ *
+ * Staff was formerly known as ViewElementsManager.
+ */
+class Staff : public SegmentObserver
+{
+public:
+ virtual ~Staff();
+
+ /**
+ * Create a new ViewElementList wrapping all Events in the
+ * segment, or return the previously created one
+ */
+ ViewElementList *getViewElementList();
+
+ /**
+ * Create a new ViewElementList wrapping Events in the
+ * [from, to[ interval, or return the previously created one
+ * (even if passed new arguments)
+ */
+ ViewElementList *getViewElementList(Segment::iterator from,
+ Segment::iterator to);
+
+ /**
+ * Return the Segment wrapped by this object
+ */
+ Segment &getSegment() { return m_segment; }
+
+ /**
+ * Return the Segment wrapped by this object
+ */
+ const Segment &getSegment() const { return m_segment; }
+
+ /**
+ * Return the location of the given event in this Staff
+ */
+ ViewElementList::iterator findEvent(Event *);
+
+ /**
+ * SegmentObserver method - called after the event has been added to
+ * the segment
+ */
+ virtual void eventAdded(const Segment *, Event *);
+
+ /**
+ * SegmentObserver method - called after the event has been removed
+ * from the segment, and just before it is deleted
+ */
+ virtual void eventRemoved(const Segment *, Event *);
+
+ /**
+ * SegmentObserver method - called after the segment's end marker
+ * time has been changed
+ */
+ virtual void endMarkerTimeChanged(const Segment *, bool shorten);
+
+ /**
+ * SegmentObserver method - called from Segment dtor
+ */
+ virtual void segmentDeleted(const Segment *);
+
+ void addObserver (StaffObserver *obs) { m_observers.push_back(obs); }
+ void removeObserver(StaffObserver *obs) { m_observers.remove(obs); }
+
+protected:
+ Staff(Segment &);
+ virtual ViewElement* makeViewElement(Event*) = 0;
+
+ /**
+ * Return true if the event should be wrapped
+ * Useful for piano roll where we only want to wrap notes
+ * (always true by default)
+ */
+ virtual bool wrapEvent(Event *);
+
+ void notifyAdd(ViewElement *) const;
+ void notifyRemove(ViewElement *) const;
+ void notifySourceDeletion() const;
+
+ //--------------- Data members ---------------------------------
+
+ Segment &m_segment;
+ ViewElementList *m_viewElementList;
+
+ typedef std::list<StaffObserver*> ObserverSet;
+ ObserverSet m_observers;
+
+private: // not provided
+ Staff(const Staff &);
+ Staff &operator=(const Staff &);
+};
+
+class StaffObserver
+{
+public:
+ virtual ~StaffObserver() {}
+ virtual void elementAdded(const Staff *, ViewElement *) = 0;
+ virtual void elementRemoved(const Staff *, ViewElement *) = 0;
+
+ /// called when the observed object is being deleted
+ virtual void staffDeleted(const Staff *) = 0;
+};
+
+
+
+}
+
+#endif
+