mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-09 00:04:56 +01:00
refactor zoom focus handling so that all EditingContexts can use the same code
This commit is contained in:
parent
9b22e16bec
commit
0a40b50b86
8 changed files with 115 additions and 82 deletions
|
|
@ -10,7 +10,7 @@ CueEditor::CueEditor (std::string const & name)
|
||||||
{
|
{
|
||||||
_history.Changed.connect (history_connection, invalidator (*this), std::bind (&CueEditor::history_changed, this), gui_context());
|
_history.Changed.connect (history_connection, invalidator (*this), std::bind (&CueEditor::history_changed, this), gui_context());
|
||||||
|
|
||||||
set_zoom_focus (Editing::ZoomFocusMouse);
|
set_zoom_focus (Editing::ZoomFocusLeft);
|
||||||
}
|
}
|
||||||
|
|
||||||
CueEditor::~CueEditor ()
|
CueEditor::~CueEditor ()
|
||||||
|
|
@ -153,6 +153,12 @@ CueEditor::set_zoom_focus (Editing::ZoomFocus zf)
|
||||||
return;
|
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) {
|
if (_zoom_focus != zf) {
|
||||||
_zoom_focus = zf;
|
_zoom_focus = zf;
|
||||||
ZoomFocusChanged (); /* EMIT SIGNAL */
|
ZoomFocusChanged (); /* EMIT SIGNAL */
|
||||||
|
|
|
||||||
|
|
@ -98,6 +98,17 @@ static const gchar *_grid_type_strings[] = {
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static const gchar *_zoom_focus_strings[] = {
|
||||||
|
N_("Left"),
|
||||||
|
N_("Right"),
|
||||||
|
N_("Center"),
|
||||||
|
N_("Playhead"),
|
||||||
|
N_("Mouse"),
|
||||||
|
N_("Edit point"),
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
Editing::GridType EditingContext::_draw_length (GridTypeNone);
|
Editing::GridType EditingContext::_draw_length (GridTypeNone);
|
||||||
int EditingContext::_draw_velocity (DRAW_VEL_AUTO);
|
int EditingContext::_draw_velocity (DRAW_VEL_AUTO);
|
||||||
int EditingContext::_draw_channel (DRAW_CHAN_AUTO);
|
int EditingContext::_draw_channel (DRAW_CHAN_AUTO);
|
||||||
|
|
@ -174,6 +185,10 @@ EditingContext::EditingContext (std::string const & name)
|
||||||
grid_type_strings = I18N (_grid_type_strings);
|
grid_type_strings = I18N (_grid_type_strings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (zoom_focus_strings.empty()) {
|
||||||
|
zoom_focus_strings = I18N (_zoom_focus_strings);
|
||||||
|
}
|
||||||
|
|
||||||
snap_mode_button.set_text (_("Snap"));
|
snap_mode_button.set_text (_("Snap"));
|
||||||
snap_mode_button.set_name ("mouse mode button");
|
snap_mode_button.set_name ("mouse mode button");
|
||||||
snap_mode_button.signal_button_press_event().connect (sigc::mem_fun (*this, &EditingContext::snap_mode_button_clicked), false);
|
snap_mode_button.signal_button_press_event().connect (sigc::mem_fun (*this, &EditingContext::snap_mode_button_clicked), false);
|
||||||
|
|
@ -3157,3 +3172,60 @@ EditingContext::window_event_sample (GdkEvent const * event, double* pcx, double
|
||||||
return pixel_to_sample (canvas_to_timeline (d.x));
|
return pixel_to_sample (canvas_to_timeline (d.x));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
EditingContext::zoom_focus_selection_done (ZoomFocus f)
|
||||||
|
{
|
||||||
|
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*/
|
||||||
|
}
|
||||||
|
|
||||||
|
return ActionManager::get_radio_action (X_("Zoom"), action);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
EditingContext::zoom_focus_chosen (ZoomFocus focus)
|
||||||
|
{
|
||||||
|
/* this is driven by a toggle on a radio group, and so is invoked twice,
|
||||||
|
once for the item that became inactive and once for the one that became
|
||||||
|
active.
|
||||||
|
*/
|
||||||
|
|
||||||
|
RefPtr<RadioAction> ract = zoom_focus_action (focus);
|
||||||
|
|
||||||
|
if (ract && ract->get_active()) {
|
||||||
|
set_zoom_focus (focus);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -328,6 +328,10 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider
|
||||||
Editing::ZoomFocus zoom_focus () const { return _zoom_focus; }
|
Editing::ZoomFocus zoom_focus () const { return _zoom_focus; }
|
||||||
sigc::signal<void> ZoomFocusChanged;
|
sigc::signal<void> ZoomFocusChanged;
|
||||||
|
|
||||||
|
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;
|
virtual void reposition_and_zoom (samplepos_t, double) = 0;
|
||||||
|
|
||||||
sigc::signal<void> ZoomChanged;
|
sigc::signal<void> ZoomChanged;
|
||||||
|
|
@ -720,6 +724,10 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider
|
||||||
virtual void parameter_changed (std::string);
|
virtual void parameter_changed (std::string);
|
||||||
virtual void ui_parameter_changed (std::string);
|
virtual void ui_parameter_changed (std::string);
|
||||||
|
|
||||||
|
ArdourWidgets::ArdourDropdown zoom_focus_selector;
|
||||||
|
std::vector<std::string> zoom_focus_strings;
|
||||||
|
virtual void build_zoom_focus_menu () = 0;
|
||||||
|
|
||||||
bool _mouse_changed_selection;
|
bool _mouse_changed_selection;
|
||||||
ArdourMarker* entered_marker;
|
ArdourMarker* entered_marker;
|
||||||
TimeAxisView* entered_track;
|
TimeAxisView* entered_track;
|
||||||
|
|
|
||||||
|
|
@ -202,16 +202,6 @@ static const gchar *_ripple_mode_strings[] = {
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
static const gchar *_zoom_focus_strings[] = {
|
|
||||||
N_("Left"),
|
|
||||||
N_("Right"),
|
|
||||||
N_("Center"),
|
|
||||||
N_("Playhead"),
|
|
||||||
N_("Mouse"),
|
|
||||||
N_("Edit point"),
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef USE_RUBBERBAND
|
#ifdef USE_RUBBERBAND
|
||||||
static const gchar *_rb_opt_strings[] = {
|
static const gchar *_rb_opt_strings[] = {
|
||||||
N_("Mushy"),
|
N_("Mushy"),
|
||||||
|
|
@ -407,7 +397,6 @@ Editor::Editor ()
|
||||||
selection_op_history.clear();
|
selection_op_history.clear();
|
||||||
before.clear();
|
before.clear();
|
||||||
|
|
||||||
zoom_focus_strings = I18N (_zoom_focus_strings);
|
|
||||||
edit_mode_strings = I18N (_edit_mode_strings);
|
edit_mode_strings = I18N (_edit_mode_strings);
|
||||||
ripple_mode_strings = I18N (_ripple_mode_strings);
|
ripple_mode_strings = I18N (_ripple_mode_strings);
|
||||||
edit_point_strings = I18N (_edit_point_strings);
|
edit_point_strings = I18N (_edit_point_strings);
|
||||||
|
|
@ -3182,24 +3171,15 @@ Editor::build_zoom_focus_menu ()
|
||||||
{
|
{
|
||||||
using namespace Menu_Helpers;
|
using namespace Menu_Helpers;
|
||||||
|
|
||||||
zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusLeft], sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_selection_done), (ZoomFocus) ZoomFocusLeft)));
|
zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusLeft], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusLeft)));
|
||||||
zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusRight], sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_selection_done), (ZoomFocus) ZoomFocusRight)));
|
zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusRight], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusRight)));
|
||||||
zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusCenter], sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_selection_done), (ZoomFocus) ZoomFocusCenter)));
|
zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusCenter], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusCenter)));
|
||||||
zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusPlayhead], sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_selection_done), (ZoomFocus) ZoomFocusPlayhead)));
|
zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusPlayhead], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusPlayhead)));
|
||||||
zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusMouse], sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_selection_done), (ZoomFocus) ZoomFocusMouse)));
|
zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusMouse], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusMouse)));
|
||||||
zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusEdit], sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_selection_done), (ZoomFocus) ZoomFocusEdit)));
|
zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusEdit], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusEdit)));
|
||||||
zoom_focus_selector.set_sizing_texts (zoom_focus_strings);
|
zoom_focus_selector.set_sizing_texts (zoom_focus_strings);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
Editor::zoom_focus_selection_done (ZoomFocus f)
|
|
||||||
{
|
|
||||||
RefPtr<RadioAction> ract = zoom_focus_action (f);
|
|
||||||
if (ract) {
|
|
||||||
ract->set_active ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Editor::marker_click_behavior_selection_done (MarkerClickBehavior m)
|
Editor::marker_click_behavior_selection_done (MarkerClickBehavior m)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1786,14 +1786,7 @@ private:
|
||||||
//zoom focus menu stuff
|
//zoom focus menu stuff
|
||||||
Editing::ZoomFocus effective_zoom_focus() const;
|
Editing::ZoomFocus effective_zoom_focus() const;
|
||||||
|
|
||||||
ArdourWidgets::ArdourDropdown zoom_focus_selector;
|
|
||||||
void zoom_focus_selection_done (Editing::ZoomFocus);
|
|
||||||
void build_zoom_focus_menu ();
|
void build_zoom_focus_menu ();
|
||||||
std::vector<std::string> zoom_focus_strings;
|
|
||||||
|
|
||||||
void zoom_focus_chosen (Editing::ZoomFocus);
|
|
||||||
|
|
||||||
Glib::RefPtr<Gtk::RadioAction> zoom_focus_action (Editing::ZoomFocus);
|
|
||||||
|
|
||||||
/* Marker Click Radio */
|
/* Marker Click Radio */
|
||||||
Glib::RefPtr<Gtk::RadioAction> marker_click_behavior_action (Editing::MarkerClickBehavior);
|
Glib::RefPtr<Gtk::RadioAction> marker_click_behavior_action (Editing::MarkerClickBehavior);
|
||||||
|
|
|
||||||
|
|
@ -1022,39 +1022,6 @@ Editor::marker_click_behavior_action (MarkerClickBehavior m)
|
||||||
return ActionManager::get_radio_action (X_("MarkerClickBehavior"), action);
|
return ActionManager::get_radio_action (X_("MarkerClickBehavior"), action);
|
||||||
}
|
}
|
||||||
|
|
||||||
RefPtr<RadioAction>
|
|
||||||
Editor::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*/
|
|
||||||
}
|
|
||||||
|
|
||||||
return ActionManager::get_radio_action (X_("Zoom"), action);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Editor::toggle_sound_midi_notes ()
|
Editor::toggle_sound_midi_notes ()
|
||||||
{
|
{
|
||||||
|
|
@ -1065,21 +1032,6 @@ Editor::toggle_sound_midi_notes ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
Editor::zoom_focus_chosen (ZoomFocus focus)
|
|
||||||
{
|
|
||||||
/* this is driven by a toggle on a radio group, and so is invoked twice,
|
|
||||||
once for the item that became inactive and once for the one that became
|
|
||||||
active.
|
|
||||||
*/
|
|
||||||
|
|
||||||
RefPtr<RadioAction> ract = zoom_focus_action (focus);
|
|
||||||
|
|
||||||
if (ract && ract->get_active()) {
|
|
||||||
set_zoom_focus (focus);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Editor::marker_click_behavior_chosen (Editing::MarkerClickBehavior m)
|
Editor::marker_click_behavior_chosen (Editing::MarkerClickBehavior m)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -245,6 +245,13 @@ MidiCueEditor::build_upper_toolbar ()
|
||||||
_toolbar_outer->pack_start (full_zoom_button, false, false);
|
_toolbar_outer->pack_start (full_zoom_button, false, false);
|
||||||
_toolbar_outer->pack_start (*_toolbar_inner, true, false);
|
_toolbar_outer->pack_start (*_toolbar_inner, true, false);
|
||||||
|
|
||||||
|
build_zoom_focus_menu ();
|
||||||
|
std::string str = zoom_focus_strings[(int)_zoom_focus];
|
||||||
|
if (str != zoom_focus_selector.get_text()) {
|
||||||
|
zoom_focus_selector.set_text (str);
|
||||||
|
}
|
||||||
|
_toolbar_outer->pack_start (zoom_focus_selector, true, false);
|
||||||
|
|
||||||
_toolbox.pack_start (*_toolbar_outer, false, false);
|
_toolbox.pack_start (*_toolbar_outer, false, false);
|
||||||
|
|
||||||
Bindings* pr_bindings = Bindings::get_bindings (X_("Pianoroll"));
|
Bindings* pr_bindings = Bindings::get_bindings (X_("Pianoroll"));
|
||||||
|
|
@ -2026,3 +2033,17 @@ MidiCueEditor::set_note_mode (NoteMode nm)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MidiCueEditor::build_zoom_focus_menu ()
|
||||||
|
{
|
||||||
|
using namespace Gtk::Menu_Helpers;
|
||||||
|
using namespace Editing;
|
||||||
|
|
||||||
|
zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusLeft], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusLeft)));
|
||||||
|
zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusRight], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusRight)));
|
||||||
|
zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusCenter], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusCenter)));
|
||||||
|
zoom_focus_selector.AddMenuElem (MenuElem (zoom_focus_strings[(int)ZoomFocusMouse], sigc::bind (sigc::mem_fun(*this, &EditingContext::zoom_focus_selection_done), (ZoomFocus) ZoomFocusMouse)));
|
||||||
|
zoom_focus_selector.set_sizing_texts (zoom_focus_strings);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -263,6 +263,7 @@ class MidiCueEditor : public CueEditor
|
||||||
|
|
||||||
void automation_state_changed ();
|
void automation_state_changed ();
|
||||||
|
|
||||||
|
void build_zoom_focus_menu ();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue