#include "evoral/Control.hpp"
#include "evoral/midi_util.h"
-#include "canvas/pixbuf.h"
+#include "canvas/debug.h"
#include "automation_region_view.h"
#include "automation_time_axis.h"
#define MIDI_BP_ZERO ((Config->get_first_midi_bank_is_zero())?0:1)
MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &tv,
- boost::shared_ptr<MidiRegion> r, double spu, Gdk::Color const & basic_color)
+ boost::shared_ptr<MidiRegion> r, double spu, uint32_t basic_color)
: RegionView (parent, tv, r, spu, basic_color)
, _current_range_min(0)
, _current_range_max(0)
, pre_press_cursor (0)
, _note_player (0)
{
+ CANVAS_DEBUG_NAME (_note_group, string_compose ("note group for %1", get_item_name()));
_note_group->raise_to_top();
PublicEditor::DropDownKeys.connect (sigc::mem_fun (*this, &MidiRegionView::drop_down_keys));
}
MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &tv,
- boost::shared_ptr<MidiRegion> r, double spu, Gdk::Color& basic_color,
+ boost::shared_ptr<MidiRegion> r, double spu, uint32_t basic_color,
TimeAxisViewItem::Visibility visibility)
: RegionView (parent, tv, r, spu, basic_color, false, visibility)
, _current_range_min(0)
, pre_press_cursor (0)
, _note_player (0)
{
+ CANVAS_DEBUG_NAME (_note_group, string_compose ("note group for %1", get_item_name()));
_note_group->raise_to_top();
+
PublicEditor::DropDownKeys.connect (sigc::mem_fun (*this, &MidiRegionView::drop_down_keys));
connect_to_diskstream ();
void
MidiRegionView::parameter_changed (std::string const & p)
{
- if (p == "diplay-first-midi-bank-as-zero") {
+ if (p == "display-first-midi-bank-as-zero") {
if (_enable_display) {
redisplay_model();
}
, pre_press_cursor (0)
, _note_player (0)
{
- Gdk::Color c;
- int r,g,b,a;
-
- UINT_TO_RGBA (other.fill_color, &r, &g, &b, &a);
- c.set_rgb_p (r/255.0, g/255.0, b/255.0);
-
- init (c, false);
+ init (false);
}
MidiRegionView::MidiRegionView (const MidiRegionView& other, boost::shared_ptr<MidiRegion> region)
, pre_press_cursor (0)
, _note_player (0)
{
- Gdk::Color c;
- int r,g,b,a;
-
- UINT_TO_RGBA (other.fill_color, &r, &g, &b, &a);
- c.set_rgb_p (r/255.0, g/255.0, b/255.0);
-
- init (c, true);
+ init (true);
}
void
-MidiRegionView::init (Gdk::Color const & basic_color, bool wfd)
+MidiRegionView::init (bool wfd)
{
PublicEditor::DropDownKeys.connect (sigc::mem_fun (*this, &MidiRegionView::drop_down_keys));
_model = midi_region()->midi_source(0)->model();
_enable_display = false;
- RegionView::init (basic_color, false);
-
- compute_colors (basic_color);
+ RegionView::init (false);
set_height (trackview.current_height());
reset_width_dependent_items (_pixel_width);
group->raise_to_top();
- group->Event.connect (sigc::mem_fun (this, &MidiRegionView::canvas_event));
-
midi_view()->midi_track()->PlaybackChannelModeChanged.connect (_channel_mode_changed_connection, invalidator (*this),
boost::bind (&MidiRegionView::midi_channel_mode_changed, this),
}
bool
-MidiRegionView::canvas_event(GdkEvent* ev)
+MidiRegionView::canvas_group_event(GdkEvent* ev)
{
bool r;
if ((!trackview.editor().internal_editing() && trackview.editor().current_mouse_mode() != MouseGain) ||
(trackview.editor().current_mouse_mode() == MouseTimeFX) ||
(trackview.editor().current_mouse_mode() == MouseZoom)) {
- // handle non-draw modes elsewhere
- return false;
+ // handle non-internal-edit/non-draw modes elsewhere
+ return RegionView::canvas_group_event (ev);
}
switch (ev->type) {
break;
}
- return false;
-}
-
-void
-MidiRegionView::remove_ghost_note ()
-{
- delete _ghost_note;
- _ghost_note = 0;
+ return trackview.editor().canvas_region_view_event (ev, group, this);
}
bool
MouseMode m = editor.current_mouse_mode();
if (m == MouseDraw || (m == MouseObject && Keyboard::modifier_state_contains (ev->state, Keyboard::insert_note_modifier()))) {
-
editor.drags()->set (new NoteCreateDrag (dynamic_cast<Editor *> (&editor), group, this), (GdkEvent *) ev);
_mouse_state = AddDragging;
remove_ghost_note ();
default:
break;
+
}
- return false;
+ /* we may be dragging some non-note object (eg. patch-change, sysex)
+ */
+
+ return editor.drags()->motion_handler ((GdkEvent *) ev, false);
}
MidiModel::Notes& notes (_model->notes());
_optimization_iterator = _events.begin();
+ bool empty_when_starting = _events.empty();
+
for (MidiModel::Notes::iterator n = notes.begin(); n != notes.end(); ++n) {
boost::shared_ptr<NoteType> note (*n);
bool visible;
if (note_in_region_range (note, visible)) {
-
- if ((cne = find_canvas_note (note)) != 0) {
+
+ if (!empty_when_starting && (cne = find_canvas_note (note)) != 0) {
cne->validate ();
}
} else {
-
- if ((cne = find_canvas_note (note)) != 0) {
+
+ if (!empty_when_starting && (cne = find_canvas_note (note)) != 0) {
cne->validate ();
cne->hide ();
}
/* remove note items that are no longer valid */
- for (Events::iterator i = _events.begin(); i != _events.end(); ) {
- if (!(*i)->valid ()) {
-
- for (vector<GhostRegion*>::iterator j = ghosts.begin(); j != ghosts.end(); ++j) {
- MidiGhostRegion* gr = dynamic_cast<MidiGhostRegion*> (*j);
- if (gr) {
- gr->remove_note (*i);
+ if (!empty_when_starting) {
+ for (Events::iterator i = _events.begin(); i != _events.end(); ) {
+ if (!(*i)->valid ()) {
+
+ for (vector<GhostRegion*>::iterator j = ghosts.begin(); j != ghosts.end(); ++j) {
+ MidiGhostRegion* gr = dynamic_cast<MidiGhostRegion*> (*j);
+ if (gr) {
+ gr->remove_note (*i);
+ }
}
+
+ delete *i;
+ i = _events.erase (i);
+
+ } else {
+ ++i;
}
-
- delete *i;
- i = _events.erase (i);
-
- } else {
- ++i;
}
}
redisplay_model();
}
-// CAIROCANVAS
-#if 0
for (PatchChanges::iterator x = _patch_changes.begin(); x != _patch_changes.end(); ++x) {
- if ((*x)->width() >= _pixel_width) {
+ if ((*x)->canvas_item()->width() >= _pixel_width) {
(*x)->hide();
} else {
(*x)->show();
}
}
-#endif
move_step_edit_cursor (_step_edit_cursor_position);
set_step_edit_cursor_width (_step_edit_cursor_width);
void
MidiRegionView::set_height (double height)
{
- static const double FUDGE = 2.0;
- const double old_height = _height;
+ double old_height = _height;
RegionView::set_height(height);
- _height = height - FUDGE;
- apply_note_range(midi_stream_view()->lowest_note(),
- midi_stream_view()->highest_note(),
- height != old_height + FUDGE);
+ apply_note_range (midi_stream_view()->lowest_note(),
+ midi_stream_view()->highest_note(),
+ height != old_height);
- if (name_pixbuf) {
- name_pixbuf->raise_to_top();
+ if (name_text) {
+ name_text->raise_to_top();
}
for (PatchChanges::iterator x = _patch_changes.begin(); x != _patch_changes.end(); ++x) {
cnote->set_y1 (y1);
} else if (Hit* chit = dynamic_cast<Hit*>(event)) {
-
- const double diamond_size = update_hit (chit);
-
- chit->set_height (diamond_size);
+ update_hit (chit);
}
}
}
const framepos_t end_time_frames = region_beats_to_region_frames(end_time);
_active_notes[note]->set_x1 (trackview.editor().sample_to_pixel(end_time_frames));
- _active_notes[note]->set_outline_what (0xf);
+ _active_notes[note]->set_outline_all ();
_active_notes[note] = 0;
+
}
}
Note* const old_rect = _active_notes[note->note()];
boost::shared_ptr<NoteType> old_note = old_rect->note();
old_rect->set_x1 (x);
- old_rect->set_outline_what (0xF);
+ old_rect->set_outline_all ();
}
_active_notes[note->note()] = ev;
}
/* outline all but right edge */
- ev->set_outline_what (0x1 & 0x4 & 0x8);
+ ev->set_outline_what (ArdourCanvas::Rectangle::What (
+ ArdourCanvas::Rectangle::TOP|
+ ArdourCanvas::Rectangle::LEFT|
+ ArdourCanvas::Rectangle::BOTTOM));
} else {
/* outline all edges */
- ev->set_outline_what (0xF);
+ ev->set_outline_all ();
}
if (update_ghost_regions) {
}
}
-double
+void
MidiRegionView::update_hit (Hit* ev)
{
boost::shared_ptr<NoteType> note = ev->note();
const framepos_t note_start_frames = source_beats_to_region_frames(note->time());
const double x = trackview.editor().sample_to_pixel(note_start_frames);
- const double diamond_size = midi_stream_view()->note_height() / 2.0;
- const double y = midi_stream_view()->note_to_y(note->note()) + ((diamond_size-2) / 4.0);
+ const double diamond_size = midi_stream_view()->note_height();
+ const double y = midi_stream_view()->note_to_y(note->note()) + (diamond_size/2.0);
ev->set_position (ArdourCanvas::Duple (x, y));
-
- return diamond_size;
+ ev->set_height (diamond_size);
}
/** Add a MIDI note to the view (with length).
{
NoteBase* event = 0;
- //ArdourCanvas::Group* const group = (ArdourCanvas::Group*) get_canvas_group();
-
if (midi_view()->note_mode() == Sustained) {
Note* ev_rect = new Note (*this, _note_group, note);
void
MidiRegionView::select_matching_notes (uint8_t notenum, uint16_t channel_mask, bool add, bool extend)
{
+ bool have_selection = !_selection.empty();
uint8_t low_note = 127;
uint8_t high_note = 0;
MidiModel::Notes& notes (_model->notes());
_optimization_iterator = _events.begin();
+
+ if (extend && !have_selection) {
+ extend = false;
+ }
+ /* scan existing selection to get note range */
+
+ for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
+ if ((*i)->note()->note() < low_note) {
+ low_note = (*i)->note()->note();
+ }
+ if ((*i)->note()->note() > high_note) {
+ high_note = (*i)->note()->note();
+ }
+ }
+
if (!add) {
clear_selection ();
- }
- if (extend && _selection.empty()) {
- extend = false;
+ if (!extend && (low_note == high_note) && (high_note == notenum)) {
+ /* only note previously selected is the one we are
+ * reselecting. treat this as cancelling the selection.
+ */
+ return;
+ }
}
if (extend) {
-
- /* scan existing selection to get note range */
-
- for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
- if ((*i)->note()->note() < low_note) {
- low_note = (*i)->note()->note();
- }
- if ((*i)->note()->note() > high_note) {
- high_note = (*i)->note()->note();
- }
- }
-
low_note = min (low_note, notenum);
high_note = max (high_note, notenum);
}
// calculate the colors: get the color settings
uint32_t fill_color = UINT_RGBA_CHANGE_A(
- ARDOUR_UI::config()->canvasvar_MidiNoteSelected.get(),
+ ARDOUR_UI::config()->get_canvasvar_MidiNoteSelected(),
128);
// make the resize preview notes more transparent and bright
0.85));
resize_rect->set_outline_color (NoteBase::calculate_outline (
- ARDOUR_UI::config()->canvasvar_MidiNoteSelected.get()));
+ ARDOUR_UI::config()->get_canvasvar_MidiNoteSelected()));
resize_data->resize_rect = resize_rect;
_resize_data.push_back(resize_data);
return;
}
- Evoral::MusicalTime delta = region_frames_to_region_beats (fabs (distance));
+ Evoral::MusicalTime delta = region_frames_to_region_beats (fabs ((double)distance));
if (!forward) {
delta = -delta;
}
if (_selected) {
- f = ARDOUR_UI::config()->canvasvar_SelectedFrameBase.get();
+ f = ARDOUR_UI::config()->get_canvasvar_SelectedFrameBase();
} else if (high_enough_for_name) {
- f= ARDOUR_UI::config()->canvasvar_MidiFrameBase.get();
+ f= ARDOUR_UI::config()->get_canvasvar_MidiFrameBase();
} else {
f = fill_color;
}
{
Notes notes;
- for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
+ for (Selection::const_iterator i = _selection.begin(); i != _selection.end(); ++i) {
NoteType* n = (*i)->note().get();
notes.insert (boost::shared_ptr<NoteType> (new NoteType (*n)));
}
show_verbose_cursor (_ghost_note->note ());
}
+void
+MidiRegionView::remove_ghost_note ()
+{
+ delete _ghost_note;
+ _ghost_note = 0;
+}
+
void
MidiRegionView::snap_changed ()
{
{
PatchChangeDialog d (&_source_relative_time_converter, trackview.session(), *pc->patch (), instrument_info(), Gtk::Stock::APPLY, true);
- d.set_position (Gtk::WIN_POS_MOUSE);
-
int response = d.run();
switch (response) {