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
This commit is contained in:
Ben Loftis 2012-11-26 22:43:10 +00:00
parent f9d1faa634
commit e63da83c53
11 changed files with 164 additions and 184 deletions

View file

@ -151,7 +151,7 @@
<menuitem action='ToggleClick'/> <menuitem action='ToggleClick'/>
<menuitem action='toggle-follow-playhead'/> <menuitem action='toggle-follow-playhead'/>
<menuitem action='panic'/> <menuitem action='panic'/>
<separator/> <separator/>
</menu> </menu>
<menu name='Edit' action='Edit'> <menu name='Edit' action='Edit'>
@ -222,6 +222,7 @@
<menuitem action='set-tempo-from-region'/> <menuitem action='set-tempo-from-region'/>
<menuitem action='set-tempo-from-edit-range'/> <menuitem action='set-tempo-from-edit-range'/>
</menu> </menu>
<menuitem action='set-mouse-mode-object-range'/>
#ifndef GTKOSX #ifndef GTKOSX
<separator/> <separator/>
<menuitem action='ToggleRCOptionsEditor'/> <menuitem action='ToggleRCOptionsEditor'/>

View file

@ -1622,10 +1622,6 @@ ARDOUR_UI::transport_roll ()
_session->request_play_range (0, true); _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) { if (!rolling) {
_session->request_transport_speed (1.0f); _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) { if (rolling) {
_session->request_stop (with_abort, true); _session->request_stop (with_abort, true);
} else { } 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); _session->request_play_range (&editor->get_selection().time, true);
} }

View file

@ -46,7 +46,6 @@
#include "public_editor.h" #include "public_editor.h"
#include "audio_clock.h" #include "audio_clock.h"
#include "actions.h" #include "actions.h"
#include "button_joiner.h"
#include "main_clock.h" #include "main_clock.h"
#include "utils.h" #include "utils.h"
#include "theme_manager.h" #include "theme_manager.h"

View file

