X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fprocessor_box.cc;h=361945d5e0f8de57f93317dbcb8b4750cf39e4ee;hb=8b230014412b90b78240685b16a8d4e624cc5ce6;hp=aa8f285a43efc41d519b3dd4cdd0fee7807395c8;hpb=f4b5f4c72ee60b6f509e307c5bfd164108d1f30b;p=ardour.git diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index aa8f285a43..361945d5e0 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -76,7 +76,6 @@ #include "return_ui.h" #include "route_processor_selection.h" #include "send_ui.h" -#include "utils.h" #include "i18n.h" @@ -104,17 +103,18 @@ static const uint32_t midi_port_color = 0x960909FF; //Red ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr p, Width w) : _button (ArdourButton::led_default_elements) , _position (PreFader) + , _position_num(0) + , _selectable(true) , _parent (parent) , _processor (p) , _width (w) - , _visual_state (Gtk::STATE_NORMAL) , _input_icon(true) , _output_icon(false) { _vbox.show (); - _button.set_diameter (3); _button.set_distinct_led_click (true); + _button.set_fallthrough_to_parent(true); _button.set_led_left (true); _button.signal_led_clicked.connect (sigc::mem_fun (*this, &ProcessorEntry::led_clicked)); _button.set_text (name (_width)); @@ -492,7 +492,7 @@ ProcessorEntry::toggle_panner_link () ProcessorEntry::Control::Control (boost::shared_ptr c, string const & n) : _control (c) , _adjustment (gain_to_slider_position_with_max (1.0, Config->get_max_gain()), 0, 1, 0.01, 0.1) - , _slider (&_adjustment, 0, 13, false) + , _slider (&_adjustment, boost::shared_ptr(), 0, 13) , _slider_persistant_tooltip (&_slider) , _button (ArdourButton::led_default_elements) , _ignore_ui_adjustment (false) @@ -521,14 +521,30 @@ ProcessorEntry::Control::Control (boost::shared_ptr c, string box.add (_slider); _slider.show (); - double const lo = c->internal_to_interface (c->lower ()); - double const up = c->internal_to_interface (c->upper ()); - + const ARDOUR::ParameterDescriptor& desc = c->desc(); + double const lo = c->internal_to_interface(desc.lower); + double const up = c->internal_to_interface(desc.upper); + double const normal = c->internal_to_interface(desc.normal); + double smallstep = desc.smallstep; + double largestep = desc.largestep; + + if (smallstep == 0.0) { + smallstep = up / 1000.; + } else { + smallstep = c->internal_to_interface(desc.lower + smallstep); + } + + if (largestep == 0.0) { + largestep = up / 40.; + } else { + largestep = c->internal_to_interface(desc.lower + largestep); + } + _adjustment.set_lower (lo); _adjustment.set_upper (up); - _adjustment.set_step_increment ((up - lo) / 100); - _adjustment.set_page_increment ((up - lo) / 10); - _slider.set_default_value (c->internal_to_interface (c->normal ())); + _adjustment.set_step_increment (smallstep); + _adjustment.set_page_increment (largestep); + _slider.set_default_value (normal); _adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &Control::slider_adjusted)); c->Changed.connect (_connection, MISSING_INVALIDATOR, boost::bind (&Control::control_changed, this), gui_context ()); @@ -580,7 +596,7 @@ ProcessorEntry::Control::slider_adjusted () return; } - c->set_value (c->interface_to_internal (_adjustment.get_value ())); + c->set_value ( c->interface_to_internal(_adjustment.get_value ()) ); set_tooltip (); } @@ -616,7 +632,7 @@ ProcessorEntry::Control::control_changed () } else { - _adjustment.set_value (c->internal_to_interface (c->get_value ())); + _adjustment.set_value (c->internal_to_interface(c->get_value ())); stringstream s; s.precision (1); @@ -1196,14 +1212,14 @@ ProcessorBox::leave_notify (GdkEventCrossing*) return false; } -void +bool ProcessorBox::processor_operation (ProcessorOperation op) { ProcSelection targets; get_selected_processors (targets); - if (targets.empty()) { +/* if (targets.empty()) { int x, y; processor_display.get_pointer (x, y); @@ -1214,12 +1230,20 @@ ProcessorBox::processor_operation (ProcessorOperation op) targets.push_back (pointer.first->processor ()); } } +*/ + if ( (op == ProcessorsDelete) && targets.empty() ) + return false; //nothing to delete. return false so the editor-mixer, because the user was probably intending to delete something in the editor + switch (op) { case ProcessorsSelectAll: processor_display.select_all (); break; + case ProcessorsSelectNone: + processor_display.select_none (); + break; + case ProcessorsCopy: copy_processors (targets); break; @@ -1257,24 +1281,17 @@ ProcessorBox::processor_operation (ProcessorOperation op) default: break; } + + return true; } ProcessorWindowProxy* ProcessorBox::find_window_proxy (boost::shared_ptr processor) const { - for (list::const_iterator i = _processor_window_info.begin(); i != _processor_window_info.end(); ++i) { - boost::shared_ptr p = (*i)->processor().lock(); - - if (p && p == processor) { - return (*i); - } - } - - return 0; + return processor->window_proxy(); } - bool ProcessorBox::processor_button_press_event (GdkEventButton *ev, ProcessorEntry* child) { @@ -1302,6 +1319,12 @@ ProcessorBox::processor_button_press_event (GdkEventButton *ev, ProcessorEntry* ret = true; + } else if (Keyboard::is_context_menu_event (ev)) { + + show_processor_menu (ev->time); + + ret = true; + } else if (processor && ev->button == 1 && selected) { // this is purely informational but necessary for route params UI @@ -1330,10 +1353,6 @@ ProcessorBox::processor_button_release_event (GdkEventButton *ev, ProcessorEntry sigc::mem_fun(*this, &ProcessorBox::idle_delete_processor), boost::weak_ptr(processor))); - } else if (Keyboard::is_context_menu_event (ev)) { - - show_processor_menu (ev->time); - } else if (processor && Keyboard::is_button2_event (ev) #ifndef GTKOSX && (Keyboard::no_modifier_keys_pressed (ev) && ((ev->state & Gdk::BUTTON2_MASK) == Gdk::BUTTON2_MASK)) @@ -1599,56 +1618,7 @@ ProcessorBox::redisplay_processors () &_visible_prefader_processors, &fader_seen)); _route->foreach_processor (sigc::mem_fun (*this, &ProcessorBox::add_processor_to_display)); - - for (ProcessorWindowProxies::iterator i = _processor_window_info.begin(); i != _processor_window_info.end(); ++i) { - (*i)->marked = false; - } - _route->foreach_processor (sigc::mem_fun (*this, &ProcessorBox::maybe_add_processor_to_ui_list)); - - /* trim dead wood from the processor window proxy list */ - - ProcessorWindowProxies::iterator i = _processor_window_info.begin(); - while (i != _processor_window_info.end()) { - ProcessorWindowProxies::iterator j = i; - ++j; - - if (!(*i)->valid()) { - - WM::Manager::instance().remove (*i); - delete *i; - _processor_window_info.erase (i); - - } else if (!(*i)->marked) { - - /* this processor is no longer part of this processor - * box. - * - * that could be because it was deleted or it could be - * because the route being displayed in the parent - * strip changed. - * - * The latter only happens with the editor mixer strip. - */ - - if (is_editor_mixer_strip()) { - - /* editor mixer strip .. DO NOTHING - * - * note: the processor window stays visible if - * it is already visible - */ - } else { - (*i)->hide (); - WM::Manager::instance().remove (*i); - delete *i; - _processor_window_info.erase (i); - } - } - - i = j; - } - setup_entry_positions (); } @@ -1662,24 +1632,14 @@ ProcessorBox::maybe_add_processor_to_ui_list (boost::weak_ptr w) if (!p) { return; } - - ProcessorWindowProxies::iterator i = _processor_window_info.begin (); - while (i != _processor_window_info.end()) { - - boost::shared_ptr t = (*i)->processor().lock (); - - if (p == t) { - /* this processor is already on the list; done */ - (*i)->marked = true; - return; - } - - ++i; + if (p->window_proxy()) { + return; } /* not on the list; add it */ string loc; +#if 0 // is this still needed? Why? if (_parent_strip) { if (_parent_strip->mixer_owned()) { loc = X_("M"); @@ -1689,6 +1649,9 @@ ProcessorBox::maybe_add_processor_to_ui_list (boost::weak_ptr w) } else { loc = X_("P"); } +#else + loc = X_("P"); +#endif ProcessorWindowProxy* wp = new ProcessorWindowProxy ( string_compose ("%1-%2-%3", loc, _route->id(), p->id()), @@ -1701,19 +1664,13 @@ ProcessorBox::maybe_add_processor_to_ui_list (boost::weak_ptr w) wp->set_state (*ui_xml); } - 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->use_window (*(reinterpret_cast(existing_ui))); } - _processor_window_info.push_back (wp); + p->set_window_proxy (wp); WM::Manager::instance().register_window (wp); } @@ -1744,6 +1701,7 @@ ProcessorBox::add_processor_to_display (boost::weak_ptr p) } boost::shared_ptr plugin_insert = boost::dynamic_pointer_cast (processor); + ProcessorEntry* e = 0; if (plugin_insert) { e = new PluginInsertProcessorEntry (this, plugin_insert, _width); @@ -1751,6 +1709,13 @@ ProcessorBox::add_processor_to_display (boost::weak_ptr p) e = new ProcessorEntry (this, processor, _width); } + boost::shared_ptr send = boost::dynamic_pointer_cast (processor); + boost::shared_ptr ext = boost::dynamic_pointer_cast (processor); + + //faders and meters are not deletable, copy/paste-able, so they shouldn't be selectable + if (!send && !plugin_insert && !ext) + e->set_selectable(false); + /* Set up this entry's state from the GUIObjectState */ XMLNode* proc = entry_gui_object_state (e); if (proc) { @@ -2111,8 +2076,8 @@ ProcessorBox::paste_processor_state (const XMLNodeList& nlist, boost::shared_ptr boost::shared_ptr sendpan(new Pannable (*_session)); XMLNode n (**niter); - InternalSend* s = new InternalSend (*_session, sendpan, _route->mute_master(), - boost::shared_ptr(), Delivery::Aux); + InternalSend* s = new InternalSend (*_session, sendpan, _route->mute_master(), + _route, boost::shared_ptr(), Delivery::Aux); IOProcessor::prepare_for_reset (n, s->name()); @@ -2821,16 +2786,10 @@ ProcessorBox::generate_processor_title (boost::shared_ptr pi) Window * ProcessorBox::get_processor_ui (boost::shared_ptr p) const { - list::const_iterator i = _processor_window_info.begin (); - while (i != _processor_window_info.end()) { - boost::shared_ptr t = (*i)->processor().lock (); - if (t && t == p) { - return (*i)->get (); - } - - ++i; + ProcessorWindowProxy* wp = p->window_proxy(); + if (wp) { + return wp->get (); } - return 0; } @@ -2841,24 +2800,9 @@ ProcessorBox::get_processor_ui (boost::shared_ptr p) const void ProcessorBox::set_processor_ui (boost::shared_ptr p, Gtk::Window* w) { - list::iterator i = _processor_window_info.begin (); - + assert (p->window_proxy()); p->set_ui (w); - - while (i != _processor_window_info.end()) { - boost::shared_ptr t = (*i)->processor().lock (); - if (t && t == p) { - (*i)->use_window (*w); - return; - } - - ++i; - } - - /* we shouldn't get here, because the ProcessorUIList should always contain - an entry for each processor. - */ - assert (false); + p->window_proxy()->use_window (*w); } void @@ -2933,12 +2877,10 @@ ProcessorBox::is_editor_mixer_strip() const ProcessorWindowProxy::ProcessorWindowProxy (string const & name, ProcessorBox* box, boost::weak_ptr processor) : WM::ProxyBase (name, string()) - , marked (false) , _processor_box (box) , _processor (processor) , is_custom (false) , want_custom (false) - , _valid (true) { boost::shared_ptr p = _processor.lock (); if (!p) { @@ -2961,7 +2903,7 @@ ProcessorWindowProxy::processor_going_away () { delete _window; _window = 0; - _valid = false; + WM::Manager::instance().remove (this); /* should be no real reason to do this, since the object that would send DropReferences is about to be deleted, but lets do it anyway. */ @@ -2975,12 +2917,6 @@ ProcessorWindowProxy::session_handle() return 0; } -bool -ProcessorWindowProxy::valid() const -{ - return _valid; -} - XMLNode& ProcessorWindowProxy::get_state () const {