Changing active-state needs no color lookup
[ardour.git] / gtk2_ardour / hit.cc
index 257a3cd4f041ca94a9aaf91546ab7833bdd21b91..d750ed3f9d75a63750f9ead980e80e41e03dde14 100644 (file)
@@ -1,80 +1,57 @@
 /*
-    Copyright (C) 2007 Paul Davis
-    Author: Dave Robillard
-
-    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.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
+ * Copyright (C) 2013-2017 Paul Davis <paul@linuxaudiosystems.com>
+ * Copyright (C) 2014 David Robillard <d@drobilla.net>
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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<ArdourCanvas::Rect> bbox = _polygon->bounding_box ();
-       assert (bbox);
-       return bbox.get().x0;
-}
-
-Coord
-Hit::x1 () const
-{
-       boost::optional<ArdourCanvas::Rect> bbox = _polygon->bounding_box ();
-       assert (bbox);
-       return bbox.get().x1;
-}
-
-Coord
-Hit::y0 () const
+Hit::~Hit ()
 {
-       boost::optional<ArdourCanvas::Rect> bbox = _polygon->bounding_box ();
-       assert (bbox);
-       return bbox.get().y0;
+       delete _polygon;
 }
 
-Coord
-Hit::y1 () const
+void
+Hit::move_event (double dx, double dy)
 {
-       boost::optional<ArdourCanvas::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);
+}