@ -80,7 +80,6 @@
#include "audio_time_axis.h" #include "audio_time_axis.h"
#include "automation_time_axis.h" #include "automation_time_axis.h"
#include "bundle_manager.h" #include "bundle_manager.h"
#include "button_joiner.h"
#include "canvas-noevent-text.h" #include "canvas-noevent-text.h"
#include "canvas_impl.h" #include "canvas_impl.h"
#include "crossfade_edit.h" #include "crossfade_edit.h"
@ -2317,7 +2316,13 @@ Editor::set_state (const XMLNode& node, int /*version*/)
} }
if ((prop = node.property ("join-object-range"))) { 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"))) { if ((prop = node.property ("edit-point"))) {
@ -2828,14 +2833,12 @@ Editor::setup_toolbar ()
mode_box->set_spacing(4); mode_box->set_spacing(4);
HBox* mouse_mode_box = manage (new HBox); HBox* mouse_mode_box = manage (new HBox);
HBox* mouse_mode_hbox1 = manage (new HBox); HBox* mouse_mode_hbox = manage (new HBox);
HBox* mouse_mode_hbox2 = manage (new HBox); VBox* mouse_mode_vbox = manage (new VBox);
VBox* mouse_mode_vbox1 = manage (new VBox); Alignment* mouse_mode_align = manage (new Alignment);
VBox* mouse_mode_vbox2 = manage (new VBox);
Alignment* mouse_mode_align1 = manage (new Alignment);
Alignment* mouse_mode_align2 = manage (new Alignment);
Glib::RefPtr<SizeGroup> mouse_mode_size_group = SizeGroup::create (SIZE_GROUP_BOTH); 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_move_button);
mouse_mode_size_group->add_widget (mouse_select_button); mouse_mode_size_group->add_widget (mouse_select_button);
mouse_mode_size_group->add_widget (mouse_zoom_button); mouse_mode_size_group->add_widget (mouse_zoom_button);
@ -2848,30 +2851,24 @@ Editor::setup_toolbar ()
/* make them just a bit bigger */ /* make them just a bit bigger */
mouse_move_button.set_size_request (-1, 25); mouse_move_button.set_size_request (-1, 25);
smart_mode_joiner = manage (new ButtonJoiner ("mouse mode button", mouse_move_button, mouse_select_button, true)); mouse_mode_hbox->set_spacing (2);
smart_mode_joiner->set_related_action (smart_mode_action);
mouse_mode_hbox2->set_spacing (2); mouse_mode_hbox->pack_start (smart_mode_button, false, false);
mouse_mode_box->set_spacing (2); 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_hbox1->pack_start (*smart_mode_joiner, false, false); mouse_mode_vbox->pack_start (*mouse_mode_hbox);
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_vbox1->pack_start (*mouse_mode_hbox1, false, false); mouse_mode_align->add (*mouse_mode_vbox);
mouse_mode_vbox2->pack_start (*mouse_mode_hbox2, false, false); mouse_mode_align->set (0.5, 1.0, 0.0, 0.0);
mouse_mode_align1->add (*mouse_mode_vbox1); mouse_mode_box->pack_start (*mouse_mode_align, false, false);
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_box->pack_start (*mouse_mode_align1, false, false);
mouse_mode_box->pack_start (*mouse_mode_align2, false, false);
edit_mode_strings.push_back (edit_mode_to_string (Slide)); edit_mode_strings.push_back (edit_mode_to_string (Slide));
if (!Profile->get_sae()) { if (!Profile->get_sae()) {
@ -3049,14 +3046,14 @@ Editor::setup_toolbar ()
void void
Editor::setup_tooltips () Editor::setup_tooltips ()
{ {
ARDOUR_UI::instance()->set_tip (mouse_move_button, _("Select/Move Objects")); ARDOUR_UI::instance()->set_tip (smart_mode_button, _("Smart Mode (add Range functions to Object mode)"));
ARDOUR_UI::instance()->set_tip (mouse_select_button, _("Select/Move Ranges")); 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_draw_button, _("Draw/Edit MIDI Notes"));
ARDOUR_UI::instance()->set_tip (mouse_gain_button, _("Draw Region Gain")); 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_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_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 (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 (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 (*_group_tabs, _("Groups: click to (de)activate\nContext-click for other operations"));
ARDOUR_UI::instance()->set_tip (nudge_forward_button, _("Nudge Region/Selection Later")); 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); zoom_range_clock->set (frames);
} }
bool const showing_time_selection = bool const showing_time_selection = selection->time.length() > 0;
mouse_mode == MouseRange ||
(mouse_mode == MouseObject && _join_object_range_state != JOIN_OBJECT_RANGE_NONE);
if (showing_time_selection && selection->time.start () != selection->time.end_frame ()) { if (showing_time_selection && selection->time.start () != selection->time.end_frame ()) {
for (TrackViewList::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) { for (TrackViewList::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {

View file

@ -1586,11 +1586,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
ArdourButton mouse_timefx_button; ArdourButton mouse_timefx_button;
ArdourButton mouse_audition_button; ArdourButton mouse_audition_button;
ButtonJoiner* smart_mode_joiner; ArdourButton smart_mode_button;
Glib::RefPtr<Gtk::ToggleAction> smart_mode_action; Glib::RefPtr<Gtk::ToggleAction> smart_mode_action;
void mouse_mode_toggled (Editing::MouseMode m); void mouse_mode_toggled (Editing::MouseMode m);
void mouse_mode_object_range_toggled () {} void mouse_mode_object_range_toggled ();
bool ignore_mouse_mode_toggle; bool ignore_mouse_mode_toggle;
ArdourButton internal_edit_button; 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); 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 (); void toggle_sound_midi_notes ();
/** Flag for a bit of a hack wrt control point selection; see set_selected_control_point_from_click */ /** Flag for a bit of a hack wrt control point selection; see set_selected_control_point_from_click */

View file

@ -404,6 +404,12 @@ Editor::register_actions ()
Glib::RefPtr<ActionGroup> mouse_mode_actions = ActionGroup::create (X_("MouseMode")); Glib::RefPtr<ActionGroup> mouse_mode_actions = ActionGroup::create (X_("MouseMode"));
RadioAction::Group mouse_mode_group; 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)); 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_related_action (act);
mouse_move_button.set_image (::get_icon("tool_object")); 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_image (::get_icon("midi_tool_pencil"));
mouse_draw_button.set_name ("mouse mode button"); 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)); 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_related_action (act);
mouse_gain_button.set_image (::get_icon("tool_gain")); mouse_gain_button.set_image (::get_icon("tool_gain"));

View file

@ -3607,9 +3607,7 @@ SelectionDrag::finished (GdkEvent* event, bool movement_occurred)
s->request_play_range (&_editor->selection->time, true); s->request_play_range (&_editor->selection->time, true);
} else { } else {
if (Config->get_always_play_range()) { 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 { } else {
/* just a click, no pointer movement. /* just a click, no pointer movement.
*/ */
_editor->selection->clear_time();
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();
}
}
if (_editor->clicked_axisview && !_editor->selection->selected (_editor->clicked_axisview)) { if (_editor->clicked_axisview && !_editor->selection->selected (_editor->clicked_axisview)) {
_editor->selection->set (_editor->clicked_axisview); _editor->selection->set (_editor->clicked_axisview);

View file

@ -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 */ /* 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; double x, y;
get_pointer_position (x, y); get_pointer_position (x, y);
ArdourCanvas::Item* i = track_canvas->get_item_at (x, y); ArdourCanvas::Item* i = track_canvas->get_item_at (x, y);
@ -308,6 +308,21 @@ Editor::set_canvas_cursor ()
set_canvas_cursor (current_canvas_cursor, true); set_canvas_cursor (current_canvas_cursor, true);
} }
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 void
Editor::set_mouse_mode (MouseMode m, bool force) Editor::set_mouse_mode (MouseMode m, bool force)
{ {
@ -360,26 +375,7 @@ Editor::set_mouse_mode (MouseMode m, bool force)
tact->set_active (false); tact->set_active (false);
tact->set_active (true); tact->set_active (true);
MouseModeChanged (); /* EMIT SIGNAL */ //NOTE: this will result in a call to mouse_mode_toggled which does the heavy lifting
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);
}
}
}
} }
void void
@ -451,29 +447,25 @@ Editor::mouse_mode_toggled (MouseMode m)
instant_save (); instant_save ();
if (!internal_editing()) { //TODO: set button styles for smart buttons
if (mouse_mode != MouseRange && mouse_mode != MouseGain && _join_object_range_state == JOIN_OBJECT_RANGE_NONE) { /*
if ( smart_mode_action->get_active() ) {
/* in all modes except range, gain and joined object/range, hide the range selection, if( mouse_mode == MouseObject ) { //smart active and object active
show the object (region) selection. smart_mode_button.set_active(1);
*/ smart_mode_button.set_name("smart mode button");
mouse_move_button.set_name("smart mode button");
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { } else { //smart active but object inactive
(*i)->hide_selection (); smart_mode_button.set_active(0);
} smart_mode_button.set_name("smart mode button");
mouse_move_button.set_name("mouse mode button");
} 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);
}
} }
} 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_canvas_cursor ();
set_gain_envelope_visibility (); set_gain_envelope_visibility ();
@ -579,11 +571,9 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
*/ */
if (((mouse_mode != MouseObject) && if (((mouse_mode != MouseObject) &&
(_join_object_range_state != JOIN_OBJECT_RANGE_OBJECT) &&
(mouse_mode != MouseAudition || item_type != RegionItem) && (mouse_mode != MouseAudition || item_type != RegionItem) &&
(mouse_mode != MouseTimeFX || item_type != RegionItem) && (mouse_mode != MouseTimeFX || item_type != RegionItem) &&
(mouse_mode != MouseGain) && (mouse_mode != MouseGain) &&
(mouse_mode != MouseRange) &&
(mouse_mode != MouseDraw)) || (mouse_mode != MouseDraw)) ||
((event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE) || event->button.button > 3) || ((event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE) || event->button.button > 3) ||
(internal_editing() && mouse_mode != MouseTimeFX)) { (internal_editing() && mouse_mode != MouseTimeFX)) {
@ -608,12 +598,10 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
switch (item_type) { switch (item_type) {
case RegionItem: case RegionItem:
if (!doing_range_stuff()) {
set_selected_regionview_from_click (press, op);
}
if (press) { 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 /* don't change the selection unless the
clicked track is not currently selected. if clicked track is not currently selected. if
so, "collapse" the selection to just this so, "collapse" the selection to just this
@ -630,7 +618,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
case RegionViewName: case RegionViewName:
case LeftFrameHandle: case LeftFrameHandle:
case RightFrameHandle: case RightFrameHandle:
if (doing_object_stuff() || (mouse_mode != MouseRange && mouse_mode != MouseObject)) { if ( mouse_mode != MouseRange ) {
set_selected_regionview_from_click (press, op); set_selected_regionview_from_click (press, op);
} else if (event->type == GDK_BUTTON_PRESS) { } else if (event->type == GDK_BUTTON_PRESS) {
set_selected_track_as_side_effect (op); set_selected_track_as_side_effect (op);
@ -643,7 +631,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
case FadeOutItem: case FadeOutItem:
case StartCrossFadeItem: case StartCrossFadeItem:
case EndCrossFadeItem: case EndCrossFadeItem:
if (doing_object_stuff() || (mouse_mode != MouseRange && mouse_mode != MouseObject)) { if ( mouse_mode != MouseRange ) {
set_selected_regionview_from_click (press, op); set_selected_regionview_from_click (press, op);
} else if (event->type == GDK_BUTTON_PRESS) { } else if (event->type == GDK_BUTTON_PRESS) {
set_selected_track_as_side_effect (op); set_selected_track_as_side_effect (op);
@ -652,7 +640,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
case ControlPointItem: case ControlPointItem:
set_selected_track_as_side_effect (op); 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); set_selected_control_point_from_click (press, op);
} }
break; 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); pair<TimeAxisView*, int> tvp = trackview_by_y_position (y);
if (tvp.first) { if (tvp.first) {
AutomationTimeAxisView* atv = dynamic_cast<AutomationTimeAxisView*> (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 */ /* smart "join" mode: drag automation */
_drags->set (new AutomationRangeDrag (this, atv, selection->time), event, _cursors->up_down); _drags->set (new AutomationRangeDrag (this, atv, selection->time), event, _cursors->up_down);
} else { } else {
@ -854,7 +842,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
case LeftFrameHandle: case LeftFrameHandle:
case RightFrameHandle: 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); RegionSelection s = get_equivalent_regions (selection->regions, Properties::edit.property_id);
_drags->set (new TrimDrag (this, item, clicked_regionview, s.by_layer()), event); _drags->set (new TrimDrag (this, item, clicked_regionview, s.by_layer()), event);
return true; 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())) { // 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->add (new SelectionDrag (this, clicked_axisview->get_selection_rect (clicked_selection)->rect, SelectionDrag::SelectionMove));
} // }
_drags->start_grab (event); _drags->start_grab (event);
break; break;
@ -1054,7 +1042,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
case SelectionItem: 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 */ /* 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; double const y = event->button.y + vertical_adjustment.get_value() - canvas_timebars_vsize;
pair<TimeAxisView*, int> tvp = trackview_by_y_position (y); 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, /* 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 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) { if (rtv && _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) {
boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (rtv->route ()); boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (rtv->route ());
if (t) { if (t) {
@ -1089,6 +1077,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
} }
} }
} }
*/
} }
} }
break; 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 //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); framepos_t where = event_frame (event, 0, 0);
snap_to(where); snap_to(where);
_session->request_locate (where, false); _session->request_locate (where, false);
@ -1439,16 +1428,6 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
were_dragging = true; 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 (); update_region_layering_order_editor ();
/* edit events get handled here */ /* 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 */ /* context menu events get handled here */
if (Keyboard::is_context_menu_event (&event->button)) { if (Keyboard::is_context_menu_event (&event->button)) {
context_click_event = *event; context_click_event = *event;
@ -1847,7 +1825,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
break; break;
case RegionViewNameHighlight: 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); set_canvas_cursor_for_region_view (event->crossing.x, entered_regionview);
_over_region_trim_target = true; _over_region_trim_target = true;
} }
@ -1855,7 +1833,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
case LeftFrameHandle: case LeftFrameHandle:
case RightFrameHandle: 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); set_canvas_cursor_for_region_view (event->crossing.x, entered_regionview);
} }
break; break;
@ -1981,7 +1959,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
} }
break; break;
case SelectionItem: case SelectionItem:
if (smart_mode_action->get_active()) { if ( get_smart_mode() ) {
set_canvas_cursor (); set_canvas_cursor ();
} }
break; break;
@ -2814,7 +2792,7 @@ Editor::update_join_object_range_location (double /*x*/, double y)
that we're over requires searching the playlist. 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; _join_object_range_state = JOIN_OBJECT_RANGE_NONE;
return; return;
} }

