fix management of undo/redo and _current_editing_context

We cannot switch on a leave event from a widget, because the undo/redo menu items must remain
labelled until we are actually in a new editing context. So switch when we switch tabs
or when we edit the (MIDI) cue editor
This commit is contained in:
Paul Davis 2024-06-30 14:20:53 -06:00
parent e591bc91f9
commit 8523598664
5 changed files with 12 additions and 29 deletions

View file

@ -718,6 +718,8 @@ ARDOUR_UI::tabs_switch (GtkNotebookPage*, guint page)
trigger_page_visibility_button.set_active_state (Gtkmm2ext::Off);
}
EditingContext::switch_editing_context (editor);
} else if (mixer && (page == (guint) _tabs.page_num (mixer->contents()))) {
if (editor && (editor->tabbed() || editor->tabbed_by_default())) {

View file

@ -65,9 +65,9 @@ sigc::signal<void> EditingContext::DropDownKeys;
Gtkmm2ext::Bindings* EditingContext::button_bindings = nullptr;
Glib::RefPtr<Gtk::ActionGroup> EditingContext::_midi_actions;
Glib::RefPtr<Gtk::ActionGroup> EditingContext::_common_actions;
std::stack<EditingContext*> EditingContext::ec_stack;
std::vector<std::string> EditingContext::grid_type_strings;
MouseCursors* EditingContext::_cursors = nullptr;
EditingContext* EditingContext::_current_editing_context = nullptr;
static const gchar *_grid_type_strings[] = {
N_("No Grid"),
@ -1982,28 +1982,14 @@ EditingContext::apply_midi_note_edit_op (MidiOperator& op, const RegionSelection
EditingContext*
EditingContext::current_editing_context()
{
if (!ec_stack.empty()) {
return ec_stack.top ();
}
return nullptr;
return _current_editing_context;
}
void
EditingContext::push_editing_context (EditingContext* ec)
EditingContext::switch_editing_context (EditingContext* ec)
{
assert (ec);
ec_stack.push (ec);
ec->history_changed ();
}
void
EditingContext::pop_editing_context ()
{
ec_stack.pop ();
if (!ec_stack.empty()) {
ec_stack.top()->history_changed ();
}
_current_editing_context = ec;
}
double

View file

@ -33,8 +33,6 @@
#ifndef __ardour_midi_editing_context_h__
#define __ardour_midi_editing_context_h__
#include <stack>
#include "pbd/signals.h"
#include "temporal/timeline.h"
@ -401,6 +399,9 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider
virtual void history_changed() = 0;
static void update_undo_redo_actions (PBD::UndoHistory const &);
static EditingContext* current_editing_context();
static void switch_editing_context(EditingContext*);
protected:
std::string _name;
@ -573,10 +574,6 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider
void transform_regions (const RegionSelection& rs);
void transpose_regions (const RegionSelection& rs);
static EditingContext* current_editing_context();
static void push_editing_context (EditingContext*);
static void pop_editing_context ();
/** the adjustment that controls the overall editing vertical scroll position */
friend class EditorSummary;
Gtk::Adjustment vertical_adjustment;
@ -670,8 +667,7 @@ class EditingContext : public ARDOUR::SessionHandlePtr, public AxisViewProvider
static void toggle_reg_sens (Glib::RefPtr<Gtk::ActionGroup> group, char const* name, char const* label, sigc::slot<void> slot);
static void radio_reg_sens (Glib::RefPtr<Gtk::ActionGroup> action_group, Gtk::RadioAction::Group& radio_group, char const* name, char const* label, sigc::slot<void> slot);
private:
static std::stack<EditingContext*> ec_stack;
static EditingContext* _current_editing_context;
};

View file

@ -787,7 +787,7 @@ Editor::Editor ()
setup_fade_images ();
push_editing_context (this);
switch_editing_context (this);
}
Editor::~Editor()

View file

@ -305,14 +305,13 @@ MidiCueEditor::canvas_enter_leave (GdkEventCrossing* ev)
if (ev->detail != GDK_NOTIFY_INFERIOR) {
_canvas_viewport->canvas()->grab_focus ();
ActionManager::set_sensitive (_midi_actions, true);
EditingContext::push_editing_context (this);
EditingContext::switch_editing_context (this);
}
break;
case GDK_LEAVE_NOTIFY:
if (ev->detail != GDK_NOTIFY_INFERIOR) {
ActionManager::set_sensitive (_midi_actions, false);
ARDOUR_UI::instance()->reset_focus (_canvas_viewport);
EditingContext::pop_editing_context ();
}
default:
break;