summaryrefslogtreecommitdiffstats
path: root/src/base/LayoutEngine.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/LayoutEngine.h')
-rw-r--r--src/base/LayoutEngine.h161
1 files changed, 161 insertions, 0 deletions
diff --git a/src/base/LayoutEngine.h b/src/base/LayoutEngine.h
new file mode 100644
index 0000000..179d119
--- /dev/null
+++ b/src/base/LayoutEngine.h
@@ -0,0 +1,161 @@
+// -*- 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 _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