X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fprocessor_box.cc;h=064e7358fdd25ee8ec38db750b6f660231f01aa8;hb=b502bbc61895d61c39bf240b47e8a3664be2c541;hp=45cf5d76609f6fada3b71bcb4ef7ded7aaf81345;hpb=1f8e12a1b1cd5d6e4d2ec4961f6c50c671bf75b1;p=ardour.git diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 45cf5d7660..064e7358fd 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -54,6 +54,7 @@ #include "ardour/route.h" #include "ardour/send.h" #include "ardour/session.h" +#include "ardour/dB.h" #include "actions.h" #include "ardour_dialog.h" @@ -94,8 +95,10 @@ RefPtr ProcessorBox::edit_action; Glib::RefPtr SendProcessorEntry::_slider; ProcessorEntry::ProcessorEntry (boost::shared_ptr p, Width w) - : _processor (p) + : _position (PreFader) + , _processor (p) , _width (w) + , _visual_state (Gtk::STATE_NORMAL) { _hbox.pack_start (_active, false, false); _event_box.add (_name); @@ -103,7 +106,8 @@ ProcessorEntry::ProcessorEntry (boost::shared_ptr p, Width w) _vbox.pack_start (_hbox); _frame.add (_vbox); - _frame.set_name ("ProcessorFrame"); + /* without this, the border is mis-drawn on some systems */ + _vbox.set_border_width (1); _name.set_alignment (0, 0.5); _name.set_text (name ()); @@ -112,11 +116,19 @@ ProcessorEntry::ProcessorEntry (boost::shared_ptr p, Width w) if (boost::dynamic_pointer_cast (p)) { /* Fader processor gets a special look */ _event_box.set_name ("ProcessorFader"); + _frame.set_name ("ProcessorFaderFrame"); _name.set_padding (2, 4); } _active.set_active (_processor->active ()); _active.signal_toggled().connect (sigc::mem_fun (*this, &ProcessorEntry::active_toggled)); + + _frame.show (); + _vbox.show (); + _hbox.show (); + _event_box.show (); + _name.show (); + _active.show (); _processor->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&ProcessorEntry::processor_active_changed, this), gui_context()); _processor->PropertyChanged.connect (name_connection, invalidator (*this), ui_bind (&ProcessorEntry::processor_property_changed, this, _1), gui_context()); @@ -140,6 +152,66 @@ ProcessorEntry::drag_text () const return name (); } +void +ProcessorEntry::set_visual_state (Gtk::StateType t) +{ + _visual_state = t; + setup_visuals (); +} + +void +ProcessorEntry::set_position (Position p) +{ + _position = p; + setup_visuals (); +} + +void +ProcessorEntry::setup_visuals () +{ + switch (_position) { + case PreFader: + _event_box.set_name ("ProcessorPreFader"); + if (_visual_state == Gtk::STATE_NORMAL) { + _frame.set_name ("ProcessorPreFaderFrame"); + } + break; + + case Fader: + _event_box.set_name ("ProcessorFader"); + if (_visual_state == Gtk::STATE_NORMAL) { + _frame.set_name ("ProcessorFaderFrame"); + } + break; + + case PostFader: + _event_box.set_name ("ProcessorPostFader"); + if (_visual_state == Gtk::STATE_NORMAL) { + _frame.set_name ("ProcessorPostFaderFrame"); + } + break; + } + + switch (_visual_state) { + case Gtk::STATE_NORMAL: + /* _frame has been set up above */ + _event_box.set_state (Gtk::STATE_NORMAL); + break; + case Gtk::STATE_SELECTED: + _frame.set_name ("ProcessorFrameSelected"); + /* don't change the background of the box when it is selected */ + _event_box.set_state (Gtk::STATE_NORMAL); + break; + case Gtk::STATE_ACTIVE: + _frame.set_name ("ProcessorFrameActiveSend"); + _event_box.set_state (Gtk::STATE_ACTIVE); + break; + default: + break; + } +} + + boost::shared_ptr ProcessorEntry::processor () const { @@ -227,7 +299,8 @@ ProcessorEntry::name () const SendProcessorEntry::SendProcessorEntry (boost::shared_ptr s, Width w) : ProcessorEntry (s, w), _send (s), - _adjustment (0, 0, 1, 0.01, 0.1), + /* set the adjustment to a gain of 0dB so that the fader's default value is right */ + _adjustment (0.781787, 0, 1, 0.01, 0.1), _fader (_slider, &_adjustment, 0, false), _ignore_gain_change (false) { @@ -235,6 +308,8 @@ SendProcessorEntry::SendProcessorEntry (boost::shared_ptr s, Width w) _fader.set_controllable (_send->amp()->gain_control ()); _vbox.pack_start (_fader); + _fader.show (); + _adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &SendProcessorEntry::gain_adjusted)); _send->amp()->gain_control()->Changed.connect (send_gain_connection, invalidator (*this), boost::bind (&SendProcessorEntry::show_gain, this), gui_context()); show_gain (); @@ -258,6 +333,12 @@ SendProcessorEntry::show_gain () _ignore_gain_change = true; _adjustment.set_value (value); _ignore_gain_change = false; + + stringstream s; + s.precision (1); + s.setf (ios::fixed, ios::floatfield); + s << accurate_coefficient_to_dB (_send->amp()->gain ()) << _("dB"); + _fader.set_tooltip_text (s.str ()); } } @@ -277,6 +358,88 @@ SendProcessorEntry::set_pixel_width (int p) _fader.set_fader_length (p); } +PluginInsertProcessorEntry::PluginInsertProcessorEntry (boost::shared_ptr p, Width w) + : ProcessorEntry (p, w) + , _plugin_insert (p) +{ + p->SplittingChanged.connect ( + _splitting_connection, invalidator (*this), ui_bind (&PluginInsertProcessorEntry::plugin_insert_splitting_changed, this), gui_context() + ); + + _splitting_icon.set_size_request (-1, 12); + + _vbox.pack_start (_splitting_icon); + _vbox.reorder_child (_splitting_icon, 0); + + plugin_insert_splitting_changed (); +} + +void +PluginInsertProcessorEntry::plugin_insert_splitting_changed () +{ + if (_plugin_insert->splitting ()) { + _splitting_icon.show (); + } else { + _splitting_icon.hide (); + } +} + +void +PluginInsertProcessorEntry::hide_things () +{ + plugin_insert_splitting_changed (); +} + +void +PluginInsertProcessorEntry::setup_visuals () +{ + switch (_position) { + case PreFader: + _splitting_icon.set_name ("ProcessorPreFader"); + break; + + case Fader: + _splitting_icon.set_name ("ProcessorFader"); + break; + + case PostFader: + _splitting_icon.set_name ("ProcessorPostFader"); + break; + } + + ProcessorEntry::setup_visuals (); +} + +bool +PluginInsertProcessorEntry::SplittingIcon::on_expose_event (GdkEventExpose* ev) +{ + cairo_t* cr = gdk_cairo_create (get_window()->gobj()); + + cairo_set_line_width (cr, 1); + + double const width = ev->area.width; + double const height = ev->area.height; + + Gdk::Color const bg = get_style()->get_bg (STATE_NORMAL); + cairo_set_source_rgb (cr, bg.get_red_p (), bg.get_green_p (), bg.get_blue_p ()); + + cairo_rectangle (cr, 0, 0, width, height); + cairo_fill (cr); + + Gdk::Color const fg = get_style()->get_fg (STATE_NORMAL); + cairo_set_source_rgb (cr, fg.get_red_p (), fg.get_green_p (), fg.get_blue_p ()); + + cairo_move_to (cr, width * 0.3, height); + cairo_line_to (cr, width * 0.3, height * 0.5); + cairo_line_to (cr, width * 0.7, height * 0.5); + cairo_line_to (cr, width * 0.7, height); + cairo_move_to (cr, width * 0.5, height * 0.5); + cairo_line_to (cr, width * 0.5, 0); + cairo_stroke (cr); + + return true; +} + ProcessorBox::ProcessorBox (ARDOUR::Session* sess, boost::function get_plugin_selector, RouteRedirectSelection& rsel, MixerStrip* parent, bool owner_is_mixer) : _parent_strip (parent) @@ -316,6 +479,9 @@ ProcessorBox::ProcessorBox (ARDOUR::Session* sess, boost::functionDeliveryChanged.connect ( _mixer_strip_connections, invalidator (*this), ui_bind (&ProcessorBox::mixer_strip_delivery_changed, this, _1), gui_context () @@ -472,13 +638,13 @@ ProcessorBox::show_processor_menu (gint arg) processor_menu = build_processor_menu (); } - Gtk::MenuItem* plugin_menu_item = dynamic_cast(ActionManager::get_widget("/processormenu/newplugin")); + Gtk::MenuItem* plugin_menu_item = dynamic_cast(ActionManager::get_widget("/ProcessorMenu/newplugin")); if (plugin_menu_item) { plugin_menu_item->set_submenu (*_get_plugin_selector()->plugin_menu()); } - Gtk::MenuItem* aux_menu_item = dynamic_cast(ActionManager::get_widget("/processormenu/newaux")); + Gtk::MenuItem* aux_menu_item = dynamic_cast(ActionManager::get_widget("/ProcessorMenu/newaux")); if (aux_menu_item) { Menu* m = build_possible_aux_menu(); @@ -709,11 +875,8 @@ ProcessorBox::processor_button_release_event (GdkEventButton *ev, ProcessorEntry Menu * ProcessorBox::build_processor_menu () { - processor_menu = dynamic_cast(ActionManager::get_widget("/processormenu") ); + processor_menu = dynamic_cast(ActionManager::get_widget("/ProcessorMenu") ); processor_menu->set_name ("ArdourContextMenu"); - - show_all_children(); - return processor_menu; } @@ -792,14 +955,14 @@ ProcessorBox::weird_plugin_dialog (Plugin& p, Route::ProcessorStreams streams) text += _("\nThis plugin has:\n"); if (has_midi) { uint32_t const n = p.get_info()->n_inputs.n_midi (); - text += string_compose (ngettext ("\t%1 MIDI input", "\t%1 MIDI inputs", n), n); + text += string_compose (ngettext ("\t%1 MIDI input\n", "\t%1 MIDI inputs\n", n), n); } if (has_audio) { uint32_t const n = p.get_info()->n_inputs.n_audio (); - text += string_compose (ngettext ("\t%1 audio input", "\t%1 audio inputs", n), n); + text += string_compose (ngettext ("\t%1 audio input\n", "\t%1 audio inputs\n", n), n); } - text += _("\nBut at the insertion point, there are:\n"); + text += _("\nbut at the insertion point, there are:\n"); if (has_midi) { uint32_t const n = streams.count.n_midi (); text += string_compose (ngettext ("\t%1 MIDI channel\n", "\t%1 MIDI channels\n", n), n); @@ -826,7 +989,7 @@ ProcessorBox::weird_plugin_dialog (Plugin& p, Route::ProcessorStreams streams) void ProcessorBox::choose_insert () { - boost::shared_ptr processor (new PortInsert (*_session, _route->mute_master())); + boost::shared_ptr processor (new PortInsert (*_session, _route->pannable(), _route->mute_master())); _route->add_processor (processor, _placement); } @@ -834,7 +997,7 @@ ProcessorBox::choose_insert () void ProcessorBox::choose_send () { - boost::shared_ptr send (new Send (*_session, _route->mute_master())); + boost::shared_ptr send (new Send (*_session, _route->pannable(), _route->mute_master())); /* make an educated guess at the initial number of outputs for the send */ ChanCount outs = (_session->master_out()) @@ -858,7 +1021,7 @@ ProcessorBox::choose_send () */ IOSelectorWindow *ios = new IOSelectorWindow (_session, send->output(), true); - ios->show_all (); + ios->show (); /* keep a reference to the send so it doesn't get deleted while the IOSelectorWindow is doing its stuff @@ -970,8 +1133,6 @@ ProcessorBox::redisplay_processors () _route->foreach_processor (sigc::mem_fun (*this, &ProcessorBox::add_processor_to_display)); - build_processor_tooltip (processor_eventbox, _("Inserts, sends & plugins:")); - for (list::iterator i = _processor_window_proxies.begin(); i != _processor_window_proxies.end(); ++i) { (*i)->marked = false; } @@ -994,7 +1155,7 @@ ProcessorBox::redisplay_processors () i = j; } - setup_entry_widget_names (); + setup_entry_positions (); } /** Add a ProcessorWindowProxy for a processor to our list, if that processor does @@ -1042,6 +1203,17 @@ ProcessorBox::maybe_add_processor_to_ui_list (boost::weak_ptr w) w); wp->marked = true; + + /* if the processor already has an existing UI, + note that so that we don't recreate it + */ + + void* existing_ui = p->get_ui (); + + if (existing_ui) { + wp->set (static_cast(existing_ui)); + } + _processor_window_proxies.push_back (wp); ARDOUR_UI::instance()->add_window_proxy (wp); } @@ -1056,12 +1228,16 @@ ProcessorBox::add_processor_to_display (boost::weak_ptr p) } boost::shared_ptr send = boost::dynamic_pointer_cast (processor); + boost::shared_ptr plugin_insert = boost::dynamic_pointer_cast (processor); ProcessorEntry* e = 0; if (send) { e = new SendProcessorEntry (send, _width); + } else if (plugin_insert) { + e = new PluginInsertProcessorEntry (plugin_insert, _width); } else { e = new ProcessorEntry (processor, _width); } + e->set_pixel_width (get_allocation().get_width()); processor_display.add_child (e); } @@ -1085,23 +1261,24 @@ void ProcessorBox::reordered () { compute_processor_sort_keys (); - setup_entry_widget_names (); + setup_entry_positions (); } -/* Name the Entry widgets according to pre- or post-fader so that they get coloured right */ void -ProcessorBox::setup_entry_widget_names () +ProcessorBox::setup_entry_positions () { list children = processor_display.children (); bool pre_fader = true; + for (list::iterator i = children.begin(); i != children.end(); ++i) { if (boost::dynamic_pointer_cast((*i)->processor())) { pre_fader = false; + (*i)->set_position (ProcessorEntry::Fader); } else { if (pre_fader) { - (*i)->action_widget().set_name ("ProcessorPreFader"); + (*i)->set_position (ProcessorEntry::PreFader); } else { - (*i)->action_widget().set_name ("ProcessorPostFader"); + (*i)->set_position (ProcessorEntry::PostFader); } } } @@ -1437,7 +1614,7 @@ ProcessorBox::paste_processor_state (const XMLNodeList& nlist, boost::shared_ptr XMLNode n (**niter); Send::make_unique (n, *_session); - Send* s = new Send (*_session, _route->mute_master()); + Send* s = new Send (*_session, _route->pannable(), _route->mute_master()); if (s->set_state (n, Stateful::loading_state_version)) { delete s; return; @@ -1459,6 +1636,14 @@ ProcessorBox::paste_processor_state (const XMLNodeList& nlist, boost::shared_ptr p.reset (r); + } else if (type->value() == "port") { + + XMLNode n (**niter); + p.reset (new PortInsert (*_session, _route->pannable (), _route->mute_master ())); + if (p->set_state (n, Stateful::loading_state_version)) { + return; + } + } else { /* XXX its a bit limiting to assume that everything else is a plugin. @@ -1615,6 +1800,7 @@ void ProcessorBox::toggle_edit_processor (boost::shared_ptr processor) { boost::shared_ptr send; + boost::shared_ptr internal_send; boost::shared_ptr retrn; boost::shared_ptr plugin_insert; boost::shared_ptr port_insert; @@ -1627,20 +1813,33 @@ ProcessorBox::toggle_edit_processor (boost::shared_ptr processor) } } - if ((send = boost::dynamic_pointer_cast (processor)) != 0) { + if (boost::dynamic_pointer_cast (processor)) { + + _parent_strip->revert_to_default_display (); + + } else if ((internal_send = boost::dynamic_pointer_cast (processor)) != 0) { if (!_session->engine().connected()) { return; } if (_parent_strip) { - if (boost::dynamic_pointer_cast (_parent_strip->current_delivery()) == send) { + if (boost::dynamic_pointer_cast (_parent_strip->current_delivery()) == internal_send) { _parent_strip->revert_to_default_display (); } else { - _parent_strip->show_send (send); + _parent_strip->show_send (internal_send); } } + } else if ((send = boost::dynamic_pointer_cast (processor)) != 0) { + + if (!_session->engine().connected()) { + return; + } + + SendUIWindow* w = new SendUIWindow (send, _session); + w->show (); + } else if ((retrn = boost::dynamic_pointer_cast (processor)) != 0) { if (boost::dynamic_pointer_cast (retrn)) { @@ -1729,7 +1928,7 @@ ProcessorBox::toggle_edit_processor (boost::shared_ptr processor) void ProcessorBox::register_actions () { - Glib::RefPtr popup_act_grp = Gtk::ActionGroup::create(X_("processormenu")); + Glib::RefPtr popup_act_grp = Gtk::ActionGroup::create(X_("ProcessorMenu")); Glib::RefPtr act; /* new stuff */ @@ -2060,6 +2259,9 @@ void ProcessorBox::set_processor_ui (boost::shared_ptr p, Gtk::Window* w) { list::iterator i = _processor_window_proxies.begin (); + + p->set_ui (w); + while (i != _processor_window_proxies.end()) { boost::shared_ptr t = (*i)->processor().lock (); if (t && t == p) { @@ -2097,6 +2299,15 @@ ProcessorBox::mixer_strip_delivery_changed (boost::weak_ptr w) } } +void +ProcessorBox::hide_things () +{ + list c = processor_display.children (); + for (list::iterator i = c.begin(); i != c.end(); ++i) { + (*i)->hide_things (); + } +} + ProcessorWindowProxy::ProcessorWindowProxy ( string const & name, XMLNode const * node,