13
0

triggerbox: display pass_thru state and allow control via context menu

This commit is contained in:
Ben Loftis 2021-12-16 10:40:03 -06:00
parent ce40f82cc4
commit f4009e0e09
2 changed files with 87 additions and 3 deletions

View File

@ -107,14 +107,80 @@ Loopster::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) cons
float degrees = slices * deg_per_slice;
float radians = (degrees/180)*M_PI;
set_source_rgba (context, rgba_to_color (0,0,0,1));
context->arc ( size/2, size/2, size/2 - 5*scale, 1.5*M_PI+radians, 1.5*M_PI+2*M_PI ); //arrow head
context->arc ( size/2, size/2, size/2 - 5*scale, 1.5*M_PI+radians, 1.5*M_PI+2*M_PI );
context->stroke();
context->set_line_width(1);
context->set_identity_matrix();
}
//========================
/* ======================== */
class PassThru : public ArdourCanvas::Rectangle
{
public:
PassThru (ArdourCanvas::Item* canvas);
void render (ArdourCanvas::Rect const & area, Cairo::RefPtr<Cairo::Context> context) const;
void set_enabled (bool e);
private:
bool _enabled;
};
PassThru::PassThru (Item* parent)
: ArdourCanvas::Rectangle (parent)
{
set_enabled(false);
}
void
PassThru::set_enabled (bool e)
{
if (e != _enabled) {
_enabled = e;
redraw();
}
}
void
PassThru::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const
{
/* Note that item_to_window() already takes _position into account (as
part of item_to_canvas()
*/
Rect self (item_to_window (_rect));
const Rect draw = self.intersection (area);
if (!draw) {
return;
}
context->set_identity_matrix();
context->translate (self.x0, self.y0-0.5);
float size = _rect.height();
const double scale = UIConfiguration::instance().get_ui_scale();
if (_enabled) {
//outer white circle
set_source_rgba (context, rgba_to_color (1,1,1,1));
context->arc ( size/2, size/2, size/2 - 3*scale, 0, 2*M_PI );
context->fill();
//black circle
set_source_rgba (context, rgba_to_color (0,0,0,1));
context->arc ( size/2, size/2, size/2 - 5*scale, 0, 2*M_PI );
context->fill();
//inner white circle
set_source_rgba (context, rgba_to_color (1,1,1,1));
context->arc ( size/2, size/2, size/2 - 7*scale, 0, 2*M_PI );
context->fill();
}
}
/* ======================== */
TriggerMaster::TriggerMaster (Item* parent)
@ -132,6 +198,7 @@ TriggerMaster::TriggerMaster (Item* parent)
name_text->set_ignore_events (false);
_loopster = new Loopster(this);
_passthru = new PassThru(this);
/* trigger changes
_triggerbox->PropertyChanged.connect (trigger_prop_connection, MISSING_INVALIDATOR, boost::bind (&TriggerMaster::prop_change, this, _1), gui_context());
@ -321,7 +388,11 @@ TriggerMaster::context_menu ()
Menu* load_menu = manage (new Menu);
MenuList& loitems (load_menu->items());
items.push_back (MenuElem (_("Toggle Monitor Thru"), sigc::mem_fun (*this, &TriggerMaster::maybe_update))); //ToDo
items.push_back (CheckMenuElem (_("Toggle Monitor Thru"), sigc::mem_fun (*this, &TriggerMaster::toggle_thru)));
if (_triggerbox->pass_thru()) {
dynamic_cast<Gtk::CheckMenuItem*> (&items.back ())->set_active (true);
}
items.push_back (MenuElem (_("Enable/Disable..."), sigc::mem_fun (*this, &TriggerMaster::maybe_update))); //ToDo
items.push_back (MenuElem (_("Follow Action..."), *follow_menu));
items.push_back (MenuElem (_("Launch Style..."), *launch_menu));
@ -331,6 +402,12 @@ TriggerMaster::context_menu ()
_context_menu->popup (1, gtk_get_current_event_time());
}
void
TriggerMaster::toggle_thru ()
{
_triggerbox->set_pass_thru(!_triggerbox->pass_thru());
}
void
TriggerMaster::set_all_follow_action (Trigger::FollowAction fa)
{
@ -380,6 +457,7 @@ TriggerMaster::_size_allocate (ArdourCanvas::Rect const & alloc)
name_text->clamp_width (twidth);
_loopster->set(ArdourCanvas::Rect(0, 0, height, height));
_passthru->set(ArdourCanvas::Rect(width-height, 0, width, height));
//font scale may have changed. uiconfig 'embeds' the ui-scale in the font
name_text->set_font_description (UIConfiguration::instance().get_NormalFont());
@ -392,6 +470,8 @@ TriggerMaster::prop_change (PropertyChange const & change)
return;
}
_passthru->set_enabled(_triggerbox->pass_thru ());
std::string text;
ARDOUR::Trigger *trigger = _triggerbox->currently_playing();

View File

@ -59,6 +59,8 @@ class Loopster : public ArdourCanvas::Rectangle
float _fraction;
};
class PassThru;
class TriggerMaster : public ArdourCanvas::Rectangle
{
public:
@ -73,12 +75,14 @@ class TriggerMaster : public ArdourCanvas::Rectangle
ArdourCanvas::Text* name_text;
void toggle_thru ();
void maybe_update ();
bool event_handler (GdkEvent*);
void selection_change ();
private:
Loopster* _loopster;
PassThru* _passthru;
Gtk::Menu* _context_menu;
void context_menu ();