View file

@ -3641,7 +3641,7 @@ Editor::copy ()
bool bool
Editor::can_cut_copy () const Editor::can_cut_copy () const
{ {
switch (current_mouse_mode()) { switch (effective_mouse_mode()) {
case MouseObject: case MouseObject:
if (!selection->regions.empty() || !selection->points.empty()) { 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) { if (entered_marker) {
@ -3719,7 +3720,7 @@ Editor::cut_copy (CutCopyOp op)
if (internal_editing()) { if (internal_editing()) {
switch (current_mouse_mode()) { switch (effective_mouse_mode()) {
case MouseObject: case MouseObject:
case MouseRange: case MouseRange:
cut_copy_midi (op); cut_copy_midi (op);
@ -3730,19 +3731,62 @@ Editor::cut_copy (CutCopyOp op)
} else { } 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()) { if (!selection->regions.empty()) {
rs = get_regions_from_selection (); 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()) { if (!rs.empty() || !selection->points.empty()) {
begin_reversible_command (opname + _(" objects")); begin_reversible_command (opname + _(" objects"));
if (!rs.empty()) { if (!rs.empty()) {
cut_copy_regions (op, rs); cut_copy_regions (op, rs);
if (op == Cut || op == Delete) { if (op == Cut || op == Delete) {
selection->clear_regions (); selection->clear_regions ();
} }
@ -3755,16 +3799,11 @@ Editor::cut_copy (CutCopyOp op)
selection->clear_points (); 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()) { if (selection->time.empty()) {
framepos_t start, end; framepos_t start, end;
if (!get_edit_op_range (start, end)) { if (!get_edit_op_range (start, end)) {
@ -3772,18 +3811,22 @@ Editor::cut_copy (CutCopyOp op)
} }
selection->set (start, end); selection->set (start, end);
} }
begin_reversible_command (opname + _(" range")); begin_reversible_command (opname + _(" range"));
cut_copy_ranges (op); cut_copy_ranges (op);
commit_reversible_command (); commit_reversible_command ();
if (op == Cut || op == Delete) { if (op == Cut || op == Delete) {
selection->clear_time (); selection->clear_time ();
} }
break;
default:
break;
} }
} }
out:
if (op == Delete || op == Cut || op == Clear) { if (op == Delete || op == Cut || op == Clear) {
_drags->abort (); _drags->abort ();
} }
@ -5443,9 +5486,7 @@ Editor::set_playhead_cursor ()
void void
Editor::split_region () Editor::split_region ()
{ {
if (((mouse_mode == MouseRange) || if ( !selection->time.empty()) {
(mouse_mode != MouseObject && _join_object_range_state == JOIN_OBJECT_RANGE_RANGE)) &&
!selection->time.empty()) {
separate_regions_between (selection->time); separate_regions_between (selection->time);
return; return;
} }

View file

@ -962,9 +962,7 @@ Editor::track_selection_changed ()
(*j)->set_selected (find (selection->tracks.begin(), selection->tracks.end(), j->get()) != selection->tracks.end()); (*j)->set_selected (find (selection->tracks.begin(), selection->tracks.end(), j->get()) != selection->tracks.end());
} }
if (yn && if (yn) {
((mouse_mode == MouseRange) ||
((mouse_mode == MouseObject) && (_join_object_range_state == JOIN_OBJECT_RANGE_OBJECT)))) {
(*i)->reshow_selection (selection->time); (*i)->reshow_selection (selection->time);
} else { } else {
(*i)->hide_selection (); (*i)->hide_selection ();
@ -1801,7 +1799,7 @@ Editor::select_range_between ()
framepos_t start; framepos_t start;
framepos_t end; framepos_t end;
if (mouse_mode == MouseRange && !selection->time.empty()) { if ( !selection->time.empty() ) {
selection->clear_time (); selection->clear_time ();
} }

View file

@ -216,6 +216,8 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible {
virtual bool show_measures () const = 0; virtual bool show_measures () const = 0;
virtual bool redraw_measures () = 0; virtual bool redraw_measures () = 0;
virtual Editing::MouseMode effective_mouse_mode () const = 0;
/** Open main export dialog */ /** Open main export dialog */
virtual void export_audio () = 0; virtual void export_audio () = 0;