Add some convenient public editor methods (for lua-bindings)
[ardour.git] / gtk2_ardour / note_base.cc
index 9c47fa7b1882b27cf815f954a1f992d69f4a2bed..3852673e601cf569c81341d67176d136426df720 100644 (file)
@@ -44,6 +44,25 @@ const uint32_t NoteBase::midi_channel_colors[16] = {
          0x832dd3ff,  0xa92dd3ff,  0xd32dbfff,  0xd32d67ff
        };
 
+bool     NoteBase::_color_init = false;
+uint32_t NoteBase::_selected_mod_col = 0;
+uint32_t NoteBase::_selected_outline_col = 0;
+uint32_t NoteBase::_selected_col = 0;
+uint32_t NoteBase::_min_col = 0;
+uint32_t NoteBase::_mid_col = 0;
+uint32_t NoteBase::_max_col = 0;
+
+void
+NoteBase::set_colors ()
+{
+       _selected_mod_col = UIConfiguration::instance().color_mod ("midi note selected", "midi note");
+       _selected_outline_col = UIConfiguration::instance().color ("midi note selected outline");
+       _selected_col = UIConfiguration::instance().color ("midi note selected");
+       _min_col = UIConfiguration::instance().color_mod ("midi note min", "midi note");
+       _mid_col = UIConfiguration::instance().color_mod ("midi note mid", "midi note");
+       _max_col = UIConfiguration::instance().color_mod ("midi note max", "midi note");
+}
+
 NoteBase::NoteBase(MidiRegionView& region, bool with_events, const boost::shared_ptr<NoteType> note)
        : _region(region)
        , _item (0)
@@ -56,6 +75,10 @@ NoteBase::NoteBase(MidiRegionView& region, bool with_events, const boost::shared
        , _mouse_x_fraction (-1.0)
        , _mouse_y_fraction (-1.0)
 {
+       if (!_color_init) {
+               NoteBase::set_colors();
+               _color_init = true;
+       }
 }
 
 NoteBase::~NoteBase()
@@ -119,9 +142,9 @@ NoteBase::on_channel_selection_change(uint16_t selection)
 {
        // make note change its color if its channel is not marked active
        if ( (selection & (1 << _note->channel())) == 0 ) {
-               set_fill_color(UIConfiguration::instance().color ("midi note inactive channel"));
-               set_outline_color(calculate_outline(UIConfiguration::instance().color ("midi note inactive channel"),
-                                                   _selected));
+               const ArdourCanvas::Color inactive_ch = UIConfiguration::instance().color ("midi note inactive channel");
+               set_fill_color(inactive_ch);
+               set_outline_color(calculate_outline(inactive_ch, _selected));
        } else {
                // set the color according to the notes selection state
                set_selected(_selected);
@@ -146,9 +169,11 @@ NoteBase::set_selected(bool selected)
        }
 
        _selected = selected;
-       set_fill_color (base_color());
 
-       set_outline_color(calculate_outline(base_color(), _selected));
+       const uint32_t base_col = base_color();
+       set_fill_color (base_col);
+
+       set_outline_color(calculate_outline(base_col, _selected));
 }
 
 #define SCALE_USHORT_TO_UINT8_T(x) ((x) / 257)
@@ -166,15 +191,14 @@ NoteBase::base_color()
        switch (mode) {
        case TrackColor:
        {
-               uint32_t color = _region.midi_stream_view()->get_region_color();
-               return UINT_INTERPOLATE (UINT_RGBA_CHANGE_A (color, opacity),
-                                        UIConfiguration::instance().color ("midi note selected"),
+               const uint32_t region_color = _region.midi_stream_view()->get_region_color();
+               return UINT_INTERPOLATE (UINT_RGBA_CHANGE_A (region_color, opacity), _selected_col,
                                         0.5);
        }
 
        case ChannelColors:
                return UINT_INTERPOLATE (UINT_RGBA_CHANGE_A (NoteBase::midi_channel_colors[_note->channel()], opacity),
-                                        UIConfiguration::instance().color ("midi note selected"), 0.5);
+                                         _selected_col, 0.5);
 
        default:
                return meter_style_fill_color(_note->velocity(), selected());