summaryrefslogtreecommitdiffstats
path: root/src/base/RulerScale.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/RulerScale.h')
-rw-r--r--src/base/RulerScale.h166
1 files changed, 166 insertions, 0 deletions
diff --git a/src/base/RulerScale.h b/src/base/RulerScale.h
new file mode 100644
index 0000000..763ca13
--- /dev/null
+++ b/src/base/RulerScale.h
@@ -0,0 +1,166 @@
+
+/*
+ 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 _RULER_SCALE_H_
+#define _RULER_SCALE_H_
+
+#include "Event.h"
+
+namespace Rosegarden {
+
+class Composition;
+
+/**
+ * RulerScale is a base for classes that may be queried in order to
+ * discover the correct x-coordinates for bar lines and bar
+ * subdivisions.
+ *
+ * RulerScale does not contain any methods that relate bar numbers
+ * to times, time signature or duration -- those are in Composition.
+ *
+ * The methods in RulerScale should return extrapolated (but valid)
+ * results even when passed a bar number outside the theoretically
+ * visible or existant bar range.
+ *
+ * Apart from getBarPosition, every method in this class has a
+ * default implementation, which should work correctly provided
+ * the subclass maintains spacing proportional to time within a
+ * bar, but which may not be an efficient implementation for any
+ * given subclass.
+ *
+ * (Potential to-do: At the moment all our RulerScales are used in
+ * contexts where spacing proportional to time within a bar is the
+ * only interpretation that makes sense, so this is okay. In
+ * theory though we should probably subclass out these "default"
+ * implementations into an intermediate abstract class.)
+ */
+
+class RulerScale
+{
+public:
+ virtual ~RulerScale();
+ Composition *getComposition() const { return m_composition; }
+
+ /**
+ * Return the number of the first visible bar.
+ */
+ virtual int getFirstVisibleBar() const;
+
+ /**
+ * Return the number of the last visible bar. (The last
+ * visible bar_line_ will be at the end of this bar.)
+ */
+ virtual int getLastVisibleBar() const;
+
+ /**
+ * Return the x-coordinate at which bar number n starts.
+ */
+ virtual double getBarPosition(int n) const = 0;
+
+ /**
+ * Return the width of bar number n.
+ */
+ virtual double getBarWidth(int n) const;
+
+ /**
+ * Return the width of each beat subdivision in bar n.
+ */
+ virtual double getBeatWidth(int n) const;
+
+ /**
+ * Return the number of the bar containing the given x-coord.
+ */
+ virtual int getBarForX(double x) const;
+
+ /**
+ * Return the nearest time value to the given x-coord.
+ */
+ virtual timeT getTimeForX(double x) const;
+
+ /**
+ * Return the x-coord corresponding to the given time value.
+ */
+ virtual double getXForTime(timeT time) const;
+
+ /**
+ * Return the duration corresponding to the given delta-x
+ * starting at the given x-coord.
+ */
+ virtual timeT getDurationForWidth(double x, double width) const;
+
+ /**
+ * Return the width corresponding to the given duration
+ * starting at the given time.
+ */
+ virtual double getWidthForDuration(timeT startTime, timeT duration) const;
+
+ /**
+ * Return the width of the entire scale.
+ */
+ virtual double getTotalWidth() const;
+
+protected:
+ RulerScale(Composition *c);
+ Composition *m_composition;
+};
+
+
+/**
+ * SimpleRulerScale is an implementation of RulerScale that maintains
+ * a strict proportional correspondence between x-coordinate and time.
+ */
+
+class SimpleRulerScale : public RulerScale
+{
+public:
+ /**
+ * Construct a SimpleRulerScale for the given Composition, with a
+ * given origin and x-coord/time ratio. (For example, a ratio of
+ * 10 means that one pixel equals 10 time units.)
+ */
+ SimpleRulerScale(Composition *composition,
+ double origin, double unitsPerPixel);
+ virtual ~SimpleRulerScale();
+
+ double getOrigin() const { return m_origin; }
+ void setOrigin(double origin) { m_origin = origin; }
+
+ double getUnitsPerPixel() const { return m_ratio; }
+ void setUnitsPerPixel(double ratio) { m_ratio = ratio; }
+
+ virtual double getBarPosition(int n) const;
+ virtual double getBarWidth(int n) const;
+ virtual double getBeatWidth(int n) const;
+ virtual int getBarForX(double x) const;
+ virtual timeT getTimeForX(double x) const;
+ virtual double getXForTime(timeT time) const;
+
+protected:
+ double m_origin;
+ double m_ratio;
+
+private:
+ SimpleRulerScale(const SimpleRulerScale &ruler);
+ SimpleRulerScale &operator=(const SimpleRulerScale &ruler);
+};
+
+}
+
+#endif