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