diff --git a/gtk2_ardour/marker.cc b/gtk2_ardour/marker.cc index 4523f1075c..d38244983e 100644 --- a/gtk2_ardour/marker.cc +++ b/gtk2_ardour/marker.cc @@ -60,6 +60,7 @@ PBD::Signal1 Marker::CatchDeletion; const char * Marker::default_new_marker_prefix = N_("Marker "); static const double name_padding = 10.0; +static const double handler_size = 5.0; RulerMarker::RulerMarker (ARDOUR::Location* l, PublicEditor& editor, ArdourCanvas::Container& parent, double height, guint32 rgba, const std::string& text, framepos_t start, framepos_t end) @@ -91,6 +92,8 @@ RangeMarker::RangeMarker (ARDOUR::Location* l, PublicEditor& editor, ArdourCanva : Marker (l, editor, parent, height, rgba, text, Range, start, true) , _end_frame (end) , _end_line (0) + , _start_handler (0) + , _end_handler (0) { assert (start < end); @@ -125,6 +128,7 @@ void RangeMarker::use_color () { Marker::use_color (); + _name_background->set_outline_what (ArdourCanvas::Rectangle::What (0)); double dimen = _height * 2.0; @@ -207,34 +211,58 @@ RangeMarker::_set_position (framepos_t start, framepos_t end) void RangeMarker::setup_line () { - Marker::setup_line (); + Marker::setup_line (); - if (!_end_line) { - _end_line = new ArdourCanvas::Line (editor.get_hscroll_group()); - _end_line->set_y1 (ArdourCanvas::COORD_MAX); - } + if (!_end_line) { + _end_line = new ArdourCanvas::Line (editor.get_hscroll_group()); + _end_line->set_y1 (ArdourCanvas::COORD_MAX); + } - /* line at the end (the start line is handled by Marker */ + /* 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. - */ + /* lines in a different canvas (scroll)group so we have to convert the position + into a different coordinate system. + */ - ArdourCanvas::Duple h = _name_background->item_to_canvas (ArdourCanvas::Duple (0.0, _height)); - ArdourCanvas::Duple g = group->canvas_origin(); + ArdourCanvas::Duple h = _name_background->item_to_canvas (ArdourCanvas::Duple (0.0, _height)); + ArdourCanvas::Duple g = group->canvas_origin(); - /* merge and adjust them */ + /* merge and adjust them */ - g.x += _name_background->x1(); - g.y = h.y; + g.x += _name_background->x1(); + g.y = h.y; - ArdourCanvas::Duple d = _end_line->canvas_to_item (g); + ArdourCanvas::Duple d = _end_line->canvas_to_item (g); - _end_line->set_y0 (d.y); /* bottom of marker, in the right coordinate system */ - _end_line->set_x0 (d.x); - _end_line->set_x1 (d.x); - _end_line->set_outline_color (_color); - _end_line->show (); + _end_line->set_y0 (d.y - 2.0); /* bottom of marker, in the right coordinate system */ + _end_line->set_x0 (d.x - 1.0); + _end_line->set_x1 (d.x - 1.0); + _end_line->set_outline_color (_color); + _end_line->show (); + + ArdourCanvas::Color marker_color = ArdourCanvas::rgba_to_color (1.0, 1.0, 1.0, 0.8); + + if (!_start_handler) { + _start_handler = new ArdourCanvas::Rectangle (group); + _start_handler->set_fill_color (marker_color); + _start_handler->set_outline_what (ArdourCanvas::Rectangle::What (ArdourCanvas::Rectangle::NOTHING)); + } + + _start_handler->set_x0 (0); + _start_handler->set_y0 (0); + _start_handler->set_x1 (handler_size); + _start_handler->set_y1 (handler_size); + + if (!_end_handler) { + _end_handler = new ArdourCanvas::Rectangle (group); + _end_handler->set_fill_color (marker_color); + _end_handler->set_outline_what (ArdourCanvas::Rectangle::What (ArdourCanvas::Rectangle::NOTHING)); + } + + _end_handler->set_x0 (_name_background->x1() - handler_size); + _end_handler->set_y0 (0); + _end_handler->set_x1 (_name_background->x1()); + _end_handler->set_y1 (handler_size); } void @@ -246,35 +274,34 @@ RangeMarker::bounds_changed () void RangeMarker::canvas_height_set (double h) { - if (_end_line) { - /* h is already in the right coordinate system since it is an absolute height */ - _end_line->set_y1 (h); - } + if (_end_line) { + /* h is already in the right coordinate system since it is an absolute height */ + _end_line->set_y1 (h); + } } void RangeMarker::setup_name_display () { - /* No need to adjust name background size here, since it is always the same */ + /* 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); - } + 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->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 (ARDOUR::Location* l, PublicEditor& ed, ArdourCanvas::Container& parent, double height, guint32 rgba, const string& annotation, @@ -466,7 +493,7 @@ Marker::setup_line () ArdourCanvas::Duple d = _start_line->canvas_to_item (g); - _start_line->set_y0 (d.y); /* bottom of marker, in the right coordinate system */ + _start_line->set_y0 (d.y - 2.0); /* bottom of marker, in the right coordinate system */ _start_line->set_x0 (d.x); _start_line->set_x1 (d.x); _start_line->set_outline_color (_color); @@ -628,16 +655,15 @@ Marker::use_color () _start_line->set_outline_color (_color); } - 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)); + 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)); - } + _name_background->set_outline_what (ArdourCanvas::Rectangle::What (ArdourCanvas::Rectangle::TOP| + ArdourCanvas::Rectangle::LEFT)); + } } /** Set the number of pixels that are available for a label to the left of the centre of this marker */ diff --git a/gtk2_ardour/marker.h b/gtk2_ardour/marker.h index b3577b73b9..8acd14a71b 100644 --- a/gtk2_ardour/marker.h +++ b/gtk2_ardour/marker.h @@ -169,14 +169,16 @@ class RangeMarker : public Marker void canvas_height_set (double); protected: - framepos_t _end_frame; + framepos_t _end_frame; ArdourCanvas::Line* _end_line; - Cairo::RefPtr _pattern; - PBD::ScopedConnection parameter_connection; + ArdourCanvas::Rectangle* _start_handler; + ArdourCanvas::Rectangle* _end_handler; + Cairo::RefPtr _pattern; + PBD::ScopedConnection parameter_connection; - void bounds_changed (); - void _set_position (framepos_t, framepos_t); - void parameter_changed (const std::string&); + void bounds_changed (); + void _set_position (framepos_t, framepos_t); + void parameter_changed (const std::string&); }; /** A variant on RangeMarker that is used to draw markers/locations on top of the ruler using diff --git a/libs/canvas/canvas/rectangle.h b/libs/canvas/canvas/rectangle.h index 5c6b66fbb6..0899fbe1ab 100644 --- a/libs/canvas/canvas/rectangle.h +++ b/libs/canvas/canvas/rectangle.h @@ -65,6 +65,7 @@ public: void set_y1 (Coord); enum What { + NOTHING = 0x0, LEFT = 0x1, RIGHT = 0x2, TOP = 0x4,