summaryrefslogtreecommitdiff
path: root/gtk2_ardour/midi_region_view.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2009-08-10 19:29:29 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2009-08-10 19:29:29 +0000
commit0bf3eb77591afc4aa8d0d6b5efa72273f02b109e (patch)
treeca49bb8ef0ef1ffd6df3adaa3c835b35cf6f2f16 /gtk2_ardour/midi_region_view.cc
parent7f9aea14e926a58f86ffdc788e4873dcf41a6d2c (diff)
first part of MIDI cut/copy/paste ; fix for input/output_streams of an IOProcessor being reported in a misleading way; in/out translation fix from 2.X, sort of
git-svn-id: svn://localhost/ardour2/branches/3.0@5510 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/midi_region_view.cc')
-rw-r--r--gtk2_ardour/midi_region_view.cc155
1 files changed, 102 insertions, 53 deletions
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc
index aa964749ff..9b9be486a3 100644
--- a/gtk2_ardour/midi_region_view.cc
+++ b/gtk2_ardour/midi_region_view.cc
@@ -39,23 +39,24 @@
#include "evoral/Parameter.hpp"
#include "evoral/Control.hpp"
-#include "streamview.h"
-#include "midi_region_view.h"
-#include "midi_streamview.h"
-#include "midi_time_axis.h"
-#include "simpleline.h"
+#include "automation_region_view.h"
+#include "automation_time_axis.h"
#include "canvas-hit.h"
#include "canvas-note.h"
#include "canvas-program-change.h"
-#include "public_editor.h"
#include "ghostregion.h"
-#include "midi_time_axis.h"
-#include "automation_time_axis.h"
-#include "automation_region_view.h"
-#include "utils.h"
-#include "midi_util.h"
#include "gui_thread.h"
#include "keyboard.h"
+#include "midi_region_view.h"
+#include "midi_streamview.h"
+#include "midi_time_axis.h"
+#include "midi_time_axis.h"
+#include "midi_util.h"
+#include "public_editor.h"
+#include "selection.h"
+#include "simpleline.h"
+#include "streamview.h"
+#include "utils.h"
#include "i18n.h"
@@ -659,12 +660,12 @@ MidiRegionView::~MidiRegionView ()
}
_selection.clear();
+ _cut_buffer.clear ();
clear_events();
delete _note_group;
delete _delta_command;
}
-
void
MidiRegionView::region_resized (Change what_changed)
{
@@ -1162,34 +1163,32 @@ MidiRegionView::clear_selection_except(ArdourCanvas::CanvasNoteEvent* ev)
void
MidiRegionView::unique_select(ArdourCanvas::CanvasNoteEvent* ev)
{
- for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
+ for (Selection::iterator i = _selection.begin(); i != _selection.end(); ) {
+
+ Selection::iterator tmp = i;
+ ++tmp;
+
if ((*i) != ev) {
- (*i)->selected(false);
- (*i)->hide_velocity();
- }
- }
+ remove_from_selection (*i);
+ }
- _selection.clear();
- _selection.insert(ev);
+ i = tmp;
+ }
- if ( ! ev->selected()) {
- ev->selected(true);
+ if (!ev->selected()) {
+ add_to_selection (ev);
}
}
void
MidiRegionView::note_selected(ArdourCanvas::CanvasNoteEvent* ev, bool add)
{
- if ( ! add) {
+ if (!add) {
clear_selection_except(ev);
}
- if (_selection.insert(ev).second) {
- play_midi_note(ev->note());
- }
-
- if ( ! ev->selected()) {
- ev->selected(true);
+ if (!ev->selected()) {
+ add_to_selection (ev);
}
}
@@ -1197,15 +1196,11 @@ MidiRegionView::note_selected(ArdourCanvas::CanvasNoteEvent* ev, bool add)
void
MidiRegionView::note_deselected(ArdourCanvas::CanvasNoteEvent* ev, bool add)
{
- if ( ! add) {
+ if (!add) {
clear_selection_except(ev);
}
- _selection.erase(ev);
-
- if (ev->selected()) {
- ev->selected(false);
- }
+ remove_from_selection (ev);
}
@@ -1230,17 +1225,12 @@ MidiRegionView::update_drag_selection(double x1, double x2, double y1, double y2
assert((*i)->x1() >= last_x1);
last_x1 = (*i)->x1();
#endif
- // Inside rectangle
if ((*i)->x1() >= x1 && (*i)->x1() <= x2 && (*i)->y1() >= last_y && (*i)->y1() <= y) {
- if (!(*i)->selected()) {
- (*i)->selected(true);
- _selection.insert(*i);
- play_midi_note((*i)->note());
- }
- // Not inside rectangle
+ // Inside rectangle
+ add_to_selection (*i);
} else if ((*i)->selected()) {
- (*i)->selected(false);
- _selection.erase(*i);
+ // Not inside rectangle
+ remove_from_selection (*i);
}
}
} else {
@@ -1250,22 +1240,54 @@ MidiRegionView::update_drag_selection(double x1, double x2, double y1, double y2
assert((*i)->x1() >= last_x1);
last_x1 = (*i)->x1();
#endif
- // Inside rectangle
if ((*i)->x2() <= x1 && (*i)->x2() >= x2 && (*i)->y1() >= last_y && (*i)->y1() <= y) {
- if (!(*i)->selected()) {
- (*i)->selected(true);
- _selection.insert(*i);
- play_midi_note((*i)->note());
- }
- // Not inside rectangle
+ // Inside rectangle
+ add_to_selection (*i);
} else if ((*i)->selected()) {
- (*i)->selected(false);
- _selection.erase(*i);
+ // Not inside rectangle
+ remove_from_selection (*i);
}
}
}
}
+void
+MidiRegionView::remove_from_selection (CanvasNoteEvent* ev)
+{
+ Selection::iterator i = _selection.find (ev);
+
+ if (i != _selection.end()) {
+ _selection.erase (i);
+ }
+
+ ev->selected (false);
+ ev->hide_velocity ();
+
+ if (_selection.empty()) {
+ PublicEditor& editor (trackview.editor());
+ editor.get_selection().remove (this);
+ }
+}
+
+void
+MidiRegionView::add_to_selection (CanvasNoteEvent* ev)
+{
+ bool add_mrv_selection = false;
+
+ if (_selection.empty()) {
+ add_mrv_selection = true;
+ }
+
+ if (_selection.insert (ev).second) {
+ ev->selected (true);
+ play_midi_note ((ev)->note());
+ }
+
+ if (add_mrv_selection) {
+ PublicEditor& editor (trackview.editor());
+ editor.get_selection().add (this);
+ }
+}
void
MidiRegionView::move_selection(double dx, double dy)
@@ -1275,7 +1297,6 @@ MidiRegionView::move_selection(double dx, double dy)
}
}
-
void
MidiRegionView::note_dropped(CanvasNoteEvent* ev, double dt, uint8_t dnote)
{
@@ -1641,3 +1662,31 @@ MidiRegionView::midi_patch_settings_changed(std::string model, std::string custo
redisplay_model();
}
+void
+MidiRegionView::cut_copy_clear (Editing::CutCopyOp op)
+{
+ if (_selection.empty()) {
+ return;
+ }
+
+ _cut_buffer.clear ();
+
+ start_delta_command();
+
+ for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
+ switch (op) {
+ case Copy:
+ _cut_buffer.push_back (NoteType (*((*i)->note().get())));
+ break;
+ case Cut:
+ _cut_buffer.push_back (NoteType (*(*i)->note().get()));
+ command_remove_note (*i);
+ break;
+ case Clear:
+ break;
+ }
+ }
+
+ apply_command();
+}
+