diff --git a/gtk2_ardour/marker.cc b/gtk2_ardour/marker.cc index 1ecc1cdf37..c714148d0b 100644 --- a/gtk2_ardour/marker.cc +++ b/gtk2_ardour/marker.cc @@ -17,6 +17,7 @@ */ +#include #include #include @@ -56,37 +57,214 @@ using namespace Gtkmm2ext; PBD::Signal1 Marker::CatchDeletion; const double Marker::_marker_height = 17.0; -const char * Marker::default_new_marker_prefix = N_("MARKER"); +const char * Marker::default_new_marker_prefix = N_("Marker"); static const double name_padding = 10.0; -Marker::Marker (PublicEditor& ed, ArdourCanvas::Container& parent, guint32 rgba, const string& annotation, - Type type, framepos_t start_pos, bool handle_events, framepos_t end_pos) +RulerMarker::RulerMarker (PublicEditor& editor, ArdourCanvas::Container& parent, double height, guint32 rgba, const std::string& text, + framepos_t start, framepos_t end) + : RangeMarker (editor, parent, height, rgba, text, start, end) +{ + /* make sure we call our own color stuff, since we look different */ + + set_color_rgba (rgba); +} + +void +RulerMarker::set_color_rgba (uint32_t rgba) +{ + Marker::set_color_rgba (rgba); + + /* unset the effects of RangeMarker::set_color_rgba () */ + + _name_background->set_pattern (Cairo::RefPtr ()); + + /* Create a linear gradient that goes from full opacity to totally transparent + across the height of the marker + */ + + ArdourCanvas::Color normal (_color); + int r, g, b; + UINT_TO_RGB(rgba, &r, &g, &b); + ArdourCanvas::Color transparent = ArdourCanvas::rgba_to_color (r, g, b, 0.0); + + ArdourCanvas::Fill::StopList stops; + stops.push_back (make_pair (0.0, normal)); + stops.push_back (make_pair (1.0, transparent)); + _name_background->set_gradient (stops, true); + + /* set end line correctly, also */ + + if (_end_line) { + _end_line->set_outline_color (_color); + } +} + +RangeMarker::RangeMarker (PublicEditor& editor, ArdourCanvas::Container& parent, double height, guint32 rgba, const std::string& text, + framepos_t start, framepos_t end) + : Marker (editor, parent, height, rgba, text, Range, start, true) + , _end_frame (end) + , _end_line (0) +{ + assert (start < end); + + /* Marker::Marker calls these but will not have used our versions since it is a constructor. + */ + + set_position (frame_position); + setup_line (); + set_color_rgba (rgba); + setup_name_display (); +} + +RangeMarker::~RangeMarker () +{ + delete _end_line; +} + +void +RangeMarker::set_color_rgba (uint32_t rgba) +{ + Marker::set_color_rgba (rgba); + + double dimen = _height * 2.0; + + Cairo::RefPtr surface = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, dimen, dimen); + Cairo::RefPtr context = Cairo::Context::create (surface); + + /* make a darker version of the color */ + + double h, s, v; + ArdourCanvas::color_to_hsv (_color, h, s, v); + s *= 1.2; + v *= 1.2; + ArdourCanvas::Color darker = ArdourCanvas::hsv_to_color (h, s, v, 1.0); + + /* fill background with transparent version of color */ + ArdourCanvas::set_source_rgba (context, darker); + context->rectangle (0.0, 0.0, dimen, dimen); + context->fill (); + + /* now draw lines */ + + ArdourCanvas::set_source_rgba (context, _color); + const double line_width = 2.0; + context->set_line_width (line_width); + + const double d = line_width / (cos ((45.0 / 360.0) * (M_PI * 2.0))); + + for (double p = d; p < (dimen * 3.0); p += (2.0 * d)) { + context->move_to (p, 0); + context->line_to (0, p); + context->stroke (); + } + + /* and assign pattern to the background rect */ + + Cairo::RefPtr pattern = Cairo::SurfacePattern::create (surface); + pattern->set_extend (Cairo::EXTEND_REPEAT); + _name_background->set_pattern (pattern); + + /* set end line correctly, also */ + + if (_end_line) { + _end_line->set_outline_color (_color); + } + + if (_name_item) { + /* black text */ + _name_item->set_color (ArdourCanvas::rgba_to_color (0.0, 0.0, 0.0, 1.0)); + } +} + +void +RangeMarker::set_position (framepos_t frame) +{ + Marker::set_position (frame); + double pixel_width = editor.sample_to_pixel (_end_frame - frame_position); + _name_background->set_x1 (_name_background->x0() + pixel_width); + if (_name_item) { + _name_item->clamp_width (pixel_width - _label_offset); + } + setup_line (); +} + +void +RangeMarker::setup_line () +{ + Marker::setup_line (); + + if (!_end_line) { + _end_line = new ArdourCanvas::Line (editor.get_hscroll_group()); + /* these never change - they cause the line to span from the bottom + edge of the marker rectangle to the absolute lowest possible + canvas coordinate. + */ + _end_line->set_y0 (_height); + _end_line->set_y1 (ArdourCanvas::COORD_MAX); + } + + /* line at the end (the start line is handled by Marker */ + + /* lines in a different canvas (scroll)group so we have to convert the position + into a different coordinate system. + */ + + ArdourCanvas::Duple g = group->canvas_origin(); + ArdourCanvas::Duple d = _end_line->canvas_to_item (ArdourCanvas::Duple (g.x + _shift + _name_background->x1(), 0)); + + _end_line->set_x0 (d.x); + _end_line->set_x1 (d.x); + _end_line->set_outline_color (_color); + _end_line->show (); +} + +void +RangeMarker::setup_name_display () +{ + /* No need to adjust name background size here, since it is always the same */ + + if (_name.empty()) { + if (_name_item) { + _name_item->hide (); + } + } else { + + if (!_name_item) { + _name_item = new ArdourCanvas::Text (group); + CANVAS_DEBUG_NAME (_name_item, string_compose ("Marker::_name_item for %1", _name)); + _name_item->set_font_description (name_font); + } + + _name_item->show (); + _name_item->set_x_position (_label_offset); + /* Limit text to width of background rect */ + _name_item->clamp_width (_name_background->get().width()); + _name_item->set (_name); + } +} + +Marker::Marker (PublicEditor& ed, ArdourCanvas::Container& parent, double height, guint32 rgba, const string& annotation, + Type type, framepos_t start_pos, bool handle_events) : editor (ed) , _parent (&parent) , group (0) , mark (0) , _name_item (0) - , _track_canvas_line (0) + , _start_line (0) , _scene_change_rect (0) , _scene_change_text (0) , frame_position (start_pos) - , end_frame (end_pos) , _type (type) - , _selected (false) + , _height (height) , _shown (false) - , _line_shown (false) , _color (rgba) , _left_label_limit (DBL_MAX) , _right_label_limit (DBL_MAX) , _label_offset (0) , _have_scene_change (false) { - if (end_frame >= 0 && (end_frame < frame_position)) { - swap (end_frame, frame_position); - } - unit_position = editor.sample_to_pixel (frame_position); unit_position -= _shift; @@ -95,54 +273,31 @@ Marker::Marker (PublicEditor& ed, ArdourCanvas::Container& parent, guint32 rgba, _name_background = new ArdourCanvas::Rectangle (group); CANVAS_DEBUG_NAME (_name_background, string_compose ("Marker::_name_background for %1", annotation)); + /* x-coordinates will be set elsewhere */ + _name_background->set_y0 (0.0); + _name_background->set_y1 (_height - 1.0); - if (!ARDOUR::Profile->get_trx()) { - add_polygon (type); - CANVAS_DEBUG_NAME (mark, string_compose ("Marker::mark for %1", annotation)); - } else { - _label_offset = name_padding; - } + _label_offset = name_padding; - set_color_rgba (rgba); - - if (type == Mark || type == Skip) { - _line_shown = true; - } - /* setup name pixbuf sizes */ - name_font = Pango::FontDescription (ARDOUR_UI::config()->get_canvasvar_SmallFont()); - + name_font = Pango::FontDescription (ARDOUR_UI::config()->get_canvasvar_SmallBoldFont()); Gtk::Label foo; - Glib::RefPtr 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 ("Marker::_name_item for %1", annotation)); - _name_item->set_font_description (name_font); - /* white with 95% opacity */ - _name_item->set_color (ArdourCanvas::rgba_to_color (1.0,1.0,1.0,0.95)); - _name_item->set_position (ArdourCanvas::Duple (_label_offset, (_marker_height / 2.0) - (name_height / 2.0))); - - set_name (annotation.c_str()); - editor.ZoomChanged.connect (sigc::mem_fun (*this, &Marker::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); - if (mark) { - mark->set_data ("marker", this); - } - if (handle_events) { + /* events will be handled by both the group, make sure it can be used to lookup this object. + */ + group->set_data ("marker", this); group->Event.connect (sigc::bind (sigc::mem_fun (editor, &PublicEditor::canvas_marker_event), group, this)); } + + set_name (annotation); + set_color_rgba (rgba); } Marker::~Marker () @@ -151,180 +306,7 @@ Marker::~Marker () /* destroying the parent group destroys its contents, namely any polygons etc. that we added */ delete group; - delete _track_canvas_line; -} - -void -Marker::add_polygon (Type type) -{ - boost::scoped_ptr points (new ArdourCanvas::Points()); - - /* Shapes we use: - - Mark: - - (0,0) -> (6,0) - ^ | - | V - (0,5) (6,5) - \ / - (3,_marker_height) - - - TempoMark: - MeterMark: - - (3,0) - / \ - (0,5) -> (6,5) - ^ | - | V - (0,10)<-(6,10) - - - Start: - - 0,0\ - | \ - | \ 6,6 - | / - | / - 0,12 - - End: - - /12,0 - / | - / | - 6,6 | - \ | - \ | - \ | - 12,12 - - PunchIn: - - 0,0 ------> _marker_height,0 - | / - | / - | / - | / - | / - | / - 0,_marker_height - - PunchOut - - 0,0 -->-_marker_height,0 - \ | - \ | - \ | - \ | - \ | - \ | - _marker_height,_marker_height - - - */ - - switch (type) { - case Skip: - /*NOTREACHED*/ - break; - - case Mark: - points->push_back (ArdourCanvas::Duple (0.0, 0.0)); - points->push_back (ArdourCanvas::Duple (6.0, 0.0)); - points->push_back (ArdourCanvas::Duple (6.0, 5.0)); - points->push_back (ArdourCanvas::Duple (3.0, _marker_height)); - points->push_back (ArdourCanvas::Duple (0.0, 5.0)); - points->push_back (ArdourCanvas::Duple (0.0, 0.0)); - - _shift = 3; - _label_offset = 8.0; - break; - - case Tempo: - case Meter: - - points->push_back (ArdourCanvas::Duple (3.0, 0.0)); - points->push_back (ArdourCanvas::Duple (6.0, 5.0)); - points->push_back (ArdourCanvas::Duple (6.0, 10.0)); - points->push_back (ArdourCanvas::Duple (0.0, 10.0)); - points->push_back (ArdourCanvas::Duple (0.0, 5.0)); - points->push_back (ArdourCanvas::Duple (3.0, 0.0)); - - _shift = 3; - _label_offset = 8.0; - break; - - case SessionStart: - case RangeStart: - - points->push_back (ArdourCanvas::Duple (0.0, 0.0)); - points->push_back (ArdourCanvas::Duple (6.5, 6.5)); - points->push_back (ArdourCanvas::Duple (0.0, _marker_height)); - points->push_back (ArdourCanvas::Duple (0.0, 0.0)); - - _shift = 0; - _label_offset = _marker_height; - break; - - case SessionEnd: - case RangeEnd: - points->push_back (ArdourCanvas::Duple (6.5, 6.5)); - points->push_back (ArdourCanvas::Duple (_marker_height, 0.0)); - points->push_back (ArdourCanvas::Duple (_marker_height, _marker_height)); - points->push_back (ArdourCanvas::Duple (6.5, 6.5)); - - _shift = _marker_height; - _label_offset = 6.0; - break; - - case LoopStart: - points->push_back (ArdourCanvas::Duple (0.0, 0.0)); - points->push_back (ArdourCanvas::Duple (_marker_height, _marker_height)); - points->push_back (ArdourCanvas::Duple (0.0, _marker_height)); - points->push_back (ArdourCanvas::Duple (0.0, 0.0)); - - _shift = 0; - _label_offset = 12.0; - break; - - case LoopEnd: - points->push_back (ArdourCanvas::Duple (_marker_height, 0.0)); - points->push_back (ArdourCanvas::Duple (_marker_height, _marker_height)); - points->push_back (ArdourCanvas::Duple (0.0, _marker_height)); - points->push_back (ArdourCanvas::Duple (_marker_height, 0.0)); - - _shift = _marker_height; - _label_offset = 0.0; - break; - - case PunchIn: - points->push_back (ArdourCanvas::Duple (0.0, 0.0)); - points->push_back (ArdourCanvas::Duple (_marker_height, 0.0)); - points->push_back (ArdourCanvas::Duple (0.0, _marker_height)); - points->push_back (ArdourCanvas::Duple (0.0, 0.0)); - - _shift = 0; - _label_offset = _marker_height; - break; - - case PunchOut: - points->push_back (ArdourCanvas::Duple (0.0, 0.0)); - points->push_back (ArdourCanvas::Duple (12.0, 0.0)); - points->push_back (ArdourCanvas::Duple (12.0, 12.0)); - points->push_back (ArdourCanvas::Duple (0.0, 0.0)); - - _shift = _marker_height; - _label_offset = 0.0; - break; - - } - - mark = new ArdourCanvas::Polygon (group); - mark->set (*points); + delete _start_line; } void Marker::reparent(ArdourCanvas::Container & parent) @@ -333,59 +315,30 @@ void Marker::reparent(ArdourCanvas::Container & parent) _parent = &parent; } -void -Marker::set_selected (bool s) -{ - _selected = s; - setup_line (); -} - -void -Marker::set_show_line (bool s) -{ - _line_shown = s; - setup_line (); -} - void Marker::setup_line () { - if ((Profile->get_trx() && (_type == Skip || _type == Mark)) || -(_shown && ((!Profile->get_trx() && _selected) || _line_shown))) { + if (_start_line == 0) { + _start_line = new ArdourCanvas::Line (editor.get_hscroll_group()); + _start_line->Event.connect (sigc::bind (sigc::mem_fun (editor, &PublicEditor::canvas_marker_event), group, this)); + _start_line->set_y0 (_height); + _start_line->set_y1 (ArdourCanvas::COORD_MAX); + } - if (_track_canvas_line == 0) { - - _track_canvas_line = new ArdourCanvas::Line (editor.get_hscroll_group()); - _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 (_marker_height); - _track_canvas_line->set_y1 (ArdourCanvas::COORD_MAX); - if (ARDOUR::Profile->get_trx()) { - _track_canvas_line->set_outline_color (_color); - } else { - _track_canvas_line->set_outline_color (_selected ? ARDOUR_UI::config()->get_canvasvar_EditPoint() : _color); - } - _track_canvas_line->raise_to_top (); - _track_canvas_line->show (); - - } else { - if (_track_canvas_line) { - _track_canvas_line->hide (); - } - } -} - -void -Marker::canvas_height_set (double h) -{ - _canvas_height = h; - setup_line (); + /* lines in a different canvas (scroll)group so we have to convert the position + into a different coordinate system. + */ + + ArdourCanvas::Duple g = group->canvas_origin(); + ArdourCanvas::Duple d = _start_line->canvas_to_item (ArdourCanvas::Duple (g.x + _shift, _height)); + + _start_line->set_y0 (d.y); + _start_line->set_y1 (ArdourCanvas::COORD_MAX); + + _start_line->set_x0 (d.x); + _start_line->set_x1 (d.x); + _start_line->set_outline_color (_color); + _start_line->show (); } ArdourCanvas::Item& @@ -412,120 +365,98 @@ Marker::label_on_left () const void Marker::setup_name_display () { - double limit = DBL_MAX; + double limit = _left_label_limit; + + if (_name.empty()) { - if (label_on_left ()) { - limit = _left_label_limit; - } else { - limit = _right_label_limit; - } - - /* Work out how wide the name can be */ - int name_width; - string text = _name; - int scene_change_width = 0.0; - - if (_have_scene_change) { - - /* coordinates of rect that will surround "MIDI" */ - - ArdourCanvas::Rect r; - int midi_height; - - pixel_size (X_("MIDI"), name_font, name_width, midi_height); - - r.x0 = 2.0; - r.x1 = r.x1 + name_width + 7.0; - - if (_scene_change_text == 0) { - _scene_change_rect = new ArdourCanvas::Rectangle (group); - _scene_change_text = new ArdourCanvas::Text (group); - /* move name label over */ - _label_offset += r.x1; + if (_name_item) { + _name_item->hide (); } - - /* white with 95% opacity */ - _scene_change_rect->set_outline_color (ArdourCanvas::rgba_to_color (1.0, 1.0, 1.0, 0.95)); - _scene_change_rect->set_fill (false); + + _name_background->set_x0 (0); + _name_background->set_x1 (10); - _scene_change_text->set_font_description (name_font); - _scene_change_text->set_color (ArdourCanvas::rgba_to_color (1.0, 1.0, 1.0, 0.95)); - _scene_change_text->set (X_("MIDI")); + return; + + } else { + + int name_width; + int scene_change_width = 0; + + if (!_name_item) { + _name_item = new ArdourCanvas::Text (group); + CANVAS_DEBUG_NAME (_name_item, string_compose ("Marker::_name_item for %1", _name)); + _name_item->set_font_description (name_font); + /* white with 95% opacity */ + _name_item->set_color (ArdourCanvas::rgba_to_color (1.0,1.0,1.0,0.95)); + } + + if (_have_scene_change) { + + /* coordinates of rect that will surround "MIDI" */ + + ArdourCanvas::Rect r; + int midi_height; + + pixel_size (X_("MIDI"), name_font, name_width, midi_height); + + r.x0 = 2.0; + r.x1 = r.x1 + name_width + 7.0; + + if (_scene_change_text == 0) { + _scene_change_rect = new ArdourCanvas::Rectangle (group); + _scene_change_text = new ArdourCanvas::Text (group); + /* move name label over */ + _label_offset += r.x1; + } + + /* white with 95% opacity */ + _scene_change_rect->set_outline_color (ArdourCanvas::rgba_to_color (1.0, 1.0, 1.0, 0.95)); + _scene_change_rect->set_fill (false); + + _scene_change_text->set_font_description (name_font); + _scene_change_text->set_color (ArdourCanvas::rgba_to_color (1.0, 1.0, 1.0, 0.95)); + _scene_change_text->set (X_("MIDI")); + + /* 4 pixels left margin, place it in the vertical middle. + */ + _scene_change_text->set_position (ArdourCanvas::Duple (4.0, (_height / 2.0) - (name_height / 2.0))); + + r.y0 = _scene_change_text->position().y - 2.0; + r.y1 = r.y0 + name_height + 4.0; + + _scene_change_rect->set (r); + scene_change_width = r.x1; - /* 4 pixels left margin, place it in the vertical middle. - */ - _scene_change_text->set_position (ArdourCanvas::Duple (4.0, (_marker_height / 2.0) - (name_height / 2.0))); - - r.y0 = _scene_change_text->position().y - 2.0; - r.y1 = r.y0 + name_height + 4.0; - - _scene_change_rect->set (r); - scene_change_width = r.x1; - - } else { - if (_scene_change_text) { - delete _scene_change_text; - delete _scene_change_rect; - _scene_change_text = 0; - _scene_change_rect = 0; - } - } - - if (ARDOUR::Profile->get_trx()) { - name_width = min ((double) pixel_width (_name, name_font) + (2 * name_padding), limit); - } else { - name_width = min ((double) pixel_width (_name, name_font) + 2, limit); - } - if (name_width == 0) { - _name_item->hide (); - } else { - _name_item->show (); - - if (ARDOUR::Profile->get_trx()) { - _name_item->set_x_position (_label_offset); } else { - if (label_on_left ()) { - _name_item->set_x_position (-name_width); + if (_scene_change_text) { + delete _scene_change_text; + delete _scene_change_rect; + _scene_change_text = 0; + _scene_change_rect = 0; } } - + + double name_text_width = pixel_width (_name, name_font); + + name_width = min ((name_text_width + (2.0 * name_padding)), limit); + _name_item->show (); + _name_item->set_position (ArdourCanvas::Duple (_label_offset, (_height / 2.0) - (name_height / 2.0))); _name_item->clamp_width (name_width); _name_item->set (_name); - - if (_type == Skip) { - - /* fully span the extent between frame_position + end_frame */ - _name_background->set_x0 (_name_item->position().x - _label_offset); - _name_background->set_x1 (_name_background->x0() + editor.sample_to_pixel (end_frame - frame_position)); - - } else { - if (ARDOUR::Profile->get_trx()) { - _name_background->set_x0 (_name_item->position().x - _label_offset); - _name_background->set_x1 (_name_item->position().x - _label_offset + name_width + scene_change_width); - } else { - if (label_on_left ()) { - _name_background->set_x0 (_name_item->position().x - 2); - _name_background->set_x1 (_name_item->position().x + name_width + _shift + scene_change_width); - } else { - _name_background->set_x0 (_name_item->position().x - _label_offset + 2); - _name_background->set_x1 (_name_item->position().x + name_width + scene_change_width); - } - } - } + _name_background->set_x0 (_name_item->position().x - _label_offset); + _name_background->set_x1 (_name_background->x0() + name_width + scene_change_width); } - - _name_background->set_y0 (0); - _name_background->set_y1 (_marker_height + 1.0); } void Marker::set_position (framepos_t frame) { - unit_position = editor.sample_to_pixel (frame) - _shift; + frame_position = frame; + unit_position = editor.sample_to_pixel (frame_position) - _shift; group->set_x_position (unit_position); setup_line (); - frame_position = frame; } void @@ -562,16 +493,16 @@ Marker::set_color_rgba (uint32_t c) mark->set_outline_color (_color); } - if (_track_canvas_line && !_selected) { - _track_canvas_line->set_outline_color (_color); + if (_start_line) { + _start_line->set_outline_color (_color); } - _name_background->set_fill (true); - _name_background->set_fill_color (UINT_RGBA_CHANGE_A (_color, 0x70)); - /* white with 20% opacity */ - _name_background->set_outline_color (ArdourCanvas::rgba_to_color (1.0, 1.0, 1.0, 0.20)); - - if (ARDOUR::Profile->get_trx()) { + if (_name_background) { + _name_background->set_fill (true); + _name_background->set_fill_color (_color); + /* white with 20% opacity */ + _name_background->set_outline_color (ArdourCanvas::rgba_to_color (1.0, 1.0, 1.0, 0.20)); + _name_background->set_outline_what (ArdourCanvas::Rectangle::What (ArdourCanvas::Rectangle::TOP| ArdourCanvas::Rectangle::LEFT| ArdourCanvas::Rectangle::RIGHT)); @@ -582,8 +513,8 @@ Marker::set_color_rgba (uint32_t c) void Marker::set_left_label_limit (double p) { - /* Account for the size of the marker */ - _left_label_limit = p - _marker_height; + _left_label_limit = p; + if (_left_label_limit < 0) { _left_label_limit = 0; } @@ -597,8 +528,8 @@ Marker::set_left_label_limit (double p) void Marker::set_right_label_limit (double p) { - /* Account for the size of the marker */ - _right_label_limit = p - _marker_height; + _right_label_limit = p; + if (_right_label_limit < 0) { _right_label_limit = 0; } @@ -619,7 +550,7 @@ Marker::set_has_scene_change (bool yn) TempoMarker::TempoMarker (PublicEditor& editor, ArdourCanvas::Container& parent, guint32 rgba, const string& text, ARDOUR::TempoSection& temp) - : Marker (editor, parent, rgba, text, Tempo, 0, false), + : Marker (editor, parent, Marker::marker_height(), rgba, text, Tempo, 0, false), _tempo (temp) { set_position (_tempo.frame()); @@ -634,7 +565,7 @@ TempoMarker::~TempoMarker () MeterMarker::MeterMarker (PublicEditor& editor, ArdourCanvas::Container& parent, guint32 rgba, const string& text, ARDOUR::MeterSection& m) - : Marker (editor, parent, rgba, text, Meter, 0, false), + : Marker (editor, parent, Marker::marker_height(), rgba, text, Meter, 0, false), _meter (m) { set_position (_meter.frame()); diff --git a/gtk2_ardour/marker.h b/gtk2_ardour/marker.h index 43f103bd85..1adadcffe7 100644 --- a/gtk2_ardour/marker.h +++ b/gtk2_ardour/marker.h @@ -53,12 +53,12 @@ class Marker : public sigc::trackable LoopEnd, PunchIn, PunchOut, - Skip, + Range, }; - Marker (PublicEditor& editor, ArdourCanvas::Container &, guint32 rgba, const std::string& text, Type, - framepos_t frame = 0, bool handle_events = true, framepos_t end_frame = -1); + Marker (PublicEditor& editor, ArdourCanvas::Container &, double height, guint32 rgba, const std::string& text, Type, + framepos_t frame = 0, bool handle_events = true); virtual ~Marker (); @@ -66,16 +66,12 @@ class Marker : public sigc::trackable ArdourCanvas::Item& the_item() const; - void set_selected (bool); - void set_show_line (bool); - void canvas_height_set (double); - void set_has_scene_change (bool); - void set_position (framepos_t); void set_name (const std::string&); - void set_color_rgba (uint32_t rgba); - void setup_line (); + + virtual void set_position (framepos_t); + virtual void set_color_rgba (uint32_t rgba); framepos_t position() const { return frame_position; } @@ -110,7 +106,7 @@ class Marker : public sigc::trackable ArdourCanvas::Container *group; ArdourCanvas::Polygon *mark; ArdourCanvas::Text *_name_item; - ArdourCanvas::Line* _track_canvas_line; + ArdourCanvas::Line* _start_line; ArdourCanvas::Rectangle* _name_background; ArdourCanvas::Rectangle* _scene_change_rect; ArdourCanvas::Text* _scene_change_text; @@ -118,14 +114,11 @@ class Marker : public sigc::trackable std::string _name; double unit_position; framepos_t frame_position; - framepos_t end_frame; double _shift; Type _type; int name_height; - bool _selected; bool _shown; - bool _line_shown; - double _canvas_height; + double _height; uint32_t _color; double _left_label_limit; ///< the number of pixels available to the left of this marker for a label double _right_label_limit; ///< the number of pixels available to the right of this marker for a label @@ -133,17 +126,47 @@ class Marker : public sigc::trackable bool _have_scene_change; void reposition (); - void setup_line_x (); - void setup_name_display (); + virtual void setup_name_display (); + virtual void setup_line (); + + static const double _marker_height; private: /* disallow copy construction */ Marker (Marker const &); Marker & operator= (Marker const &); +}; - void add_polygon (Type); +/** A Marker that displays a range (start+end) rather than a single location + */ +class RangeMarker : public Marker +{ + public: + RangeMarker (PublicEditor& editor, ArdourCanvas::Container &, double height, guint32 rgba, const std::string& text, + framepos_t start, framepos_t end); + ~RangeMarker (); + + void setup_name_display (); + void set_color_rgba (uint32_t rgba); + void set_position (framepos_t); + void setup_line (); - static const double _marker_height; + protected: + framepos_t _end_frame; + ArdourCanvas::Line* _end_line; + Cairo::RefPtr _pattern; +}; + +/** A variant on RangeMarker that is used to draw markers/locations on top of the ruler using + a washout gradient. It differs from RangeMarker only in the coloration. + */ +class RulerMarker: public RangeMarker +{ + public: + RulerMarker (PublicEditor& editor, ArdourCanvas::Container &, double height, guint32 rgba, const std::string& text, + framepos_t start, framepos_t end); + + void set_color_rgba (uint32_t rgba); }; class TempoMarker : public Marker