mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-17 20:26:30 +01:00
zoom focus and snap mode get the stateful-action treatment
This commit is contained in:
parent
298df2029b
commit
9c890f2690
12 changed files with 204 additions and 271 deletions
|
|
@ -109,14 +109,17 @@ AudioClipEditor::AudioClipEditor (std::string const & name, bool with_transport)
|
|||
, scroll_fraction (0)
|
||||
, current_line_drag (0)
|
||||
{
|
||||
build_upper_toolbar ();
|
||||
build_canvas ();
|
||||
build_lower_toolbar ();
|
||||
|
||||
load_bindings ();
|
||||
register_actions ();
|
||||
|
||||
build_canvas ();
|
||||
|
||||
build_grid_type_menu ();
|
||||
|
||||
build_upper_toolbar ();
|
||||
build_lower_toolbar ();
|
||||
|
||||
set_action_defaults ();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -61,7 +61,6 @@ CueEditor::CueEditor (std::string const & name, bool with_transport)
|
|||
horizontal_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &CueEditor::scrolled));
|
||||
|
||||
_history.Changed.connect (history_connection, invalidator (*this), std::bind (&CueEditor::history_changed, this), gui_context());
|
||||
set_zoom_focus (Editing::ZoomFocusLeft);
|
||||
}
|
||||
|
||||
CueEditor::~CueEditor ()
|
||||
|
|
@ -203,16 +202,7 @@ CueEditor::set_zoom_focus (Editing::ZoomFocus zf)
|
|||
return;
|
||||
}
|
||||
|
||||
std::string str = zoom_focus_strings[(int)zf];
|
||||
|
||||
if (str != zoom_focus_selector.get_text()) {
|
||||
zoom_focus_selector.set_text (str);
|
||||
}
|
||||
|
||||
if (_zoom_focus != zf) {
|
||||
_zoom_focus = zf;
|
||||
ZoomFocusChanged (); /* EMIT SIGNAL */
|
||||
}
|
||||
zoom_focus_actions[zf]->set_active (true);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -415,7 +405,7 @@ CueEditor::build_upper_toolbar ()
|
|||
_toolbar_outer->pack_start (*_toolbar_inner, true, false);
|
||||
|
||||
build_zoom_focus_menu ();
|
||||
zoom_focus_selector.set_text (zoom_focus_strings[(int)_zoom_focus]);
|
||||
zoom_focus_selector.set_text (zoom_focus_strings[(int)zoom_focus()]);
|
||||
|
||||
_toolbar_left->pack_start (zoom_in_button, false, false);
|
||||
_toolbar_left->pack_start (zoom_out_button, false, false);
|
||||
|
|
@ -436,10 +426,10 @@ CueEditor::build_zoom_focus_menu ()
|
|||
using namespace Gtk::Menu_Helpers;
|
||||
using namespace Editing;
|
||||
|
||||
zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusLeft], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusLeft)));
|
||||
zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusRight], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusRight)));
|
||||
zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusCenter], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusCenter)));
|
||||
zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusMouse], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusMouse)));
|
||||
zoom_focus_selector.append (zoom_focus_actions[ZoomFocusLeft]);
|
||||
zoom_focus_selector.append (zoom_focus_actions[ZoomFocusRight]);
|
||||
zoom_focus_selector.append (zoom_focus_actions[ZoomFocusCenter]);
|
||||
zoom_focus_selector.append (zoom_focus_actions[ZoomFocusMouse]);
|
||||
zoom_focus_selector.set_sizing_texts (zoom_focus_strings);
|
||||
}
|
||||
|
||||
|
|
@ -968,12 +958,6 @@ CueEditor::catch_pending_show_region ()
|
|||
}
|
||||
}
|
||||
|
||||
Editing::MouseMode
|
||||
CueEditor::current_mouse_mode () const
|
||||
{
|
||||
return mouse_mode;
|
||||
}
|
||||
|
||||
RegionSelection
|
||||
CueEditor::region_selection()
|
||||
{
|
||||
|
|
@ -983,12 +967,9 @@ CueEditor::region_selection()
|
|||
}
|
||||
|
||||
void
|
||||
CueEditor::mouse_mode_toggled (Editing::MouseMode m)
|
||||
CueEditor::mouse_mode_chosen (Editing::MouseMode m)
|
||||
{
|
||||
Glib::RefPtr<Gtk::Action> act = get_mouse_mode_action (m);
|
||||
Glib::RefPtr<Gtk::ToggleAction> tact = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic (act);
|
||||
|
||||
if (!tact->get_active()) {
|
||||
if (!mouse_mode_actions[m]->get_active()) {
|
||||
/* this was just the notification that the old mode has been
|
||||
* left. we'll get called again with the new mode active in a
|
||||
* jiffy.
|
||||
|
|
@ -996,8 +977,6 @@ CueEditor::mouse_mode_toggled (Editing::MouseMode m)
|
|||
return;
|
||||
}
|
||||
|
||||
mouse_mode = m;
|
||||
|
||||
/* this should generate a new enter event which will
|
||||
trigger the appropriate cursor.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -101,13 +101,9 @@ class CueEditor : public EditingContext, public PBD::HistoryOwner
|
|||
* @param next true to move to the next, otherwise move to the previous
|
||||
*/
|
||||
void step_mouse_mode (bool next);
|
||||
/** @return The current mouse mode (gain, object, range, timefx etc.)
|
||||
* (defined in editing_syms.inc.h)
|
||||
*/
|
||||
Editing::MouseMode current_mouse_mode () const;
|
||||
/** cue editors are *always* used for internal editing */
|
||||
bool internal_editing() const { return true; }
|
||||
void mouse_mode_toggled (Editing::MouseMode);
|
||||
void mouse_mode_chosen (Editing::MouseMode);
|
||||
|
||||
Gdk::Cursor* get_canvas_cursor () const;
|
||||
MouseCursors const* cursors () const {
|
||||
|
|
|
|||
|
|
@ -131,7 +131,6 @@ EditingContext::EditingContext (std::string const & name)
|
|||
, _selection_memento (new SelectionMemento())
|
||||
, _verbose_cursor (nullptr)
|
||||
, samples_per_pixel (2048)
|
||||
, _zoom_focus (ZoomFocusPlayhead)
|
||||
, bbt_ruler_scale (bbt_show_many)
|
||||
, bbt_bars (0)
|
||||
, bbt_bar_helper_on (0)
|
||||
|
|
@ -142,7 +141,6 @@ EditingContext::EditingContext (std::string const & name)
|
|||
, vertical_adjustment (0.0, 0.0, 10.0, 400.0)
|
||||
, horizontal_adjustment (0.0, 0.0, 1e16)
|
||||
, own_bindings (nullptr)
|
||||
, mouse_mode (MouseObject)
|
||||
, visual_change_queued (false)
|
||||
, autoscroll_horizontal_allowed (false)
|
||||
, autoscroll_vertical_allowed (false)
|
||||
|
|
@ -329,6 +327,34 @@ EditingContext::disable_automation_bindings ()
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
EditingContext::set_action_defaults ()
|
||||
{
|
||||
#ifndef LIVETRAX
|
||||
follow_playhead_action->set_active (true);
|
||||
#else
|
||||
follow_playhead_action->set_active (false);
|
||||
#endif
|
||||
mouse_mode_actions[Editing::MouseObject]->set_active (true);
|
||||
zoom_focus_actions[Editing::ZoomFocusLeft]->set_active (true);
|
||||
|
||||
if (snap_mode_actions[Editing::SnapMagnetic]) {
|
||||
snap_mode_actions[Editing::SnapMagnetic]->set_active (true);
|
||||
}
|
||||
if (grid_actions[Editing::GridTypeBeat]) {
|
||||
grid_actions[Editing::GridTypeBeat]->set_active (true);
|
||||
}
|
||||
if (draw_length_actions[DRAW_LEN_AUTO]) {
|
||||
draw_length_actions[DRAW_LEN_AUTO]->set_active (true);
|
||||
}
|
||||
if (draw_velocity_actions[DRAW_VEL_AUTO]) {
|
||||
draw_velocity_actions[DRAW_VEL_AUTO]->set_active (true);
|
||||
}
|
||||
if (draw_channel_actions[DRAW_CHAN_AUTO]) {
|
||||
draw_channel_actions[DRAW_CHAN_AUTO]->set_active (true);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
EditingContext::register_common_actions (Bindings* common_bindings, std::string const & prefix)
|
||||
{
|
||||
|
|
@ -337,7 +363,10 @@ EditingContext::register_common_actions (Bindings* common_bindings, std::string
|
|||
reg_sens (_common_actions, "temporal-zoom-out", _("Zoom Out"), sigc::bind (sigc::mem_fun (*this, &EditingContext::temporal_zoom_step), true));
|
||||
reg_sens (_common_actions, "temporal-zoom-in", _("Zoom In"), sigc::bind (sigc::mem_fun (*this, &EditingContext::temporal_zoom_step), false));
|
||||
|
||||
follow_playhead_action = toggle_reg_sens (_common_actions, "toggle-follow-playhead", _("Follow Playhead"), (sigc::mem_fun(*this, &EditingContext::toggle_follow_playhead)));
|
||||
/* toggle action that represents state */
|
||||
follow_playhead_action = toggle_reg_sens (_common_actions, "follow-playhead", _("Follow Playhead"), sigc::mem_fun (*this, &EditingContext::follow_playhead_chosen));
|
||||
/* invokable action that toggles the stateful action */
|
||||
reg_sens (_common_actions, "toggle-follow-playhead", _("Follow Playhead"), sigc::mem_fun (*this, &EditingContext::toggle_follow_playhead));
|
||||
|
||||
undo_action = reg_sens (_common_actions, "undo", S_("Command|Undo"), sigc::bind (sigc::mem_fun (*this, &EditingContext::undo), 1U));
|
||||
redo_action = reg_sens (_common_actions, "redo", _("Redo"), sigc::bind (sigc::mem_fun (*this, &EditingContext::redo), 1U));
|
||||
|
|
@ -353,23 +382,23 @@ EditingContext::register_common_actions (Bindings* common_bindings, std::string
|
|||
|
||||
RadioAction::Group mouse_mode_group;
|
||||
|
||||
ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-object", _("Grab (Object Tool)"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_toggled), Editing::MouseObject));
|
||||
ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-range", _("Range Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_toggled), Editing::MouseRange));
|
||||
ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-draw", _("Note Drawing Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_toggled), Editing::MouseDraw));
|
||||
ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-timefx", _("Time FX Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_toggled), Editing::MouseTimeFX));
|
||||
ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-grid", _("Grid Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_toggled), Editing::MouseGrid));
|
||||
ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-content", _("Internal Edit (Content Tool)"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_toggled), Editing::MouseContent));
|
||||
ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-cut", _("Cut Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_toggled), Editing::MouseCut));
|
||||
mouse_mode_actions[Editing::MouseObject] = ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-object", _("Grab (Object Tool)"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_chosen), Editing::MouseObject));
|
||||
mouse_mode_actions[Editing::MouseRange] = ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-range", _("Range Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_chosen), Editing::MouseRange));
|
||||
mouse_mode_actions[Editing::MouseDraw] = ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-draw", _("Note Drawing Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_chosen), Editing::MouseDraw));
|
||||
mouse_mode_actions[Editing::MouseTimeFX] = ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-timefx", _("Time FX Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_chosen), Editing::MouseTimeFX));
|
||||
mouse_mode_actions[Editing::MouseGrid] = ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-grid", _("Grid Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_chosen), Editing::MouseGrid));
|
||||
mouse_mode_actions[Editing::MouseContent] = ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-content", _("Internal Edit (Content Tool)"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_chosen), Editing::MouseContent));
|
||||
mouse_mode_actions[Editing::MouseCut] = ActionManager::register_radio_action (_common_actions, mouse_mode_group, "set-mouse-mode-cut", _("Cut Tool"), sigc::bind (sigc::mem_fun (*this, &EditingContext::mouse_mode_chosen), Editing::MouseCut));
|
||||
|
||||
zoom_actions = ActionManager::create_action_group (common_bindings, prefix + X_("Zoom"));
|
||||
RadioAction::Group zoom_group;
|
||||
|
||||
radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-left", _("Zoom Focus Left"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusLeft));
|
||||
radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-right", _("Zoom Focus Right"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusRight));
|
||||
radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-center", _("Zoom Focus Center"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusCenter));
|
||||
radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-playhead", _("Zoom Focus Playhead"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusPlayhead));
|
||||
radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-mouse", _("Zoom Focus Mouse"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusMouse));
|
||||
radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-edit", _("Zoom Focus Edit Point"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusEdit));
|
||||
zoom_focus_actions[Editing::ZoomFocusLeft] = radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-left", _("Zoom Focus Left"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusLeft));
|
||||
zoom_focus_actions[Editing::ZoomFocusRight] = radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-right", _("Zoom Focus Right"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusRight));
|
||||
zoom_focus_actions[Editing::ZoomFocusCenter] = radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-center", _("Zoom Focus Center"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusCenter));
|
||||
zoom_focus_actions[Editing::ZoomFocusPlayhead] = radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-playhead", _("Zoom Focus Playhead"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusPlayhead));
|
||||
zoom_focus_actions[Editing::ZoomFocusMouse] = radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-mouse", _("Zoom Focus Mouse"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusMouse));
|
||||
zoom_focus_actions[Editing::ZoomFocusEdit] = radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-edit", _("Zoom Focus Edit Point"), sigc::bind (sigc::mem_fun (*this, &EditingContext::zoom_focus_chosen), Editing::ZoomFocusEdit));
|
||||
|
||||
ActionManager::register_action (zoom_actions, X_("cycle-zoom-focus"), _("Next Zoom Focus"), sigc::mem_fun (*this, &EditingContext::cycle_zoom_focus));
|
||||
|
||||
|
|
@ -507,16 +536,16 @@ EditingContext::register_midi_actions (Bindings* midi_bindings, std::string cons
|
|||
draw_length_actions[Editing::GridTypeBeatDiv14] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-fourteenths"), grid_type_strings[(int)GridTypeBeatDiv14].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv14));
|
||||
draw_length_actions[Editing::GridTypeBeatDiv12] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-twelfths"), grid_type_strings[(int)GridTypeBeatDiv12].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv12));
|
||||
draw_length_actions[Editing::GridTypeBeatDiv10] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-tenths"), grid_type_strings[(int)GridTypeBeatDiv10].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv10));
|
||||
draw_length_actions[Editing::GridTypeBeatDiv8] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-eighths"), grid_type_strings[(int)GridTypeBeatDiv8].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv8));
|
||||
draw_length_actions[Editing::GridTypeBeatDiv7] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-sevenths"), grid_type_strings[(int)GridTypeBeatDiv7].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv7));
|
||||
draw_length_actions[Editing::GridTypeBeatDiv6] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-sixths"), grid_type_strings[(int)GridTypeBeatDiv6].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv6));
|
||||
draw_length_actions[Editing::GridTypeBeatDiv5] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-fifths"), grid_type_strings[(int)GridTypeBeatDiv5].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv5));
|
||||
draw_length_actions[Editing::GridTypeBeatDiv4] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-quarters"), grid_type_strings[(int)GridTypeBeatDiv4].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv4));
|
||||
draw_length_actions[Editing::GridTypeBeatDiv3] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-thirds"), grid_type_strings[(int)GridTypeBeatDiv3].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv3));
|
||||
draw_length_actions[Editing::GridTypeBeatDiv2] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-halves"), grid_type_strings[(int)GridTypeBeatDiv2].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv2));
|
||||
draw_length_actions[Editing::GridTypeBeat] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-beat"), grid_type_strings[(int)GridTypeBeat].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeat));
|
||||
draw_length_actions[Editing::GridTypeBar] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-bar"), grid_type_strings[(int)GridTypeBar].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBar));
|
||||
draw_length_actions[DRAW_LEN_AUTO] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-auto"), _("Auto"), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), DRAW_LEN_AUTO));
|
||||
draw_length_actions[Editing::GridTypeBeatDiv8] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-eighths"), grid_type_strings[(int)GridTypeBeatDiv8].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv8));
|
||||
draw_length_actions[Editing::GridTypeBeatDiv7] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-sevenths"), grid_type_strings[(int)GridTypeBeatDiv7].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv7));
|
||||
draw_length_actions[Editing::GridTypeBeatDiv6] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-sixths"), grid_type_strings[(int)GridTypeBeatDiv6].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv6));
|
||||
draw_length_actions[Editing::GridTypeBeatDiv5] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-fifths"), grid_type_strings[(int)GridTypeBeatDiv5].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv5));
|
||||
draw_length_actions[Editing::GridTypeBeatDiv4] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-quarters"), grid_type_strings[(int)GridTypeBeatDiv4].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv4));
|
||||
draw_length_actions[Editing::GridTypeBeatDiv3] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-thirds"), grid_type_strings[(int)GridTypeBeatDiv3].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv3));
|
||||
draw_length_actions[Editing::GridTypeBeatDiv2] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-halves"), grid_type_strings[(int)GridTypeBeatDiv2].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeatDiv2));
|
||||
draw_length_actions[Editing::GridTypeBeat] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-beat"), grid_type_strings[(int)GridTypeBeat].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBeat));
|
||||
draw_length_actions[Editing::GridTypeBar] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-bar"), grid_type_strings[(int)GridTypeBar].c_str(), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), Editing::GridTypeBar));
|
||||
draw_length_actions[DRAW_LEN_AUTO] = ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-auto"), _("Auto"), sigc::bind (sigc::mem_fun (*this, &EditingContext::draw_length_chosen), DRAW_LEN_AUTO));
|
||||
|
||||
velocity_actions = ActionManager::create_action_group (midi_bindings, prefix + X_("DrawVelocity"));
|
||||
RadioAction::Group draw_velocity_group;
|
||||
|
|
@ -673,8 +702,6 @@ EditingContext::grid_type_chosen (GridType gt)
|
|||
auto ti = grid_actions.find (gt);
|
||||
assert (ti != grid_actions.end());
|
||||
|
||||
std::cerr << "gt chosen, type " << enum_2_string (gt) << " active ? " << ti->second->get_active () << std::endl;
|
||||
|
||||
if (!ti->second->get_active()) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -701,11 +728,10 @@ EditingContext::grid_type_chosen (GridType gt)
|
|||
compute_bbt_ruler_scale (_leftmost_sample, _leftmost_sample + current_page_samples());
|
||||
update_tempo_based_rulers ();
|
||||
} else if (current_mouse_mode () == Editing::MouseGrid) {
|
||||
Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic (get_mouse_mode_action (Editing::MouseObject));
|
||||
ract->set_active (true);
|
||||
mouse_mode_actions[Editing::MouseObject]->set_active (true);
|
||||
}
|
||||
|
||||
get_mouse_mode_action (Editing::MouseGrid)->set_sensitive (grid_is_musical);
|
||||
mouse_mode_actions[Editing::MouseGrid]->set_sensitive (grid_is_musical);
|
||||
|
||||
mark_region_boundary_cache_dirty ();
|
||||
|
||||
|
|
@ -728,7 +754,7 @@ EditingContext::draw_length_chosen (GridType type)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!grid_type_is_musical (type) ) { // is this is sensible sanity check ?
|
||||
if ((DRAW_LEN_AUTO != type) && !grid_type_is_musical (type) ) { // is this is sensible sanity check ?
|
||||
set_draw_length (DRAW_LEN_AUTO);
|
||||
return;
|
||||
}
|
||||
|
|
@ -830,10 +856,7 @@ EditingContext::snap_mode_chosen (SnapMode mode)
|
|||
mode = SnapMagnetic;
|
||||
}
|
||||
|
||||
auto si = snap_mode_actions.find (mode);
|
||||
assert (si != snap_mode_actions.end());
|
||||
|
||||
if (!si->second->get_active()) {
|
||||
if (!snap_mode_actions[mode]->get_active()) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1144,8 +1167,13 @@ EditingContext::time_domain () const
|
|||
void
|
||||
EditingContext::toggle_follow_playhead ()
|
||||
{
|
||||
RefPtr<ToggleAction> tact = ActionManager::get_toggle_action ((_name + X_("Editing")).c_str(), X_("toggle-follow-playhead"));
|
||||
set_follow_playhead (tact->get_active());
|
||||
set_follow_playhead (!follow_playhead_action->get_active(), true);
|
||||
}
|
||||
|
||||
void
|
||||
EditingContext::follow_playhead_chosen ()
|
||||
{
|
||||
instant_save ();
|
||||
}
|
||||
|
||||
/** @param yn true to follow playhead, otherwise false.
|
||||
|
|
@ -1155,14 +1183,10 @@ void
|
|||
EditingContext::set_follow_playhead (bool yn, bool catch_up)
|
||||
{
|
||||
assert (follow_playhead_action);
|
||||
if (follow_playhead() != yn) {
|
||||
follow_playhead_action->set_active (yn);
|
||||
if (yn && catch_up) {
|
||||
/* catch up */
|
||||
reset_x_origin_to_follow_playhead ();
|
||||
}
|
||||
std::cerr << editor_name() << " SFP instant save\n";
|
||||
instant_save ();
|
||||
follow_playhead_action->set_active (yn);
|
||||
if (yn && catch_up) {
|
||||
/* catch up */
|
||||
reset_x_origin_to_follow_playhead ();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1969,28 +1993,6 @@ EditingContext::pack_snap_box ()
|
|||
snap_box.pack_start (grid_type_selector, false, false);
|
||||
}
|
||||
|
||||
Glib::RefPtr<Action>
|
||||
EditingContext::get_mouse_mode_action (MouseMode m) const
|
||||
{
|
||||
switch (m) {
|
||||
case MouseRange:
|
||||
return ActionManager::get_action ((_name + X_("Editing")).c_str(), X_("set-mouse-mode-range"));
|
||||
case MouseObject:
|
||||
return ActionManager::get_action ((_name + X_("Editing")).c_str(), X_("set-mouse-mode-object"));
|
||||
case MouseCut:
|
||||
return ActionManager::get_action ((_name + X_("Editing")).c_str(), X_("set-mouse-mode-cut"));
|
||||
case MouseDraw:
|
||||
return ActionManager::get_action ((_name + X_("Editing")).c_str(), X_("set-mouse-mode-draw"));
|
||||
case MouseTimeFX:
|
||||
return ActionManager::get_action ((_name + X_("Editing")).c_str(), X_("set-mouse-mode-timefx"));
|
||||
case MouseGrid:
|
||||
return ActionManager::get_action ((_name + X_("Editing")).c_str(), X_("set-mouse-mode-grid"));
|
||||
case MouseContent:
|
||||
return ActionManager::get_action ((_name + X_("Editing")).c_str(), X_("set-mouse-mode-content"));
|
||||
}
|
||||
return Glib::RefPtr<Action>();
|
||||
}
|
||||
|
||||
void
|
||||
EditingContext::bind_mouse_mode_buttons ()
|
||||
{
|
||||
|
|
@ -2001,37 +2003,36 @@ EditingContext::bind_mouse_mode_buttons ()
|
|||
act = ActionManager::get_action ((_name + X_("Editing")).c_str(), X_("temporal-zoom-out"));
|
||||
zoom_out_button.set_related_action (act);
|
||||
|
||||
act = ActionManager::get_action ((_name + X_("Editing")).c_str(), X_("toggle-follow-playhead"));
|
||||
follow_playhead_button.set_related_action (act);
|
||||
follow_playhead_button.set_related_action (follow_playhead_action);
|
||||
|
||||
act = ActionManager::get_action (X_("Transport"), X_("ToggleFollowEdits"));
|
||||
follow_edits_button.set_related_action (act);
|
||||
|
||||
mouse_move_button.set_related_action (get_mouse_mode_action (Editing::MouseObject));
|
||||
mouse_move_button.set_related_action (mouse_mode_actions[Editing::MouseObject]);
|
||||
mouse_move_button.set_icon (ArdourWidgets::ArdourIcon::ToolGrab);
|
||||
mouse_move_button.set_name ("mouse mode button");
|
||||
|
||||
mouse_select_button.set_related_action (get_mouse_mode_action (Editing::MouseRange));
|
||||
mouse_select_button.set_related_action (mouse_mode_actions[Editing::MouseRange]);
|
||||
mouse_select_button.set_icon (ArdourWidgets::ArdourIcon::ToolRange);
|
||||
mouse_select_button.set_name ("mouse mode button");
|
||||
|
||||
mouse_draw_button.set_related_action (get_mouse_mode_action (Editing::MouseDraw));
|
||||
mouse_draw_button.set_related_action (mouse_mode_actions[Editing::MouseDraw]);
|
||||
mouse_draw_button.set_icon (ArdourWidgets::ArdourIcon::ToolDraw);
|
||||
mouse_draw_button.set_name ("mouse mode button");
|
||||
|
||||
mouse_timefx_button.set_related_action (get_mouse_mode_action (Editing::MouseTimeFX));
|
||||
mouse_timefx_button.set_related_action (mouse_mode_actions[Editing::MouseTimeFX]);
|
||||
mouse_timefx_button.set_icon (ArdourWidgets::ArdourIcon::ToolStretch);
|
||||
mouse_timefx_button.set_name ("mouse mode button");
|
||||
|
||||
mouse_grid_button.set_related_action (get_mouse_mode_action (Editing::MouseGrid));
|
||||
mouse_grid_button.set_related_action (mouse_mode_actions[Editing::MouseGrid]);
|
||||
mouse_grid_button.set_icon (ArdourWidgets::ArdourIcon::ToolGrid);
|
||||
mouse_grid_button.set_name ("mouse mode button");
|
||||
|
||||
mouse_content_button.set_related_action (get_mouse_mode_action (Editing::MouseContent));
|
||||
mouse_content_button.set_related_action (mouse_mode_actions[Editing::MouseContent]);
|
||||
mouse_content_button.set_icon (ArdourWidgets::ArdourIcon::ToolContent);
|
||||
mouse_content_button.set_name ("mouse mode button");
|
||||
|
||||
mouse_cut_button.set_related_action (get_mouse_mode_action (Editing::MouseCut));
|
||||
mouse_cut_button.set_related_action (mouse_mode_actions[Editing::MouseCut]);
|
||||
mouse_cut_button.set_icon (ArdourWidgets::ArdourIcon::ToolCut);
|
||||
mouse_cut_button.set_name ("mouse mode button");
|
||||
|
||||
|
|
@ -2044,6 +2045,18 @@ EditingContext::bind_mouse_mode_buttons ()
|
|||
set_tooltip (mouse_content_button, _("Internal Edit Mode (edit notes and automation points)"));
|
||||
}
|
||||
|
||||
Editing::MouseMode
|
||||
EditingContext::current_mouse_mode() const
|
||||
{
|
||||
for (auto & [mode,action] : mouse_mode_actions) {
|
||||
if (action->get_active()) {
|
||||
return mode;
|
||||
}
|
||||
}
|
||||
|
||||
return MouseObject;
|
||||
}
|
||||
|
||||
void
|
||||
EditingContext::set_mouse_mode (MouseMode m, bool force)
|
||||
{
|
||||
|
|
@ -2051,21 +2064,13 @@ EditingContext::set_mouse_mode (MouseMode m, bool force)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!force && m == mouse_mode) {
|
||||
return;
|
||||
if (force && mouse_mode_actions[m]->get_active()) {
|
||||
mouse_mode_actions[m]->set_active (false);
|
||||
}
|
||||
|
||||
Glib::RefPtr<Action> act = get_mouse_mode_action(m);
|
||||
Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
|
||||
|
||||
/* go there and back to ensure that the toggled handler is called to set up mouse_mode */
|
||||
tact->set_active (false);
|
||||
tact->set_active (true);
|
||||
|
||||
/* NOTE: this will result in a call to mouse_mode_toggled which does the heavy lifting */
|
||||
mouse_mode_actions[m]->set_active (true);
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
EditingContext::on_velocity_scroll_event (GdkEventScroll* ev)
|
||||
{
|
||||
|
|
@ -2545,7 +2550,7 @@ EditingContext::follow_playhead_clicked ()
|
|||
void
|
||||
EditingContext::cycle_zoom_focus ()
|
||||
{
|
||||
switch (_zoom_focus) {
|
||||
switch (zoom_focus()) {
|
||||
case ZoomFocusLeft:
|
||||
set_zoom_focus (ZoomFocusRight);
|
||||
break;
|
||||
|
|
@ -2570,7 +2575,8 @@ EditingContext::cycle_zoom_focus ()
|
|||
void
|
||||
EditingContext::temporal_zoom_step_mouse_focus_scale (bool zoom_out, double scale)
|
||||
{
|
||||
PBD::Unwinder<Editing::ZoomFocus> zf (_zoom_focus, Editing::ZoomFocusMouse);
|
||||
#warning paul how to unwind a failed attempt here
|
||||
// PBD::Unwinder<Editing::ZoomFocus> zf (zoom_focus(), Editing::ZoomFocusMouse);
|
||||
temporal_zoom_step_scale (zoom_out, scale);
|
||||
}
|
||||
|
||||
|
|
@ -2931,47 +2937,16 @@ EditingContext::window_event_sample (GdkEvent const * event, double* pcx, double
|
|||
return pixel_to_sample (canvas_to_timeline (d.x));
|
||||
}
|
||||
|
||||
void
|
||||
EditingContext::zoom_focus_selection_done (ZoomFocus f)
|
||||
Editing::ZoomFocus
|
||||
EditingContext::zoom_focus () const
|
||||
{
|
||||
RefPtr<RadioAction> ract = zoom_focus_action (f);
|
||||
if (ract) {
|
||||
ract->set_active ();
|
||||
}
|
||||
}
|
||||
|
||||
RefPtr<RadioAction>
|
||||
EditingContext::zoom_focus_action (ZoomFocus focus)
|
||||
{
|
||||
const char* action = 0;
|
||||
RefPtr<Action> act;
|
||||
|
||||
switch (focus) {
|
||||
case ZoomFocusLeft:
|
||||
action = X_("zoom-focus-left");
|
||||
break;
|
||||
case ZoomFocusRight:
|
||||
action = X_("zoom-focus-right");
|
||||
break;
|
||||
case ZoomFocusCenter:
|
||||
action = X_("zoom-focus-center");
|
||||
break;
|
||||
case ZoomFocusPlayhead:
|
||||
action = X_("zoom-focus-playhead");
|
||||
break;
|
||||
case ZoomFocusMouse:
|
||||
action = X_("zoom-focus-mouse");
|
||||
break;
|
||||
case ZoomFocusEdit:
|
||||
action = X_("zoom-focus-edit");
|
||||
break;
|
||||
default:
|
||||
fatal << string_compose (_("programming error: %1: %2"), "Editor: impossible focus type", (int) focus) << endmsg;
|
||||
abort(); /*NOTREACHED*/
|
||||
for (auto & [mode,action] : zoom_focus_actions) {
|
||||
if (action->get_active()) {
|
||||
return mode;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return ActionManager::get_radio_action ((_name + X_("Zoom")).c_str(), action);
|
||||
return ZoomFocusLeft;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -2982,11 +2957,13 @@ EditingContext::zoom_focus_chosen (ZoomFocus focus)
|
|||
active.
|
||||
*/
|
||||
|
||||
RefPtr<RadioAction> ract = zoom_focus_action (focus);
|
||||
|
||||
if (ract && ract->get_active()) {
|
||||
set_zoom_focus (focus);
|
||||
if (!zoom_focus_actions[focus]->get_active()) {
|
||||
return;
|
||||
}
|
||||
|
||||
zoom_focus_selector.set_active (zoom_focus_strings[(int)focus]);
|
||||
|
||||
instant_save ();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -3152,6 +3129,7 @@ EditingContext::set_loop_range (timepos_t const & start, timepos_t const & end,
|
|||
bool
|
||||
EditingContext::allow_trim_cursors () const
|
||||
{
|
||||
auto mouse_mode = current_mouse_mode();
|
||||
return mouse_mode == MouseContent || mouse_mode == MouseTimeFX || mouse_mode == MouseDraw;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -332,12 +332,9 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider,
|
|||
|
||||
virtual void cycle_zoom_focus ();
|
||||
virtual void set_zoom_focus (Editing::ZoomFocus) = 0;
|
||||
Editing::ZoomFocus zoom_focus () const { return _zoom_focus; }
|
||||
sigc::signal<void> ZoomFocusChanged;
|
||||
Editing::ZoomFocus zoom_focus () const;
|
||||
|
||||
void zoom_focus_selection_done (Editing::ZoomFocus);
|
||||
void zoom_focus_chosen (Editing::ZoomFocus);
|
||||
Glib::RefPtr<Gtk::RadioAction> zoom_focus_action (Editing::ZoomFocus);
|
||||
|
||||
virtual void reposition_and_zoom (samplepos_t, double) = 0;
|
||||
|
||||
|
|
@ -363,8 +360,8 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider,
|
|||
/** @return The current mouse mode (gain, object, range, timefx etc.)
|
||||
* (defined in editing_syms.inc.h)
|
||||
*/
|
||||
Editing::MouseMode current_mouse_mode () const { return mouse_mode; }
|
||||
virtual Editing::MouseMode effective_mouse_mode () const { return mouse_mode; }
|
||||
Editing::MouseMode current_mouse_mode () const;
|
||||
virtual Editing::MouseMode effective_mouse_mode () const { return current_mouse_mode(); }
|
||||
virtual void use_appropriate_mouse_mode_for_sections () {}
|
||||
|
||||
/** @return Whether the current mouse mode is an "internal" editing mode. */
|
||||
|
|
@ -426,6 +423,7 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider,
|
|||
void register_midi_actions (Gtkmm2ext::Bindings*, std::string const &);
|
||||
void register_common_actions (Gtkmm2ext::Bindings*, std::string const &);
|
||||
void register_automation_actions (Gtkmm2ext::Bindings*, std::string const &);
|
||||
void set_action_defaults ();
|
||||
|
||||
ArdourCanvas::Rectangle* rubberband_rect;
|
||||
|
||||
|
|
@ -445,7 +443,7 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider,
|
|||
virtual ArdourCanvas::GtkCanvasViewport* get_canvas_viewport() const = 0;
|
||||
virtual ArdourCanvas::GtkCanvas* get_canvas() const = 0;
|
||||
|
||||
virtual void mouse_mode_toggled (Editing::MouseMode) = 0;
|
||||
virtual void mouse_mode_chosen (Editing::MouseMode) = 0;
|
||||
|
||||
bool on_velocity_scroll_event (GdkEventScroll*);
|
||||
void pre_render ();
|
||||
|
|
@ -531,6 +529,8 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider,
|
|||
std::map<Editing::GridType, Glib::RefPtr<Gtk::RadioAction> > grid_actions;
|
||||
std::map<Editing::SnapMode, Glib::RefPtr<Gtk::RadioAction> > snap_mode_actions;
|
||||
std::map<Editing::GridType, Glib::RefPtr<Gtk::RadioAction> > draw_length_actions;
|
||||
std::map<Editing::MouseMode, Glib::RefPtr<Gtk::RadioAction> > mouse_mode_actions;
|
||||
std::map<Editing::ZoomFocus, Glib::RefPtr<Gtk::RadioAction> > zoom_focus_actions;
|
||||
std::map<int, Glib::RefPtr<Gtk::RadioAction> > draw_velocity_actions;
|
||||
std::map<int, Glib::RefPtr<Gtk::RadioAction> > draw_channel_actions;
|
||||
|
||||
|
|
@ -594,6 +594,7 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider,
|
|||
EditorCursor* _snapped_cursor;
|
||||
|
||||
Glib::RefPtr<Gtk::ToggleAction> follow_playhead_action;
|
||||
void follow_playhead_chosen ();
|
||||
|
||||
/* selection process */
|
||||
|
||||
|
|
@ -608,8 +609,8 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider,
|
|||
VerboseCursor* _verbose_cursor;
|
||||
|
||||
samplecnt_t samples_per_pixel;
|
||||
Editing::ZoomFocus _zoom_focus;
|
||||
virtual Editing::ZoomFocus effective_zoom_focus() const { return _zoom_focus; }
|
||||
|
||||
virtual Editing::ZoomFocus effective_zoom_focus() const { return zoom_focus(); }
|
||||
|
||||
Temporal::timepos_t snap_to_bbt_via_grid (Temporal::timepos_t const & start,
|
||||
Temporal::RoundMode direction,
|
||||
|
|
@ -698,7 +699,6 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider,
|
|||
virtual void register_actions() = 0;
|
||||
void register_grid_actions ();
|
||||
|
||||
Glib::RefPtr<Gtk::Action> get_mouse_mode_action (Editing::MouseMode m) const;
|
||||
void bind_mouse_mode_buttons ();
|
||||
|
||||
Gtk::HBox snap_box;
|
||||
|
|
@ -714,8 +714,6 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider,
|
|||
Gtkmm2ext::BindingSet bindings;
|
||||
Gtkmm2ext::Bindings* own_bindings;
|
||||
|
||||
Editing::MouseMode mouse_mode;
|
||||
|
||||
void set_common_editing_state (XMLNode const & node);
|
||||
void get_common_editing_state (XMLNode& node) const;
|
||||
|
||||
|
|
|
|||
|
|
@ -654,6 +654,7 @@ Editor::Editor ()
|
|||
load_bindings ();
|
||||
register_actions ();
|
||||
bind_mouse_mode_buttons ();
|
||||
set_action_defaults ();
|
||||
|
||||
build_edit_mode_menu();
|
||||
build_zoom_focus_menu();
|
||||
|
|
@ -2199,8 +2200,11 @@ Editor::set_state (const XMLNode& node, int version)
|
|||
|
||||
node.get_property ("mixer-width", editor_mixer_strip_width);
|
||||
|
||||
node.get_property ("zoom-focus", _zoom_focus);
|
||||
zoom_focus_selection_done (_zoom_focus);
|
||||
ZoomFocus zf;
|
||||
if (!node.get_property ("zoom-focus", zf)) {
|
||||
zf = ZoomFocusLeft;
|
||||
}
|
||||
set_zoom_preset (zf);
|
||||
|
||||
node.get_property ("marker-click-behavior", marker_click_behavior);
|
||||
marker_click_behavior_selection_done (marker_click_behavior);
|
||||
|
|
@ -2223,7 +2227,7 @@ Editor::set_state (const XMLNode& node, int version)
|
|||
/* do it twice to force the change */
|
||||
smart_mode_action->set_active (!yn);
|
||||
smart_mode_action->set_active (yn);
|
||||
set_mouse_mode (mouse_mode, true);
|
||||
set_mouse_mode (current_mouse_mode(), true);
|
||||
}
|
||||
|
||||
EditPoint ep;
|
||||
|
|
@ -2316,26 +2320,6 @@ Editor::set_state (const XMLNode& node, int version)
|
|||
nudge_clock->set_duration (timecnt_t (_session->sample_rate() * 5), true);
|
||||
}
|
||||
|
||||
{
|
||||
/* apply state
|
||||
* Not all properties may have been in XML, but
|
||||
* those that are linked to a private variable may need changing
|
||||
*/
|
||||
RefPtr<ToggleAction> tact;
|
||||
|
||||
tact = ActionManager::get_toggle_action ((editor_name () + X_("Editing")).c_str(), X_("toggle-follow-playhead"));
|
||||
yn = follow_playhead();
|
||||
if (tact->get_active() != yn) {
|
||||
tact->set_active (yn);
|
||||
}
|
||||
|
||||
tact = ActionManager::get_toggle_action (X_("Editor"), X_("toggle-stationary-playhead"));
|
||||
yn = _stationary_playhead;
|
||||
if (tact->get_active() != yn) {
|
||||
tact->set_active (yn);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -2352,7 +2336,7 @@ Editor::get_state () const
|
|||
|
||||
maybe_add_mixer_strip_width (*node);
|
||||
|
||||
node->set_property ("zoom-focus", _zoom_focus);
|
||||
node->set_property ("zoom-focus", zoom_focus());
|
||||
|
||||
node->set_property ("edit-point", _edit_point);
|
||||
node->set_property ("visible-track-count", _visible_track_count);
|
||||
|
|
@ -2366,7 +2350,7 @@ Editor::get_state () const
|
|||
node->set_property ("maximised", _maximised);
|
||||
node->set_property ("follow-playhead", follow_playhead());
|
||||
node->set_property ("stationary-playhead", _stationary_playhead);
|
||||
node->set_property ("mouse-mode", mouse_mode);
|
||||
node->set_property ("mouse-mode", current_mouse_mode());
|
||||
node->set_property ("join-object-range", smart_mode_action->get_active ());
|
||||
|
||||
node->set_property (X_("show-editor-mixer"), show_editor_mixer_action->get_active());
|
||||
|
|
@ -3210,12 +3194,12 @@ Editor::build_zoom_focus_menu ()
|
|||
{
|
||||
using namespace Menu_Helpers;
|
||||
|
||||
zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusLeft], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusLeft)));
|
||||
zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusRight], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusRight)));
|
||||
zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusCenter], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusCenter)));
|
||||
zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusPlayhead], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusPlayhead)));
|
||||
zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusMouse], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusMouse)));
|
||||
zoom_focus_selector.add_menu_elem (MenuElem (zoom_focus_strings[(int)ZoomFocusEdit], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusEdit)));
|
||||
zoom_focus_selector.append (zoom_focus_actions[ZoomFocusLeft]);
|
||||
zoom_focus_selector.append (zoom_focus_actions[ZoomFocusRight]);
|
||||
zoom_focus_selector.append (zoom_focus_actions[ZoomFocusCenter]);
|
||||
zoom_focus_selector.append (zoom_focus_actions[ZoomFocusPlayhead]);
|
||||
zoom_focus_selector.append (zoom_focus_actions[ZoomFocusMouse]);
|
||||
zoom_focus_selector.append (zoom_focus_actions[ZoomFocusEdit]);
|
||||
zoom_focus_selector.set_sizing_texts (zoom_focus_strings);
|
||||
}
|
||||
|
||||
|
|
@ -3384,17 +3368,7 @@ Editor::mouse_select_button_release (GdkEventButton* ev)
|
|||
void
|
||||
Editor::set_zoom_focus (ZoomFocus f)
|
||||
{
|
||||
string str = zoom_focus_strings[(int)f];
|
||||
|
||||
if (str != zoom_focus_selector.get_text()) {
|
||||
zoom_focus_selector.set_text (str);
|
||||
}
|
||||
|
||||
if (_zoom_focus != f) {
|
||||
_zoom_focus = f;
|
||||
instant_save ();
|
||||
ZoomFocusChanged (); /* EMIT SIGNAL */
|
||||
}
|
||||
zoom_focus_actions[f]->set_active (true);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -3812,7 +3786,7 @@ Editor::current_visual_state (bool with_tracks)
|
|||
vs->y_position = vertical_adjustment.get_value();
|
||||
vs->samples_per_pixel = samples_per_pixel;
|
||||
vs->_leftmost_sample = _leftmost_sample;
|
||||
vs->zoom_focus = _zoom_focus;
|
||||
vs->zoom_focus = zoom_focus();
|
||||
|
||||
if (with_tracks) {
|
||||
vs->gui_state->set_state (ARDOUR_UI::instance()->gui_object_state->get_state());
|
||||
|
|
|
|||
|
|
@ -1768,7 +1768,7 @@ private:
|
|||
ArdourWidgets::ArdourButton smart_mode_button;
|
||||
Glib::RefPtr<Gtk::ToggleAction> smart_mode_action;
|
||||
|
||||
void mouse_mode_toggled (Editing::MouseMode m);
|
||||
void mouse_mode_chosen (Editing::MouseMode m);
|
||||
void mouse_mode_object_range_toggled ();
|
||||
bool ignore_mouse_mode_toggle;
|
||||
|
||||
|
|
|
|||
|
|
@ -1123,7 +1123,7 @@ Editor::which_mode_cursor () const
|
|||
{
|
||||
Gdk::Cursor* mode_cursor = MouseCursors::invalid_cursor ();
|
||||
|
||||
switch (mouse_mode) {
|
||||
switch (current_mouse_mode()) {
|
||||
case MouseRange:
|
||||
mode_cursor = _cursors->selector;
|
||||
break;
|
||||
|
|
@ -1213,6 +1213,7 @@ Gdk::Cursor*
|
|||
Editor::which_canvas_cursor(ItemType type) const
|
||||
{
|
||||
Gdk::Cursor* cursor = which_mode_cursor ();
|
||||
auto mouse_mode = current_mouse_mode();
|
||||
|
||||
if (mouse_mode == MouseRange) {
|
||||
switch (type) {
|
||||
|
|
@ -1385,6 +1386,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
|
|||
TempoMarker* t_marker = 0;
|
||||
double fraction;
|
||||
bool ret = true;
|
||||
auto mouse_mode = current_mouse_mode();
|
||||
|
||||
/* by the time we reach here, entered_regionview and entered trackview
|
||||
* will have already been set as appropriate. Things are done this
|
||||
|
|
|
|||
|
|
@ -121,16 +121,13 @@ Editor::set_current_movable (std::shared_ptr<Movable> m)
|
|||
void
|
||||
Editor::mouse_mode_object_range_toggled()
|
||||
{
|
||||
set_mouse_mode (mouse_mode, true); /* updates set-mouse-mode-range */
|
||||
set_mouse_mode (current_mouse_mode(), true); /* updates set-mouse-mode-range */
|
||||
}
|
||||
|
||||
void
|
||||
Editor::mouse_mode_toggled (MouseMode m)
|
||||
Editor::mouse_mode_chosen (MouseMode m)
|
||||
{
|
||||
Glib::RefPtr<Action> act = get_mouse_mode_action(m);
|
||||
Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
|
||||
|
||||
if (!tact->get_active()) {
|
||||
if (!mouse_mode_actions[m]->get_active()) {
|
||||
/* this was just the notification that the old mode has been
|
||||
* left. we'll get called again with the new mode active in a
|
||||
* jiffy.
|
||||
|
|
@ -140,8 +137,6 @@ Editor::mouse_mode_toggled (MouseMode m)
|
|||
|
||||
const bool was_internal = internal_editing();
|
||||
|
||||
mouse_mode = m;
|
||||
|
||||
/* Ben ToDo: once we have a dedicated 'region edit panel', we can store
|
||||
* one snap mode in the editor canvas and another one in the editor,
|
||||
* relieving the complexity here */
|
||||
|
|
@ -174,6 +169,8 @@ Editor::mouse_mode_toggled (MouseMode m)
|
|||
|
||||
update_time_selection_display ();
|
||||
|
||||
auto mouse_mode = current_mouse_mode ();
|
||||
|
||||
if (mouse_mode == MouseDraw) {
|
||||
draw_box.show();
|
||||
_draw_box_spacer.show();
|
||||
|
|
@ -239,12 +236,14 @@ Editor::mouse_mode_toggled (MouseMode m)
|
|||
bool
|
||||
Editor::internal_editing() const
|
||||
{
|
||||
auto mouse_mode = current_mouse_mode ();
|
||||
return mouse_mode == Editing::MouseContent || mouse_mode == Editing::MouseDraw;
|
||||
}
|
||||
|
||||
void
|
||||
Editor::update_time_selection_display ()
|
||||
{
|
||||
auto mouse_mode = current_mouse_mode ();
|
||||
switch (mouse_mode) {
|
||||
case MouseRange:
|
||||
selection->clear_objects ();
|
||||
|
|
@ -328,6 +327,7 @@ Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType it
|
|||
*/
|
||||
|
||||
MouseMode eff_mouse_mode = effective_mouse_mode ();
|
||||
auto mouse_mode = current_mouse_mode ();
|
||||
|
||||
if (eff_mouse_mode == MouseCut) {
|
||||
/* never change selection in cut mode */
|
||||
|
|
@ -1751,6 +1751,8 @@ Editor::determine_mapping_grid_snap (timepos_t t)
|
|||
bool
|
||||
Editor::motion_handler (ArdourCanvas::Item* item, GdkEvent* event, bool from_autoscroll)
|
||||
{
|
||||
auto mouse_mode = current_mouse_mode ();
|
||||
|
||||
_last_motion_y = event->motion.y;
|
||||
|
||||
if (event->motion.is_hint) {
|
||||
|
|
@ -2274,6 +2276,8 @@ Editor::escape ()
|
|||
void
|
||||
Editor::update_join_object_range_location (double y)
|
||||
{
|
||||
auto mouse_mode = current_mouse_mode ();
|
||||
|
||||
if (!get_smart_mode()) {
|
||||
_join_object_range_state = JOIN_OBJECT_RANGE_NONE;
|
||||
return;
|
||||
|
|
@ -2352,7 +2356,7 @@ Editor::effective_mouse_mode () const
|
|||
return MouseRange;
|
||||
}
|
||||
|
||||
return mouse_mode;
|
||||
return current_mouse_mode ();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -2382,16 +2386,7 @@ Editor::use_appropriate_mouse_mode_for_sections ()
|
|||
/*fallthrough*/
|
||||
default:
|
||||
/* switch to range mode */
|
||||
Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_static (get_mouse_mode_action (Editing::MouseRange));
|
||||
if (!ract) {
|
||||
/* missing action */
|
||||
fatal << X_("programming error: missing mouse-mode-range action") << endmsg;
|
||||
/*NOTREACHED*/
|
||||
break;
|
||||
}
|
||||
if (ract) {
|
||||
ract->set_active (true);
|
||||
}
|
||||
mouse_mode_actions[Editing::MouseRange]->set_active (true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -2417,6 +2412,7 @@ Editor::get_pointer_position (double& x, double& y) const
|
|||
void
|
||||
Editor::choose_mapping_drag (ArdourCanvas::Item* item, GdkEvent* event)
|
||||
{
|
||||
|
||||
/* In a departure from convention, this event is not handled by a widget
|
||||
* 'on' the ruler-bar, like a tempo marker, but is instead handled by the
|
||||
* whole canvas. The intent is for the user to feel that they
|
||||
|
|
@ -2433,6 +2429,8 @@ Editor::choose_mapping_drag (ArdourCanvas::Item* item, GdkEvent* event)
|
|||
|
||||
/* if tempo-mapping, set a cursor to indicate whether we are close to a bar line, beat line, or neither */
|
||||
bool ramped = false;
|
||||
auto mouse_mode = current_mouse_mode ();
|
||||
|
||||
if (mouse_mode == MouseGrid && item ==_canvas_grid_zone) {
|
||||
GridType gt = determine_mapping_grid_snap (timepos_t (where));
|
||||
if (gt == GridTypeBar) {
|
||||
|
|
|
|||
|
|
@ -380,7 +380,7 @@ Editor::split_regions_at (timepos_t const & where, RegionSelection& regions)
|
|||
}
|
||||
|
||||
//if the user wants newly-created regions to be selected, then select them:
|
||||
if (mouse_mode == MouseObject) {
|
||||
if (current_mouse_mode() == MouseObject) {
|
||||
for (RegionSelection::iterator ri = latest_regionviews.begin(); ri != latest_regionviews.end(); ri++) {
|
||||
if ((*ri)->region()->position() < where) {
|
||||
// new regions created before the split
|
||||
|
|
@ -1201,7 +1201,7 @@ Editor::cursor_to_selection_start (EditorCursor *cursor)
|
|||
{
|
||||
timepos_t pos;
|
||||
|
||||
switch (mouse_mode) {
|
||||
switch (current_mouse_mode()) {
|
||||
case MouseObject:
|
||||
if (!selection->regions.empty()) {
|
||||
pos = selection->regions.start_time();
|
||||
|
|
@ -1230,7 +1230,7 @@ Editor::cursor_to_selection_end (EditorCursor *cursor)
|
|||
{
|
||||
timepos_t pos;
|
||||
|
||||
switch (mouse_mode) {
|
||||
switch (current_mouse_mode()) {
|
||||
case MouseObject:
|
||||
if (!selection->regions.empty()) {
|
||||
pos = selection->regions.end_time();
|
||||
|
|
@ -1400,7 +1400,7 @@ Editor::selected_marker_to_selection_start ()
|
|||
return;
|
||||
}
|
||||
|
||||
switch (mouse_mode) {
|
||||
switch (current_mouse_mode()) {
|
||||
case MouseObject:
|
||||
if (!selection->regions.empty()) {
|
||||
pos = selection->regions.start_time();
|
||||
|
|
@ -1435,7 +1435,7 @@ Editor::selected_marker_to_selection_end ()
|
|||
return;
|
||||
}
|
||||
|
||||
switch (mouse_mode) {
|
||||
switch (current_mouse_mode()) {
|
||||
case MouseObject:
|
||||
if (!selection->regions.empty()) {
|
||||
pos = selection->regions.end_time();
|
||||
|
|
@ -4394,7 +4394,7 @@ Editor::cut_copy (CutCopyOp op)
|
|||
return;
|
||||
}
|
||||
|
||||
switch (mouse_mode) {
|
||||
switch (current_mouse_mode()) {
|
||||
case MouseDraw:
|
||||
case MouseContent:
|
||||
begin_reversible_command (opname + ' ' + X_("MIDI"));
|
||||
|
|
@ -9451,11 +9451,13 @@ Editor::ripple_marks (std::shared_ptr<Playlist> target_playlist, timepos_t at, t
|
|||
Editing::ZoomFocus
|
||||
Editor::effective_zoom_focus() const
|
||||
{
|
||||
if (_zoom_focus == ZoomFocusEdit && _edit_point == EditAtMouse) {
|
||||
auto zf = zoom_focus();
|
||||
|
||||
if (zf == ZoomFocusEdit && _edit_point == EditAtMouse) {
|
||||
return ZoomFocusMouse;
|
||||
}
|
||||
|
||||
return _zoom_focus;
|
||||
return zf;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -1710,7 +1710,7 @@ Editor::region_selection_changed ()
|
|||
/* if in TimeFX mode and there's just 1 region selected
|
||||
* (i.e. we just clicked on it), leave things as they are
|
||||
*/
|
||||
if (selection->regions.size() > 1 || mouse_mode != Editing::MouseTimeFX) {
|
||||
if (selection->regions.size() > 1 || current_mouse_mode() != Editing::MouseTimeFX) {
|
||||
set_mouse_mode (MouseObject, false);
|
||||
}
|
||||
}
|
||||
|
|
@ -1998,7 +1998,7 @@ Editor::set_selection_from_region ()
|
|||
|
||||
selection->set (tvl);
|
||||
|
||||
if (!get_smart_mode () || !(mouse_mode == Editing::MouseObject) ) {
|
||||
if (!get_smart_mode () || !(current_mouse_mode() == Editing::MouseObject) ) {
|
||||
set_mouse_mode (Editing::MouseRange, false);
|
||||
}
|
||||
}
|
||||
|
|
@ -2041,7 +2041,7 @@ Editor::set_selection_from_range (Location& loc)
|
|||
|
||||
commit_reversible_selection_op ();
|
||||
|
||||
if (!get_smart_mode () || mouse_mode != Editing::MouseObject) {
|
||||
if (!get_smart_mode () || current_mouse_mode() != Editing::MouseObject) {
|
||||
set_mouse_mode (MouseRange, false);
|
||||
}
|
||||
}
|
||||
|
|
@ -2312,7 +2312,7 @@ Editor::select_range_between ()
|
|||
return;
|
||||
}
|
||||
|
||||
if (!get_smart_mode () || mouse_mode != Editing::MouseObject) {
|
||||
if (!get_smart_mode () || current_mouse_mode() != Editing::MouseObject) {
|
||||
set_mouse_mode (MouseRange, false);
|
||||
}
|
||||
|
||||
|
|
@ -2326,16 +2326,16 @@ Editor::get_edit_op_range (timepos_t& start, timepos_t& end) const
|
|||
{
|
||||
/* if an explicit range exists, use it */
|
||||
|
||||
if ((mouse_mode == MouseRange || get_smart_mode()) && !selection->time.empty()) {
|
||||
if ((current_mouse_mode() == MouseRange || get_smart_mode()) && !selection->time.empty()) {
|
||||
/* we know that these are ordered */
|
||||
start = selection->time.start_time();
|
||||
end = selection->time.end_time();
|
||||
return true;
|
||||
} else {
|
||||
start = timepos_t ();
|
||||
end = timepos_t ();
|
||||
return false;
|
||||
}
|
||||
|
||||
start = timepos_t ();
|
||||
end = timepos_t ();
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -75,19 +75,20 @@ Pianoroll::Pianoroll (std::string const & name, bool with_transport)
|
|||
, _note_mode (Sustained)
|
||||
, ignore_channel_changes (false)
|
||||
{
|
||||
mouse_mode = Editing::MouseContent;
|
||||
autoscroll_vertical_allowed = false;
|
||||
|
||||
build_upper_toolbar ();
|
||||
build_canvas ();
|
||||
build_lower_toolbar ();
|
||||
|
||||
load_bindings ();
|
||||
register_actions ();
|
||||
|
||||
build_upper_toolbar ();
|
||||
build_canvas ();
|
||||
|
||||
build_grid_type_menu ();
|
||||
build_draw_midi_menus();
|
||||
|
||||
build_lower_toolbar ();
|
||||
|
||||
set_action_defaults ();
|
||||
set_mouse_mode (Editing::MouseContent, true);
|
||||
}
|
||||
|
||||
|
|
@ -780,7 +781,7 @@ bool
|
|||
Pianoroll::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type)
|
||||
{
|
||||
NoteBase* note = nullptr;
|
||||
|
||||
Editing::MouseMode mouse_mode = current_mouse_mode();
|
||||
switch (item_type) {
|
||||
case NoteItem:
|
||||
if (mouse_mode == Editing::MouseContent) {
|
||||
|
|
@ -1052,7 +1053,7 @@ Pianoroll::which_mode_cursor () const
|
|||
{
|
||||
Gdk::Cursor* mode_cursor = MouseCursors::invalid_cursor ();
|
||||
|
||||
switch (mouse_mode) {
|
||||
switch (current_mouse_mode()) {
|
||||
case Editing::MouseContent:
|
||||
mode_cursor = _cursors->grabber;
|
||||
break;
|
||||
|
|
@ -1081,6 +1082,7 @@ Gdk::Cursor*
|
|||
Pianoroll::which_canvas_cursor (ItemType type) const
|
||||
{
|
||||
Gdk::Cursor* cursor = which_mode_cursor ();
|
||||
Editing::MouseMode mouse_mode = current_mouse_mode ();
|
||||
|
||||
if (mouse_mode == Editing::MouseContent) {
|
||||
|
||||
|
|
@ -1618,7 +1620,7 @@ Pianoroll::cut_copy (Editing::CutCopyOp op)
|
|||
cut_buffer->clear ();
|
||||
}
|
||||
|
||||
switch (mouse_mode) {
|
||||
switch (current_mouse_mode()) {
|
||||
case MouseDraw:
|
||||
case MouseContent:
|
||||
if (view) {
|
||||
|
|
@ -1781,6 +1783,7 @@ Pianoroll::map_transport_state ()
|
|||
bool
|
||||
Pianoroll::allow_trim_cursors () const
|
||||
{
|
||||
auto mouse_mode = current_mouse_mode ();
|
||||
return mouse_mode == Editing::MouseContent || mouse_mode == Editing::MouseTimeFX;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue