Move PC flags to avoid obscuring region name.
authorDavid Robillard <d@drobilla.net>
Sat, 14 Mar 2015 04:21:29 +0000 (00:21 -0400)
committerDavid Robillard <d@drobilla.net>
Sat, 14 Mar 2015 04:21:29 +0000 (00:21 -0400)
Fixes bug #6179.  Top vs. bottom seems pretty arbitrary to me, and this solves
the obscuring issue (which is quite common since there are often PC events at
the start of MIDI files), so bottom it is.

gtk2_ardour/patch_change.cc
libs/canvas/canvas/flag.h
libs/canvas/flag.cc

index bde5b4bf25433b8d7189aa643238e1f1db74c2b3..601011d01773da41c0dacecb5506a41f750b2eea 100644 (file)
@@ -60,7 +60,8 @@ PatchChange::PatchChange(MidiRegionView&                   region,
                height,
                ARDOUR_UI::config()->color ("midi patch change outline"),
                ARDOUR_UI::config()->color_mod ("midi patch change fill", "midi patch change fill"),
-               ArdourCanvas::Duple (x, y));
+               ArdourCanvas::Duple (x, y),
+               true);
        
        CANVAS_DEBUG_NAME (_flag, text);
 
index 19a302b4b6b724beb752387ae33399d64633f120..82f257b7d23bf9ab5fe0dfd37a6e515ed8c595fb 100644 (file)
@@ -32,8 +32,8 @@ class Rectangle;
 class LIBCANVAS_API Flag : public Container
 {
 public:
-       Flag (Canvas *, Distance, Color, Color, Duple);
-       Flag (Item*, Distance, Color, Color, Duple);
+       Flag (Canvas *, Distance, Color, Color, Duple, bool invert=false);
+       Flag (Item*, Distance, Color, Color, Duple, bool invert=false);
 
        void set_text (std::string const &);
        void set_height (Distance);
@@ -50,6 +50,7 @@ private:
        Text* _text;
        Line* _line;
        Rectangle* _rectangle;
+       bool _invert;
 };
        
 }
index 742516604328b1cf555dcc4c0f3ad72c5b7f3e04..87c3cc281c86043fdf075f21497d67b2df8d9974 100644 (file)
 using namespace std;
 using namespace ArdourCanvas;
 
-Flag::Flag (Canvas* canvas, Distance height, Color outline_color, Color fill_color, Duple position)
+Flag::Flag (Canvas* canvas, Distance height, Color outline_color, Color fill_color, Duple position, bool invert)
        : Container (canvas)
        , _outline_color (outline_color)
        , _fill_color (fill_color)
+       , _invert (invert)
 {
        setup (height, position);
 }
 
-Flag::Flag (Item* parent, Distance height, Color outline_color, Color fill_color, Duple position)
+Flag::Flag (Item* parent, Distance height, Color outline_color, Color fill_color, Duple position, bool invert)
        : Container (parent)
        , _outline_color (outline_color)
        , _fill_color (fill_color)
+       , _invert (invert)
 {
        setup (height, position);
 }
@@ -50,7 +52,6 @@ Flag::setup (Distance height, Duple position)
 
        _line = new Line (this);
        _line->set_outline_color (_outline_color);
-       set_height (height);
 
        _rectangle = new Rectangle (this);
        _rectangle->set_outline_color (_outline_color);
@@ -58,6 +59,7 @@ Flag::setup (Distance height, Duple position)
 
        _text->raise_to_top ();
 
+       set_height (height);
        set_position (position);
 }
 
@@ -76,14 +78,29 @@ Flag::set_text (string const & text)
 
        Duple flag_size (bbox.get().width() + 10, bbox.get().height() + 4);
        
-       _text->set_position (Duple (5, 2));
-       _rectangle->set (Rect (0, 0, flag_size.x, flag_size.y));
+       if (_invert) {
+               const Distance h = fabs(_line->y1() - _line->y0());
+               _text->set_position (Duple (5, h - flag_size.y + 2));
+               _rectangle->set (Rect (0, h - flag_size.y, flag_size.x, h));
+       } else {
+               _text->set_position (Duple (5, 2));
+               _rectangle->set (Rect (0, 0, flag_size.x, flag_size.y));
+       }
 }
 
 void
 Flag::set_height (Distance h)
 {
        _line->set (Duple (0, 0), Duple (0, h));
+
+       if (_invert) {
+               boost::optional<Rect> bbox = _text->bounding_box ();
+               if (bbox) {
+                       Duple flag_size (bbox.get().width() + 10, bbox.get().height() + 4);
+                       _rectangle->set (Rect (0, h - flag_size.y, flag_size.x, h));
+                       _text->set_position (Duple (5, h - flag_size.y + 2));
+               }
+       }
 }
 
 bool