X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=gtk2_ardour%2Frc_option_editor.cc;h=3d5badf57b8408d08d5e273b519302be2b797a21;hb=d3acba6be4a93ab757703816de1a6f12cf457a0e;hp=2243b5af01e42c828e2ecd3c5a8e0c10208c69f2;hpb=4eb161cd4cf55841b7d0d93ca54e8d5706f46232;p=ardour.git diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index 2243b5af01..3d5badf57b 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -54,6 +54,7 @@ #include "ardour_window.h" #include "ardour_dialog.h" +#include "ardour_ui.h" #include "gui_thread.h" #include "meter_patterns.h" #include "midi_tracer.h" @@ -76,7 +77,7 @@ using namespace ARDOUR_UI_UTILS; class ClickOptions : public OptionEditorBox { public: - ClickOptions (RCConfiguration* c, Gtk::Window* p) + ClickOptions (RCConfiguration* c) : _rc_config (c) , _click_browse_button (_("Browse...")) , _click_emphasis_browse_button (_("Browse...")) @@ -326,7 +327,7 @@ static const struct { { "Unmodified", 0 }, -#ifdef GTKOSX +#ifdef __APPLE__ /* Command = Meta Option/Alt = Mod1 @@ -514,7 +515,7 @@ public: _copy_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::copy_modifier_chosen)); Gtkmm2ext::UI::instance()->set_tip (_copy_modifier_combo, (string_compose (_("Recommended Setting: %1%2"), -#ifdef GTKOSX +#ifdef __APPLE__ Keyboard::secondary_modifier_name (), #else Keyboard::primary_modifier_name (), @@ -541,7 +542,7 @@ public: _constraint_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::constraint_modifier_chosen)); Gtkmm2ext::UI::instance()->set_tip (_constraint_modifier_combo, (string_compose (_("Recommended Setting: %1%2"), -#ifdef GTKOSX +#ifdef __APPLE__ Keyboard::primary_modifier_name (), #else Keyboard::secondary_modifier_name (), @@ -665,7 +666,7 @@ public: /* ignore snap */ set_popdown_strings (_snap_modifier_combo, dumb); _snap_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::snap_modifier_chosen)); -#ifdef GTKOSX +#ifdef __APPLE__ Glib::ustring mod_str = string_compose (X_("%1-%2"), Keyboard::level4_modifier_name (), Keyboard::tertiary_modifier_name ()); #else Glib::ustring mod_str = Keyboard::secondary_modifier_name(); @@ -691,7 +692,7 @@ public: /* snap delta */ set_popdown_strings (_snap_delta_combo, dumb); _snap_delta_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::snap_delta_modifier_chosen)); -#ifdef GTKOSX +#ifdef __APPLE__ mod_str = Keyboard::level4_modifier_name (); #else mod_str = string_compose (X_("%1-%2"), Keyboard::secondary_modifier_name (), Keyboard::level4_modifier_name ()); @@ -1053,7 +1054,7 @@ public: _box->pack_start (*h, false, false); - set_note (_("Adjusting the scale require an application restart to re-layout.")); + set_note (_("Adjusting the scale requires an application restart to re-layout.")); _dpi_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &FontScalingOptions::dpi_changed)); } @@ -1083,6 +1084,68 @@ private: HScale _dpi_slider; }; +class VstTimeOutSliderOption : public OptionEditorBox +{ +public: + VstTimeOutSliderOption (RCConfiguration* c) + : _rc_config (c) + , _timeout_adjustment (0, 0, 3000, 50, 50) + , _timeout_slider (_timeout_adjustment) + { + _timeout_slider.set_digits (0); + _timeout_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &VstTimeOutSliderOption::timeout_changed)); + + _timeout_slider.set_draw_value(false); + _timeout_slider.add_mark( 0, Gtk::POS_TOP, _("\u221e")); // infinity + _timeout_slider.add_mark( 300, Gtk::POS_TOP, _("30 sec")); + _timeout_slider.add_mark( 600, Gtk::POS_TOP, _("1 min")); + _timeout_slider.add_mark(1200, Gtk::POS_TOP, _("2 mins")); + _timeout_slider.add_mark(1800, Gtk::POS_TOP, _("3 mins")); + _timeout_slider.add_mark(2400, Gtk::POS_TOP, _("4 mins")); + _timeout_slider.add_mark(3000, Gtk::POS_TOP, _("5 mins")); + + Gtkmm2ext::UI::instance()->set_tip(_timeout_slider, + _("Specify the default timeout for plugin instantiation. Plugins that require more time to load will be blacklisted. A value of 0 disables the timeout.")); + + Label* l = manage (left_aligned_label (_("Scan Time Out:"))); + HBox* h = manage (new HBox); + h->set_spacing (4); + h->pack_start (*l, false, false); + h->pack_start (_timeout_slider, true, true); + + _box->pack_start (*h, false, false); + } + + void parameter_changed (string const & p) + { + if (p == "vst-scan-timeout") { + int const x = _rc_config->get_vst_scan_timeout(); + _timeout_adjustment.set_value (x); + } + } + + void set_state_from_config () + { + parameter_changed ("vst-scan-timeout"); + } + +private: + + void timeout_changed () + { + int x = floor(_timeout_adjustment.get_value()); + _rc_config->set_vst_scan_timeout(x); + } + + RCConfiguration* _rc_config; + Adjustment _timeout_adjustment; + HScale _timeout_slider; +}; + + + + + class ClipLevelOptions : public OptionEditorBox { public: @@ -1281,36 +1344,41 @@ private: class ControlSurfacesOptions : public OptionEditorBox { public: - ControlSurfacesOptions (Gtk::Window& parent) - : _parent (parent) - , _ignore_view_change (0) + ControlSurfacesOptions () + : _ignore_view_change (0) { _store = ListStore::create (_model); _view.set_model (_store); _view.append_column (_("Control Surface Protocol"), _model.name); _view.get_column(0)->set_resizable (true); _view.get_column(0)->set_expand (true); - _view.append_column (_("Edit"), _model.edit); _view.append_column_editable (_("Enabled"), _model.enabled); _view.append_column_editable (_("Feedback"), _model.feedback); - /* hacky data marker for the edit "column", since GTK offers no - way to get the column number. - */ - _view.get_column (1)->set_data ("edit", (void*) 0xdeadbeef); - CellRendererText* crt = dynamic_cast (_view.get_column_cell_renderer (1)); - if (crt) { - crt->property_weight() = 1000; - } - _box->pack_start (_view, false, false); + Gtk::HBox* edit_box = manage (new Gtk::HBox); + edit_box->set_spacing(3); + _box->pack_start (*edit_box, false, false); + edit_box->show (); + + Label* label = manage (new Label); + label->set_text (_("Click to edit the settings for selected protocol ( it must be ENABLED first ):")); + edit_box->pack_start (*label, false, false); + label->show (); + + edit_button = manage (new Button(_("Show Protocol Settings"))); + edit_button->signal_clicked().connect (sigc::mem_fun(*this, &ControlSurfacesOptions::edit_btn_clicked)); + edit_box->pack_start (*edit_button, true, true); + edit_button->set_sensitive (false); + edit_button->show (); + ControlProtocolManager& m = ControlProtocolManager::instance (); m.ProtocolStatusChange.connect (protocol_status_connection, MISSING_INVALIDATOR, boost::bind (&ControlSurfacesOptions::protocol_status_changed, this, _1), gui_context()); _store->signal_row_changed().connect (sigc::mem_fun (*this, &ControlSurfacesOptions::view_changed)); - _view.signal_button_release_event().connect_notify (sigc::mem_fun(*this, &ControlSurfacesOptions::edit_clicked)); + _view.signal_button_press_event().connect_notify (sigc::mem_fun(*this, &ControlSurfacesOptions::edit_clicked)); _view.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &ControlSurfacesOptions::selection_changed)); } @@ -1329,7 +1397,6 @@ public: if (!(*i)->mandatory) { TreeModel::Row r = *_store->append (); r[_model.name] = (*i)->name; - r[_model.edit] = _("Edit Settings"); r[_model.enabled] = ((*i)->protocol || (*i)->requested); r[_model.feedback] = ((*i)->protocol && (*i)->protocol->get_feedback ()); r[_model.protocol_info] = *i; @@ -1357,8 +1424,14 @@ private: void selection_changed () { + //enable the Edit button when a row is selected for editing + TreeModel::Row row = *(_view.get_selection()->get_selected()); + if (row && row[_model.enabled]) + edit_button->set_sensitive (true); + else + edit_button->set_sensitive (false); } - + void view_changed (TreeModel::Path const &, TreeModel::iterator const & i) { TreeModel::Row r = *i; @@ -1372,49 +1445,10 @@ private: return; } -#if 0 - /* XXX when we move to putting all editors into a notebook, - this test will have to be more subtle. - */ - bool const was_editing = (cpi && cpi->protocol && (cpi->protocol->get_gui() != 0)); - bool const is_editing = r[_model.edit]; - - if (was_editing != is_editing) { - if (!was_editing) { - if (!r[_model.enabled]) { - return; - } - cpi = r[_model.protocol_info]; - if (!cpi || !cpi->protocol || !cpi->protocol->has_editor ()) { - return; - } - Box* box = (Box*) cpi->protocol->get_gui (); - if (!box) { - return; - } - if (box->get_parent()) { - static_cast(box->get_parent())->present(); - return; - } - WindowTitle title (Glib::get_application_name()); - title += r[_model.name]; - title += _("Configuration"); - /* once created, the window is managed by the surface itself (as ->get_parent()) - * Surface's tear_down_gui() is called on session close, when de-activating - * or re-initializing a surface. - * tear_down_gui() hides an deletes the Window if it exists. - */ - ArdourWindow* win = new ArdourWindow (_parent, title.get_string()); - win->add (*box); - box->show (); - win->present (); - } else { - } - } -#endif bool const was_enabled = (cpi->protocol != 0); bool const is_enabled = r[_model.enabled]; + if (was_enabled != is_enabled) { if (!was_enabled) { @@ -1462,7 +1496,8 @@ private: * or re-initializing a surface. * tear_down_gui() hides an deletes the Window if it exists. */ - ArdourWindow* win = new ArdourWindow (_parent, title.get_string()); + ArdourWindow* win = new ArdourWindow (*((Gtk::Window*) _view.get_toplevel()), title.get_string()); + win->set_title ("Control Protocol Options"); win->add (*box); box->show (); win->present (); @@ -1470,19 +1505,11 @@ private: void edit_clicked (GdkEventButton* ev) { - TreeModel::Path path; - TreeViewColumn* col; - int cell_x; - int cell_y; - - if (!_view.get_path_at_pos (ev->x, ev->y, path, col, cell_x, cell_y)) { - /* no path there */ + if (ev->type != GDK_2BUTTON_PRESS) { return; } - if (col && col->get_data (X_("edit"))) { - edit_btn_clicked(); - } + edit_btn_clicked(); } class ControlSurfacesModelColumns : public TreeModelColumnRecord @@ -1492,7 +1519,6 @@ private: ControlSurfacesModelColumns () { add (name); - add (edit); add (enabled); add (feedback); add (protocol_info); @@ -1501,16 +1527,15 @@ private: TreeModelColumn name; TreeModelColumn enabled; TreeModelColumn feedback; - TreeModelColumn edit; TreeModelColumn protocol_info; }; Glib::RefPtr _store; ControlSurfacesModelColumns _model; TreeView _view; - Gtk::Window& _parent; PBD::ScopedConnection protocol_status_connection; uint32_t _ignore_view_change; + Gtk::Button* edit_button; }; class VideoTimelineOptions : public OptionEditorBox @@ -1521,45 +1546,78 @@ public: , _show_video_export_info_button (_("Show Video Export Info before export")) , _show_video_server_dialog_button (_("Show Video Server Startup Dialog")) , _video_advanced_setup_button (_("Advanced Setup (remote video server)")) + , _xjadeo_browse_button (_("Browse...")) { - Table* t = manage (new Table (2, 6)); + Table* t = manage (new Table (8, 4)); t->set_spacings (4); - t->attach (_video_advanced_setup_button, 0, 2, 0, 1); + std::stringstream s; + s << "" << _("Video Server") << ""; + Label* l = manage (new Label (s.str())); + l->set_use_markup (true); + l->set_alignment (0, 0.5); + t->attach (*l, 0, 4, 0, 1, EXPAND | FILL, FILL | EXPAND, 0, 8); + + t->attach (_video_advanced_setup_button, 1, 4, 1, 2); _video_advanced_setup_button.signal_toggled().connect (sigc::mem_fun (*this, &VideoTimelineOptions::video_advanced_setup_toggled)); Gtkmm2ext::UI::instance()->set_tip (_video_advanced_setup_button, _("When enabled you can speficify a custom video-server URL and docroot. - Do not enable this option unless you know what you are doing.")); - Label* l = manage (new Label (_("Video Server URL:"))); + l = manage (new Label (_("Video Server URL:"))); l->set_alignment (0, 0.5); - t->attach (*l, 0, 1, 1, 2, FILL); - t->attach (_video_server_url_entry, 1, 2, 1, 2, FILL); + t->attach (*l, 1, 2, 2, 3, FILL); + t->attach (_video_server_url_entry, 2, 4, 2, 3, FILL); Gtkmm2ext::UI::instance()->set_tip (_video_server_url_entry, _("Base URL of the video-server including http prefix. This is usually 'http://hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when the video-server is running locally")); l = manage (new Label (_("Video Folder:"))); l->set_alignment (0, 0.5); - t->attach (*l, 0, 1, 2, 3, FILL); - t->attach (_video_server_docroot_entry, 1, 2, 2, 3); + t->attach (*l, 1, 2, 3, 4, FILL); + t->attach (_video_server_docroot_entry, 2, 4, 3, 4); Gtkmm2ext::UI::instance()->set_tip (_video_server_docroot_entry, _("Local path to the video-server document-root. Only files below this directory will be accessible by the video-server. If the server run on a remote host, it should point to a network mounted folder of the server's docroot or be left empty if it is unvailable. It is used for the local video-monitor and file-browsing when opening/adding a video file.")); - /* small vspace y=3..4 */ - - t->attach (_show_video_export_info_button, 0, 2, 4, 5); + t->attach (_show_video_export_info_button, 1, 4, 4, 5); _show_video_export_info_button.signal_toggled().connect (sigc::mem_fun (*this, &VideoTimelineOptions::show_video_export_info_toggled)); Gtkmm2ext::UI::instance()->set_tip (_show_video_export_info_button, _("When enabled an information window with details is displayed before the video-export dialog.")); - t->attach (_show_video_server_dialog_button, 0, 2, 5, 6); + t->attach (_show_video_server_dialog_button, 1, 4, 5, 6); _show_video_server_dialog_button.signal_toggled().connect (sigc::mem_fun (*this, &VideoTimelineOptions::show_video_server_dialog_toggled)); Gtkmm2ext::UI::instance()->set_tip (_show_video_server_dialog_button, _("When enabled the video server is never launched automatically without confirmation")); + s.str (std::string ()); + s << "" << _("Video Monitor") << ""; + l = manage (new Label (s.str())); + l->set_use_markup (true); + l->set_alignment (0, 0.5); + t->attach (*l, 0, 4, 6, 7, EXPAND | FILL, FILL | EXPAND, 0, 8); + + l = manage (new Label (string_compose (_("Custom Path to Video Monitor (%1) - leave empty for default:"), +#ifdef __APPLE__ + "Jadeo.app" +#elif defined PLATFORM_WINDOWS + "xjadeo.exe" +#else + "xjadeo" +#endif + ))); + l->set_alignment (0, 0.5); + t->attach (*l, 1, 4, 7, 8, FILL); + t->attach (_custom_xjadeo_path, 2, 3, 8, 9); + Gtkmm2ext::UI::instance()->set_tip (_custom_xjadeo_path, _("Set a custom path to the Video Monitor Executable, changing this requires a restart.")); + t->attach (_xjadeo_browse_button, 3, 4, 8, 9, FILL); + _video_server_url_entry.signal_changed().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_url_changed)); _video_server_url_entry.signal_activate().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_url_changed)); _video_server_docroot_entry.signal_changed().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_docroot_changed)); _video_server_docroot_entry.signal_activate().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_docroot_changed)); + _custom_xjadeo_path.signal_changed().connect (sigc::mem_fun (*this, &VideoTimelineOptions::custom_xjadeo_path_changed)); + _xjadeo_browse_button.signal_clicked ().connect (sigc::mem_fun (*this, &VideoTimelineOptions::xjadeo_browse_clicked)); + + // xjadeo-path is a UIConfig parameter + UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &VideoTimelineOptions::parameter_changed)); _box->pack_start (*t,true,true); } @@ -1592,6 +1650,30 @@ public: _rc_config->set_video_advanced_setup(x); } + void custom_xjadeo_path_changed () + { + UIConfiguration::instance().set_xjadeo_binary (_custom_xjadeo_path.get_text()); + } + + void xjadeo_browse_clicked () + { + Gtk::FileChooserDialog dialog(_("Set Video Monitor Executable"), Gtk::FILE_CHOOSER_ACTION_OPEN); + dialog.set_filename (UIConfiguration::instance().get_xjadeo_binary()); + dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); + dialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK); + if (dialog.run () == Gtk::RESPONSE_OK) { + const std::string& filename = dialog.get_filename(); + if (!filename.empty() && ( +#ifdef __APPLE__ + Glib::file_test (filename + "/Contents/MacOS/xjadeo", Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE) || +#endif + Glib::file_test (filename, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE) + )) { + UIConfiguration::instance().set_xjadeo_binary (filename); + } + } + } + void parameter_changed (string const & p) { if (p == "video-server-url") { @@ -1609,6 +1691,8 @@ public: _video_advanced_setup_button.set_active(x); _video_server_docroot_entry.set_sensitive(x); _video_server_url_entry.set_sensitive(x); + } else if (p == "xjadeo-binary") { + _custom_xjadeo_path.set_text (UIConfiguration::instance().get_xjadeo_binary()); } } @@ -1620,248 +1704,18 @@ public: parameter_changed ("show-video-export-info"); parameter_changed ("show-video-server-dialog"); parameter_changed ("video-advanced-setup"); + parameter_changed ("xjadeo-binary"); } private: RCConfiguration* _rc_config; Entry _video_server_url_entry; Entry _video_server_docroot_entry; + Entry _custom_xjadeo_path; CheckButton _show_video_export_info_button; CheckButton _show_video_server_dialog_button; CheckButton _video_advanced_setup_button; -}; - -class PluginOptions : public OptionEditorBox -{ -public: - PluginOptions (RCConfiguration* c) - : _rc_config (c) - , _display_plugin_scan_progress (_("Always Display Plugin Scan Progress")) - , _discover_vst_on_start (_("Scan for [new] VST Plugins on Application Start")) - , _discover_au_on_start (_("Scan for AudioUnit Plugins on Application Start")) - , _verbose_plugin_scan (_("Verbose Plugin Scan")) - , _timeout_adjustment (0, 0, 3000, 50, 50) - , _timeout_slider (_timeout_adjustment) - { - Label *l; - std::stringstream ss; - Table* t = manage (new Table (2, 6)); - t->set_spacings (4); - Button* b; - int n = 0; - - ss << "" << _("General") << ""; - l = manage (left_aligned_label (ss.str())); - l->set_use_markup (true); - t->attach (*manage (new Label ("")), 0, 3, n, n+1, FILL | EXPAND); ++n; - t->attach (*l, 0, 2, n, n+1, FILL | EXPAND); ++n; - - b = manage (new Button (_("Scan for Plugins"))); - b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::refresh_clicked)); - t->attach (*b, 0, 2, n, n+1, FILL); ++n; - - t->attach (_display_plugin_scan_progress, 0, 2, n, n+1); ++n; - _display_plugin_scan_progress.signal_toggled().connect (sigc::mem_fun (*this, &PluginOptions::display_plugin_scan_progress_toggled)); - Gtkmm2ext::UI::instance()->set_tip (_display_plugin_scan_progress, - _("When enabled a popup window showing plugin scan progress is displayed for indexing (cache load) and discovery (detect new plugins)")); - -#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT) - _timeout_slider.set_digits (0); - _timeout_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &PluginOptions::timeout_changed)); - - Gtkmm2ext::UI::instance()->set_tip(_timeout_slider, - _("Specify the default timeout for plugin instantiation in 1/10 seconds. Plugins that require more time to load will be blacklisted. A value of 0 disables the timeout.")); - - l = manage (left_aligned_label (_("Scan Time Out [deciseconds]")));; - HBox* h = manage (new HBox); - h->set_spacing (4); - h->pack_start (*l, false, false); - h->pack_start (_timeout_slider, true, true); - t->attach (*h, 0, 2, n, n+1); ++n; - - ss.str(""); - ss << "" << _("VST") << ""; - l = manage (left_aligned_label (ss.str())); - l->set_use_markup (true); - t->attach (*manage (new Label ("")), 0, 3, n, n+1, FILL | EXPAND); ++n; - t->attach (*l, 0, 2, n, n+1, FILL | EXPAND); ++n; - - b = manage (new Button (_("Clear VST Cache"))); - b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::clear_vst_cache_clicked)); - t->attach (*b, 0, 1, n, n+1, FILL); - - b = manage (new Button (_("Clear VST Blacklist"))); - b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::clear_vst_blacklist_clicked)); - t->attach (*b, 1, 2, n, n+1, FILL); - ++n; - - t->attach (_discover_vst_on_start, 0, 2, n, n+1); ++n; - _discover_vst_on_start.signal_toggled().connect (sigc::mem_fun (*this, &PluginOptions::discover_vst_on_start_toggled)); - Gtkmm2ext::UI::instance()->set_tip (_discover_vst_on_start, - _("When enabled new VST plugins are searched, tested and added to the cache index on application start. When disabled new plugins will only be available after triggering a 'Scan' manually")); - -#ifdef LXVST_SUPPORT - t->attach (*manage (right_aligned_label (_("Linux VST Path:"))), 0, 1, n, n+1); - b = manage (new Button (_("Edit"))); - b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::edit_lxvst_path_clicked)); - t->attach (*b, 1, 2, n, n+1, FILL); ++n; -#endif - -#ifdef WINDOWS_VST_SUPPORT - t->attach (*manage (right_aligned_label (_("Windows VST Path:"))), 0, 1, n, n+1); - b = manage (new Button (_("Edit"))); - b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::edit_vst_path_clicked)); - t->attach (*b, 1, 2, n, n+1, FILL); ++n; - - // currently verbose logging is only implemented for Windows VST. - t->attach (_verbose_plugin_scan, 0, 2, n, n+1); ++n; - _verbose_plugin_scan.signal_toggled().connect (sigc::mem_fun (*this, &PluginOptions::verbose_plugin_scan_toggled)); - Gtkmm2ext::UI::instance()->set_tip (_verbose_plugin_scan, - _("When enabled additional information for every plugin is added to the Log Window.")); -#endif -#endif // any VST - -#ifdef AUDIOUNIT_SUPPORT - ss.str(""); - ss << "" << _("Audio Unit") << ""; - l = manage (left_aligned_label (ss.str())); - l->set_use_markup (true); - t->attach (*manage (new Label ("")), 0, 3, n, n+1, FILL | EXPAND); ++n; - t->attach (*l, 0, 2, n, n+1, FILL | EXPAND); ++n; - - t->attach (_discover_au_on_start, 0, 2, n, n+1); ++n; - _discover_au_on_start.signal_toggled().connect (sigc::mem_fun (*this, &PluginOptions::discover_au_on_start_toggled)); - Gtkmm2ext::UI::instance()->set_tip (_discover_au_on_start, - _("When enabled Audio Unit Plugins are discovered on application start. When disabled AU plugins will only be available after triggering a 'Scan' manually. The first successful scan will enable AU auto-scan, Any crash during plugin discovery will disable it.")); - - ++n; - b = manage (new Button (_("Clear AU Cache"))); - b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::clear_au_cache_clicked)); - t->attach (*b, 0, 1, n, n+1, FILL); - - b = manage (new Button (_("Clear AU Blacklist"))); - b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::clear_au_blacklist_clicked)); - t->attach (*b, 1, 2, n, n+1, FILL); - ++n; -#endif - - _box->pack_start (*t,true,true); - } - - void parameter_changed (string const & p) { - if (p == "show-plugin-scan-window") { - bool const x = UIConfiguration::instance().get_show_plugin_scan_window(); - _display_plugin_scan_progress.set_active (x); - } - else if (p == "discover-vst-on-start") { - bool const x = _rc_config->get_discover_vst_on_start(); - _discover_vst_on_start.set_active (x); - } - else if (p == "vst-scan-timeout") { - int const x = _rc_config->get_vst_scan_timeout(); - _timeout_adjustment.set_value (x); - } - else if (p == "discover-audio-units") { - bool const x = _rc_config->get_discover_audio_units(); - _discover_au_on_start.set_active (x); - } - else if (p == "verbose-plugin-scan") { - bool const x = _rc_config->get_verbose_plugin_scan(); - _verbose_plugin_scan.set_active (x); - } - } - - void set_state_from_config () { - parameter_changed ("show-plugin-scan-window"); - parameter_changed ("discover-vst-on-start"); - parameter_changed ("vst-scan-timeout"); - parameter_changed ("discover-audio-units"); - parameter_changed ("verbose-plugin-scan"); - } - -private: - RCConfiguration* _rc_config; - CheckButton _display_plugin_scan_progress; - CheckButton _discover_vst_on_start; - CheckButton _discover_au_on_start; - CheckButton _verbose_plugin_scan; - Adjustment _timeout_adjustment; - HScale _timeout_slider; - - void display_plugin_scan_progress_toggled () { - bool const x = _display_plugin_scan_progress.get_active(); - UIConfiguration::instance().set_show_plugin_scan_window(x); - } - - void discover_vst_on_start_toggled () { - bool const x = _discover_vst_on_start.get_active(); - _rc_config->set_discover_vst_on_start(x); - } - - void discover_au_on_start_toggled () { - bool const x = _discover_au_on_start.get_active(); - _rc_config->set_discover_audio_units(x); - } - - void verbose_plugin_scan_toggled () { - bool const x = _verbose_plugin_scan.get_active(); - _rc_config->set_verbose_plugin_scan(x); - } - - void timeout_changed () { - int x = floor(_timeout_adjustment.get_value()); - _rc_config->set_vst_scan_timeout(x); - } - - void clear_vst_cache_clicked () { - PluginManager::instance().clear_vst_cache(); - } - - void clear_vst_blacklist_clicked () { - PluginManager::instance().clear_vst_blacklist(); - } - - void clear_au_cache_clicked () { - PluginManager::instance().clear_au_cache(); - } - - void clear_au_blacklist_clicked () { - PluginManager::instance().clear_au_blacklist(); - } - - - void edit_vst_path_clicked () { - Gtkmm2ext::PathsDialog *pd = new Gtkmm2ext::PathsDialog ( - _("Set Windows VST Search Path"), - _rc_config->get_plugin_path_vst(), - PluginManager::instance().get_default_windows_vst_path() - ); - ResponseType r = (ResponseType) pd->run (); - pd->hide(); - if (r == RESPONSE_ACCEPT) { - _rc_config->set_plugin_path_vst(pd->get_serialized_paths()); - } - delete pd; - } - - // todo consolidate with edit_vst_path_clicked.. - void edit_lxvst_path_clicked () { - Gtkmm2ext::PathsDialog *pd = new Gtkmm2ext::PathsDialog ( - _("Set Linux VST Search Path"), - _rc_config->get_plugin_path_lxvst(), - PluginManager::instance().get_default_lxvst_path() - ); - ResponseType r = (ResponseType) pd->run (); - pd->hide(); - if (r == RESPONSE_ACCEPT) { - _rc_config->set_plugin_path_lxvst(pd->get_serialized_paths()); - } - delete pd; - } - - void refresh_clicked () { - PluginManager::instance().refresh(); - } + Button _xjadeo_browse_button; }; @@ -1928,10 +1782,14 @@ private: RCOptionEditor::RCOptionEditor () - : OptionEditor (Config, string_compose (_("%1 Preferences"), PROGRAM_NAME)) + : OptionEditorContainer (Config, string_compose (_("%1 Preferences"), PROGRAM_NAME)) + , Tabbable (*this, _("Preferences")) /* pack self-as-vbox into tabbable */ , _rc_config (Config) , _mixer_strip_visibility ("mixer-element-visibility") { + + UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &RCOptionEditor::parameter_changed)); + /* MISC */ uint32_t hwcpus = hardware_concurrency (); @@ -2008,7 +1866,7 @@ RCOptionEditor::RCOptionEditor () add_option (_("Misc"), new OptionEditorHeading (_("Click"))); - add_option (_("Misc"), new ClickOptions (_rc_config, this)); + add_option (_("Misc"), new ClickOptions (_rc_config)); add_option (_("Misc"), new FaderOption ( @@ -2146,7 +2004,7 @@ RCOptionEditor::RCOptionEditor () psc->add (2.0, _("2.0 seconds")); add_option (_("Transport"), psc); - add_option (_("Transport"), new OptionEditorHeading (S_("Sync/Slave"))); + add_option (_("Transport/Sync"), new OptionEditorHeading (S_("Synchronization and Slave Options"))); _sync_source = new ComboOption ( "sync-source", @@ -2155,7 +2013,7 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_sync_source) ); - add_option (_("Transport"), _sync_source); + add_option (_("Transport/Sync"), _sync_source); _sync_framerate = new BoolOption ( "timecode-sync-frame-rate", @@ -2171,7 +2029,7 @@ RCOptionEditor::RCOptionEditor () "Instead the frame rate indication in the main clock will flash red and %1 will convert between the external " "timecode standard and the session standard."), PROGRAM_NAME)); - add_option (_("Transport"), _sync_framerate); + add_option (_("Transport/Sync"), _sync_framerate); _sync_genlock = new BoolOption ( "timecode-source-is-synced", @@ -2192,7 +2050,7 @@ RCOptionEditor::RCOptionEditor () ), PROGRAM_NAME)); - add_option (_("Transport"), _sync_genlock); + add_option (_("Transport/Sync"), _sync_genlock); _sync_source_2997 = new BoolOption ( "timecode-source-2997", @@ -2210,9 +2068,9 @@ RCOptionEditor::RCOptionEditor () "because the variant of using exactly 29.97 fps has zero timecode drift.\n" )); - add_option (_("Transport"), _sync_source_2997); + add_option (_("Transport/Sync"), _sync_source_2997); - add_option (_("Transport"), new OptionEditorHeading (S_("LTC Reader"))); + add_option (_("Transport/Sync"), new OptionEditorHeading (S_("LTC Reader"))); _ltc_port = new ComboStringOption ( "ltc-source-port", @@ -2227,13 +2085,14 @@ RCOptionEditor::RCOptionEditor () _ltc_port->set_popdown_strings (physical_inputs); populate_sync_options (); + AudioEngine::instance()->Running.connect (engine_started_connection, MISSING_INVALIDATOR, boost::bind (&RCOptionEditor::populate_sync_options, this), gui_context()); - add_option (_("Transport"), _ltc_port); + add_option (_("Transport/Sync"), _ltc_port); // TODO; rather disable this button than not compile it.. - add_option (_("Transport"), new OptionEditorHeading (S_("LTC Generator"))); + add_option (_("Transport/Sync"), new OptionEditorHeading (S_("LTC Generator"))); - add_option (_("Transport"), + add_option (_("Transport/Sync"), new BoolOption ( "send-ltc", _("Enable LTC generator"), @@ -2261,7 +2120,7 @@ RCOptionEditor::RCOptionEditor () (_ltc_volume_slider->tip_widget(), _("Specify the Peak Volume of the generated LTC signal in dbFS. A good value is 0dBu ^= -18dbFS in an EBU calibrated system")); - add_option (_("Transport"), _ltc_volume_slider); + add_option (_("Transport/Sync"), _ltc_volume_slider); /* EDITOR */ @@ -2315,6 +2174,14 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_zoom_tools), sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_zoom_tools) )); + + add_option (_("Editor"), + new BoolOption ( + "use-mouse-position-as-zoom-focus-on-scroll", + _("Always use mouse cursor position as zoom focus when zooming using mouse scroll wheel"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_use_mouse_position_as_zoom_focus_on_scroll), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_use_mouse_position_as_zoom_focus_on_scroll) + )); } // !mixbus add_option (_("Editor"), @@ -2411,7 +2278,7 @@ if (!Profile->get_mixbus()) { rsas->add(ExistingNewlyCreatedBoth, _("existing selection and newly-created regions")); add_option (_("Editor"), rsas); - + add_option (_("Editor"), new OptionEditorHeading (_("Waveforms"))); if (!Profile->get_mixbus()) { @@ -2493,8 +2360,8 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (*_rc_config, &RCConfiguration::set_tape_machine_mode) )); -if (!Profile->get_mixbus()) { add_option (_("Audio"), new OptionEditorHeading (_("Connection of tracks and busses"))); +if (!Profile->get_mixbus()) { add_option (_("Audio"), new BoolOption ( @@ -2528,6 +2395,18 @@ if (!Profile->get_mixbus()) { oac->add (ManualConnect, _("manually")); add_option (_("Audio"), oac); + + bo = new BoolOption ( + "strict-io", + _("Use 'Strict-I/O' for new tracks or Busses"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_strict_io), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_strict_io) + ); + + add_option (_("Audio"), bo); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), + _("With strict-i/o enabled, Effect Processors will not modify the number of channels on a track. The number of output channels will always match the number of input channels.")); + } // !mixbus add_option (_("Audio"), new OptionEditorHeading (_("Denormals"))); @@ -2617,7 +2496,7 @@ if (!Profile->get_mixbus()) { /* SOLO AND MUTE */ - add_option (_("Solo / mute"), new OptionEditorHeading (_("Solo"))); + add_option (_("Solo & mute"), new OptionEditorHeading (_("Solo"))); _solo_control_is_listen_control = new BoolOption ( "solo-control-is-listen-control", @@ -2626,9 +2505,9 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_control_is_listen_control) ); - add_option (_("Solo / mute"), _solo_control_is_listen_control); + add_option (_("Solo & mute"), _solo_control_is_listen_control); - add_option (_("Solo / mute"), + add_option (_("Solo & mute"), new BoolOption ( "exclusive-solo", _("Exclusive solo"), @@ -2636,7 +2515,7 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (*_rc_config, &RCConfiguration::set_exclusive_solo) )); - add_option (_("Solo / mute"), + add_option (_("Solo & mute"), new BoolOption ( "show-solo-mutes", _("Show solo muting"), @@ -2644,7 +2523,7 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_solo_mutes) )); - add_option (_("Solo / mute"), + add_option (_("Solo & mute"), new BoolOption ( "solo-mute-override", _("Soloing overrides muting"), @@ -2652,7 +2531,7 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_mute_override) )); - add_option (_("Solo / mute"), + add_option (_("Solo & mute"), new FaderOption ( "solo-mute-gain", _("Solo-in-place mute cut (dB)"), @@ -2670,7 +2549,7 @@ if (!Profile->get_mixbus()) { _listen_position->add (AfterFaderListen, _("after-fader (AFL)")); _listen_position->add (PreFaderListen, _("pre-fader (PFL)")); - add_option (_("Solo / mute"), _listen_position); + add_option (_("Solo & mute"), _listen_position); ComboOption* pp = new ComboOption ( "pfl-position", @@ -2682,7 +2561,7 @@ if (!Profile->get_mixbus()) { pp->add (PFLFromBeforeProcessors, _("before pre-fader processors")); pp->add (PFLFromAfterProcessors, _("pre-fader but after pre-fader processors")); - add_option (_("Solo / mute"), pp); + add_option (_("Solo & mute"), pp); ComboOption* pa = new ComboOption ( "afl-position", @@ -2694,11 +2573,11 @@ if (!Profile->get_mixbus()) { pa->add (AFLFromBeforeProcessors, _("immediately post-fader")); pa->add (AFLFromAfterProcessors, _("after post-fader processors (before pan)")); - add_option (_("Solo / mute"), pa); + add_option (_("Solo & mute"), pa); - add_option (_("Solo / mute"), new OptionEditorHeading (_("Default track / bus muting options"))); + add_option (_("Solo & mute"), new OptionEditorHeading (_("Default track / bus muting options"))); - add_option (_("Solo / mute"), + add_option (_("Solo & mute"), new BoolOption ( "mute-affects-pre-fader", _("Mute affects pre-fader sends"), @@ -2706,7 +2585,7 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_pre_fader) )); - add_option (_("Solo / mute"), + add_option (_("Solo & mute"), new BoolOption ( "mute-affects-post-fader", _("Mute affects post-fader sends"), @@ -2714,7 +2593,7 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_post_fader) )); - add_option (_("Solo / mute"), + add_option (_("Solo & mute"), new BoolOption ( "mute-affects-control-outs", _("Mute affects control outputs"), @@ -2722,7 +2601,7 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_control_outs) )); - add_option (_("Solo / mute"), + add_option (_("Solo & mute"), new BoolOption ( "mute-affects-main-outs", _("Mute affects main outputs"), @@ -2730,9 +2609,9 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_main_outs) )); - add_option (_("Solo / mute"), new OptionEditorHeading (_("Send Routing"))); + add_option (_("Solo & mute"), new OptionEditorHeading (_("Send Routing"))); - add_option (_("Solo / mute"), + add_option (_("Solo & mute"), new BoolOption ( "link-send-and-route-panner", _("Link panners of Aux and External Sends with main panner by default"), @@ -2909,7 +2788,7 @@ if (!Profile->get_mixbus()) { /* Control Surfaces */ - add_option (_("Control Surfaces"), new ControlSurfacesOptions (*this)); + add_option (_("Control Surfaces"), new ControlSurfacesOptions); ComboOption* rm = new ComboOption ( "remote-model", @@ -2927,8 +2806,141 @@ if (!Profile->get_mixbus()) { add_option (_("Video"), new VideoTimelineOptions (_rc_config)); #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined AUDIOUNIT_SUPPORT) - /* Plugin options (currrently VST only) */ - add_option (_("Plugins"), new PluginOptions (_rc_config)); + add_option (_("Plugins"), new OptionEditorHeading (_("General"))); + + add_option (_("Plugins"), + new RcActionButton (_("Scan for Plugins"), + sigc::mem_fun (*this, &RCOptionEditor::plugin_scan_refresh))); + + bo = new BoolOption ( + "show-plugin-scan-window", + _("Always Display Plugin Scan Progress"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_plugin_scan_window), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_plugin_scan_window) + ); + add_option (_("Plugins"), bo); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), + _("When enabled a popup window showing plugin scan progress is displayed for indexing (cache load) and discovery (detect new plugins)")); + +#endif + +#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT) + add_option (_("Plugins"), new OptionEditorHeading (_("VST"))); + + bo = new BoolOption ( + "discover-vst-on-start", + _("Scan for [new] VST Plugins on Application Start"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_discover_vst_on_start), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_discover_vst_on_start) + ); + add_option (_("Plugins"), bo); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), + _("When enabled new VST plugins are searched, tested and added to the cache index on application start. When disabled new plugins will only be available after triggering a 'Scan' manually")); + +#ifdef WINDOWS_VST_SUPPORT + // currently verbose logging is only implemented for Windows VST. + bo = new BoolOption ( + "verbose-plugin-scan", + _("Verbose Plugin Scan"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_verbose_plugin_scan), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_verbose_plugin_scan) + ); + add_option (_("Plugins"), bo); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), + _("When enabled additional information for every plugin is added to the Log Window.")); +#endif + + add_option (_("Plugins"), new VstTimeOutSliderOption (_rc_config)); + + add_option (_("Plugins"), + new RcActionButton (_("Clear"), + sigc::mem_fun (*this, &RCOptionEditor::clear_vst_cache), + _("VST Cache:"))); + + add_option (_("Plugins"), + new RcActionButton (_("Clear"), + sigc::mem_fun (*this, &RCOptionEditor::clear_vst_blacklist), + _("VST Blacklist:"))); +#endif + +#ifdef LXVST_SUPPORT + add_option (_("Plugins"), + new RcActionButton (_("Edit"), + sigc::mem_fun (*this, &RCOptionEditor::edit_lxvst_path), + _("Linux VST Path:"))); + + add_option (_("Plugins"), + new RcConfigDisplay ( + "plugin-path-lxvst", + _("Path:"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_plugin_path_lxvst), + ':')); +#endif + +#ifdef WINDOWS_VST_SUPPORT + add_option (_("Plugins"), + new RcActionButton (_("Edit"), + sigc::mem_fun (*this, &RCOptionEditor::edit_vst_path), + _("Windows VST Path:"))); + add_option (_("Plugins"), + new RcConfigDisplay ( + "plugin-path-vst", + _("Path:"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_plugin_path_vst), + ';')); +#endif + +#ifdef AUDIOUNIT_SUPPORT + add_option (_("Plugins"), new OptionEditorHeading (_("Audio Unit"))); + + bo = new BoolOption ( + "discover-audio-units", + _("Scan for AudioUnit Plugins on Application Start"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_discover_audio_units), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_discover_audio_units) + ); + add_option (_("Plugins"), bo); + Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(), + _("When enabled Audio Unit Plugins are discovered on application start. When disabled AU plugins will only be available after triggering a 'Scan' manually. The first successful scan will enable AU auto-scan, Any crash during plugin discovery will disable it.")); + + add_option (_("Plugins"), + new RcActionButton (_("Clear"), + sigc::mem_fun (*this, &RCOptionEditor::clear_au_cache), + _("AU Cache:"))); + + add_option (_("Plugins"), + new RcActionButton (_("Clear"), + sigc::mem_fun (*this, &RCOptionEditor::clear_au_blacklist), + _("AU Blacklist:"))); +#endif + +#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined AUDIOUNIT_SUPPORT || defined HAVE_LV2) + add_option (_("Plugins"), new OptionEditorHeading (_("Plugin GUI"))); + add_option (_("Plugins"), + new BoolOption ( + "open-gui-after-adding-plugin", + _("Automatically open the plugin GUI when adding a new plugin"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_open_gui_after_adding_plugin), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_open_gui_after_adding_plugin) + )); + +#ifdef LV2_SUPPORT + add_option (_("Plugins"), + new BoolOption ( + "show-inline-display-by-default", + _("Show Plugin Inline Display on Mixerstrip by default"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_inline_display_by_default), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_inline_display_by_default) + )); + + _plugin_prefer_inline = new BoolOption ( + "prefer-inline-over-gui", + _("Don't automatically open the plugin GUI when the plugin has an inline display mode"), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_prefer_inline_over_gui), + sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_prefer_inline_over_gui) + ); + add_option (_("Plugins"), _plugin_prefer_inline); +#endif #endif /* INTERFACE */ @@ -2984,7 +2996,7 @@ if (!Profile->get_mixbus()) { sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_name_highlight) )); - add_option (S_("GUI"), + add_option (S_("Preferences|GUI"), new BoolOption ( "super-rapid-clock-update", _("Update transport clock display at FPS instead of every 100ms"), @@ -2993,7 +3005,7 @@ if (!Profile->get_mixbus()) { )); -#ifndef GTKOSX +#ifndef __APPLE__ /* font scaling does nothing with GDK/Quartz */ add_option (S_("Preferences|GUI"), new FontScalingOptions ()); #endif @@ -3253,6 +3265,10 @@ RCOptionEditor::parameter_changed (string const & p) bool const s = Config->get_send_ltc (); _ltc_send_continuously->set_sensitive (s); _ltc_volume_slider->set_sensitive (s); + } else if (p == "open-gui-after-adding-plugin" || p == "show-inline-display-by-default") { +#ifdef LV2_SUPPORT + _plugin_prefer_inline->set_sensitive (UIConfiguration::instance().get_open_gui_after_adding_plugin() && UIConfiguration::instance().get_show_inline_display_by_default()); +#endif } } @@ -3260,6 +3276,56 @@ void RCOptionEditor::ltc_generator_volume_changed () { _rc_config->set_ltc_output_volume (pow(10, _ltc_volume_adjustment->get_value() / 20)); } +void RCOptionEditor::plugin_scan_refresh () { + PluginManager::instance().refresh(); +} + +void RCOptionEditor::clear_vst_cache () { + PluginManager::instance().clear_vst_cache(); +} + +void RCOptionEditor::clear_vst_blacklist () { + PluginManager::instance().clear_vst_blacklist(); +} + +void RCOptionEditor::clear_au_cache () { + PluginManager::instance().clear_au_cache(); +} + +void RCOptionEditor::clear_au_blacklist () { + PluginManager::instance().clear_au_blacklist(); +} + +void RCOptionEditor::edit_lxvst_path () { + Glib::RefPtr win = get_parent_window (); + Gtkmm2ext::PathsDialog *pd = new Gtkmm2ext::PathsDialog ( + *current_toplevel(), _("Set Linux VST Search Path"), + _rc_config->get_plugin_path_lxvst(), + PluginManager::instance().get_default_lxvst_path() + ); + ResponseType r = (ResponseType) pd->run (); + pd->hide(); + if (r == RESPONSE_ACCEPT) { + _rc_config->set_plugin_path_lxvst(pd->get_serialized_paths()); + } + delete pd; +} + +void RCOptionEditor::edit_vst_path () { + Gtkmm2ext::PathsDialog *pd = new Gtkmm2ext::PathsDialog ( + *current_toplevel(), _("Set Windows VST Search Path"), + _rc_config->get_plugin_path_vst(), + PluginManager::instance().get_default_windows_vst_path() + ); + ResponseType r = (ResponseType) pd->run (); + pd->hide(); + if (r == RESPONSE_ACCEPT) { + _rc_config->set_plugin_path_vst(pd->get_serialized_paths()); + } + delete pd; +} + + void RCOptionEditor::populate_sync_options () { @@ -3278,4 +3344,21 @@ RCOptionEditor::populate_sync_options () _rc_config->set_sync_source(sync_opts.front()); } } + + parameter_changed ("sync-source"); +} + +Gtk::Window* +RCOptionEditor::use_own_window (bool and_fill_it) +{ + bool new_window = !own_window(); + + Gtk::Window* win = Tabbable::use_own_window (and_fill_it); + + if (win && new_window) { + win->set_name ("PreferencesWindow"); + ARDOUR_UI::instance()->setup_toplevel_window (*win, _("Preferences"), this); + } + + return win; }