{
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;
_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()
#define CANVASFLAG_H_
#include <libgnomecanvasmm/group.h>
-#include <libgnomecanvasmm/text.h>
#include <libgnomecanvasmm/widget.h>
#include <ardour/midi_model.h>
#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(
void set_text(string& a_text);
protected:
- CanvasFlagText* _text;
+ InteractiveText* _text;
double _height;
guint _outline_color_rgba;
guint _fill_color_rgba;
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<CanvasFlag*>(&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<CanvasFlag*>(&parent);
- }
-
- virtual bool on_event(GdkEvent* ev) {
- if(_parent) {
- return _parent->on_event(ev);
- } else {
- return false;
- }
- }
-
-private:
- CanvasFlag* _parent;
+ InteractiveRect* _rect;
};
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);
}
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)
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;
void move_event(double dx, double dy);
+ uint32_t base_color();
+
void show_velocity();
void hide_velocity();
((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)
MidiRegionView& _region;
Item* const _item;
- Text* _text;
+ InteractiveText* _text;
Widget* _channel_selector_widget;
State _state;
const boost::shared_ptr<Evoral::Note> _note;
Gnome::Canvas::Item* item = track_canvas->get_item_at(ev->x, ev->y);
InteractiveItem* interactive_item = dynamic_cast<InteractiveItem*>(item);
- if (interactive_item && interactive_item->on_event(reinterpret_cast<GdkEvent*>(ev))) {
- return true;
+ if (interactive_item) {
+ return interactive_item->on_event(reinterpret_cast<GdkEvent*>(ev));
}
retry:
#ifndef __ardour_interactive_item_h__
#define __ardour_interactive_item_h__
+#include <libgnomecanvasmm/text.h>
+#include "simplerect.h"
+
namespace Gnome {
namespace Canvas {
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<InteractiveItem*>(&parent);
+ }
+
+ InteractiveText(Group& parent)
+ : Text(parent)
+ {
+ _parent = dynamic_cast<InteractiveItem*>(&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<InteractiveItem*>(&parent);
+ }
+
+ bool on_event(GdkEvent* ev) {
+ if(_parent) {
+ return _parent->on_event(ev);
+ } else {
+ return false;
+ }
+ }
+
+protected:
+ InteractiveItem* _parent;
+};
} /* namespace Canvas */
} /* namespace Gnome */
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();
, _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");
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<RadioMenuItem*>(&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<RadioMenuItem*>(&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<RadioMenuItem*>(&items.back());
+ _channel_color_mode_item->set_active(_color_mode == TrackColor);
+
+ return mode_menu;
+}
void
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)
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();
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 ();
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;
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());
}
}
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<ARDOUR::Playlist>);
FilterChannels, ///< Ignore events on certain channels
ForceChannel ///< Force all events to a certain channel
};
+
+ enum ColorMode {
+ MeterColors = 0,
+ ChannelColors,
+ TrackColor
+ };
enum EventTimeUnit {
Frames,