fix handling of MIDI draw tool actions and widgets

The actions and draw_xxx values are now "static", and changes in the values are
notified via a static PBD::Signal so that each EditingContext can update the
appearance of its relevant widgets.

Note also wider use of lambdas when creating actions and menu items.
This commit is contained in:
Paul Davis 2024-06-11 15:16:16 -06:00
parent 3224b37702
commit 4bbdbc6d13
4 changed files with 148 additions and 129 deletions

View file

@ -93,6 +93,13 @@ static const gchar *_grid_type_strings[] = {
0 0
}; };
Editing::GridType EditingContext::_draw_length (GridTypeNone);
int EditingContext::_draw_velocity (DRAW_VEL_AUTO);
int EditingContext::_draw_channel (DRAW_CHAN_AUTO);
sigc::signal<void> EditingContext::DrawLengthChanged;
sigc::signal<void> EditingContext::DrawVelocityChanged;
sigc::signal<void> EditingContext::DrawChannelChanged;
EditingContext::EditingContext (std::string const & name) EditingContext::EditingContext (std::string const & name)
: rubberband_rect (0) : rubberband_rect (0)
, _name (name) , _name (name)
@ -102,9 +109,6 @@ EditingContext::EditingContext (std::string const & name)
, internal_snap_mode (SnapOff) , internal_snap_mode (SnapOff)
, _grid_type (GridTypeBeat) , _grid_type (GridTypeBeat)
, _snap_mode (SnapOff) , _snap_mode (SnapOff)
, _draw_length (GridTypeNone)
, _draw_velocity (DRAW_VEL_AUTO)
, _draw_channel (DRAW_CHAN_AUTO)
, _timeline_origin (0.) , _timeline_origin (0.)
, _drags (new DragManager (this)) , _drags (new DragManager (this))
, _leftmost_sample (0) , _leftmost_sample (0)
@ -156,6 +160,10 @@ EditingContext::EditingContext (std::string const & name)
std::cerr << "Set cursor set to " << UIConfiguration::instance().get_icon_set() << std::endl; std::cerr << "Set cursor set to " << UIConfiguration::instance().get_icon_set() << std::endl;
} }
DrawLengthChanged.connect (sigc::mem_fun (*this, &EditingContext::draw_length_changed));
DrawVelocityChanged.connect (sigc::mem_fun (*this, &EditingContext::draw_velocity_changed));
DrawChannelChanged.connect (sigc::mem_fun (*this, &EditingContext::draw_channel_changed));
set_tooltip (draw_length_selector, _("Note Length to Draw (AUTO uses the current Grid setting)")); set_tooltip (draw_length_selector, _("Note Length to Draw (AUTO uses the current Grid setting)"));
set_tooltip (draw_velocity_selector, _("Note Velocity to Draw (AUTO uses the nearest note's velocity)")); set_tooltip (draw_velocity_selector, _("Note Velocity to Draw (AUTO uses the nearest note's velocity)"));
set_tooltip (draw_channel_selector, _("Note Channel to Draw (AUTO uses the nearest note's channel)")); set_tooltip (draw_channel_selector, _("Note Channel to Draw (AUTO uses the nearest note's channel)"));
@ -194,6 +202,8 @@ EditingContext::set_selected_midi_region_view (MidiRegionView& mrv)
void void
EditingContext::register_midi_actions (Bindings* midi_bindings) EditingContext::register_midi_actions (Bindings* midi_bindings)
{ {
/* These actions are all singletons, defined globally for all EditingContexts */
if (_midi_actions) { if (_midi_actions) {
return; return;
} }
@ -279,45 +289,45 @@ EditingContext::register_midi_actions (Bindings* midi_bindings)
Glib::RefPtr<ActionGroup> length_actions = ActionManager::create_action_group (midi_bindings, X_("DrawLength")); Glib::RefPtr<ActionGroup> length_actions = ActionManager::create_action_group (midi_bindings, X_("DrawLength"));
RadioAction::Group draw_length_group; RadioAction::Group draw_length_group;
ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-thirtyseconds"), grid_type_strings[(int)GridTypeBeatDiv32].c_str(), (sigc::bind (sigc::ptr_fun (&EditingContext::_draw_length_chosen), Editing::GridTypeBeatDiv32))); ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-thirtyseconds"), grid_type_strings[(int)GridTypeBeatDiv32].c_str(), []() { EditingContext::draw_length_action_method (Editing::GridTypeBeatDiv32); });
ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-twentyeighths"), grid_type_strings[(int)GridTypeBeatDiv28].c_str(), (sigc::bind (sigc::ptr_fun (&EditingContext::_draw_length_chosen), Editing::GridTypeBeatDiv28))); ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-twentyeighths"), grid_type_strings[(int)GridTypeBeatDiv28].c_str(), []() { EditingContext::draw_length_action_method (Editing::GridTypeBeatDiv28); });
ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-twentyfourths"), grid_type_strings[(int)GridTypeBeatDiv24].c_str(), (sigc::bind (sigc::ptr_fun (&EditingContext::_draw_length_chosen), Editing::GridTypeBeatDiv24))); ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-twentyfourths"), grid_type_strings[(int)GridTypeBeatDiv24].c_str(), []() { EditingContext::draw_length_action_method (Editing::GridTypeBeatDiv24); });
ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-twentieths"), grid_type_strings[(int)GridTypeBeatDiv20].c_str(), (sigc::bind (sigc::ptr_fun (&EditingContext::_draw_length_chosen), Editing::GridTypeBeatDiv20))); ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-twentieths"), grid_type_strings[(int)GridTypeBeatDiv20].c_str(), []() { EditingContext::draw_length_action_method (Editing::GridTypeBeatDiv20); });
ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-asixteenthbeat"), grid_type_strings[(int)GridTypeBeatDiv16].c_str(), (sigc::bind (sigc::ptr_fun (&EditingContext::_draw_length_chosen), Editing::GridTypeBeatDiv16))); ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-asixteenthbeat"), grid_type_strings[(int)GridTypeBeatDiv16].c_str(), []() { EditingContext::draw_length_action_method (Editing::GridTypeBeatDiv16); });
ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-fourteenths"), grid_type_strings[(int)GridTypeBeatDiv14].c_str(), (sigc::bind (sigc::ptr_fun (&EditingContext::_draw_length_chosen), Editing::GridTypeBeatDiv14))); ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-fourteenths"), grid_type_strings[(int)GridTypeBeatDiv14].c_str(), []() { EditingContext::draw_length_action_method (Editing::GridTypeBeatDiv14); });
ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-twelfths"), grid_type_strings[(int)GridTypeBeatDiv12].c_str(), (sigc::bind (sigc::ptr_fun (&EditingContext::_draw_length_chosen), Editing::GridTypeBeatDiv12))); ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-twelfths"), grid_type_strings[(int)GridTypeBeatDiv12].c_str(), []() { EditingContext::draw_length_action_method (Editing::GridTypeBeatDiv12); });
ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-tenths"), grid_type_strings[(int)GridTypeBeatDiv10].c_str(), (sigc::bind (sigc::ptr_fun (&EditingContext::_draw_length_chosen), Editing::GridTypeBeatDiv10))); ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-tenths"), grid_type_strings[(int)GridTypeBeatDiv10].c_str(), []() { EditingContext::draw_length_action_method (Editing::GridTypeBeatDiv10); });
ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-eighths"), grid_type_strings[(int)GridTypeBeatDiv8].c_str(), (sigc::bind (sigc::ptr_fun (&EditingContext::_draw_length_chosen), Editing::GridTypeBeatDiv8))); ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-eighths"), grid_type_strings[(int)GridTypeBeatDiv8].c_str(), []() { EditingContext::draw_length_action_method (Editing::GridTypeBeatDiv8); });
ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-sevenths"), grid_type_strings[(int)GridTypeBeatDiv7].c_str(), (sigc::bind (sigc::ptr_fun (&EditingContext::_draw_length_chosen), Editing::GridTypeBeatDiv7))); ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-sevenths"), grid_type_strings[(int)GridTypeBeatDiv7].c_str(), []() { EditingContext::draw_length_action_method (Editing::GridTypeBeatDiv7); });
ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-sixths"), grid_type_strings[(int)GridTypeBeatDiv6].c_str(), (sigc::bind (sigc::ptr_fun (&EditingContext::_draw_length_chosen), Editing::GridTypeBeatDiv6))); ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-sixths"), grid_type_strings[(int)GridTypeBeatDiv6].c_str(), []() { EditingContext::draw_length_action_method (Editing::GridTypeBeatDiv6); });
ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-fifths"), grid_type_strings[(int)GridTypeBeatDiv5].c_str(), (sigc::bind (sigc::ptr_fun (&EditingContext::_draw_length_chosen), Editing::GridTypeBeatDiv5))); ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-fifths"), grid_type_strings[(int)GridTypeBeatDiv5].c_str(), []() { EditingContext::draw_length_action_method (Editing::GridTypeBeatDiv5); });
ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-quarters"), grid_type_strings[(int)GridTypeBeatDiv4].c_str(), (sigc::bind (sigc::ptr_fun (&EditingContext::_draw_length_chosen), Editing::GridTypeBeatDiv4))); ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-quarters"), grid_type_strings[(int)GridTypeBeatDiv4].c_str(), []() { EditingContext::draw_length_action_method (Editing::GridTypeBeatDiv4); });
ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-thirds"), grid_type_strings[(int)GridTypeBeatDiv3].c_str(), (sigc::bind (sigc::ptr_fun (&EditingContext::_draw_length_chosen), Editing::GridTypeBeatDiv3))); ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-thirds"), grid_type_strings[(int)GridTypeBeatDiv3].c_str(), []() { EditingContext::draw_length_action_method (Editing::GridTypeBeatDiv3); });
ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-halves"), grid_type_strings[(int)GridTypeBeatDiv2].c_str(), (sigc::bind (sigc::ptr_fun (&EditingContext::_draw_length_chosen), Editing::GridTypeBeatDiv2))); ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-halves"), grid_type_strings[(int)GridTypeBeatDiv2].c_str(), []() { EditingContext::draw_length_action_method (Editing::GridTypeBeatDiv2); });
ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-beat"), grid_type_strings[(int)GridTypeBeat].c_str(), (sigc::bind (sigc::ptr_fun (&EditingContext::_draw_length_chosen), Editing::GridTypeBeat))); ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-beat"), grid_type_strings[(int)GridTypeBeat].c_str(), []() { EditingContext::draw_length_action_method (Editing::GridTypeBeat); });
ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-bar"), grid_type_strings[(int)GridTypeBar].c_str(), (sigc::bind (sigc::ptr_fun (&EditingContext::_draw_length_chosen), Editing::GridTypeBar))); ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-bar"), grid_type_strings[(int)GridTypeBar].c_str(), []() { EditingContext::draw_length_action_method (Editing::GridTypeBar); });
ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-auto"), _("Auto"), (sigc::bind (sigc::ptr_fun (&EditingContext::_draw_length_chosen), DRAW_LEN_AUTO))); ActionManager::register_radio_action (length_actions, draw_length_group, X_("draw-length-auto"), _("Auto"), []() { EditingContext::draw_length_action_method (DRAW_LEN_AUTO); });
Glib::RefPtr<ActionGroup> velocity_actions = ActionManager::create_action_group (midi_bindings, _("Draw Velocity")); Glib::RefPtr<ActionGroup> velocity_actions = ActionManager::create_action_group (midi_bindings, _("Draw Velocity"));
RadioAction::Group draw_velocity_group; RadioAction::Group draw_velocity_group;
ActionManager::register_radio_action (velocity_actions, draw_velocity_group, X_("draw-velocity-auto"), _("Auto"), (sigc::bind (sigc::ptr_fun(&EditingContext::_draw_velocity_chosen), DRAW_VEL_AUTO))); ActionManager::register_radio_action (velocity_actions, draw_velocity_group, X_("draw-velocity-auto"), _("Auto"), []() { EditingContext::draw_velocity_action_method (DRAW_VEL_AUTO); });
for (int i = 1; i <= 127; i++) { for (int i = 1; i <= 127; i++) {
char buf[64]; char buf[64];
sprintf(buf, X_("draw-velocity-%d"), i); snprintf(buf, sizeof (buf), X_("draw-velocity-%d"), i);
char vel[64]; char vel[64];
sprintf(vel, _("Velocity %d"), i); sprintf(vel, _("Velocity %d"), i);
ActionManager::register_radio_action (velocity_actions, draw_velocity_group, buf, vel, (sigc::bind (sigc::ptr_fun(&EditingContext::_draw_velocity_chosen), i))); ActionManager::register_radio_action (velocity_actions, draw_velocity_group, buf, vel, [i]() { EditingContext::draw_velocity_action_method (i); });
} }
Glib::RefPtr<ActionGroup> channel_actions = ActionManager::create_action_group (midi_bindings, _("Draw Channel")); Glib::RefPtr<ActionGroup> channel_actions = ActionManager::create_action_group (midi_bindings, _("Draw Channel"));
RadioAction::Group draw_channel_group; RadioAction::Group draw_channel_group;
ActionManager::register_radio_action (channel_actions, draw_channel_group, X_("draw-channel-auto"), _("Auto"), (sigc::bind (sigc::ptr_fun(&EditingContext::_draw_channel_chosen), DRAW_CHAN_AUTO))); ActionManager::register_radio_action (channel_actions, draw_channel_group, X_("draw-channel-auto"), _("Auto"), []() { EditingContext::draw_channel_action_method (DRAW_CHAN_AUTO); });
for (int i = 0; i <= 15; i++) { for (int i = 0; i <= 15; i++) {
char buf[64]; char buf[64];
sprintf(buf, X_("draw-channel-%d"), i+1); snprintf(buf, sizeof (buf), X_("draw-channel-%d"), i+1);
char ch[64]; char ch[64];
sprintf(ch, X_("Channel %d"), i+1); sprintf(ch, X_("Channel %d"), i+1);
ActionManager::register_radio_action (channel_actions, draw_channel_group, buf, ch, (sigc::bind (sigc::ptr_fun(&EditingContext::_draw_channel_chosen), i))); ActionManager::register_radio_action (channel_actions, draw_channel_group, buf, ch, [i]() { EditingContext::draw_channel_action_method (i); });
} }
ActionManager::set_sensitive (_midi_actions, false); ActionManager::set_sensitive (_midi_actions, false);
@ -361,39 +371,6 @@ EditingContext::grid_type_selection_done (GridType gridtype)
} }
} }
void
EditingContext::draw_length_selection_done (GridType gridtype)
{
RefPtr<RadioAction> ract = draw_length_action (gridtype);
if (ract && ract->get_active()) { /*radio-action is already set*/
set_draw_length_to(gridtype); /*so we must set internal state here*/
} else {
ract->set_active ();
}
}
void
EditingContext::draw_velocity_selection_done (int v)
{
RefPtr<RadioAction> ract = draw_velocity_action (v);
if (ract && ract->get_active()) { /*radio-action is already set*/
set_draw_velocity_to(v); /*so we must set internal state here*/
} else {
ract->set_active ();
}
}
void
EditingContext::draw_channel_selection_done (int c)
{
RefPtr<RadioAction> ract = draw_channel_action (c);
if (ract && ract->get_active()) { /*radio-action is already set*/
set_draw_channel_to(c); /*so we must set internal state here*/
} else {
ract->set_active ();
}
}
void void
EditingContext::snap_mode_selection_done (SnapMode mode) EditingContext::snap_mode_selection_done (SnapMode mode)
{ {
@ -598,10 +575,18 @@ EditingContext::grid_type_chosen (GridType type)
} }
void void
EditingContext::_draw_length_chosen (GridType type) EditingContext::draw_length_action_method (GridType type)
{ {
if (current_editing_context()) { /* this is driven by a toggle on a radio group, and so is invoked twice,
current_editing_context()->draw_length_chosen (type); once for the item that became inactive and once for the one that became
active.
*/
RefPtr<RadioAction> ract = draw_length_action (type);
if (ract && ract->get_active()) {
/* It doesn't really matter which EditingContext executes this */
current_editing_context()->set_draw_length_to (type);
} }
} }
@ -616,15 +601,26 @@ EditingContext::draw_length_chosen (GridType type)
RefPtr<RadioAction> ract = draw_length_action (type); RefPtr<RadioAction> ract = draw_length_action (type);
if (ract && ract->get_active()) { if (ract && ract->get_active()) {
set_draw_length_to (type); /* It doesn't really matter which EditingContext executes this */
current_editing_context()->set_draw_length_to (type);
} else {
ract->set_active();
} }
} }
void void
EditingContext::_draw_velocity_chosen (int v) EditingContext::draw_velocity_action_method (int v)
{ {
if (current_editing_context()) { /* this is driven by a toggle on a radio group, and so is invoked twice,
current_editing_context()->draw_velocity_action (v); once for the item that became inactive and once for the one that became
active.
*/
RefPtr<RadioAction> ract = draw_velocity_action (v);
if (ract && ract->get_active()) {
/* It doesn't really matter which EditingContext executes this */
current_editing_context()->set_draw_velocity_to (v);
} }
} }
@ -639,15 +635,26 @@ EditingContext::draw_velocity_chosen (int v)
RefPtr<RadioAction> ract = draw_velocity_action (v); RefPtr<RadioAction> ract = draw_velocity_action (v);
if (ract && ract->get_active()) { if (ract && ract->get_active()) {
set_draw_velocity_to (v); /* It doesn't really matter which EditingContext executes this */
current_editing_context()->set_draw_velocity_to (v);
} else {
ract->set_active();
} }
} }
void void
EditingContext::_draw_channel_chosen (int c) EditingContext::draw_channel_action_method (int c)
{ {
if (current_editing_context()) { /* this is driven by a toggle on a radio group, and so is invoked twice,
current_editing_context()->draw_channel_chosen (c); once for the item that became inactive and once for the one that became
active.
*/
RefPtr<RadioAction> ract = draw_channel_action (c);
if (ract && ract->get_active()) {
/* It doesn't really matter which EditingContext executes this */
current_editing_context()->set_draw_channel_to (c);
} }
} }
@ -662,7 +669,10 @@ EditingContext::draw_channel_chosen (int c)
RefPtr<RadioAction> ract = draw_channel_action (c); RefPtr<RadioAction> ract = draw_channel_action (c);
if (ract && ract->get_active()) { if (ract && ract->get_active()) {
set_draw_channel_to (c); /* It doesn't really matter which EditingContext executes this */
current_editing_context()->set_draw_channel_to (c);
} else {
ract->set_active();
} }
} }
@ -807,18 +817,20 @@ EditingContext::set_draw_length_to (GridType gt)
} }
_draw_length = gt; _draw_length = gt;
DrawLengthChanged (); /* EMIT SIGNAL */
}
if (DRAW_LEN_AUTO==gt) { void
EditingContext::draw_length_changed ()
{
if (DRAW_LEN_AUTO == _draw_length) {
draw_length_selector.set_text (_("Auto")); draw_length_selector.set_text (_("Auto"));
return; return;
} }
unsigned int grid_index = (unsigned int)gt; unsigned int grid_index = (unsigned int) _draw_length;
std::string str = grid_type_strings[grid_index]; std::string str = grid_type_strings[grid_index];
if (str != draw_length_selector.get_text()) {
draw_length_selector.set_text (str); draw_length_selector.set_text (str);
}
instant_save (); instant_save ();
} }
@ -830,16 +842,20 @@ EditingContext::set_draw_velocity_to (int v)
} }
_draw_velocity = v; _draw_velocity = v;
DrawVelocityChanged (); /* EMIT SIGNAL */
}
if (DRAW_VEL_AUTO==v) { void
EditingContext::draw_velocity_changed ()
{
if (DRAW_VEL_AUTO == _draw_velocity) {
draw_velocity_selector.set_text (_("Auto")); draw_velocity_selector.set_text (_("Auto"));
return; return;
} }
char buf[64]; char buf[64];
sprintf(buf, "%d", v ); snprintf (buf, sizeof (buf), "%d", _draw_velocity);
draw_velocity_selector.set_text (buf); draw_velocity_selector.set_text (buf);
instant_save (); instant_save ();
} }
@ -851,16 +867,20 @@ EditingContext::set_draw_channel_to (int c)
} }
_draw_channel = c; _draw_channel = c;
DrawChannelChanged (); /* EMIT SIGNAL */
}
if (DRAW_CHAN_AUTO==c) { void
EditingContext::draw_channel_changed ()
{
if (DRAW_CHAN_AUTO == _draw_channel) {
draw_channel_selector.set_text (_("Auto")); draw_channel_selector.set_text (_("Auto"));
return; return;
} }
char buf[64]; char buf[64];
sprintf(buf, "%d", c+1 ); snprintf (buf, sizeof (buf), "%d", _draw_channel+1 );
draw_channel_selector.set_text (buf); draw_channel_selector.set_text (buf);
instant_save (); instant_save ();
} }
@ -948,7 +968,7 @@ EditingContext::draw_velocity_action (int v)
if (v==DRAW_VEL_AUTO) { if (v==DRAW_VEL_AUTO) {
action = "draw-velocity-auto"; action = "draw-velocity-auto";
} else if (v>=1 && v<=127) { } else if (v>=1 && v<=127) {
sprintf(buf, X_("draw-velocity-%d"), v); //we don't allow drawing a velocity 0; some synths use that as note-off snprintf (buf, sizeof (buf), X_("draw-velocity-%d"), v); //we don't allow drawing a velocity 0; some synths use that as note-off
action = buf; action = buf;
} }
@ -972,7 +992,7 @@ EditingContext::draw_channel_action (int c)
if (c==DRAW_CHAN_AUTO) { if (c==DRAW_CHAN_AUTO) {
action = "draw-channel-auto"; action = "draw-channel-auto";
} else if (c>=0 && c<=15) { } else if (c>=0 && c<=15) {
sprintf(buf, X_("draw-channel-%d"), c+1); snprintf (buf, sizeof (buf), X_("draw-channel-%d"), c+1);
action = buf; action = buf;
} }
@ -1131,13 +1151,13 @@ EditingContext::build_draw_midi_menus ()
using namespace Menu_Helpers; using namespace Menu_Helpers;
/* Note-Length when drawing */ /* Note-Length when drawing */
draw_length_selector.AddMenuElem (MenuElem (grid_type_strings[(int)GridTypeBeat], sigc::bind (sigc::mem_fun(*this, &EditingContext::draw_length_selection_done), (GridType) GridTypeBeat))); draw_length_selector.AddMenuElem (MenuElem (grid_type_strings[(int)GridTypeBeat], []() { EditingContext::draw_length_chosen ((GridType) GridTypeBeat); }));
draw_length_selector.AddMenuElem (MenuElem (grid_type_strings[(int)GridTypeBeatDiv2], sigc::bind (sigc::mem_fun(*this, &EditingContext::draw_length_selection_done), (GridType) GridTypeBeatDiv2))); draw_length_selector.AddMenuElem (MenuElem (grid_type_strings[(int)GridTypeBeatDiv2], []() { EditingContext::draw_length_chosen ((GridType) GridTypeBeatDiv2); }));
draw_length_selector.AddMenuElem (MenuElem (grid_type_strings[(int)GridTypeBeatDiv4], sigc::bind (sigc::mem_fun(*this, &EditingContext::draw_length_selection_done), (GridType) GridTypeBeatDiv4))); draw_length_selector.AddMenuElem (MenuElem (grid_type_strings[(int)GridTypeBeatDiv4], []() { EditingContext::draw_length_chosen ((GridType) GridTypeBeatDiv4); }));
draw_length_selector.AddMenuElem (MenuElem (grid_type_strings[(int)GridTypeBeatDiv8], sigc::bind (sigc::mem_fun(*this, &EditingContext::draw_length_selection_done), (GridType) GridTypeBeatDiv8))); draw_length_selector.AddMenuElem (MenuElem (grid_type_strings[(int)GridTypeBeatDiv8], []() { EditingContext::draw_length_chosen ((GridType) GridTypeBeatDiv8); }));
draw_length_selector.AddMenuElem (MenuElem (grid_type_strings[(int)GridTypeBeatDiv16], sigc::bind (sigc::mem_fun(*this, &EditingContext::draw_length_selection_done), (GridType) GridTypeBeatDiv16))); draw_length_selector.AddMenuElem (MenuElem (grid_type_strings[(int)GridTypeBeatDiv16],[]() { EditingContext::draw_length_chosen ((GridType) GridTypeBeatDiv16); }));
draw_length_selector.AddMenuElem (MenuElem (grid_type_strings[(int)GridTypeBeatDiv32], sigc::bind (sigc::mem_fun(*this, &EditingContext::draw_length_selection_done), (GridType) GridTypeBeatDiv32))); draw_length_selector.AddMenuElem (MenuElem (grid_type_strings[(int)GridTypeBeatDiv32],[]() { EditingContext::draw_length_chosen ((GridType) GridTypeBeatDiv32); }));
draw_length_selector.AddMenuElem (MenuElem (_("Auto"), sigc::bind (sigc::mem_fun(*this, &EditingContext::draw_length_selection_done), (GridType) DRAW_LEN_AUTO))); draw_length_selector.AddMenuElem (MenuElem (_("Auto"),[]() { EditingContext::draw_length_chosen ((GridType) DRAW_LEN_AUTO); }));
{ {
std::vector<std::string> draw_grid_type_strings = {grid_type_strings.begin() + GridTypeBeat, grid_type_strings.begin() + GridTypeBeatDiv32 + 1}; std::vector<std::string> draw_grid_type_strings = {grid_type_strings.begin() + GridTypeBeat, grid_type_strings.begin() + GridTypeBeatDiv32 + 1};
@ -1146,21 +1166,22 @@ EditingContext::build_draw_midi_menus ()
} }
/* Note-Velocity when drawing */ /* Note-Velocity when drawing */
draw_velocity_selector.AddMenuElem (MenuElem ("8", sigc::bind (sigc::mem_fun(*this, &EditingContext::draw_velocity_selection_done), 8)));
draw_velocity_selector.AddMenuElem (MenuElem ("32", sigc::bind (sigc::mem_fun(*this, &EditingContext::draw_velocity_selection_done), 32))); draw_velocity_selector.AddMenuElem (MenuElem ("8", []() { EditingContext::draw_velocity_chosen (8); }));
draw_velocity_selector.AddMenuElem (MenuElem ("64", sigc::bind (sigc::mem_fun(*this, &EditingContext::draw_velocity_selection_done), 64))); draw_velocity_selector.AddMenuElem (MenuElem ("32", []() { EditingContext::draw_velocity_chosen (32); }));
draw_velocity_selector.AddMenuElem (MenuElem ("82", sigc::bind (sigc::mem_fun(*this, &EditingContext::draw_velocity_selection_done), 82))); draw_velocity_selector.AddMenuElem (MenuElem ("64", []() { EditingContext::draw_velocity_chosen (64); }));
draw_velocity_selector.AddMenuElem (MenuElem ("100", sigc::bind (sigc::mem_fun(*this, &EditingContext::draw_velocity_selection_done), 100))); draw_velocity_selector.AddMenuElem (MenuElem ("82", []() { EditingContext::draw_velocity_chosen (82); }));
draw_velocity_selector.AddMenuElem (MenuElem ("127", sigc::bind (sigc::mem_fun(*this, &EditingContext::draw_velocity_selection_done), 127))); draw_velocity_selector.AddMenuElem (MenuElem ("100", []() { EditingContext::draw_velocity_chosen (100); }));
draw_velocity_selector.AddMenuElem (MenuElem (_("Auto"), sigc::bind (sigc::mem_fun(*this, &EditingContext::draw_velocity_selection_done), DRAW_VEL_AUTO))); draw_velocity_selector.AddMenuElem (MenuElem ("127", []() { EditingContext::draw_velocity_chosen (127); }));
draw_velocity_selector.AddMenuElem (MenuElem (_("Auto"),[]() { EditingContext::draw_velocity_chosen (DRAW_VEL_AUTO); }));
/* Note-Channel when drawing */ /* Note-Channel when drawing */
for (int i = 0; i<= 15; i++) { for (int i = 0; i<= 15; i++) {
char buf[64]; char buf[64];
sprintf(buf, "%d", i+1); sprintf(buf, "%d", i+1);
draw_channel_selector.AddMenuElem (MenuElem (buf, sigc::bind (sigc::mem_fun(*this, &EditingContext::draw_channel_selection_done), i))); draw_channel_selector.AddMenuElem (MenuElem (buf, [i]() { EditingContext::draw_channel_chosen (i); }));
} }
draw_channel_selector.AddMenuElem (MenuElem (_("Auto"), sigc::bind (sigc::mem_fun(*this, &EditingContext::draw_channel_selection_done), DRAW_CHAN_AUTO))); draw_channel_selector.AddMenuElem (MenuElem (_("Auto"),[]() { EditingContext::draw_channel_chosen (DRAW_CHAN_AUTO); }));
} }
bool bool
@ -2253,19 +2274,19 @@ EditingContext::set_common_editing_state (XMLNode const & node)
if (!node.get_property ("draw-length", draw_length)) { if (!node.get_property ("draw-length", draw_length)) {
draw_length = _draw_length; draw_length = _draw_length;
} }
draw_length_selection_done (draw_length); draw_length_chosen (draw_length);
int draw_vel; int draw_vel;
if (!node.get_property ("draw-velocity", draw_vel)) { if (!node.get_property ("draw-velocity", draw_vel)) {
draw_vel = _draw_velocity; draw_vel = _draw_velocity;
} }
draw_velocity_selection_done (draw_vel); draw_velocity_chosen (draw_vel);
int draw_chan; int draw_chan;
if (!node.get_property ("draw-channel", draw_chan)) { if (!node.get_property ("draw-channel", draw_chan)) {
draw_chan = DRAW_CHAN_AUTO; draw_chan = DRAW_CHAN_AUTO;
} }
draw_channel_selection_done (draw_chan); draw_channel_chosen (draw_chan);
SnapMode sm; SnapMode sm;
if (node.get_property ("snap-mode", sm)) { if (node.get_property ("snap-mode", sm)) {
@ -2337,8 +2358,6 @@ EditingContext::snap_mode_button_clicked (GdkEventButton* ev)
void void
EditingContext::register_grid_actions () EditingContext::register_grid_actions ()
{ {
std::cerr << "REGISTER GRID ACTIONS for " << editor_name() << std::endl;
ActionManager::register_action (editor_actions, X_("GridChoice"), _("Snap & Grid")); ActionManager::register_action (editor_actions, X_("GridChoice"), _("Snap & Grid"));
RadioAction::Group snap_mode_group; RadioAction::Group snap_mode_group;

View file

@ -397,17 +397,32 @@ public:
Glib::RefPtr<Gtk::RadioAction> grid_type_action (Editing::GridType); Glib::RefPtr<Gtk::RadioAction> grid_type_action (Editing::GridType);
Glib::RefPtr<Gtk::RadioAction> snap_mode_action (Editing::SnapMode); Glib::RefPtr<Gtk::RadioAction> snap_mode_action (Editing::SnapMode);
Glib::RefPtr<Gtk::RadioAction> draw_length_action (Editing::GridType); static Glib::RefPtr<Gtk::RadioAction> draw_length_action (Editing::GridType);
Glib::RefPtr<Gtk::RadioAction> draw_velocity_action (int); static Glib::RefPtr<Gtk::RadioAction> draw_velocity_action (int);
Glib::RefPtr<Gtk::RadioAction> draw_channel_action (int); static Glib::RefPtr<Gtk::RadioAction> draw_channel_action (int);
Editing::GridType _grid_type; Editing::GridType _grid_type;
Editing::SnapMode _snap_mode; Editing::SnapMode _snap_mode;
Editing::GridType _draw_length; static Editing::GridType _draw_length;
static int _draw_velocity;
static int _draw_channel;
int _draw_velocity; static void draw_channel_chosen (int);
int _draw_channel; static void draw_velocity_chosen (int);
static void draw_length_chosen (Editing::GridType);
static void draw_channel_action_method (int);
static void draw_velocity_action_method (int);
static void draw_length_action_method (Editing::GridType);
static sigc::signal<void> DrawLengthChanged;
static sigc::signal<void> DrawVelocityChanged;
static sigc::signal<void> DrawChannelChanged;
void draw_length_changed ();
void draw_velocity_changed ();
void draw_channel_changed ();
double _timeline_origin; double _timeline_origin;
@ -424,18 +439,6 @@ public:
void snap_mode_chosen (Editing::SnapMode); void snap_mode_chosen (Editing::SnapMode);
void grid_type_chosen (Editing::GridType); void grid_type_chosen (Editing::GridType);
void draw_length_selection_done (Editing::GridType);
void draw_length_chosen (Editing::GridType);
static void _draw_length_chosen (Editing::GridType);
void draw_velocity_selection_done (int);
void draw_velocity_chosen (int);
static void _draw_velocity_chosen (int);
void draw_channel_selection_done (int);
void draw_channel_chosen (int);
static void _draw_channel_chosen (int);
DragManager* _drags; DragManager* _drags;
ArdourWidgets::ArdourButton snap_mode_button; ArdourWidgets::ArdourButton snap_mode_button;

View file

@ -140,7 +140,6 @@ MidiCueEditor::setup_toolbar ()
Gtk::Alignment* mouse_mode_align = manage (new Gtk::Alignment); Gtk::Alignment* mouse_mode_align = manage (new Gtk::Alignment);
Glib::RefPtr<Gtk::SizeGroup> mouse_mode_size_group = Gtk::SizeGroup::create (Gtk::SIZE_GROUP_VERTICAL); Glib::RefPtr<Gtk::SizeGroup> mouse_mode_size_group = Gtk::SizeGroup::create (Gtk::SIZE_GROUP_VERTICAL);
mouse_mode_size_group->add_widget (mouse_move_button);
mouse_mode_size_group->add_widget (mouse_draw_button); mouse_mode_size_group->add_widget (mouse_draw_button);
mouse_mode_size_group->add_widget (mouse_content_button); mouse_mode_size_group->add_widget (mouse_content_button);
@ -151,7 +150,6 @@ MidiCueEditor::setup_toolbar ()
mouse_mode_size_group->add_widget (snap_mode_button); mouse_mode_size_group->add_widget (snap_mode_button);
mouse_mode_hbox->set_spacing (2); mouse_mode_hbox->set_spacing (2);
mouse_mode_hbox->pack_start (mouse_move_button, false, false);
mouse_mode_hbox->pack_start (mouse_draw_button, false, false); mouse_mode_hbox->pack_start (mouse_draw_button, false, false);
mouse_mode_hbox->pack_start (mouse_content_button, false, false); mouse_mode_hbox->pack_start (mouse_content_button, false, false);

View file

@ -938,7 +938,6 @@ MidiView::abort_note_diff()
NoteBase* NoteBase*
MidiView::find_canvas_note (std::shared_ptr<NoteType> note) MidiView::find_canvas_note (std::shared_ptr<NoteType> note)
{ {
if (_optimization_iterator != _events.end()) { if (_optimization_iterator != _events.end()) {
++_optimization_iterator; ++_optimization_iterator;
} }