You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
rosegarden/src/base/Staff.h

148 lines
3.9 KiB

/*
Rosegarden
A sequencer and musical notation editor.
This program is Copyright 2000-2008
Guillaume Laurent <glaurent@telegraph-road.org>,
Chris Cannam <cannam@all-day-breakfast.com>,
Richard Bown <bownie@bownie.com>
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