Move control surface options into RC prefs editor. Remove Options menu.
[ardour.git] / gtk2_ardour / marker.cc
index 244079af41184e0a132dad87f9b16bc9f1c5af00..9bc475214ac24f2709942ef92a6f2f6e5135575f 100644 (file)
 */
 
 #include <sigc++/bind.h>
-#include <ardour/tempo.h>
+#include "ardour/tempo.h"
 
 #include "marker.h"
 #include "public_editor.h"
 #include "utils.h"
 #include "canvas_impl.h"
-#include "color.h"
+#include "ardour_ui.h"
+#include "simpleline.h"
 
 #include "i18n.h"
 
+using namespace std;
+using namespace ARDOUR;
+
 Marker::Marker (PublicEditor& ed, ArdourCanvas::Group& parent, guint32 rgba, const string& annotation, 
                Type type, nframes_t frame, bool handle_events)
 
-       : editor (ed), _type(type)
+       : editor (ed), _parent(&parent), _type(type)
 {
        double label_offset = 0;
        bool annotate_left = false;
@@ -241,19 +245,22 @@ Marker::Marker (PublicEditor& ed, ArdourCanvas::Group& parent, guint32 rgba, con
        mark->property_fill_color_rgba() = rgba;
        mark->property_outline_color_rgba() = rgba;
        mark->property_width_pixels() = 1;
-       Pango::FontDescription font = get_font_for_style (N_("MarkerText"));
-       
+       Pango::FontDescription* font = get_font_for_style (N_("MarkerText"));
+       //cerr << " font->get_size() = " << font->get_size() << " is_absolute = " << pango_font_description_get_size_is_absolute(font->gobj()) << " to_string = " << font->to_string() << endl;
        text = new Text (*group);
+       text->property_font_desc() = *font;
        text->property_text() = annotation.c_str();
-       text->property_font_desc() = font;
+
+       delete font;
+       
        if (annotate_left) {
-         text->property_x() = -(text->property_text_width());
+               text->property_x() = -(text->property_text_width());
        } else {
-         text->property_x() = label_offset;
+               text->property_x() = label_offset;
        }
        text->property_y() = 0.0;
        text->property_anchor() = Gtk::ANCHOR_NW;
-       text->property_fill_color_rgba() = color_map[cMarkerLabel];
+       text->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_MarkerLabel.get();
 
        editor.ZoomChanged.connect (mem_fun (*this, &Marker::reposition));
 
@@ -263,14 +270,73 @@ Marker::Marker (PublicEditor& ed, ArdourCanvas::Group& parent, guint32 rgba, con
                group->signal_event().connect (bind (mem_fun (editor, &PublicEditor::canvas_marker_event), mark, this));
        }
 
+       line = 0;
+
 }
 
+
 Marker::~Marker ()
 {
+       drop_references ();
+
        /* destroying the parent group destroys its contents, namely any polygons etc. that we added */
        delete text;
        delete mark;
        delete points;
+
+       delete line;
+       line = 0;
+}
+
+void Marker::reparent(ArdourCanvas::Group & parent)
+{
+       group->reparent(parent);
+       _parent = &parent;
+}
+
+
+void
+Marker::set_line_vpos (double pos, double height)
+{
+       if (line) {
+               line->property_y1() = pos;
+               line->property_y2() = pos + height;
+       }
+}
+
+void
+Marker::add_line (ArdourCanvas::Group* group, double y_origin, double initial_height)
+{
+       if (!line) {
+
+               line = new ArdourCanvas::SimpleLine (*group);
+               line->property_color_rgba() = ARDOUR_UI::config()->canvasvar_EditPoint.get();
+               line->property_x1() = unit_position + shift;
+               line->property_y1() = y_origin;
+               line->property_x2() = unit_position + shift;
+               line->property_y2() = y_origin + initial_height;
+
+               line->signal_event().connect (bind (mem_fun (editor, &PublicEditor::canvas_marker_event), mark, this));
+       }
+
+       show_line ();
+}
+
+void
+Marker::show_line ()
+{
+       if (line) {
+               line->raise_to_top();
+               line->show ();
+       }
+}
+
+void 
+Marker::hide_line ()
+{
+       if (line) {
+               line->hide ();
+       }
 }
 
 ArdourCanvas::Item&
@@ -296,6 +362,11 @@ Marker::set_position (nframes_t frame)
        group->move (new_unit_position - unit_position, 0.0);
        frame_position = frame;
        unit_position = new_unit_position;
+
+       if (line) {
+               line->property_x1() = unit_position + shift;
+               line->property_x2() = unit_position + shift;
+       }
 }
 
 void
@@ -320,6 +391,7 @@ void
 Marker::set_color_rgba (uint32_t color)
 {
        mark->property_fill_color_rgba() = color;
+       mark->property_outline_color_rgba() = color;
 }
 
 /***********************************************************************/