Fix ExportFormatSpecification copy-c'tor
[ardour.git] / gtk2_ardour / hit.cc
index a7d1a9b47b9212d381bcc4e31819538f3a4a8a32..41944eb3aff02f679cc66ee6272482dff822f4e0 100644 (file)
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
+#include "temporal/beats.h"
+
 #include "evoral/Note.hpp"
+
 #include "canvas/polygon.h"
-#include "midi_region_view.h"
-#include "public_editor.h"
-#include "utils.h"
+#include "canvas/debug.h"
+
 #include "hit.h"
 
 using namespace ARDOUR;
 using namespace ArdourCanvas;
 
-Hit::Hit (
-       MidiRegionView&                   region,
-       Group*                            group,
-       double                            /*size*/,
-       const boost::shared_ptr<NoteType> note,
-       bool with_events) 
+Hit::Hit (MidiRegionView& region, Item* parent, double size, const boost::shared_ptr<NoteType> note, bool with_events)
        : NoteBase (region, with_events, note)
 {
-       _polygon = new Polygon (group);
+       _polygon = new ArdourCanvas::Polygon (parent);
+       CANVAS_DEBUG_NAME (_polygon, "note");
        set_item (_polygon);
+       set_height (size);
 }
 
-void
-Hit::move_event (double dx, double dy)
-{
-       _polygon->move (Duple (dx, dy));
-}
-
-Coord
-Hit::x0 () const
-{
-       boost::optional<Rect> bbox = _polygon->bounding_box ();
-       assert (bbox);
-       return bbox.get().x0;
-}
-
-Coord
-Hit::x1 () const
+Hit::~Hit ()
 {
-       boost::optional<Rect> bbox = _polygon->bounding_box ();
-       assert (bbox);
-       return bbox.get().x1;
+       delete _polygon;
 }
 
-Coord
-Hit::y0 () const
-{
-       boost::optional<Rect> bbox = _polygon->bounding_box ();
-       assert (bbox);
-       return bbox.get().y0;
-}
-
-Coord
-Hit::y1 () const
+void
+Hit::move_event (double dx, double dy)
 {
-       boost::optional<Rect> bbox = _polygon->bounding_box ();
-       assert (bbox);
-       return bbox.get().y1;
+       Points points = _polygon->get();
+       Points moved;
+       for (Points::iterator p = points.begin(); p != points.end(); ++p) {
+               moved.push_back ((*p).translate (ArdourCanvas::Duple (dx, dy)));
+       }
+       _polygon->set (moved);
 }
 
 void
@@ -101,10 +78,32 @@ Hit::hide ()
        _polygon->hide ();
 }
 
+Points
+Hit::points(Distance height)
+{
+       /* draw a diamond */
+
+       Points p;
+
+       const double half_height = height/2.0;
+       p.push_back (Duple (-half_height, 0)); // left, middle
+       p.push_back (Duple (0, -half_height)); // top
+       p.push_back (Duple (+half_height, 0)); // right, middle
+       p.push_back (Duple (0, +half_height)); // bottom
+
+       return p;
+}
+
 void
-Hit::set_height (Distance /*height*/)
+Hit::set_height (Distance height)
+{
+       _polygon->set (points(height));
+}
+
+Duple
+Hit::position ()
 {
-       /* XXX */
+       return _polygon->position ();
 }
 
 void
@@ -112,3 +111,37 @@ Hit::set_position (Duple position)
 {
        _polygon->set_position (position);
 }
+
+Coord
+Hit::x0 () const
+{
+       /* left vertex */
+       return _polygon->position().x + _polygon->get()[0].x;
+}
+
+Coord
+Hit::x1 () const
+{
+       /* right vertex */
+       return _polygon->position().x + _polygon->get()[2].x;
+}
+
+Coord
+Hit::y0 () const
+{
+       /* top vertex */
+       return _polygon->position().y + _polygon->get()[1].y;
+}
+
+Coord
+Hit::y1 () const
+{
+       /* bottom vertex */
+       return _polygon->position().y + _polygon->get()[3].y;
+}
+
+void
+Hit::set_ignore_events (bool ignore)
+{
+       _polygon->set_ignore_events (ignore);
+}