summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/ardour.bindings.in1
-rw-r--r--gtk2_ardour/ardour.menus1
-rw-r--r--gtk2_ardour/ardour2_ui_default.conf31
-rw-r--r--gtk2_ardour/ardour_ui.cc6
-rw-r--r--gtk2_ardour/canvas-hit.h11
-rw-r--r--gtk2_ardour/canvas-midi-event.cc13
-rw-r--r--gtk2_ardour/canvas-midi-event.h22
-rw-r--r--gtk2_ardour/canvas-note.h8
-rw-r--r--gtk2_ardour/editing_syms.h2
-rw-r--r--gtk2_ardour/editor.cc30
-rw-r--r--gtk2_ardour/editor.h7
-rw-r--r--gtk2_ardour/editor_mouse.cc111
-rw-r--r--gtk2_ardour/main.cc2
-rw-r--r--gtk2_ardour/midi_region_view.cc57
-rw-r--r--gtk2_ardour/midi_region_view.h6
-rw-r--r--gtk2_ardour/midi_streamview.cc35
-rw-r--r--gtk2_ardour/midi_time_axis.h1
-rw-r--r--gtk2_ardour/public_editor.h2
18 files changed, 224 insertions, 122 deletions
diff --git a/gtk2_ardour/ardour.bindings.in b/gtk2_ardour/ardour.bindings.in
index e8a918cb1f..c7ead238bb 100644
--- a/gtk2_ardour/ardour.bindings.in
+++ b/gtk2_ardour/ardour.bindings.in
@@ -171,6 +171,7 @@
; (gtk_accel_path "<Actions>/Transport/TogglePunchOut" "")
(gtk_accel_path "<Actions>/Editor/select-all-in-loop-range" "<Control>l")
(gtk_accel_path "<Actions>/Editor/show-editor-mixer" "<Shift>e")
+(gtk_accel_path "<Actions>/Editor/show-editor-list" "<Shift>l")
; (gtk_accel_path "<Actions>/options/SoloInPlace" "")
; (gtk_accel_path "<Actions>/Main/Options" "")
; (gtk_accel_path "<Actions>/options/MeterFalloffMedium" "")
diff --git a/gtk2_ardour/ardour.menus b/gtk2_ardour/ardour.menus
index a24041374b..871aa15aee 100644
--- a/gtk2_ardour/ardour.menus
+++ b/gtk2_ardour/ardour.menus
@@ -208,6 +208,7 @@
<menuitem action='ToggleMeasureVisibility'/>
<separator/>
<menuitem action='show-editor-mixer'/>
+ <menuitem action='show-editor-list'/>
<menuitem action='SyncEditorAndMixerTrackOrder'/>
</menu>
<menu name='JACK' action='JACK'>
diff --git a/gtk2_ardour/ardour2_ui_default.conf b/gtk2_ardour/ardour2_ui_default.conf
index 034dd75b0f..721d8c3116 100644
--- a/gtk2_ardour/ardour2_ui_default.conf
+++ b/gtk2_ardour/ardour2_ui_default.conf
@@ -4,20 +4,20 @@
<Option name="waveform" value="000000cc"/>
<Option name="clipped waveform" value="ff0000e5"/>
<Option name="region base" value="bfbfc1aa"/>
- <Option name="selected region base" value="b591a8ff"/>
+ <Option name="selected region base" value="8888ffaa"/>
<Option name="audio track base" value="c6d3d868"/>
<Option name="audio bus base" value="dbd1ea68"/>
- <Option name="midi track base" value="ff8f8f3d"/>
- <Option name="midi bus base" value="ff0000ee"/>
+ <Option name="midi track base" value="c67e7e5f"/>
+ <Option name="midi bus base" value="ffceea40"/>
<Option name="time-stretch-fill" value="e2b5b596"/>
<Option name="time-stretch-outline" value="63636396"/>
<Option name="automation line" value="44bc59ff"/>
<Option name="processor automation line" value="7aa3f9ff"/>
- <Option name="control point fill" value="000000ff"/>
- <Option name="control point outline" value="000000ff"/>
+ <Option name="control point fill" value="ffffff66"/>
+ <Option name="control point outline" value="ffffffaa"/>
<Option name="entered control point outline" value="ff0000ee"/>
<Option name="entered control point selected" value="ff3535ff"/>
- <Option name="entered control point" value="000000cc"/>
+ <Option name="entered control point" value="ffffffaa"/>
<Option name="control point selected" value="00ff00ff"/>
<Option name="control point" value="ff0000ff"/>
<Option name="automation track fill" value="a0a0ce68"/>
@@ -40,7 +40,7 @@
<Option name="location punch" value="7c3a3aff"/>
<Option name="verbose canvas cursor" value="f4f214bc"/>
<Option name="marker label" value="000000ff"/>
- <Option name="marker bar separator" value="30303088"/>
+ <Option name="marker bar separator" value="aaaaaa77"/>
<Option name="tempo bar" value="72727fff"/>
<Option name="meterbar" value="666672ff"/>
<Option name="markerbar" value="7f7f8cff"/>
@@ -60,8 +60,8 @@
<Option name="EnteredMarker" value="dd6363ff"/>
<Option name="MeterMarker" value="f2425bff"/>
<Option name="TempoMarker" value="f2425bff"/>
- <Option name="MeasureLineBeat" value="72727266"/>
- <Option name="MeasureLineBar" value="8c8c988c"/>
+ <Option name="MeasureLineBeat" value="b5b5b576"/>
+ <Option name="MeasureLineBar" value="d9d9d99c"/>
<Option name="GhostTrackBase" value="44007c7f"/>
<Option name="GhostTrackWave" value="02fd004c"/>
<Option name="GhostTrackWaveClip" value="ff000000"/>
@@ -74,8 +74,8 @@
<Option name="RecordingRect" value="e5c6c6ff"/>
<Option name="SelectionRect" value="e8f4d377"/>
<Option name="Selection" value="636363b2"/>
- <Option name="VestigialFrame" value="44007c0f"/>
- <Option name="TimeAxisFrame" value="44007c0f"/>
+ <Option name="VestigialFrame" value="0000000f"/>
+ <Option name="TimeAxisFrame" value="0000000f"/>
<Option name="NameHighlightFill" value="0000ffff"/>
<Option name="NameHighlightOutline" value="7c00ff96"/>
<Option name="FrameHandle" value="7c00ff96"/>
@@ -83,6 +83,15 @@
<Option name="TrimHandle" value="1900ff44"/>
<Option name="EditCursor" value="0000ffff"/>
<Option name="PlayHead" value="ff0000ff"/>
+ <Option name="MidiSelectRectOutline" value="5555ffff"/>
+ <Option name="MidiSelectRectFill" value="8888ff88"/>
+ <Option name="MidiNoteOutlineMin" value="22ff22b0"/>
+ <Option name="MidiNoteOutlineMid" value="ffff22b0"/>
+ <Option name="MidiNoteOutlineMax" value="ff2222b0"/>
+ <Option name="MidiNoteFillMin" value="33ee338a"/>
+ <Option name="MidiNoteFillMid" value="eeee338a"/>
+ <Option name="MidiNoteFillMax" value="ee33338a"/>
+ <Option name="MidiNoteSelectedOutline" value="5566ffee"/>
</Canvas>
</Ardour>
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index 962ada5035..491939bd97 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -296,14 +296,14 @@ ARDOUR_UI::post_engine ()
MIDI::Manager::instance()->set_api_data (engine->jack());
setup_midi ();
- check_memory_locking();
-
- ActionManager::init ();
+ ActionManager::init ();
_tooltips.enable();
if (setup_windows ()) {
throw failed_constructor ();
}
+
+ check_memory_locking();
/* this is the first point at which all the keybindings are available */
diff --git a/gtk2_ardour/canvas-hit.h b/gtk2_ardour/canvas-hit.h
index b924f981bb..9a65f8067a 100644
--- a/gtk2_ardour/canvas-hit.h
+++ b/gtk2_ardour/canvas-hit.h
@@ -29,8 +29,15 @@ namespace Canvas {
class CanvasHit : public Diamond, public CanvasMidiEvent {
public:
- CanvasHit(MidiRegionView& region, Group& group, double size, const ARDOUR::Note* note=NULL)
- : Diamond(group, size), CanvasMidiEvent(region, this, note) {}
+ CanvasHit(
+ MidiRegionView& region,
+ Group& group,
+ double size,
+ const boost::shared_ptr<ARDOUR::Note> note = boost::shared_ptr<ARDOUR::Note>())
+
+ : Diamond(group, size), CanvasMidiEvent(region, this, note)
+ {
+ }
// FIXME
double x1() { return 0.0; }
diff --git a/gtk2_ardour/canvas-midi-event.cc b/gtk2_ardour/canvas-midi-event.cc
index 5981e7b78e..2987435090 100644
--- a/gtk2_ardour/canvas-midi-event.cc
+++ b/gtk2_ardour/canvas-midi-event.cc
@@ -31,24 +31,17 @@ namespace Gnome {
namespace Canvas {
-CanvasMidiEvent::CanvasMidiEvent(MidiRegionView& region, Item* item, const ARDOUR::Note* note, bool copy_note)
+CanvasMidiEvent::CanvasMidiEvent(MidiRegionView& region, Item* item,
+ const boost::shared_ptr<ARDOUR::Note> note)
: _region(region)
, _item(item)
, _state(None)
- , _note((copy_note && note) ? new ARDOUR::Note(*note) : note)
- , _own_note(copy_note)
+ , _note(note)
, _selected(false)
{
}
-CanvasMidiEvent::~CanvasMidiEvent()
-{
- if (_own_note)
- delete _note;
-}
-
-
void
CanvasMidiEvent::selected(bool yn)
{
diff --git a/gtk2_ardour/canvas-midi-event.h b/gtk2_ardour/canvas-midi-event.h
index d7b83bc212..3fa009ed33 100644
--- a/gtk2_ardour/canvas-midi-event.h
+++ b/gtk2_ardour/canvas-midi-event.h
@@ -43,8 +43,12 @@ namespace Canvas {
*/
class CanvasMidiEvent {
public:
- CanvasMidiEvent(MidiRegionView& region, Item* item, const ARDOUR::Note* note=NULL, bool copy_note=false);
- virtual ~CanvasMidiEvent();
+ CanvasMidiEvent(
+ MidiRegionView& region,
+ Item* item,
+ const boost::shared_ptr<ARDOUR::Note> note = boost::shared_ptr<ARDOUR::Note>());
+
+ virtual ~CanvasMidiEvent() {}
bool on_event(GdkEvent* ev);
@@ -62,17 +66,17 @@ public:
const Item* item() const { return _item; }
Item* item() { return _item; }
- const ARDOUR::Note* note() { return _note; }
+ const boost::shared_ptr<ARDOUR::Note> note() { return _note; }
protected:
enum State { None, Pressed, Dragging };
- MidiRegionView& _region;
- Item* const _item;
- State _state;
- const ARDOUR::Note* _note;
- bool _own_note;
- bool _selected;
+ MidiRegionView& _region;
+ Item* const _item;
+ State _state;
+ const boost::shared_ptr<ARDOUR::Note> _note;
+ bool _own_note;
+ bool _selected;
};
} // namespace Gnome
diff --git a/gtk2_ardour/canvas-note.h b/gtk2_ardour/canvas-note.h
index 4fde2281ca..3948765d66 100644
--- a/gtk2_ardour/canvas-note.h
+++ b/gtk2_ardour/canvas-note.h
@@ -30,8 +30,12 @@ namespace Canvas {
class CanvasNote : public SimpleRect, public CanvasMidiEvent {
public:
- CanvasNote(MidiRegionView& region, Group& group, const ARDOUR::Note* note=NULL, bool copy_note=false)
- : SimpleRect(group), CanvasMidiEvent(region, this, note, copy_note)
+ CanvasNote(
+ MidiRegionView& region,
+ Group& group,
+ const boost::shared_ptr<ARDOUR::Note> note = boost::shared_ptr<ARDOUR::Note>())
+
+ : SimpleRect(group), CanvasMidiEvent(region, this, note)
{
}
diff --git a/gtk2_ardour/editing_syms.h b/gtk2_ardour/editing_syms.h
index a520b0d318..f731d33efe 100644
--- a/gtk2_ardour/editing_syms.h
+++ b/gtk2_ardour/editing_syms.h
@@ -62,8 +62,8 @@ MOUSEMODE(MouseZoom)
MOUSEMODE(MouseAudition)
MOUSEMODE(MouseNote)
-MIDIEDITMODE(MidiEditSelect)
MIDIEDITMODE(MidiEditPencil)
+MIDIEDITMODE(MidiEditSelect)
MIDIEDITMODE(MidiEditErase)
/* Changing this order will break the menu */
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index f0a2bfa809..3a7009e7b7 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -158,8 +158,8 @@ Gdk::Cursor* Editor::zoom_cursor = 0;
Gdk::Cursor* Editor::time_fx_cursor = 0;
Gdk::Cursor* Editor::fader_cursor = 0;
Gdk::Cursor* Editor::speaker_cursor = 0;
-Gdk::Cursor* Editor::midi_select_cursor = 0;
Gdk::Cursor* Editor::midi_pencil_cursor = 0;
+Gdk::Cursor* Editor::midi_select_cursor = 0;
Gdk::Cursor* Editor::midi_erase_cursor = 0;
Gdk::Cursor* Editor::wait_cursor = 0;
Gdk::Cursor* Editor::timebar_cursor = 0;
@@ -349,7 +349,7 @@ Editor::Editor ()
range_marker_drag_rect = 0;
marker_drag_line = 0;
- set_midi_edit_mode (MidiEditSelect, true);
+ set_midi_edit_mode (MidiEditPencil, true);
set_mouse_mode (MouseObject, true);
frames_per_unit = 2048; /* too early to use reset_zoom () */
@@ -1310,8 +1310,8 @@ Editor::build_cursors ()
time_fx_cursor = new Gdk::Cursor (SIZING);
wait_cursor = new Gdk::Cursor (WATCH);
timebar_cursor = new Gdk::Cursor(LEFT_PTR);
- midi_select_cursor = new Gdk::Cursor (CENTER_PTR);
midi_pencil_cursor = new Gdk::Cursor (PENCIL);
+ midi_select_cursor = new Gdk::Cursor (CENTER_PTR);
midi_erase_cursor = new Gdk::Cursor (DRAPED_BOX);
}
@@ -1666,12 +1666,14 @@ Editor::add_region_context_items (Menu_Helpers::MenuList& edit_items)
if (have_selected_audio_region) {
Menu* envelopes_menu = manage (new Menu);
- MenuList& envelopes_items = envelopes_menu->items();
+
envelopes_menu->set_name ("ArdourContextMenu");
#if FIXUP_REGION_MENU
XXX NEED TO RESOLVE ONE v. MANY REGION ISSUE
+
+ MenuList& envelopes_items = envelopes_menu->items();
RegionView* rv = sv->find_view (ar);
AudioRegionView* arv = dynamic_cast<AudioRegionView*>(rv);
@@ -2751,44 +2753,44 @@ Editor::setup_midi_toolbar ()
vector<ToggleButton *> midi_tool_buttons;
- midi_tool_select_button.add (*(manage (new Image (::get_icon("midi_tool_select")))));
- midi_tool_select_button.set_relief(Gtk::RELIEF_NONE);
- midi_tool_buttons.push_back (&midi_tool_select_button);
midi_tool_pencil_button.add (*(manage (new Image (::get_icon("midi_tool_pencil")))));
midi_tool_pencil_button.set_relief(Gtk::RELIEF_NONE);
midi_tool_buttons.push_back (&midi_tool_pencil_button);
+ midi_tool_select_button.add (*(manage (new Image (::get_icon("midi_tool_select")))));
+ midi_tool_select_button.set_relief(Gtk::RELIEF_NONE);
+ midi_tool_buttons.push_back (&midi_tool_select_button);
midi_tool_erase_button.add (*(manage (new Image (::get_icon("midi_tool_erase")))));
midi_tool_erase_button.set_relief(Gtk::RELIEF_NONE);
midi_tool_buttons.push_back (&midi_tool_erase_button);
- midi_tool_select_button.set_active(true);
+ midi_tool_pencil_button.set_active(true);
midi_tool_button_set = new GroupedButtons (midi_tool_buttons);
midi_tool_button_box.set_border_width (2);
midi_tool_button_box.set_spacing(4);
midi_tool_button_box.set_spacing(1);
- midi_tool_button_box.pack_start(midi_tool_select_button, true, true);
midi_tool_button_box.pack_start(midi_tool_pencil_button, true, true);
+ midi_tool_button_box.pack_start(midi_tool_select_button, true, true);
midi_tool_button_box.pack_start(midi_tool_erase_button, true, true);
midi_tool_button_box.set_homogeneous(true);
- midi_tool_select_button.set_name ("MouseModeButton");
midi_tool_pencil_button.set_name ("MouseModeButton");
+ midi_tool_select_button.set_name ("MouseModeButton");
midi_tool_erase_button.set_name ("MouseModeButton");
- ARDOUR_UI::instance()->tooltips().set_tip (midi_tool_select_button, _("Select/Move Notes"));
ARDOUR_UI::instance()->tooltips().set_tip (midi_tool_pencil_button, _("Add/Move/Stretch Notes"));
+ ARDOUR_UI::instance()->tooltips().set_tip (midi_tool_select_button, _("Select/Move Notes"));
ARDOUR_UI::instance()->tooltips().set_tip (midi_tool_erase_button, _("Erase Notes"));
- midi_tool_select_button.unset_flags (CAN_FOCUS);
midi_tool_pencil_button.unset_flags (CAN_FOCUS);
+ midi_tool_select_button.unset_flags (CAN_FOCUS);
midi_tool_erase_button.unset_flags (CAN_FOCUS);
- midi_tool_select_button.signal_toggled().connect (bind (mem_fun(*this,
- &Editor::midi_edit_mode_toggled), Editing::MidiEditSelect));
midi_tool_pencil_button.signal_toggled().connect (bind (mem_fun(*this,
&Editor::midi_edit_mode_toggled), Editing::MidiEditPencil));
+ midi_tool_select_button.signal_toggled().connect (bind (mem_fun(*this,
+ &Editor::midi_edit_mode_toggled), Editing::MidiEditSelect));
midi_tool_erase_button.signal_toggled().connect (bind (mem_fun(*this,
&Editor::midi_edit_mode_toggled), Editing::MidiEditErase));
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index 63cbc042ac..7e96f9c9c5 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -833,8 +833,8 @@ class Editor : public PublicEditor
static Gdk::Cursor* time_fx_cursor;
static Gdk::Cursor* fader_cursor;
static Gdk::Cursor* speaker_cursor;
- static Gdk::Cursor* midi_select_cursor;
static Gdk::Cursor* midi_pencil_cursor;
+ static Gdk::Cursor* midi_select_cursor;
static Gdk::Cursor* midi_erase_cursor;
static Gdk::Cursor* wait_cursor;
static Gdk::Cursor* timebar_cursor;
@@ -1137,6 +1137,8 @@ class Editor : public PublicEditor
std::set<boost::shared_ptr<ARDOUR::Playlist> > motion_frozen_playlists;
void region_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
void region_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
+ void create_region_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
+ void create_region_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
bool _dragging_playhead;
@@ -1157,6 +1159,7 @@ class Editor : public PublicEditor
gint mouse_rename_region (ArdourCanvas::Item*, GdkEvent*);
void start_region_grab (ArdourCanvas::Item*, GdkEvent*);
+ void start_create_region_grab (ArdourCanvas::Item*, GdkEvent*);
void start_region_copy_grab (ArdourCanvas::Item*, GdkEvent*);
void start_region_brush_grab (ArdourCanvas::Item*, GdkEvent*);
void start_selection_grab (ArdourCanvas::Item*, GdkEvent*);
@@ -1439,8 +1442,8 @@ class Editor : public PublicEditor
Gtk::HBox midi_tool_button_box;
Gtkmm2ext::TearOff* midi_tool_tearoff;
- Gtk::ToggleButton midi_tool_select_button;
Gtk::ToggleButton midi_tool_pencil_button;
+ Gtk::ToggleButton midi_tool_select_button;
Gtk::ToggleButton midi_tool_erase_button;
GroupedButtons *midi_tool_button_set;
void midi_edit_mode_toggled (Editing::MidiEditMode m);
diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc
index da95d50d95..c6bbf5ca5f 100644
--- a/gtk2_ardour/editor_mouse.cc
+++ b/gtk2_ardour/editor_mouse.cc
@@ -28,6 +28,7 @@
#include <pbd/error.h>
#include <gtkmm2ext/utils.h>
#include <pbd/memento_command.h>
+#include <pbd/basename.h>
#include "ardour_ui.h"
#include "editor.h"
@@ -52,6 +53,7 @@
#include <ardour/route.h>
#include <ardour/audio_track.h>
#include <ardour/audio_diskstream.h>
+#include <ardour/midi_diskstream.h>
#include <ardour/playlist.h>
#include <ardour/audioplaylist.h>
#include <ardour/audioregion.h>
@@ -59,6 +61,7 @@
#include <ardour/dB.h>
#include <ardour/utils.h>
#include <ardour/region_factory.h>
+#include <ardour/source_factory.h>
#include <bitset>
@@ -318,22 +321,19 @@ Editor::midi_edit_mode_toggled (MidiEditMode m)
}
switch (m) {
- case MidiEditSelect:
- if (midi_tool_select_button.get_active()) {
+ case MidiEditPencil:
+ if (midi_tool_pencil_button.get_active())
set_midi_edit_mode (m);
- }
break;
-
- case MidiEditPencil:
- if (midi_tool_pencil_button.get_active()) {
+
+ case MidiEditSelect:
+ if (midi_tool_select_button.get_active())
set_midi_edit_mode (m);
- }
break;
-
+
case MidiEditErase:
- if (midi_tool_erase_button.get_active()) {
+ if (midi_tool_erase_button.get_active())
set_midi_edit_mode (m);
- }
break;
default:
@@ -362,14 +362,14 @@ Editor::set_midi_edit_mode (MidiEditMode m, bool force)
ignore_midi_edit_mode_toggle = true;
switch (midi_edit_mode) {
- case MidiEditSelect:
- midi_tool_select_button.set_active (true);
- break;
-
case MidiEditPencil:
midi_tool_pencil_button.set_active (true);
break;
-
+
+ case MidiEditSelect:
+ midi_tool_select_button.set_active (true);
+ break;
+
case MidiEditErase:
midi_tool_erase_button.set_active (true);
break;
@@ -388,12 +388,14 @@ void
Editor::set_midi_edit_cursor (MidiEditMode m)
{
switch (midi_edit_mode) {
- case MidiEditSelect:
- current_canvas_cursor = midi_select_cursor;
- break;
case MidiEditPencil:
current_canvas_cursor = midi_pencil_cursor;
break;
+
+ case MidiEditSelect:
+ current_canvas_cursor = midi_select_cursor;
+ break;
+
case MidiEditErase:
current_canvas_cursor = midi_erase_cursor;
break;
@@ -777,6 +779,10 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
/* rest handled in motion & release */
break;
+ case MouseNote:
+ start_create_region_grab (item, event);
+ break;
+
default:
break;
}
@@ -1117,7 +1123,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
session->request_transport_speed (0.0);
}
break;
-
+
default:
break;
@@ -1621,6 +1627,7 @@ Editor::motion_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item
case MouseRange:
case MouseZoom:
case MouseTimeFX:
+ case MouseNote:
if (drag_info.item && (event->motion.state & GDK_BUTTON1_MASK ||
(event->motion.state & GDK_BUTTON2_MASK))) {
if (!from_autoscroll) {
@@ -2793,6 +2800,19 @@ Editor::start_region_grab (ArdourCanvas::Item* item, GdkEvent* event)
}
void
+Editor::start_create_region_grab (ArdourCanvas::Item* item, GdkEvent* event)
+{
+ drag_info.copy = false;
+ drag_info.item = item;
+ drag_info.data = clicked_axisview;
+ drag_info.last_trackview = clicked_axisview;
+ drag_info.motion_callback = &Editor::create_region_drag_motion_callback;
+ drag_info.finished_callback = &Editor::create_region_drag_finished_callback;
+
+ start_grab (event);
+}
+
+void
Editor::start_region_copy_grab (ArdourCanvas::Item* item, GdkEvent* event)
{
if (selection->regions.empty() || clicked_regionview == 0) {
@@ -3605,6 +3625,59 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
}
}
+
+void
+Editor::create_region_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event)
+{
+ if (drag_info.move_threshold_passed) {
+ if (drag_info.first_move) {
+ // TODO: create region-create-drag region view here
+ drag_info.first_move = false;
+ }
+
+ // TODO: resize region-create-drag region view here
+ }
+}
+
+void
+Editor::create_region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event)
+{
+ MidiTimeAxisView* mtv = dynamic_cast<MidiTimeAxisView*> (drag_info.last_trackview);
+ if (!mtv)
+ return;
+
+ const boost::shared_ptr<MidiDiskstream> diskstream =
+ boost::dynamic_pointer_cast<MidiDiskstream>(mtv->view()->trackview().track()->diskstream());
+
+ if (!diskstream) {
+ warning << "Cannot create non-MIDI region" << endl;
+ return;
+ }
+
+ if (drag_info.first_move) {
+ begin_reversible_command (_("create region"));
+ XMLNode &before = mtv->playlist()->get_state();
+
+ nframes_t start = drag_info.grab_frame;
+ snap_to (start, -1);
+ const Meter& m = session->tempo_map().meter_at(start);
+ const Tempo& t = session->tempo_map().tempo_at(start);
+ double length = m.frames_per_bar(t, session->frame_rate());
+
+ boost::shared_ptr<Source> src = session->create_midi_source_for_session(*diskstream.get());
+
+ mtv->playlist()->add_region (boost::dynamic_pointer_cast<MidiRegion>(RegionFactory::create(
+ src, 0, length, PBD::basename_nosuffix(src->name()))), start);
+ XMLNode &after = mtv->playlist()->get_state();
+ session->add_command(new MementoCommand<Playlist>(*mtv->playlist().get(), &before, &after));
+ commit_reversible_command();
+
+ } else {
+ create_region_drag_motion_callback (item, event);
+ // TODO: create region-create-drag region here
+ }
+}
+
void
Editor::region_view_item_click (AudioRegionView& rv, GdkEventButton* event)
{
diff --git a/gtk2_ardour/main.cc b/gtk2_ardour/main.cc
index 1e9b27d8a7..5203346d57 100644
--- a/gtk2_ardour/main.cc
+++ b/gtk2_ardour/main.cc
@@ -57,7 +57,7 @@ TextReceiver text_receiver ("ardour");
extern int curvetest (string);
static ARDOUR_UI *ui = 0;
-static char* localedir = LOCALEDIR;
+static const char* localedir = LOCALEDIR;
gint
show_ui_callback (void *arg)
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc
index 7dcba64bae..ec326f1e2e 100644
--- a/gtk2_ardour/midi_region_view.cc
+++ b/gtk2_ardour/midi_region_view.cc
@@ -302,7 +302,7 @@ MidiRegionView::canvas_event(GdkEvent* ev)
clear_selection();
break;
case MidiEditPencil:
- trackview.editor.snap_to(event_frame);
+ trackview.editor.snap_to(event_frame, -1);
event_x = trackview.editor.frame_to_pixel(event_frame);
create_note_at(event_x, event_y, _default_note_length);
default:
@@ -359,9 +359,9 @@ MidiRegionView::create_note_at(double x, double y, double dur)
//double dur = m.frames_per_bar(t, trackview.session().frame_rate()) / m.beats_per_bar();
// Add a 1 beat long note (for now)
- const Note new_note(stamp, dur, (uint8_t)note, 0x40);
+ const boost::shared_ptr<Note> new_note(new Note(stamp, dur, (uint8_t)note, 0x40));
- view->update_bounds(new_note.note());
+ view->update_bounds(new_note->note());
MidiModel::DeltaCommand* cmd = _model->new_delta_command("add note");
cmd->add(new_note);
@@ -406,7 +406,7 @@ MidiRegionView::redisplay_model()
_model->read_lock();
for (size_t i=0; i < _model->n_notes(); ++i)
- add_note(_model->note_at(i), false);
+ add_note(_model->note_at(i));
end_write();
@@ -596,30 +596,34 @@ MidiRegionView::extend_active_notes()
* event arrives, to properly display the note.
*/
void
-MidiRegionView::add_note(const Note& note, bool copy_note)
+MidiRegionView::add_note(const boost::shared_ptr<Note> note)
{
- assert(note.time() >= 0);
- //assert(note.time() < _region->length());
+ assert(note->time() >= 0);
+ //assert(note->time() < _region->length());
ArdourCanvas::Group* const group = (ArdourCanvas::Group*)get_canvas_group();
if (midi_view()->note_mode() == Sustained) {
- const double y1 = midi_stream_view()->note_to_y(note.note());
+
+ //cerr << "MRV::add_note sustained " << note->note() << " @ " << note->time()
+ // << " .. " << note->end_time() << endl;
+
+ const double y1 = midi_stream_view()->note_to_y(note->note());
- CanvasNote* ev_rect = new CanvasNote(*this, *group, &note, copy_note);
- ev_rect->property_x1() = trackview.editor.frame_to_pixel((nframes_t)note.time());
+ CanvasNote* ev_rect = new CanvasNote(*this, *group, note);
+ ev_rect->property_x1() = trackview.editor.frame_to_pixel((nframes_t)note->time());
ev_rect->property_y1() = y1;
- if (note.duration() > 0)
- ev_rect->property_x2() = trackview.editor.frame_to_pixel((nframes_t)(note.end_time()));
+ if (note->duration() > 0)
+ ev_rect->property_x2() = trackview.editor.frame_to_pixel((nframes_t)(note->end_time()));
else
ev_rect->property_x2() = trackview.editor.frame_to_pixel(_region->length());
ev_rect->property_y2() = y1 + floor(midi_stream_view()->note_height());
- ev_rect->property_fill_color_rgba() = note_fill_color(note.velocity());
- ev_rect->property_outline_color_rgba() = note_outline_color(note.velocity());
+ ev_rect->property_fill_color_rgba() = note_fill_color(note->velocity());
+ ev_rect->property_outline_color_rgba() = note_outline_color(note->velocity());
- if (note.duration() == 0) {
- _active_notes[note.note()] = ev_rect;
+ if (note->duration() == 0) {
+ _active_notes[note->note()] = ev_rect;
/* outline all but right edge */
ev_rect->property_outline_what() = (guint32) (0x1 & 0x4 & 0x8);
} else {
@@ -631,15 +635,18 @@ MidiRegionView::add_note(const Note& note, bool copy_note)
_events.push_back(ev_rect);
} else if (midi_view()->note_mode() == Percussive) {
+
+ //cerr << "MRV::add_note percussive " << note->note() << " @ " << note->time() << endl;
+
const double diamond_size = midi_stream_view()->note_height() / 2.0;
- const double x = trackview.editor.frame_to_pixel((nframes_t)note.time());
- const double y = midi_stream_view()->note_to_y(note.note()) + ((diamond_size-2) / 4.0);
+ const double x = trackview.editor.frame_to_pixel((nframes_t)note->time());
+ const double y = midi_stream_view()->note_to_y(note->note()) + ((diamond_size-2) / 4.0);
CanvasHit* ev_diamond = new CanvasHit(*this, *group, diamond_size);
ev_diamond->move(x, y);
ev_diamond->show();
- ev_diamond->property_fill_color_rgba() = note_fill_color(note.velocity());
- ev_diamond->property_outline_color_rgba() = note_outline_color(note.velocity());
+ ev_diamond->property_fill_color_rgba() = note_fill_color(note->velocity());
+ ev_diamond->property_outline_color_rgba() = note_outline_color(note->velocity());
_events.push_back(ev_diamond);
}
}
@@ -651,7 +658,7 @@ MidiRegionView::delete_selection()
for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i)
if ((*i)->selected())
- _delta_command->remove(*(*i)->note());
+ _delta_command->remove((*i)->note());
_selection.clear();
}
@@ -755,10 +762,10 @@ MidiRegionView::note_dropped(CanvasMidiEvent* ev, double dt, uint8_t dnote)
for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
command_remove_note(*i);
- Note copy(*(*i)->note());
+ const boost::shared_ptr<Note> copy(new Note(*(*i)->note().get()));
- copy.set_time((*i)->note()->time() + dt);
- copy.set_note((*i)->note()->note() + dnote);
+ copy->set_time((*i)->note()->time() + dt);
+ copy->set_note((*i)->note()->note() + dnote);
command_add_note(copy);
}
@@ -773,7 +780,7 @@ MidiRegionView::note_entered(ArdourCanvas::CanvasMidiEvent* ev)
if (ev->note() && _mouse_state == EraseTouchDragging) {
start_delta_command();
ev->selected(true);
- _delta_command->remove(*ev->note());
+ _delta_command->remove(ev->note());
} else if (_mouse_state == SelectTouchDragging) {
note_selected(ev, true);
}
diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h
index 6b0dcd1804..20c7671f5b 100644
--- a/gtk2_ardour/midi_region_view.h
+++ b/gtk2_ardour/midi_region_view.h
@@ -76,7 +76,7 @@ class MidiRegionView : public RegionView
GhostRegion* add_ghost (AutomationTimeAxisView&);
- void add_note(const ARDOUR::Note& note, bool copy_note);
+ void add_note(const boost::shared_ptr<ARDOUR::Note> note);
void resolve_note(uint8_t note_num, double end_time);
void begin_write();
@@ -99,14 +99,14 @@ class MidiRegionView : public RegionView
_delta_command = _model->new_delta_command();
}
- void command_add_note(ARDOUR::Note& note) {
+ void command_add_note(const boost::shared_ptr<ARDOUR::Note> note) {
if (_delta_command)
_delta_command->add(note);
}
void command_remove_note(ArdourCanvas::CanvasMidiEvent* ev) {
if (_delta_command && ev->note()) {
- _delta_command->remove(*ev->note());
+ _delta_command->remove(ev->note());
ev->selected(true);
}
}
diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc
index a2b4229650..9e0f9f368f 100644
--- a/gtk2_ardour/midi_streamview.cc
+++ b/gtk2_ardour/midi_streamview.cc
@@ -146,13 +146,10 @@ MidiStreamView::display_region(MidiRegionView* region_view, bool load_model)
if (load_model)
source->load_model();
- if (source->model()) {
- // Find our note range
- for (size_t i=0; i < source->model()->n_notes(); ++i) {
- const Note& note = source->model()->note_at(i);
- update_bounds(note.note());
- }
- }
+ // Find our note range
+ if (source->model())
+ for (size_t i=0; i < source->model()->n_notes(); ++i)
+ update_bounds(source->model()->note_at(i)->note());
// Display region contents
region_view->display_model(source->model());
@@ -467,24 +464,26 @@ MidiStreamView::update_rec_regions (boost::shared_ptr<MidiModel> data, nframes_t
MidiRegionView* mrv = (MidiRegionView*)iter->second;
for (size_t i=0; i < data->n_notes(); ++i) {
- const Note& note = data->note_at(i);
+ // FIXME: slooooooooow!
- if (note.time() + region->position() < start)
+ const boost::shared_ptr<Note> note = data->note_at(i);
+
+ if (note->duration() > 0 && note->end_time() + region->position() > start)
+ mrv->resolve_note(note->note(), note->end_time());
+
+ if (note->time() + region->position() < start)
continue;
- if (note.time() + region->position() > start + dur)
+ if (note->time() + region->position() > start + dur)
break;
- mrv->add_note(note, true);
-
- if (note.duration() > 0 && note.end_time() >= start)
- mrv->resolve_note(note.note(), note.end_time());
+ mrv->add_note(note);
- if (note.note() < _lowest_note) {
- _lowest_note = note.note();
+ if (note->note() < _lowest_note) {
+ _lowest_note = note->note();
update_range = true;
- } else if (note.note() > _highest_note) {
- _highest_note = note.note();
+ } else if (note->note() > _highest_note) {
+ _highest_note = note->note();
update_range = true;
}
}
diff --git a/gtk2_ardour/midi_time_axis.h b/gtk2_ardour/midi_time_axis.h
index a35a332e01..f7ec164edc 100644
--- a/gtk2_ardour/midi_time_axis.h
+++ b/gtk2_ardour/midi_time_axis.h
@@ -42,7 +42,6 @@
namespace ARDOUR {
class Session;
- class MidiDiskstream;
class RouteGroup;
class Processor;
class Location;
diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h
index 871ec0fb9c..03d5897c1a 100644
--- a/gtk2_ardour/public_editor.h
+++ b/gtk2_ardour/public_editor.h
@@ -146,7 +146,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway
*/
virtual Editing::MouseMode current_mouse_mode () const = 0;
- /** Set the midi edit mode (select, pencil, eraser, etc.)
+ /** Set the midi edit mode (pencil, select, eraser, etc.)
* @param m Midi edit mode (defined in editing_syms.h)
* @param force Perform the effects of the change even if no change is required
* (ie even if the current midi edit mode is equal to \ref m)