1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
2 
3 /*
4     Rosegarden
5     A sequencer and musical notation editor.
6     Copyright 2000-2021 the Rosegarden development team.
7     See the AUTHORS file for more details.
8 
9     This program is free software; you can redistribute it and/or
10     modify it under the terms of the GNU General Public License as
11     published by the Free Software Foundation; either version 2 of the
12     License, or (at your option) any later version.  See the file
13     COPYING included with this distribution for more information.
14 */
15 
16 #ifndef RG_VIEW_SEGMENT_H
17 #define RG_VIEW_SEGMENT_H
18 
19 #include "ViewElement.h"
20 #include "base/Segment.h"
21 
22 #include <cassert>
23 
24 namespace Rosegarden
25 {
26 
27 class ViewSegmentObserver;
28 
29 /**
30  * ViewSegment is the base class for classes which represent a Segment as an
31  * on-screen graphic.  It manages the relationship between Segment/Event
32  * and specific implementations of ViewElement.
33  *
34  * ViewSegment was formerly known as Staff, and before that as
35  * ViewElementsManager.  It was renamed from Staff to ViewSegment to
36  * avoid confusion with classes that draw staff lines and other
37  * surrounding context.  All this does is manage the view elements.
38  */
39 class ViewSegment : public SegmentObserver
40 {
41 public:
42     ~ViewSegment() override;
43 
44     /**
45      * Create a new ViewElementList wrapping all Events in the
46      * segment, or return the previously created one
47      */
48     ViewElementList *getViewElementList();
49 
50     /**
51      * Return the Segment wrapped by this object
52      */
getSegment()53     Segment &getSegment() { return m_segment; }
54 
55     /**
56      * Return the Segment wrapped by this object
57      */
getSegment()58     const Segment &getSegment() const { return m_segment; }
59 
60     /**
61      * Return the location of the given event in this ViewSegment
62      */
63     ViewElementList::iterator findEvent(Event *);
64 
65     /**
66      * SegmentObserver method - called after the event has been added to
67      * the segment
68      */
69     void eventAdded(const Segment *, Event *) override;
70 
71     /**
72      * SegmentObserver method - called after the event has been removed
73      * from the segment, and just before it is deleted
74      */
75     void eventRemoved(const Segment *, Event *) override;
76 
77     /**
78      * SegmentObserver method - called after the segment's end marker
79      * time has been changed
80      */
81     void endMarkerTimeChanged(const Segment *, bool shorten) override;
82 
83     /**
84      * SegmentObserver method - called from Segment dtor
85      */
86     void segmentDeleted(const Segment *) override;
87 
addObserver(ViewSegmentObserver * obs)88     void addObserver   (ViewSegmentObserver *obs) { m_observers.push_back(obs); }
removeObserver(ViewSegmentObserver * obs)89     void removeObserver(ViewSegmentObserver *obs) { m_observers.remove(obs); }
90 
91 protected:
92     ViewSegment(Segment &);
93     virtual ViewElement* makeViewElement(Event*) = 0;
94 
95     /**
96      * Return true if the event should be wrapped
97      * Useful for piano roll where we only want to wrap notes
98      * (always true by default)
99      */
100     virtual bool wrapEvent(Event *);
101 
102     void notifyAdd(ViewElement *) const;
103     void notifyRemove(ViewElement *) const;
104     void notifySourceDeletion() const;
105 
106     //--------------- Data members ---------------------------------
107 
108     Segment &m_segment;
109     ViewElementList *m_viewElementList;
110 
111     typedef std::list<ViewSegmentObserver*> ObserverSet;
112     ObserverSet m_observers;
113 
114     bool m_modified;
115     timeT m_modStart;
116     timeT m_modEnd;
117 
118 private: // not provided
119     ViewSegment(const ViewSegment &);
120     ViewSegment &operator=(const ViewSegment &);
121 };
122 
123 class ViewSegmentObserver
124 {
125 public:
~ViewSegmentObserver()126     virtual ~ViewSegmentObserver() {}
127     virtual void elementAdded(const ViewSegment *, ViewElement *) = 0;
128     virtual void elementRemoved(const ViewSegment *, ViewElement *) = 0;
129 
130     /// called when the observed object is being deleted
131     virtual void viewSegmentDeleted(const ViewSegment *) = 0;
132 };
133 
134 
135 
136 }
137 
138 #endif
139 
140