- unit_position -= shift;
-
- group = gnome_canvas_item_new (parent,
- gnome_canvas_group_get_type(),
- "x", unit_position,
- "y", 1.0,
- NULL);
-
- // cerr << "set mark al points, nc = " << points->num_points << endl;
- mark = gnome_canvas_item_new (GNOME_CANVAS_GROUP(group),
- gnome_canvas_polygon_get_type(),
- "points", points,
- "fill_color_rgba", rgba,
- "outline_color", "black",
- NULL);
-
- string fontname = get_font_for_style (N_("MarkerText"));
-
- text = gnome_canvas_item_new (GNOME_CANVAS_GROUP(group),
- gnome_canvas_text_get_type (),
- "text", annotation.c_str(),
- "x", label_offset,
- "y", 0.0,
- "font", fontname.c_str(),
- "anchor", GTK_ANCHOR_NW,
- "fill_color", "black",
- NULL);
-
- gtk_object_set_data (GTK_OBJECT(group), "marker", this);
- gtk_signal_connect (GTK_OBJECT(group), "event", (GtkSignalFunc) callback, &editor);
-
- editor.ZoomChanged.connect (mem_fun(*this, &Marker::reposition));
+ mark = new ArdourCanvas::Polygon (group);
+ CANVAS_DEBUG_NAME (mark, string_compose ("Marker::mark for %1", annotation));
+
+ mark->set (*points);
+ set_color_rgba (rgba);
+
+ /* setup name pixbuf sizes */
+ name_font = get_font_for_style (N_("MarkerText"));
+
+ Gtk::Label foo;
+
+ Glib::RefPtr<Pango::Layout> layout = foo.create_pango_layout (X_("Hg")); /* ascender + descender */
+ int width;
+
+ layout->set_font_description (name_font);
+ Gtkmm2ext::get_ink_pixel_size (layout, width, name_height);
+
+ _name_item = new ArdourCanvas::Text (group);
+ CANVAS_DEBUG_NAME (_name_item, string_compose ("ArdourMarker::_name_item for %1", annotation));
+ _name_item->set_font_description (name_font);
+ _name_item->set_color (RGBA_TO_UINT (0,0,0,255));
+ _name_item->set_position (ArdourCanvas::Duple (_label_offset, (marker_height - name_height - 1) * .5 ));
+
+ set_name (annotation.c_str());
+
+ editor.ZoomChanged.connect (sigc::mem_fun (*this, &ArdourMarker::reposition));
+
+ /* events will be handled by both the group and the mark itself, so
+ * make sure they can both be used to lookup this object.
+ */
+
+ group->set_data ("marker", this);
+ mark->set_data ("marker", this);
+
+ if (handle_events) {
+ group->Event.connect (sigc::bind (sigc::mem_fun (editor, &PublicEditor::canvas_marker_event), group, this));
+ }
+}
+
+ArdourMarker::~ArdourMarker ()
+{
+ CatchDeletion (this); /* EMIT SIGNAL */
+
+ /* destroying the parent group destroys its contents, namely any polygons etc. that we added */
+ delete group;
+ delete _track_canvas_line;
+}
+
+void ArdourMarker::reparent(ArdourCanvas::Container & parent)
+{
+ group->reparent (&parent);
+ _parent = &parent;
+}
+
+void
+ArdourMarker::set_selected (bool s)
+{
+ _selected = s;
+ setup_line ();
+}
+
+void
+ArdourMarker::set_show_line (bool s)
+{
+ _line_shown = s;
+ setup_line ();
+}
+
+void
+ArdourMarker::setup_line ()
+{
+ if (_shown && (_selected || _line_shown)) {
+
+ if (_track_canvas_line == 0) {
+
+ _track_canvas_line = new ArdourCanvas::Line (editor.get_hscroll_group());
+ _track_canvas_line->set_outline_color (UIConfiguration::instance().color ("edit point"));
+ _track_canvas_line->Event.connect (sigc::bind (sigc::mem_fun (editor, &PublicEditor::canvas_marker_event), group, this));
+ }
+
+ ArdourCanvas::Duple g = group->canvas_origin();
+ ArdourCanvas::Duple d = _track_canvas_line->canvas_to_item (ArdourCanvas::Duple (g.x + _shift, 0));
+
+ _track_canvas_line->set_x0 (d.x);
+ _track_canvas_line->set_x1 (d.x);
+ _track_canvas_line->set_y0 (d.y);
+ _track_canvas_line->set_y1 (ArdourCanvas::COORD_MAX);
+ _track_canvas_line->set_outline_color (_selected ? UIConfiguration::instance().color ("edit point") : _color);
+ _track_canvas_line->raise_to_top ();
+ _track_canvas_line->show ();
+
+ } else {
+ if (_track_canvas_line) {
+ _track_canvas_line->hide ();
+ }
+ }
+}
+
+void
+ArdourMarker::canvas_height_set (double h)
+{
+ _canvas_height = h;
+ setup_line ();