summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Loftis <ben@glw.com>2012-11-26 22:43:10 +0000
committerBen Loftis <ben@glw.com>2012-11-26 22:43:10 +0000
commite63da83c530f8c2f81bfba4ec6d77c7adad8a50d (patch)
tree407fdce24fe888539f9a2f767f973720b1394a28
parentf9d1faa63490d77f4a1e9493fcac5b3166c1b1d8 (diff)
tweak Smart Mode to be more like Mixbus. Smart mode is just a modifier on Object mode which provides Range selection in the top half of the waveform. probably lots of corner cases to clear up before its all over, but at least we can use Mixbus as a consistent target rather than making it all up again.
git-svn-id: svn://localhost/ardour2/branches/3.0@13551 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--gtk2_ardour/ardour.menus.in3
-rw-r--r--gtk2_ardour/ardour_ui.cc6
-rw-r--r--gtk2_ardour/ardour_ui2.cc1
-rw-r--r--gtk2_ardour/editor.cc63
-rw-r--r--gtk2_ardour/editor.h14
-rw-r--r--gtk2_ardour/editor_actions.cc9
-rw-r--r--gtk2_ardour/editor_drag.cc27
-rw-r--r--gtk2_ardour/editor_mouse.cc128
-rw-r--r--gtk2_ardour/editor_ops.cc89
-rw-r--r--gtk2_ardour/editor_selection.cc6
-rw-r--r--gtk2_ardour/public_editor.h2
11 files changed, 164 insertions, 184 deletions
diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in
index 27a94cae3d..c9472db56c 100644
--- a/gtk2_ardour/ardour.menus.in
+++ b/gtk2_ardour/ardour.menus.in
@@ -151,7 +151,7 @@
<menuitem action='ToggleClick'/>
<menuitem action='toggle-follow-playhead'/>
<menuitem action='panic'/>
- <separator/>
+ <separator/>
</menu>
<menu name='Edit' action='Edit'>
@@ -222,6 +222,7 @@
<menuitem action='set-tempo-from-region'/>
<menuitem action='set-tempo-from-edit-range'/>
</menu>
+ <menuitem action='set-mouse-mode-object-range'/>
#ifndef GTKOSX
<separator/>
<menuitem action='ToggleRCOptionsEditor'/>
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index a5eb449739..2c97591d0e 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -1622,10 +1622,6 @@ ARDOUR_UI::transport_roll ()
_session->request_play_range (0, true);
}
- if ( ((editor->current_mouse_mode() == Editing::MouseRange) || get_smart_mode()) && Config->get_always_play_range()) {
- _session->request_play_range (&editor->get_selection().time, true);
- }
-
if (!rolling) {
_session->request_transport_speed (1.0f);
}
@@ -1688,7 +1684,7 @@ ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode)
if (rolling) {
_session->request_stop (with_abort, true);
} else {
- if ( ((editor->current_mouse_mode() == Editing::MouseRange) || editor->get_smart_mode()) && Config->get_always_play_range()) {
+ if ( Config->get_always_play_range() ) {
_session->request_play_range (&editor->get_selection().time, true);
}
diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc
index 3b060a73ea..81b5175389 100644
--- a/gtk2_ardour/ardour_ui2.cc
+++ b/gtk2_ardour/ardour_ui2.cc
@@ -46,7 +46,6 @@
#include "public_editor.h"
#include "audio_clock.h"
#include "actions.h"
-#include "button_joiner.h"
#include "main_clock.h"
#include "utils.h"
#include "theme_manager.h"
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index 330646a42d..c9008f9d55 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -80,7 +80,6 @@
#include "audio_time_axis.h"
#include "automation_time_axis.h"
#include "bundle_manager.h"
-#include "button_joiner.h"
#include "canvas-noevent-text.h"
#include "canvas_impl.h"
#include "crossfade_edit.h"
@@ -2317,7 +2316,13 @@ Editor::set_state (const XMLNode& node, int /*version*/)
}
if ((prop = node.property ("join-object-range"))) {
- ActionManager::set_toggle_action ("MouseMode", "set-mouse-mode-object-range", string_is_affirmative (prop->value ()));
+ RefPtr<Action> act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-object-range"));
+ if (act) {
+ RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
+ tact->set_active (!yn);
+ tact->set_active (yn);
+ }
+ set_mouse_mode(mouse_mode, true);
}
if ((prop = node.property ("edit-point"))) {
@@ -2828,14 +2833,12 @@ Editor::setup_toolbar ()
mode_box->set_spacing(4);
HBox* mouse_mode_box = manage (new HBox);
- HBox* mouse_mode_hbox1 = manage (new HBox);
- HBox* mouse_mode_hbox2 = manage (new HBox);
- VBox* mouse_mode_vbox1 = manage (new VBox);
- VBox* mouse_mode_vbox2 = manage (new VBox);
- Alignment* mouse_mode_align1 = manage (new Alignment);
- Alignment* mouse_mode_align2 = manage (new Alignment);
+ HBox* mouse_mode_hbox = manage (new HBox);
+ VBox* mouse_mode_vbox = manage (new VBox);
+ Alignment* mouse_mode_align = manage (new Alignment);
Glib::RefPtr<SizeGroup> mouse_mode_size_group = SizeGroup::create (SIZE_GROUP_BOTH);
+// mouse_mode_size_group->add_widget (smart_mode_button);
mouse_mode_size_group->add_widget (mouse_move_button);
mouse_mode_size_group->add_widget (mouse_select_button);
mouse_mode_size_group->add_widget (mouse_zoom_button);
@@ -2848,30 +2851,24 @@ Editor::setup_toolbar ()
/* make them just a bit bigger */
mouse_move_button.set_size_request (-1, 25);
- smart_mode_joiner = manage (new ButtonJoiner ("mouse mode button", mouse_move_button, mouse_select_button, true));
- smart_mode_joiner->set_related_action (smart_mode_action);
-
- mouse_mode_hbox2->set_spacing (2);
- mouse_mode_box->set_spacing (2);
+ mouse_mode_hbox->set_spacing (2);
- mouse_mode_hbox1->pack_start (*smart_mode_joiner, false, false);
- mouse_mode_hbox2->pack_start (mouse_zoom_button, false, false);
- mouse_mode_hbox2->pack_start (mouse_gain_button, false, false);
- mouse_mode_hbox2->pack_start (mouse_timefx_button, false, false);
- mouse_mode_hbox2->pack_start (mouse_audition_button, false, false);
- mouse_mode_hbox2->pack_start (mouse_draw_button, false, false);
- mouse_mode_hbox2->pack_start (internal_edit_button, false, false, 8);
+ mouse_mode_hbox->pack_start (smart_mode_button, false, false);
+ mouse_mode_hbox->pack_start (mouse_move_button, false, false);
+ mouse_mode_hbox->pack_start (mouse_select_button, false, false);
+ mouse_mode_hbox->pack_start (mouse_zoom_button, false, false);
+ mouse_mode_hbox->pack_start (mouse_gain_button, false, false);
+ mouse_mode_hbox->pack_start (mouse_timefx_button, false, false);
+ mouse_mode_hbox->pack_start (mouse_audition_button, false, false);
+ mouse_mode_hbox->pack_start (mouse_draw_button, false, false);
+ mouse_mode_hbox->pack_start (internal_edit_button, false, false, 8);
- mouse_mode_vbox1->pack_start (*mouse_mode_hbox1, false, false);
- mouse_mode_vbox2->pack_start (*mouse_mode_hbox2, false, false);
+ mouse_mode_vbox->pack_start (*mouse_mode_hbox);
- mouse_mode_align1->add (*mouse_mode_vbox1);
- mouse_mode_align1->set (0.5, 1.0, 0.0, 0.0);
- mouse_mode_align2->add (*mouse_mode_vbox2);
- mouse_mode_align2->set (0.5, 1.0, 0.0, 0.0);
+ mouse_mode_align->add (*mouse_mode_vbox);
+ mouse_mode_align->set (0.5, 1.0, 0.0, 0.0);
- mouse_mode_box->pack_start (*mouse_mode_align1, false, false);
- mouse_mode_box->pack_start (*mouse_mode_align2, false, false);
+ mouse_mode_box->pack_start (*mouse_mode_align, false, false);
edit_mode_strings.push_back (edit_mode_to_string (Slide));
if (!Profile->get_sae()) {
@@ -3049,14 +3046,14 @@ Editor::setup_toolbar ()
void
Editor::setup_tooltips ()
{
- ARDOUR_UI::instance()->set_tip (mouse_move_button, _("Select/Move Objects"));
- ARDOUR_UI::instance()->set_tip (mouse_select_button, _("Select/Move Ranges"));
+ ARDOUR_UI::instance()->set_tip (smart_mode_button, _("Smart Mode (add Range functions to Object mode)"));
+ ARDOUR_UI::instance()->set_tip (mouse_move_button, _("Object Mode (select/move Objects)"));
+ ARDOUR_UI::instance()->set_tip (mouse_select_button, _("Range Mode (select/move Ranges)"));
ARDOUR_UI::instance()->set_tip (mouse_draw_button, _("Draw/Edit MIDI Notes"));
ARDOUR_UI::instance()->set_tip (mouse_gain_button, _("Draw Region Gain"));
ARDOUR_UI::instance()->set_tip (mouse_zoom_button, _("Select Zoom Range"));
ARDOUR_UI::instance()->set_tip (mouse_timefx_button, _("Stretch/Shrink Regions and MIDI Notes"));
ARDOUR_UI::instance()->set_tip (mouse_audition_button, _("Listen to Specific Regions"));
- ARDOUR_UI::instance()->set_tip (smart_mode_joiner, _("Smart Mode (Select/Move Objects + Ranges)"));
ARDOUR_UI::instance()->set_tip (internal_edit_button, _("Note Level Editing"));
ARDOUR_UI::instance()->set_tip (*_group_tabs, _("Groups: click to (de)activate\nContext-click for other operations"));
ARDOUR_UI::instance()->set_tip (nudge_forward_button, _("Nudge Region/Selection Later"));
@@ -4200,9 +4197,7 @@ Editor::set_frames_per_unit (double fpu)
zoom_range_clock->set (frames);
}
- bool const showing_time_selection =
- mouse_mode == MouseRange ||
- (mouse_mode == MouseObject && _join_object_range_state != JOIN_OBJECT_RANGE_NONE);
+ bool const showing_time_selection = selection->time.length() > 0;
if (showing_time_selection && selection->time.start () != selection->time.end_frame ()) {
for (TrackViewList::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index ca4a3ec87a..113ddcf377 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -1586,11 +1586,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
ArdourButton mouse_timefx_button;
ArdourButton mouse_audition_button;
- ButtonJoiner* smart_mode_joiner;
+ ArdourButton smart_mode_button;
Glib::RefPtr<Gtk::ToggleAction> smart_mode_action;
void mouse_mode_toggled (Editing::MouseMode m);
- void mouse_mode_object_range_toggled () {}
+ void mouse_mode_object_range_toggled ();
bool ignore_mouse_mode_toggle;
ArdourButton internal_edit_button;
@@ -2100,16 +2100,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
int time_fx (ARDOUR::RegionList&, float val, bool pitching);
- bool doing_range_stuff() const {
- return (mouse_mode == Editing::MouseRange && (_join_object_range_state == JOIN_OBJECT_RANGE_NONE)) ||
- _join_object_range_state == JOIN_OBJECT_RANGE_RANGE;
- }
-
- bool doing_object_stuff() const {
- return (mouse_mode == Editing::MouseObject && (_join_object_range_state == JOIN_OBJECT_RANGE_NONE)) ||
- _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT;
- }
-
void toggle_sound_midi_notes ();
/** Flag for a bit of a hack wrt control point selection; see set_selected_control_point_from_click */
diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc
index f37453ea6a..54894f9746 100644
--- a/gtk2_ardour/editor_actions.cc
+++ b/gtk2_ardour/editor_actions.cc
@@ -404,6 +404,12 @@ Editor::register_actions ()
Glib::RefPtr<ActionGroup> mouse_mode_actions = ActionGroup::create (X_("MouseMode"));
RadioAction::Group mouse_mode_group;
+ act = ActionManager::register_toggle_action (mouse_mode_actions, "set-mouse-mode-object-range", _("Smart Object Mode"), sigc::mem_fun (*this, &Editor::mouse_mode_object_range_toggled));
+ smart_mode_action = Glib::RefPtr<ToggleAction>::cast_static (act);
+ smart_mode_button.set_related_action (smart_mode_action);
+ smart_mode_button.set_text (_("Smart"));
+ smart_mode_button.set_name ("mouse mode button");
+
act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-object", _("Object Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseObject));
mouse_move_button.set_related_action (act);
mouse_move_button.set_image (::get_icon("tool_object"));
@@ -419,9 +425,6 @@ Editor::register_actions ()
mouse_draw_button.set_image (::get_icon("midi_tool_pencil"));
mouse_draw_button.set_name ("mouse mode button");
- act = ActionManager::register_toggle_action (mouse_mode_actions, "set-mouse-mode-object-range", _("Link Object / Range Tools"), sigc::mem_fun (*this, &Editor::mouse_mode_object_range_toggled));
- smart_mode_action = Glib::RefPtr<ToggleAction>::cast_static (act);
-
act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-gain", _("Gain Tool"), sigc::bind (mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseGain));
mouse_gain_button.set_related_action (act);
mouse_gain_button.set_image (::get_icon("tool_gain"));
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc
index 07971e4d22..c0155a8b62 100644
--- a/gtk2_ardour/editor_drag.cc
+++ b/gtk2_ardour/editor_drag.cc
@@ -3607,9 +3607,7 @@ SelectionDrag::finished (GdkEvent* event, bool movement_occurred)
s->request_play_range (&_editor->selection->time, true);
} else {
if (Config->get_always_play_range()) {
- if (_editor->doing_range_stuff()) {
- s->request_locate (_editor->get_selection().time.start());
- }
+ s->request_locate (_editor->get_selection().time.start());
}
}
}
@@ -3617,28 +3615,7 @@ SelectionDrag::finished (GdkEvent* event, bool movement_occurred)
} else {
/* just a click, no pointer movement.
*/
-
- if (Keyboard::no_modifier_keys_pressed (&event->button)) {
- if (!_time_selection_at_start) {
- if (_editor->clicked_regionview) {
- if (_editor->get_selection().selected (_editor->clicked_regionview)) {
- /* range select the entire current
- region selection
- */
- _editor->select_range (_editor->get_selection().regions.start(),
- _editor->get_selection().regions.end_frame());
- } else {
- /* range select this (unselected)
- * region
- */
- _editor->select_range (_editor->clicked_regionview->region()->position(),
- _editor->clicked_regionview->region()->last_frame());
- }
- }
- } else {
- _editor->selection->clear_time();
- }
- }
+ _editor->selection->clear_time();
if (_editor->clicked_axisview && !_editor->selection->selected (_editor->clicked_axisview)) {
_editor->selection->set (_editor->clicked_axisview);
diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc
index 1096afad87..ad50f744ce 100644
--- a/gtk2_ardour/editor_mouse.cc
+++ b/gtk2_ardour/editor_mouse.cc
@@ -293,7 +293,7 @@ Editor::set_canvas_cursor ()
}
/* up-down cursor as a cue that automation can be dragged up and down when in join object/range mode */
- if (smart_mode_action->get_active()) {
+ if ( get_smart_mode() ) {
double x, y;
get_pointer_position (x, y);
ArdourCanvas::Item* i = track_canvas->get_item_at (x, y);
@@ -309,6 +309,21 @@ Editor::set_canvas_cursor ()
}
void
+Editor::mouse_mode_object_range_toggled()
+{
+ MouseMode m = mouse_mode;
+
+ Glib::RefPtr<Action> act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-range"));
+ assert (act);
+ Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
+ assert (tact);
+ if (tact->get_active())
+ m = MouseObject; //Smart mode turned to ON, force editing to Object mode
+
+ set_mouse_mode(m, true); //call this so the button styles can get updated
+}
+
+void
Editor::set_mouse_mode (MouseMode m, bool force)
{
if (_drags->active ()) {
@@ -360,26 +375,7 @@ Editor::set_mouse_mode (MouseMode m, bool force)
tact->set_active (false);
tact->set_active (true);
- MouseModeChanged (); /* EMIT SIGNAL */
-
- if ( (mouse_mode != MouseRange) && (mouse_mode != MouseGain) ) {
-
- cancel_time_selection(); //disable the range, because an invisible operating range can cause confusing operation
-
- } else {
-
- /*
- in range mode,show the range selection.
- */
-
- cancel_selection();
-
- for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
- if ((*i)->get_selected()) {
- (*i)->show_selection (selection->time);
- }
- }
- }
+ //NOTE: this will result in a call to mouse_mode_toggled which does the heavy lifting
}
void
@@ -451,29 +447,25 @@ Editor::mouse_mode_toggled (MouseMode m)
instant_save ();
- if (!internal_editing()) {
- if (mouse_mode != MouseRange && mouse_mode != MouseGain && _join_object_range_state == JOIN_OBJECT_RANGE_NONE) {
-
- /* in all modes except range, gain and joined object/range, hide the range selection,
- show the object (region) selection.
- */
-
- for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
- (*i)->hide_selection ();
- }
-
- } else {
-
- /*
- in range or object/range mode, show the range selection.
- */
-
- for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
- (*i)->show_selection (selection->time);
- }
+ //TODO: set button styles for smart buttons
+/*
+ if ( smart_mode_action->get_active() ) {
+ if( mouse_mode == MouseObject ) { //smart active and object active
+ smart_mode_button.set_active(1);
+ smart_mode_button.set_name("smart mode button");
+ mouse_move_button.set_name("smart mode button");
+ } else { //smart active but object inactive
+ smart_mode_button.set_active(0);
+ smart_mode_button.set_name("smart mode button");
+ mouse_move_button.set_name("mouse mode button");
}
+ } else {
+ smart_mode_button.set_active(0);
+ smart_mode_button.set_name("mouse mode button");
+ mouse_move_button.set_name("mouse mode button");
}
-
+*/
+
set_canvas_cursor ();
set_gain_envelope_visibility ();
@@ -579,11 +571,9 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
*/
if (((mouse_mode != MouseObject) &&
- (_join_object_range_state != JOIN_OBJECT_RANGE_OBJECT) &&
(mouse_mode != MouseAudition || item_type != RegionItem) &&
(mouse_mode != MouseTimeFX || item_type != RegionItem) &&
(mouse_mode != MouseGain) &&
- (mouse_mode != MouseRange) &&
(mouse_mode != MouseDraw)) ||
((event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE) || event->button.button > 3) ||
(internal_editing() && mouse_mode != MouseTimeFX)) {
@@ -608,12 +598,10 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
switch (item_type) {
case RegionItem:
- if (!doing_range_stuff()) {
- set_selected_regionview_from_click (press, op);
- }
-
if (press) {
- if (doing_range_stuff()) {
+ if ( mouse_mode != MouseRange ) {
+ set_selected_regionview_from_click (press, op);
+ } else {
/* don't change the selection unless the
clicked track is not currently selected. if
so, "collapse" the selection to just this
@@ -630,7 +618,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
case RegionViewName:
case LeftFrameHandle:
case RightFrameHandle:
- if (doing_object_stuff() || (mouse_mode != MouseRange && mouse_mode != MouseObject)) {
+ if ( mouse_mode != MouseRange ) {
set_selected_regionview_from_click (press, op);
} else if (event->type == GDK_BUTTON_PRESS) {
set_selected_track_as_side_effect (op);
@@ -643,7 +631,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
case FadeOutItem:
case StartCrossFadeItem:
case EndCrossFadeItem:
- if (doing_object_stuff() || (mouse_mode != MouseRange && mouse_mode != MouseObject)) {
+ if ( mouse_mode != MouseRange ) {
set_selected_regionview_from_click (press, op);
} else if (event->type == GDK_BUTTON_PRESS) {
set_selected_track_as_side_effect (op);
@@ -652,7 +640,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
case ControlPointItem:
set_selected_track_as_side_effect (op);
- if (doing_object_stuff() || (mouse_mode != MouseRange && mouse_mode != MouseObject)) {
+ if ( mouse_mode != MouseRange ) {
set_selected_control_point_from_click (press, op);
}
break;
@@ -820,7 +808,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
pair<TimeAxisView*, int> tvp = trackview_by_y_position (y);
if (tvp.first) {
AutomationTimeAxisView* atv = dynamic_cast<AutomationTimeAxisView*> (tvp.first);
- if (smart_mode_action->get_active() && atv) {
+ if ( get_smart_mode() && atv) {
/* smart "join" mode: drag automation */
_drags->set (new AutomationRangeDrag (this, atv, selection->time), event, _cursors->up_down);
} else {
@@ -854,7 +842,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
case LeftFrameHandle:
case RightFrameHandle:
- if (!internal_editing() && doing_object_stuff() && !clicked_regionview->region()->locked()) {
+ if (!internal_editing() && !clicked_regionview->region()->locked()) {
RegionSelection s = get_equivalent_regions (selection->regions, Properties::edit.property_id);
_drags->set (new TrimDrag (this, item, clicked_regionview, s.by_layer()), event);
return true;
@@ -975,9 +963,9 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
}
- if (!internal_editing() && (_join_object_range_state == JOIN_OBJECT_RANGE_RANGE && !selection->regions.empty())) {
- _drags->add (new SelectionDrag (this, clicked_axisview->get_selection_rect (clicked_selection)->rect, SelectionDrag::SelectionMove));
- }
+// if (!internal_editing() && (_join_object_range_state == JOIN_OBJECT_RANGE_RANGE && !selection->regions.empty())) {
+// _drags->add (new SelectionDrag (this, clicked_axisview->get_selection_rect (clicked_selection)->rect, SelectionDrag::SelectionMove));
+// }
_drags->start_grab (event);
break;
@@ -1054,7 +1042,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
case SelectionItem:
{
- if (smart_mode_action->get_active()) {
+ if ( get_smart_mode() ) {
/* we're in "smart" joined mode, and we've clicked on a Selection */
double const y = event->button.y + vertical_adjustment.get_value() - canvas_timebars_vsize;
pair<TimeAxisView*, int> tvp = trackview_by_y_position (y);
@@ -1068,7 +1056,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
/* if we're over a track and a region, and in the `object' part of a region,
put a selection around the region and drag both
*/
- RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (tvp.first);
+/* RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (tvp.first);
if (rtv && _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) {
boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (rtv->route ());
if (t) {
@@ -1089,6 +1077,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
}
}
}
+*/
}
}
break;
@@ -1362,7 +1351,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
}
//not rolling, range mode click + join_play_range : locate the PH here
- if ( !_drags->active () && !_session->transport_rolling() && ( (mouse_mode == MouseRange) || _join_object_range_state == JOIN_OBJECT_RANGE_RANGE ) && Config->get_always_play_range() ) {
+ if ( !_drags->active () && !_session->transport_rolling() && ( effective_mouse_mode() == MouseRange ) && Config->get_always_play_range() ) {
framepos_t where = event_frame (event, 0, 0);
snap_to(where);
_session->request_locate (where, false);
@@ -1439,16 +1428,6 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
were_dragging = true;
}
- //a mouse click (no drag) in the range area of an audio track. maybe locate the playhead here
- if ( !_drags->active () && (effective_mouse_mode() == MouseRange) && Config->get_always_play_range() && (item_type != AutomationTrackItem) && !Keyboard::is_context_menu_event (&event->button)) {
- if ( _join_object_range_state == JOIN_OBJECT_RANGE_RANGE ) {
- framepos_t pos = event_frame (event, 0, 0);
- snap_to(pos);
- _session->request_locate (pos, false);
- return true;
- }
- }
-
update_region_layering_order_editor ();
/* edit events get handled here */
@@ -1492,7 +1471,6 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
}
/* context menu events get handled here */
-
if (Keyboard::is_context_menu_event (&event->button)) {
context_click_event = *event;
@@ -1847,7 +1825,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
break;
case RegionViewNameHighlight:
- if (is_drawable() && doing_object_stuff() && entered_regionview) {
+ if (is_drawable() && effective_mouse_mode() == MouseObject && entered_regionview) {
set_canvas_cursor_for_region_view (event->crossing.x, entered_regionview);
_over_region_trim_target = true;
}
@@ -1855,7 +1833,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
case LeftFrameHandle:
case RightFrameHandle:
- if (is_drawable() && doing_object_stuff() && !internal_editing() && entered_regionview) {
+ if (is_drawable() && effective_mouse_mode() == MouseObject && !internal_editing() && entered_regionview) {
set_canvas_cursor_for_region_view (event->crossing.x, entered_regionview);
}
break;
@@ -1981,7 +1959,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
}
break;
case SelectionItem:
- if (smart_mode_action->get_active()) {
+ if ( get_smart_mode() ) {
set_canvas_cursor ();
}
break;
@@ -2814,7 +2792,7 @@ Editor::update_join_object_range_location (double /*x*/, double y)
that we're over requires searching the playlist.
*/
- if (!smart_mode_action->get_active() || (mouse_mode != MouseRange && mouse_mode != MouseObject)) {
+ if ( !get_smart_mode() ) {
_join_object_range_state = JOIN_OBJECT_RANGE_NONE;
return;
}
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc
index 92b986d0d1..80afe57d76 100644
--- a/gtk2_ardour/editor_ops.cc
+++ b/gtk2_ardour/editor_ops.cc
@@ -3641,7 +3641,7 @@ Editor::copy ()
bool
Editor::can_cut_copy () const
{
- switch (current_mouse_mode()) {
+ switch (effective_mouse_mode()) {
case MouseObject:
if (!selection->regions.empty() || !selection->points.empty()) {
@@ -3700,7 +3700,8 @@ Editor::cut_copy (CutCopyOp op)
}
}
- cut_buffer->clear ();
+ if ( op != Clear ) //"Delete" doesn't change copy/paste buf
+ cut_buffer->clear ();
if (entered_marker) {
@@ -3719,7 +3720,7 @@ Editor::cut_copy (CutCopyOp op)
if (internal_editing()) {
- switch (current_mouse_mode()) {
+ switch (effective_mouse_mode()) {
case MouseObject:
case MouseRange:
cut_copy_midi (op);
@@ -3730,19 +3731,62 @@ Editor::cut_copy (CutCopyOp op)
} else {
- RegionSelection rs;
+ RegionSelection rs;
- /* we only want to cut regions if some are selected */
+ /* we only want to cut regions if some are selected */
- if (doing_object_stuff()) {
- rs = get_regions_from_selection ();
- if (!rs.empty() || !selection->points.empty()) {
+ if (!selection->regions.empty()) {
+ rs = get_regions_from_selection ();
+ }
+ switch (effective_mouse_mode()) {
+/*
+ * case MouseGain: {
+ //find regions's gain line
+ AudioRegionView *rview = dynamic_cast<AudioRegionView*>(clicked_regionview);
+ AutomationTimeAxisView *tview = dynamic_cast<AutomationTimeAxisView*>(clicked_trackview);
+ if (rview) {
+ AudioRegionGainLine *line = rview->get_gain_line();
+ if (!line) break;
+
+ //cut region gain points in the selection
+ AutomationList& alist (line->the_list());
+ XMLNode &before = alist.get_state();
+ AutomationList* what_we_got = 0;
+ if ((what_we_got = alist.cut (selection->time.front().start - rview->audio_region()->position(), selection->time.front().end - rview->audio_region()->position())) != 0) {
+ session->add_command(new MementoCommand<AutomationList>(alist, &before, &alist.get_state()));
+ delete what_we_got;
+ what_we_got = 0;
+ }
+
+ rview->set_envelope_visible(true);
+ rview->audio_region()->set_envelope_active(true);
+
+ } else if (tview) {
+ AutomationLine *line = *(tview->lines.begin());
+ if (!line) break;
+
+ //cut auto points in the selection
+ AutomationList& alist (line->the_list());
+ XMLNode &before = alist.get_state();
+ AutomationList* what_we_got = 0;
+ if ((what_we_got = alist.cut (selection->time.front().start, selection->time.front().end)) != 0) {
+ session->add_command(new MementoCommand<AutomationList>(alist, &before, &alist.get_state()));
+ delete what_we_got;
+ what_we_got = 0;
+ }
+ } else
+ break;
+ } break;
+*/
+ case MouseObject:
+ case MouseRange:
+ if (!rs.empty() || !selection->points.empty()) {
begin_reversible_command (opname + _(" objects"));
if (!rs.empty()) {
cut_copy_regions (op, rs);
-
+
if (op == Cut || op == Delete) {
selection->clear_regions ();
}
@@ -3755,16 +3799,11 @@ Editor::cut_copy (CutCopyOp op)
selection->clear_points ();
}
}
- commit_reversible_command ();
- goto out;
- }
- if (!selection->time.empty() && (_join_object_range_state == JOIN_OBJECT_RANGE_NONE)) {
- /* don't cause suprises */
- goto out;
- }
- }
- if (doing_range_stuff()) {
+ commit_reversible_command ();
+ break;
+ }
+
if (selection->time.empty()) {
framepos_t start, end;
if (!get_edit_op_range (start, end)) {
@@ -3772,18 +3811,22 @@ Editor::cut_copy (CutCopyOp op)
}
selection->set (start, end);
}
-
+
begin_reversible_command (opname + _(" range"));
cut_copy_ranges (op);
commit_reversible_command ();
-
+
if (op == Cut || op == Delete) {
selection->clear_time ();
}
+
+ break;
+
+ default:
+ break;
}
}
- out:
if (op == Delete || op == Cut || op == Clear) {
_drags->abort ();
}
@@ -5443,9 +5486,7 @@ Editor::set_playhead_cursor ()
void
Editor::split_region ()
{
- if (((mouse_mode == MouseRange) ||
- (mouse_mode != MouseObject && _join_object_range_state == JOIN_OBJECT_RANGE_RANGE)) &&
- !selection->time.empty()) {
+ if ( !selection->time.empty()) {
separate_regions_between (selection->time);
return;
}
diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc
index ffce8af25f..d299b2fd9e 100644
--- a/gtk2_ardour/editor_selection.cc
+++ b/gtk2_ardour/editor_selection.cc
@@ -962,9 +962,7 @@ Editor::track_selection_changed ()
(*j)->set_selected (find (selection->tracks.begin(), selection->tracks.end(), j->get()) != selection->tracks.end());
}
- if (yn &&
- ((mouse_mode == MouseRange) ||
- ((mouse_mode == MouseObject) && (_join_object_range_state == JOIN_OBJECT_RANGE_OBJECT)))) {
+ if (yn) {
(*i)->reshow_selection (selection->time);
} else {
(*i)->hide_selection ();
@@ -1801,7 +1799,7 @@ Editor::select_range_between ()
framepos_t start;
framepos_t end;
- if (mouse_mode == MouseRange && !selection->time.empty()) {
+ if ( !selection->time.empty() ) {
selection->clear_time ();
}
diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h
index 84256aa130..21db5c8e22 100644
--- a/gtk2_ardour/public_editor.h
+++ b/gtk2_ardour/public_editor.h
@@ -216,6 +216,8 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible {
virtual bool show_measures () const = 0;
virtual bool redraw_measures () = 0;
+ virtual Editing::MouseMode effective_mouse_mode () const = 0;
+
/** Open main export dialog */
virtual void export_audio () = 0;