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='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'/>

View File

@ -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);
}

View File

@ -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"

View File

@ -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_hbox->set_spacing (2);
mouse_mode_hbox2->set_spacing (2);
mouse_mode_box->set_spacing (2);
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_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_vbox->pack_start (*mouse_mode_hbox);
mouse_mode_vbox1->pack_start (*mouse_mode_hbox1, false, false);
mouse_mode_vbox2->pack_start (*mouse_mode_hbox2, false, false);
mouse_mode_align->add (*mouse_mode_vbox);
mouse_mode_align->set (0.5, 1.0, 0.0, 0.0);
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_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) {

View File

@ -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 */

View File

@ -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"));

View File

@ -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);

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 */
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);
@ -308,6 +308,21 @@ Editor::set_canvas_cursor ()
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
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 (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;
}

View File

@ -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 (!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;
}

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());
}
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 ();
}

View File

@ -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;