1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
// -*- c-basic-offset: 4 -*-
/*
Rosegarden-4
A sequencer and musical notation editor.
This program is Copyright 2000-2005
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 _LAYOUT_ENGINE_H_
#define _LAYOUT_ENGINE_H_
#include "RulerScale.h"
namespace Rosegarden {
class Staff;
class TimeSignature;
/**
* Base classes for layout engines. The intention is that
* different sorts of renderers (piano-roll, score etc) can be
* implemented by simply plugging different implementations
* of Staff and LayoutEngine into a single view class.
*/
class LayoutEngine
{
public:
LayoutEngine();
virtual ~LayoutEngine();
/**
* Resets internal data stores for all staffs
*/
virtual void reset() = 0;
/**
* Resets internal data stores for a specific staff.
*
* If startTime == endTime, act on the whole staff; otherwise only
* the given section.
*/
virtual void resetStaff(Staff &staff,
timeT startTime = 0,
timeT endTime = 0) = 0;
/**
* Precomputes layout data for a single staff, updating any
* internal data stores associated with that staff and updating
* any layout-related properties in the events on the staff's
* segment.
*
* If startTime == endTime, act on the whole staff; otherwise only
* the given section.
*/
virtual void scanStaff(Staff &staff,
timeT startTime = 0,
timeT endTime = 0) = 0;
/**
* Computes any layout data that may depend on the results of
* scanning more than one staff. This may mean doing most of
* the layout (likely for horizontal layout) or nothing at all
* (likely for vertical layout).
*
* If startTime == endTime, act on the whole staff; otherwise only
* the given section.
*/
virtual void finishLayout(timeT startTime = 0,
timeT endTime = 0) = 0;
unsigned int getStatus() const { return m_status; }
protected:
unsigned int m_status;
};
class HorizontalLayoutEngine : public LayoutEngine,
public RulerScale
{
public:
HorizontalLayoutEngine(Composition *c);
virtual ~HorizontalLayoutEngine();
/**
* Sets a page width for the layout.
*
* A layout implementation does not have to use this. Some might
* use it (for example) to ensure that bar lines fall precisely at
* the right-hand margin of each page. The computed x-coordinates
* will still require to be wrapped into lines by the staff or
* view implementation, however.
*
* A width of zero indicates no requirement for division into
* pages.
*/
virtual void setPageWidth(double) { /* default: ignore it */ }
/**
* Returns the number of the first visible bar line on the given
* staff
*/
virtual int getFirstVisibleBarOnStaff(Staff &) {
return getFirstVisibleBar();
}
/**
* Returns the number of the last visible bar line on the given
* staff
*/
virtual int getLastVisibleBarOnStaff(Staff &) {
return getLastVisibleBar();
}
/**
* Returns true if the specified bar has the correct length
*/
virtual bool isBarCorrectOnStaff(Staff &, int/* barNo */) {
return true;
}
/**
* Returns true if there is a new time signature in the given bar,
* setting timeSignature appropriately and setting timeSigX to its
* x-coord
*/
virtual bool getTimeSignaturePosition
(Staff &, int /* barNo */, TimeSignature &, double &/* timeSigX */) {
return 0;
}
};
class VerticalLayoutEngine : public LayoutEngine
{
public:
VerticalLayoutEngine();
virtual ~VerticalLayoutEngine();
// I don't think we need to add anything here for now
};
}
#endif
|