diff --git a/gtk2_ardour/canvas-flag.cc b/gtk2_ardour/canvas-flag.cc index df23b83d71..bd82b2d3f3 100644 --- a/gtk2_ardour/canvas-flag.cc +++ b/gtk2_ardour/canvas-flag.cc @@ -24,7 +24,7 @@ CanvasFlag::set_text(string& a_text) { delete_allocated_objects(); - _text = new CanvasFlagText(*this, 0.0, 0.0, Glib::ustring(a_text)); + _text = new InteractiveText(*this, 0.0, 0.0, Glib::ustring(a_text)); _text->property_justification() = Gtk::JUSTIFY_CENTER; _text->property_fill_color_rgba() = _outline_color_rgba; double flagwidth = _text->property_text_width() + 10.0; @@ -34,11 +34,10 @@ CanvasFlag::set_text(string& a_text) _text->show(); _line = new SimpleLine(*this, 0.0, 0.0, 0.0, _height); _line->property_color_rgba() = _outline_color_rgba; - _rect = new CanvasFlagRect(*this, 0.0, 0.0, flagwidth, flagheight); + _rect = new InteractiveRect(*this, 0.0, 0.0, flagwidth, flagheight); _rect->property_outline_color_rgba() = _outline_color_rgba; _rect->property_fill_color_rgba() = _fill_color_rgba; - _text->lower_to_bottom(); - _text->raise(2); + _text->raise_to_top(); } CanvasFlag::~CanvasFlag() diff --git a/gtk2_ardour/canvas-flag.h b/gtk2_ardour/canvas-flag.h index 57a78ef992..c48f78b358 100644 --- a/gtk2_ardour/canvas-flag.h +++ b/gtk2_ardour/canvas-flag.h @@ -2,23 +2,20 @@ #define CANVASFLAG_H_ #include -#include #include #include #include "simplerect.h" #include "simpleline.h" +#include "interactive-item.h" class MidiRegionView; namespace Gnome { namespace Canvas { -class CanvasFlagRect; -class CanvasFlagText; - -class CanvasFlag : public Group +class CanvasFlag : public Group, public InteractiveItem { public: CanvasFlag( @@ -46,7 +43,7 @@ public: void set_text(string& a_text); protected: - CanvasFlagText* _text; + InteractiveText* _text; double _height; guint _outline_color_rgba; guint _fill_color_rgba; @@ -56,48 +53,7 @@ private: void delete_allocated_objects(); SimpleLine* _line; - CanvasFlagRect* _rect; -}; - -class CanvasFlagText: public Text -{ -public: - CanvasFlagText(Group& parent, double x, double y, const Glib::ustring& text) - : Text(parent, x, y, text) { - _parent = dynamic_cast(&parent); -; - } - - virtual bool on_event(GdkEvent* ev) { - if(_parent) { - return _parent->on_event(ev); - } else { - return false; - } - } - -private: - CanvasFlag* _parent; -}; - -class CanvasFlagRect: public SimpleRect -{ -public: - CanvasFlagRect(Group& parent, double x1, double y1, double x2, double y2) - : SimpleRect(parent, x1, y1, x2, y2) { - _parent = dynamic_cast(&parent); - } - - virtual bool on_event(GdkEvent* ev) { - if(_parent) { - return _parent->on_event(ev); - } else { - return false; - } - } - -private: - CanvasFlag* _parent; + InteractiveRect* _rect; }; diff --git a/gtk2_ardour/canvas-note-event.cc b/gtk2_ardour/canvas-note-event.cc index e4bbe038c0..e5ff6abf46 100644 --- a/gtk2_ardour/canvas-note-event.cc +++ b/gtk2_ardour/canvas-note-event.cc @@ -75,7 +75,7 @@ void CanvasNoteEvent::show_velocity() { hide_velocity(); - _text = new Text(*(_item->property_parent())); + _text = new InteractiveText(*(_item->property_parent())); _text->property_x() = (x1() + x2()) /2; _text->property_y() = (y1() + y2()) /2; ostringstream velo(ios::ate); @@ -158,24 +158,47 @@ CanvasNoteEvent::hide_channel_selector(void) } void -CanvasNoteEvent::selected(bool yn) +CanvasNoteEvent::selected(bool selected) { if (!_note) { return; - } else if (yn) { - set_fill_color(UINT_INTERPOLATE(meter_style_fill_color(_note->velocity()), + } else if (selected) { + set_fill_color(UINT_INTERPOLATE(base_color(), ARDOUR_UI::config()->canvasvar_MidiNoteSelected.get(), 0.1)); set_outline_color(calculate_outline(ARDOUR_UI::config()->canvasvar_MidiNoteSelected.get())); show_velocity(); } else { - set_fill_color(meter_style_fill_color(_note->velocity())); - set_outline_color(meter_style_outline_color(_note->velocity())); + set_fill_color(base_color()); + set_outline_color(calculate_outline(base_color())); hide_velocity(); } - _selected = yn; + _selected = selected; } +uint32_t +CanvasNoteEvent::base_color() +{ + using namespace ARDOUR; + + ColorMode mode = _region.color_mode(); + + switch (mode) { + case TrackColor: + { + Gdk::Color color = _region.midi_stream_view()->get_region_color(); + return RGBA_TO_UINT(color.get_red(), color.get_green(), color.get_blue(), 0xff); + } + + case ChannelColors: + return CanvasNoteEvent::midi_channel_colors[_note->channel()]; + + default: + return meter_style_fill_color(_note->velocity()); + }; + + return 0; +} bool CanvasNoteEvent::on_event(GdkEvent* ev) @@ -188,6 +211,8 @@ CanvasNoteEvent::on_event(GdkEvent* ev) bool select_mod; uint8_t d_velocity = 10; + cerr << "CanvasNoteEvent::on_event(GdkEvent* ev)" << endl; + if (_region.get_time_axis_view().editor.current_mouse_mode() != Editing::MouseNote) return false; diff --git a/gtk2_ardour/canvas-note-event.h b/gtk2_ardour/canvas-note-event.h index efb717823c..748c50efd4 100644 --- a/gtk2_ardour/canvas-note-event.h +++ b/gtk2_ardour/canvas-note-event.h @@ -65,6 +65,8 @@ public: void move_event(double dx, double dy); + uint32_t base_color(); + void show_velocity(); void hide_velocity(); @@ -101,11 +103,6 @@ public: ((vel-64) / (double)63.0)); } } - - inline static uint32_t meter_style_outline_color(uint8_t vel) - { - return calculate_outline(meter_style_fill_color(vel)); - } /// calculate outline colors from fill colors of notes inline static uint32_t calculate_outline(uint32_t color) @@ -121,7 +118,7 @@ protected: MidiRegionView& _region; Item* const _item; - Text* _text; + InteractiveText* _text; Widget* _channel_selector_widget; State _state; const boost::shared_ptr _note; diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc index 7767eeeb8b..b05d4e6c4c 100644 --- a/gtk2_ardour/editor_canvas_events.cc +++ b/gtk2_ardour/editor_canvas_events.cc @@ -62,8 +62,8 @@ Editor::track_canvas_scroll (GdkEventScroll* ev) Gnome::Canvas::Item* item = track_canvas->get_item_at(ev->x, ev->y); InteractiveItem* interactive_item = dynamic_cast(item); - if (interactive_item && interactive_item->on_event(reinterpret_cast(ev))) { - return true; + if (interactive_item) { + return interactive_item->on_event(reinterpret_cast(ev)); } retry: diff --git a/gtk2_ardour/interactive-item.h b/gtk2_ardour/interactive-item.h index 1e8db12e4b..145a592511 100644 --- a/gtk2_ardour/interactive-item.h +++ b/gtk2_ardour/interactive-item.h @@ -20,6 +20,9 @@ #ifndef __ardour_interactive_item_h__ #define __ardour_interactive_item_h__ +#include +#include "simplerect.h" + namespace Gnome { namespace Canvas { @@ -34,6 +37,53 @@ public: virtual bool on_event(GdkEvent* ev) = 0; }; +/** A canvas text that forwards events to its parent. + */ +class InteractiveText : public Text, public InteractiveItem { +public: + InteractiveText(Group& parent, double x, double y, const Glib::ustring& text) + : Text(parent, x, y, text) + { + _parent = dynamic_cast(&parent); + } + + InteractiveText(Group& parent) + : Text(parent) + { + _parent = dynamic_cast(&parent); + } + + bool on_event(GdkEvent* ev) { + if(_parent) { + return _parent->on_event(ev); + } else { + return false; + } + } + +protected: + InteractiveItem* _parent; +}; + +class InteractiveRect: public SimpleRect, public InteractiveItem +{ +public: + InteractiveRect(Group& parent, double x1, double y1, double x2, double y2) + : SimpleRect(parent, x1, y1, x2, y2) { + _parent = dynamic_cast(&parent); + } + + bool on_event(GdkEvent* ev) { + if(_parent) { + return _parent->on_event(ev); + } else { + return false; + } + } + +protected: + InteractiveItem* _parent; +}; } /* namespace Canvas */ } /* namespace Gnome */ diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h index 6ee2210867..2220dd9387 100644 --- a/gtk2_ardour/midi_region_view.h +++ b/gtk2_ardour/midi_region_view.h @@ -83,6 +83,8 @@ class MidiRegionView : public RegionView void set_height (double); void apply_note_range(uint8_t lowest, uint8_t highest, bool force=false); + inline ARDOUR::ColorMode color_mode() const { return midi_view()->color_mode(); } + void set_frame_color(); void redisplay_model(); diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc index 47733f9efb..1b66fa53af 100644 --- a/gtk2_ardour/midi_time_axis.cc +++ b/gtk2_ardour/midi_time_axis.cc @@ -93,8 +93,12 @@ MidiTimeAxisView::MidiTimeAxisView (PublicEditor& ed, Session& sess, boost::shar , _range_scroomer(0) , _piano_roll_header(0) , _note_mode(Sustained) - , _note_mode_item(NULL) - , _percussion_mode_item(NULL) + , _note_mode_item(0) + , _percussion_mode_item(0) + , _color_mode(MeterColors) + , _meter_color_mode_item(0) + , _channel_color_mode_item(0) + , _track_color_mode_item(0) { subplugin_menu.set_name ("ArdourContextMenu"); @@ -322,6 +326,34 @@ MidiTimeAxisView::build_mode_menu() return mode_menu; } + +Gtk::Menu* +MidiTimeAxisView::build_color_mode_menu() +{ + using namespace Menu_Helpers; + + Menu* mode_menu = manage (new Menu); + MenuList& items = mode_menu->items(); + mode_menu->set_name ("ArdourContextMenu"); + + RadioMenuItem::Group mode_group; + items.push_back (RadioMenuElem (mode_group, _("Meter Colors"), + bind (mem_fun (*this, &MidiTimeAxisView::set_color_mode), MeterColors))); + _meter_color_mode_item = dynamic_cast(&items.back()); + _meter_color_mode_item->set_active(_color_mode == MeterColors); + + items.push_back (RadioMenuElem (mode_group, _("Channel Colors"), + bind (mem_fun (*this, &MidiTimeAxisView::set_color_mode), ChannelColors))); + _channel_color_mode_item = dynamic_cast(&items.back()); + _channel_color_mode_item->set_active(_color_mode == ChannelColors); + + items.push_back (RadioMenuElem (mode_group, _("Track Color"), + bind (mem_fun (*this, &MidiTimeAxisView::set_color_mode), TrackColor))); + _channel_color_mode_item = dynamic_cast(&items.back()); + _channel_color_mode_item->set_active(_color_mode == TrackColor); + + return mode_menu; +} void MidiTimeAxisView::set_note_mode(NoteMode mode) @@ -333,6 +365,14 @@ MidiTimeAxisView::set_note_mode(NoteMode mode) } } +void +MidiTimeAxisView::set_color_mode(ColorMode mode) +{ + if (_color_mode != mode) { + _color_mode = mode; + _view->redisplay_diskstream(); + } +} void MidiTimeAxisView::set_note_range(MidiStreamView::VisibleNoteRange range) diff --git a/gtk2_ardour/midi_time_axis.h b/gtk2_ardour/midi_time_axis.h index 8f95697e2d..54fe47a555 100644 --- a/gtk2_ardour/midi_time_axis.h +++ b/gtk2_ardour/midi_time_axis.h @@ -73,7 +73,8 @@ class MidiTimeAxisView : public RouteTimeAxisView void add_parameter_track (const Evoral::Parameter& param); void create_automation_child (const Evoral::Parameter& param, bool show); - ARDOUR::NoteMode note_mode() const { return _note_mode; } + ARDOUR::NoteMode note_mode() const { return _note_mode; } + ARDOUR::ColorMode color_mode() const { return _color_mode; } void update_range(); @@ -94,8 +95,10 @@ class MidiTimeAxisView : public RouteTimeAxisView void append_extra_display_menu_items (); void build_automation_action_menu (); Gtk::Menu* build_mode_menu(); + Gtk::Menu* build_color_mode_menu(); - void set_note_mode(ARDOUR::NoteMode mode); + void set_note_mode (ARDOUR::NoteMode mode); + void set_color_mode(ARDOUR::ColorMode mode); void set_note_range(MidiStreamView::VisibleNoteRange range); void route_active_changed (); @@ -109,6 +112,10 @@ class MidiTimeAxisView : public RouteTimeAxisView ARDOUR::NoteMode _note_mode; Gtk::RadioMenuItem* _note_mode_item; Gtk::RadioMenuItem* _percussion_mode_item; + ARDOUR::ColorMode _color_mode; + Gtk::RadioMenuItem* _meter_color_mode_item; + Gtk::RadioMenuItem* _channel_color_mode_item; + Gtk::RadioMenuItem* _track_color_mode_item; Gtk::VBox _midi_controls_box; MidiMultipleChannelSelector _channel_selector; Gtk::ComboBoxText _model_selector; diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 37ad45bbfc..17ed5c9133 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -575,6 +575,12 @@ RouteTimeAxisView::build_display_menu () if (mode_menu) items.push_back (MenuElem (_("Mode"), *mode_menu)); + items.push_back (SeparatorElem()); + + color_mode_menu = build_color_mode_menu(); + if (color_mode_menu) + items.push_back (MenuElem (_("Color Mode"), *color_mode_menu)); + items.push_back (SeparatorElem()); } } diff --git a/gtk2_ardour/route_time_axis.h b/gtk2_ardour/route_time_axis.h index c41e60afce..35c4b48a16 100644 --- a/gtk2_ardour/route_time_axis.h +++ b/gtk2_ardour/route_time_axis.h @@ -285,8 +285,10 @@ protected: Gtk::Menu* playlist_action_menu; Gtk::MenuItem* playlist_item; Gtk::Menu* mode_menu; + Gtk::Menu* color_mode_menu; - virtual Gtk::Menu* build_mode_menu() { return NULL; } + virtual Gtk::Menu* build_mode_menu() { return 0; } + virtual Gtk::Menu* build_color_mode_menu() { return 0; } void use_playlist (boost::weak_ptr); diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 48671c6841..53077387ed 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -139,6 +139,12 @@ namespace ARDOUR { FilterChannels, ///< Ignore events on certain channels ForceChannel ///< Force all events to a certain channel }; + + enum ColorMode { + MeterColors = 0, + ChannelColors, + TrackColor + }; enum EventTimeUnit { Frames,