From 45689d6eab8d2a6bcdbe8b45d7de2d4ef806de0c Mon Sep 17 00:00:00 2001 From: David Robillard Date: Thu, 14 Aug 2008 21:36:53 +0000 Subject: Support for toggle ports in control window (shown as a checkbox). Rename "ControlGroups" "Controls" (each is only for one port...). git-svn-id: http://svn.drobilla.net/lad/ingen@1379 a436a847-0d15-0410-975c-d299462d15a1 --- src/libs/gui/ControlGroups.cpp | 448 -------------- src/libs/gui/ControlGroups.hpp | 162 ------ src/libs/gui/ControlPanel.cpp | 71 +-- src/libs/gui/ControlPanel.hpp | 30 +- src/libs/gui/Controls.cpp | 467 +++++++++++++++ src/libs/gui/Controls.hpp | 164 ++++++ src/libs/gui/Makefile.am | 4 +- src/libs/gui/NodeControlWindow.cpp | 2 +- src/libs/gui/PortPropertiesWindow.cpp | 2 +- src/libs/gui/ingen_gui.glade | 1025 ++++++++++++++++++--------------- 10 files changed, 1226 insertions(+), 1149 deletions(-) delete mode 100644 src/libs/gui/ControlGroups.cpp delete mode 100644 src/libs/gui/ControlGroups.hpp create mode 100644 src/libs/gui/Controls.cpp create mode 100644 src/libs/gui/Controls.hpp (limited to 'src/libs') diff --git a/src/libs/gui/ControlGroups.cpp b/src/libs/gui/ControlGroups.cpp deleted file mode 100644 index 0803b5ba..00000000 --- a/src/libs/gui/ControlGroups.cpp +++ /dev/null @@ -1,448 +0,0 @@ -/* This file is part of Ingen. - * Copyright (C) 2007 Dave Robillard - * - * Ingen is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * Ingen is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include CONFIG_H_PATH - -#include -#include -#include -#include "interface/EngineInterface.hpp" -#include "client/PluginModel.hpp" -#include "client/NodeModel.hpp" -#include "client/PortModel.hpp" -#include "ControlGroups.hpp" -#include "ControlPanel.hpp" -#include "PortPropertiesWindow.hpp" -#include "GladeFactory.hpp" -#include "App.hpp" - -using namespace std; -using namespace Ingen::Client; - -namespace Ingen { -namespace GUI { - - -// ////////////////////// ControlGroup ///////////////////////////////// // - -ControlGroup::ControlGroup(BaseObjectType* cobject, const Glib::RefPtr& glade_xml) - : Gtk::VBox(cobject) - , _control_panel(NULL) - , _enable_signal(false) -{ -} - - -ControlGroup::~ControlGroup() -{ - _enable_signal = false; - _control_connection.disconnect(); - _port_model.reset(); -} - - -void -ControlGroup::init(ControlPanel* panel, SharedPtr pm) -{ - _control_panel = panel; - _port_model = pm, - - assert(_port_model); - assert(panel); - - _control_connection = pm->signal_value_changed.connect(sigc::mem_fun(this, &ControlGroup::set_value)); -} - - -// ////////////////// SliderControlGroup ////////////////////// // - - -SliderControlGroup::SliderControlGroup(BaseObjectType* cobject, const Glib::RefPtr& xml) - : ControlGroup(cobject, xml) - , _enabled(true) -{ - xml->get_widget("control_strip_name_label", _name_label); - xml->get_widget("control_strip_slider", _slider); - xml->get_widget("control_strip_spinner", _value_spinner); - - Glib::RefPtr menu_xml = GladeFactory::new_glade_reference("port_control_menu"); - menu_xml->get_widget("port_control_menu", _menu); - menu_xml->get_widget("port_control_menu_properties", _menu_properties); - - _menu_properties->signal_activate().connect( - sigc::mem_fun(this, &SliderControlGroup::menu_properties)); -} - - -void -SliderControlGroup::init(ControlPanel* panel, SharedPtr pm) -{ - _enable_signal = false; - _enabled = true; - - ControlGroup::init(panel, pm); - - assert(_name_label); - assert(_slider); - - set_name(pm->path().name()); - - _slider->set_draw_value(false); - - signal_button_press_event().connect(sigc::mem_fun(*this, &SliderControlGroup::clicked)); - _slider->signal_button_press_event().connect(sigc::mem_fun(*this, &SliderControlGroup::clicked)); - - _slider->signal_event().connect( - sigc::mem_fun(*this, &SliderControlGroup::slider_pressed)); - - _slider->signal_value_changed().connect( - sigc::mem_fun(*this, &SliderControlGroup::update_value_from_slider)); - - _value_spinner->signal_value_changed().connect( - sigc::mem_fun(*this, &SliderControlGroup::update_value_from_spinner)); - - float min = 0.0f, max = 1.0f; - - boost::shared_ptr parent = PtrCast(_port_model->parent()); - if (parent) - parent->port_value_range(_port_model, min, max); - - if (pm->is_integer() || pm->is_toggle()) { - _slider->set_increments(1, 10); - _value_spinner->set_digits(0); - } else { - _slider->set_increments(0, 0); - } - - pm->signal_variable.connect(sigc::mem_fun(this, &SliderControlGroup::port_variable_change)); - - _slider->set_range(std::min(min, pm->value().get_float()), std::max(max, pm->value().get_float())); - //_value_spinner->set_range(min, max); - - set_value(pm->value()); - - _enable_signal = true; - - show_all(); -} - - -bool -SliderControlGroup::clicked(GdkEventButton* ev) -{ - if (ev->button == 3) { - _menu->popup(ev->button, ev->time); - return true; - } else { - return false; - } -} - - -void -SliderControlGroup::menu_properties() -{ - Glib::RefPtr xml = GladeFactory::new_glade_reference(); - - PortPropertiesWindow* window; - xml->get_widget_derived("port_properties_win", window); - window->present(_port_model); -} - - -void -SliderControlGroup::set_value(const Atom& atom) -{ - float val = atom.get_float(); - - if (_port_model->is_integer()) - val = lrintf(val); - - _enable_signal = false; - if (_enabled) { - if (_slider->get_value() != val) { - const Gtk::Adjustment* range = _slider->get_adjustment(); - const float lower = range->get_lower(); - const float upper = range->get_upper(); - if (val < lower || val > upper) - set_range(min(lower, val), max(lower, val)); - _slider->set_value(val); - } - if (_value_spinner->get_value() != val) - _value_spinner->set_value(val); - } - _enable_signal = true; -} - - -void -SliderControlGroup::port_variable_change(const string& key, const Atom& value) -{ - if ( (key == "ingen:minimum") && value.type() == Atom::FLOAT) - set_range(value.get_float(), _slider->get_adjustment()->get_upper()); - else if ( (key == "ingen:maximum") && value.type() == Atom::FLOAT) - set_range(_slider->get_adjustment()->get_lower(), value.get_float()); -} - - -void -SliderControlGroup::set_range(float min, float max) -{ - _slider->set_range(min, max); - //_value_spinner->set_range(min, max); -} - - -void -SliderControlGroup::set_name(const string& name) -{ - string name_label = ""; - name_label += name + ""; - _name_label->set_markup(name_label); -} - - -void -SliderControlGroup::enable() -{ - _slider->property_sensitive() = true; - //_min_spinner->property_sensitive() = true; - //_max_spinner->property_sensitive() = true; - _value_spinner->property_sensitive() = true; - _name_label->property_sensitive() = true; -} - - -void -SliderControlGroup::disable() -{ - _slider->property_sensitive() = false; - //_min_spinner->property_sensitive() = false; - //_max_spinner->property_sensitive() = false; - _value_spinner->property_sensitive() = false; - _name_label->property_sensitive() = false; -} - - -void -SliderControlGroup::update_value_from_slider() -{ - if (_enable_signal) { - float value = _slider->get_value(); - bool change = true; - - _enable_signal = false; - - if (_port_model->is_integer()) { - value = lrintf(value); - if (value == lrintf(_port_model->value().get_float())) - change = false; - } - - if (change) { - _value_spinner->set_value(value); - _control_panel->value_changed(_port_model, value); - } - - _enable_signal = true; - } -} - - -void -SliderControlGroup::update_value_from_spinner() -{ - if (_enable_signal) { - _enable_signal = false; - const float value = _value_spinner->get_value(); - - set_value(value); - - _control_panel->value_changed(_port_model, value); - - //m_port_model->value(value); - _enable_signal = true; - } -} - - -/** Callback for when slider is grabbed so we can ignore set_control - * events for this port (and avoid nasty feedback issues). - */ -bool -SliderControlGroup::slider_pressed(GdkEvent* ev) -{ - //cerr << "Pressed: " << ev->type << endl; - if (ev->type == GDK_BUTTON_PRESS) { - _enabled = false; - //GtkClientInterface::instance()->set_ignore_port(_port_model->path()); - } else if (ev->type == GDK_BUTTON_RELEASE) { - _enabled = true; - //GtkClientInterface::instance()->clear_ignore_port(); - } - - return false; -} - - -// ///////////// IntegerControlGroup ////////////// // - -#if 0 -IntegerControlGroup::IntegerControlGroup(ControlPanel* panel, SharedPtr pm) -: ControlGroup(panel, pm), - _enable_signal(false), - _alignment(0.5, 0.5, 0.0, 0.0), - _name_label(pm->path().name()), - _spinner(1.0, 0) -{ - set_name(pm->path().name()); - - _spinner.set_range(-99999, 99999); - _spinner.set_value(_port_model->value()); - _spinner.signal_value_changed().connect( - sigc::mem_fun(*this, &IntegerControlGroup::update_value)); - _spinner.set_increments(1, 10); - - _alignment.add(_spinner); - pack_start(_name_label); - pack_start(_alignment); - - _enable_signal = true; - - show_all(); -} - - -void -IntegerControlGroup::set_name(const string& name) -{ - string name_label = ""; - name_label += name + ""; - _name_label->set_markup(name_label); -} - - -void -IntegerControlGroup::set_value(float val) -{ - //cerr << "[IntegerControlGroup] Setting value to " << val << endl; - _enable_signal = false; - _spinner.set_value(val); - _enable_signal = true; -} - - -void -IntegerControlGroup::enable() -{ - _spinner.property_sensitive() = true; - _name_label->property_sensitive() = true; -} - - -void -IntegerControlGroup::disable() -{ - _spinner.property_sensitive() = false; - _name_label->property_sensitive() = false; -} - - -void -IntegerControlGroup::update_value() -{ - if (_enable_signal) { - float value = _spinner.get_value(); - _control_panel->value_changed(_port_model, value); - //m_port_model->value(value); - } -} - - -// ///////////// ToggleControlGroup ////////////// // - - -ToggleControlGroup::ToggleControlGroup(ControlPanel* panel, SharedPtr pm) -: ControlGroup(panel, pm), - _enable_signal(false), - _alignment(0.5, 0.5, 0.0, 0.0), - _name_label(pm->path().name()) -{ - set_name(pm->path().name()); - - set_value(_port_model->value()); - _checkbutton.signal_toggled().connect( - sigc::mem_fun(*this, &ToggleControlGroup::update_value)); - - _alignment.add(_checkbutton); - pack_start(_name_label); - pack_start(_alignment); - - _enable_signal = true; - - show_all(); -} - - -void -ToggleControlGroup::set_name(const string& name) -{ - string name_label = ""; - name_label += name + ""; - _name_label->set_markup(name_label); -} - - -void -ToggleControlGroup::set_value(float val) -{ - //cerr << "[ToggleControlGroup] Setting value to " << val << endl; - _enable_signal = false; - _checkbutton.set_active( (val > 0.0f) ); - _enable_signal = true; -} - - -void -ToggleControlGroup::enable() -{ - _checkbutton.property_sensitive() = true; - _name_label->property_sensitive() = true; -} - - -void -ToggleControlGroup::disable() -{ - _checkbutton.property_sensitive() = false; - _name_label->property_sensitive() = false; -} - - -void -ToggleControlGroup::update_value() -{ - if (_enable_signal) { - float value = _checkbutton.get_active() ? 1.0f : 0.0f; - _control_panel->value_changed(_port_model, value); - //m_port_model->value(value); - } -} -#endif - -} // namespace GUI -} // namespace Ingen diff --git a/src/libs/gui/ControlGroups.hpp b/src/libs/gui/ControlGroups.hpp deleted file mode 100644 index da604f72..00000000 --- a/src/libs/gui/ControlGroups.hpp +++ /dev/null @@ -1,162 +0,0 @@ -/* This file is part of Ingen. - * Copyright (C) 2007 Dave Robillard - * - * Ingen is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * Ingen is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef CONTROLGROUPS_H -#define CONTROLGROUPS_H - -#include -#include -#include -#include -#include "client/PortModel.hpp" -#include - -namespace Ingen { namespace Client { class PortModel; } } -using namespace Ingen::Client; - -namespace Ingen { -namespace GUI { - -class ControlPanel; - - -/** A group of controls (for a single Port) in a NodeControlWindow. - * - * \ingroup GUI - */ -class ControlGroup : public Gtk::VBox -{ -public: - ControlGroup(BaseObjectType* cobject, const Glib::RefPtr& glade_xml); - virtual ~ControlGroup(); - - void init(ControlPanel* panel, SharedPtr pm); - - inline const SharedPtr port_model() const { return _port_model; } - -protected: - virtual void set_value(const Atom& value) = 0; - virtual void set_range(float min, float max) {} - - ControlPanel* _control_panel; - SharedPtr _port_model; - sigc::connection _control_connection; - bool _enable_signal; -}; - - -/** A slider for a continuous control. - * - * \ingroup GUI - */ -class SliderControlGroup : public ControlGroup -{ -public: - SliderControlGroup(BaseObjectType* cobject, const Glib::RefPtr& glade_xml); - void init(ControlPanel* panel, SharedPtr pm); - - void enable(); - void disable(); - - void set_min(float val); - void set_max(float val); - -private: - void set_name(const string& name); - - bool clicked(GdkEventButton* ev); - - void set_value(const Atom& value); - void set_range(float min, float max); - - void port_variable_change(const string& key, const Raul::Atom& value); - - void update_range(); - void update_value_from_slider(); - void update_value_from_spinner(); - - void menu_properties(); - - bool slider_pressed(GdkEvent* ev); - - bool _enabled; - - Gtk::Label* _name_label; - Gtk::SpinButton* _value_spinner; - Gtk::HScale* _slider; - - Gtk::Menu* _menu; - Gtk::MenuItem* _menu_properties; -}; - - -#if 0 - -/** A spinbutton for integer controls. - * - * \ingroup GUI - */ -class IntegerControlGroup : public ControlGroup -{ -public: - IntegerControlGroup(ControlPanel* panel, SharedPtr pm); - - void enable(); - void disable(); - -private: - void set_name(const string& name); - void set_value(float val); - - void update_value(); - - bool _enable_signal; - Gtk::Alignment _alignment; - Gtk::Label _name_label; - Gtk::SpinButton _spinner; -}; - - -/** A radio button for toggle controls. - * - * \ingroup GUI - */ -class ToggleControlGroup : public ControlGroup -{ -public: - ToggleControlGroup(ControlPanel* panel, SharedPtr pm); - - void enable(); - void disable(); - -private: - void set_name(const string& name); - void set_value(float val); - - void update_value(); - - bool _enable_signal; - Gtk::Alignment _alignment; - Gtk::Label _name_label; - Gtk::CheckButton _checkbutton; -}; -#endif - -} // namespace GUI -} // namespace Ingen - -#endif // CONTROLGROUPS_H diff --git a/src/libs/gui/ControlPanel.cpp b/src/libs/gui/ControlPanel.cpp index 3bd7cb2d..9be36b65 100644 --- a/src/libs/gui/ControlPanel.cpp +++ b/src/libs/gui/ControlPanel.cpp @@ -22,7 +22,7 @@ #include "client/PluginModel.hpp" #include "App.hpp" #include "ControlPanel.hpp" -#include "ControlGroups.hpp" +#include "Controls.hpp" #include "GladeFactory.hpp" namespace Ingen { @@ -30,8 +30,8 @@ namespace GUI { ControlPanel::ControlPanel(BaseObjectType* cobject, const Glib::RefPtr& xml) -: Gtk::HBox(cobject), - _callback_enabled(true) + : Gtk::HBox(cobject) + , _callback_enabled(true) { xml->get_widget("control_panel_controls_box", _control_box); xml->get_widget("control_panel_voice_controls_box", _voice_control_box); @@ -51,7 +51,7 @@ ControlPanel::ControlPanel(BaseObjectType* cobject, const Glib::RefPtr::iterator i = _controls.begin(); i != _controls.end(); ++i) + for (vector::iterator i = _controls.begin(); i != _controls.end(); ++i) delete (*i); } @@ -62,15 +62,10 @@ ControlPanel::init(SharedPtr node, uint32_t poly) assert(node != NULL); assert(poly > 0); - cout << "CONTROL PANEL " << poly << endl; - if (node->polyphonic()) { - cout << "POLY" << endl; _voice_spinbutton->set_range(0, poly - 1); _voice_control_box->show(); } else { - cout << "NO POLY" << endl; - //remove(*_voice_control_box); _voice_control_box->hide(); } @@ -92,10 +87,10 @@ ControlPanel::init(SharedPtr node, uint32_t poly) } -ControlGroup* +Control* ControlPanel::find_port(const Path& path) const { - for (vector::const_iterator cg = _controls.begin(); cg != _controls.end(); ++cg) + for (vector::const_iterator cg = _controls.begin(); cg != _controls.end(); ++cg) if ((*cg)->port_model()->path() == path) return (*cg); @@ -116,40 +111,30 @@ ControlPanel::add_port(SharedPtr pm) // Add port if (pm->type().is_control() && pm->is_input()) { - SliderControlGroup* cg = NULL; -#if 0 - if (pm->is_integer()) - cerr << "FIXME: integer\n"; - //cg = new IntegerControlGroup(this, pm); - else if (pm->is_toggle()) - cerr << "FIXME: toggle\n"; - //cg = new ToggleControlGroup(this, pm); - else { -#endif + Control* control = NULL; + + if (pm->is_toggle()) { + ToggleControl* tc; + Glib::RefPtr xml = GladeFactory::new_glade_reference("toggle_control"); + xml->get_widget_derived("toggle_control", tc); + control = tc; + } else { + SliderControl* sc; Glib::RefPtr xml = GladeFactory::new_glade_reference("control_strip"); - xml->get_widget_derived("control_strip", cg); - cg->init(this, pm); -#if 0 + xml->get_widget_derived("control_strip", sc); + control = sc; } -#endif + + control->init(this, pm); if (_controls.size() > 0) _control_box->pack_start(*Gtk::manage(new Gtk::HSeparator()), false, false, 4); - _controls.push_back(cg); - _control_box->pack_start(*cg, false, false, 0); - - cg->enable(); - /*if (pm->connected()) - cg->disable(); - else - cg->enable();*/ - - cg->show(); + _controls.push_back(control); + _control_box->pack_start(*control, false, false, 0); - cerr << "FIXME: control panel connected port tracking\n"; - // pm->connection_sig.connect(bind(sigc::mem_fun(this, &ControlPanel::connection), pm)) - // pm->disconnection_sig.connect(bind(sigc::mem_fun(this, &ControlPanel::disconnection), pm)) + control->enable(); + control->show(); } Gtk::Requisition controls_size; @@ -173,7 +158,7 @@ void ControlPanel::remove_port(const Path& path) { bool was_first = false; - for (vector::iterator cg = _controls.begin(); cg != _controls.end(); ++cg) { + for (vector::iterator cg = _controls.begin(); cg != _controls.end(); ++cg) { if ((*cg)->port_model()->path() == path) { _control_box->remove(**cg); if (cg == _controls.begin()) @@ -191,7 +176,7 @@ ControlPanel::remove_port(const Path& path) void ControlPanel::rename_port(const Path& old_path, const Path& new_path) { - for (vector::iterator cg = _controls.begin(); cg != _controls.end(); ++cg) { + for (vector::iterator cg = _controls.begin(); cg != _controls.end(); ++cg) { if ((*cg)->port_model()->path() == old_path) { (*cg)->set_name(new_path.name()); return; @@ -208,7 +193,7 @@ ControlPanel::rename_port(const Path& old_path, const Path& new_path) void ControlPanel::enable_port(const Path& path) { - for (vector::iterator i = _controls.begin(); i != _controls.end(); ++i) { + for (vector::iterator i = _controls.begin(); i != _controls.end(); ++i) { if ((*i)->port_model()->path() == path) { (*i)->enable(); return; @@ -224,7 +209,7 @@ ControlPanel::enable_port(const Path& path) void ControlPanel::disable_port(const Path& path) { - for (vector::iterator i = _controls.begin(); i != _controls.end(); ++i) { + for (vector::iterator i = _controls.begin(); i != _controls.end(); ++i) { if ((*i)->port_model()->path() == path) { (*i)->disable(); return; @@ -233,7 +218,7 @@ ControlPanel::disable_port(const Path& path) } #endif -/** Callback for ControlGroups to notify this of a change. +/** Callback for Controls to notify this of a change. */ void ControlPanel::value_changed(SharedPtr port, float val) diff --git a/src/libs/gui/ControlPanel.hpp b/src/libs/gui/ControlPanel.hpp index b7a1c4b2..9dded79b 100644 --- a/src/libs/gui/ControlPanel.hpp +++ b/src/libs/gui/ControlPanel.hpp @@ -27,11 +27,7 @@ #include #include #include -#include "ControlGroups.hpp" - - -using std::vector; using std::string; using std::pair; -using std::cerr; using std::cout; using std::endl; +#include "Controls.hpp" namespace Ingen { namespace Client { class PortModel; @@ -56,7 +52,7 @@ public: void init(SharedPtr node, uint32_t poly); - ControlGroup* find_port(const Path& path) const; + Control* find_port(const Path& path) const; void add_port(SharedPtr port); void remove_port(const Path& path); @@ -64,10 +60,10 @@ public: void enable_port(const Path& path); void disable_port(const Path& path); - size_t num_controls() const { return _controls.size(); } - pair ideal_size() const { return _ideal_size; } + size_t num_controls() const { return _controls.size(); } + std::pair ideal_size() const { return _ideal_size; } - // Callback for ControlGroup + // Callback for Control void value_changed(SharedPtr port_path, float val); private: @@ -78,14 +74,14 @@ private: bool _callback_enabled; - pair _ideal_size; - - vector _controls; - Gtk::VBox* _control_box; - Gtk::Box* _voice_control_box; - Gtk::RadioButton* _all_voices_radio; - Gtk::RadioButton* _specific_voice_radio; - Gtk::SpinButton* _voice_spinbutton; + std::pair _ideal_size; + + std::vector _controls; + Gtk::VBox* _control_box; + Gtk::Box* _voice_control_box; + Gtk::RadioButton* _all_voices_radio; + Gtk::RadioButton* _specific_voice_radio; + Gtk::SpinButton* _voice_spinbutton; }; diff --git a/src/libs/gui/Controls.cpp b/src/libs/gui/Controls.cpp new file mode 100644 index 00000000..cc5383a8 --- /dev/null +++ b/src/libs/gui/Controls.cpp @@ -0,0 +1,467 @@ +/* This file is part of Ingen. + * Copyright (C) 2007 Dave Robillard + * + * Ingen is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * Ingen is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include CONFIG_H_PATH + +#include +#include +#include +#include "interface/EngineInterface.hpp" +#include "client/PluginModel.hpp" +#include "client/NodeModel.hpp" +#include "client/PortModel.hpp" +#include "Controls.hpp" +#include "ControlPanel.hpp" +#include "PortPropertiesWindow.hpp" +#include "GladeFactory.hpp" +#include "App.hpp" + +using namespace std; +using namespace Ingen::Client; + +namespace Ingen { +namespace GUI { + + +// ////////////////////// Control ///////////////////////////////// // + +Control::Control(BaseObjectType* cobject, const Glib::RefPtr& glade_xml) + : Gtk::VBox(cobject) + , _control_panel(NULL) + , _enable_signal(false) +{ + Glib::RefPtr menu_xml = GladeFactory::new_glade_reference("port_control_menu"); + menu_xml->get_widget("port_control_menu", _menu); + menu_xml->get_widget("port_control_menu_properties", _menu_properties); + + _menu_properties->signal_activate().connect( + sigc::mem_fun(this, &SliderControl::menu_properties)); +} + + +Control::~Control() +{ + _enable_signal = false; + _control_connection.disconnect(); + _port_model.reset(); +} + + +void +Control::init(ControlPanel* panel, SharedPtr pm) +{ + _control_panel = panel; + _port_model = pm, + + assert(_port_model); + assert(panel); + + _control_connection = pm->signal_value_changed.connect(sigc::mem_fun(this, &Control::set_value)); +} + + +void +Control::menu_properties() +{ + Glib::RefPtr xml = GladeFactory::new_glade_reference(); + + PortPropertiesWindow* window; + xml->get_widget_derived("port_properties_win", window); + window->present(_port_model); +} + + +// ////////////////// SliderControl ////////////////////// // + + +SliderControl::SliderControl(BaseObjectType* cobject, const Glib::RefPtr& xml) + : Control(cobject, xml) + , _enabled(true) +{ + xml->get_widget("control_strip_name_label", _name_label); + xml->get_widget("control_strip_slider", _slider); + xml->get_widget("control_strip_spinner", _value_spinner); +} + + +void +SliderControl::init(ControlPanel* panel, SharedPtr pm) +{ + _enable_signal = false; + _enabled = true; + + Control::init(panel, pm); + + assert(_name_label); + assert(_slider); + + set_name(pm->path().name()); + + _slider->set_draw_value(false); + + signal_button_press_event().connect(sigc::mem_fun(*this, &SliderControl::clicked)); + _slider->signal_button_press_event().connect(sigc::mem_fun(*this, &SliderControl::clicked)); + + _slider->signal_event().connect( + sigc::mem_fun(*this, &SliderControl::slider_pressed)); + + _slider->signal_value_changed().connect( + sigc::mem_fun(*this, &SliderControl::update_value_from_slider)); + + _value_spinner->signal_value_changed().connect( + sigc::mem_fun(*this, &SliderControl::update_value_from_spinner)); + + float min = 0.0f, max = 1.0f; + + boost::shared_ptr parent = PtrCast(_port_model->parent()); + if (parent) + parent->port_value_range(_port_model, min, max); + + if (pm->is_integer() || pm->is_toggle()) { + _slider->set_increments(1, 10); + _value_spinner->set_digits(0); + } else { + _slider->set_increments(0, 0); + } + + pm->signal_variable.connect(sigc::mem_fun(this, &SliderControl::port_variable_change)); + + _slider->set_range(std::min(min, pm->value().get_float()), std::max(max, pm->value().get_float())); + //_value_spinner->set_range(min, max); + + set_value(pm->value()); + + _enable_signal = true; + + show_all(); +} + + +bool +SliderControl::clicked(GdkEventButton* ev) +{ + if (ev->button == 3) { + _menu->popup(ev->button, ev->time); + return true; + } else { + return false; + } +} + + +void +SliderControl::set_value(const Atom& atom) +{ + float val = atom.get_float(); + + if (_port_model->is_integer()) + val = lrintf(val); + + _enable_signal = false; + if (_enabled) { + if (_slider->get_value() != val) { + const Gtk::Adjustment* range = _slider->get_adjustment(); + const float lower = range->get_lower(); + const float upper = range->get_upper(); + if (val < lower || val > upper) + set_range(min(lower, val), max(lower, val)); + _slider->set_value(val); + } + if (_value_spinner->get_value() != val) + _value_spinner->set_value(val); + } + _enable_signal = true; +} + + +void +SliderControl::port_variable_change(const string& key, const Atom& value) +{ + if ( (key == "ingen:minimum") && value.type() == Atom::FLOAT) + set_range(value.get_float(), _slider->get_adjustment()->get_upper()); + else if ( (key == "ingen:maximum") && value.type() == Atom::FLOAT) + set_range(_slider->get_adjustment()->get_lower(), value.get_float()); +} + + +void +SliderControl::set_range(float min, float max) +{ + _slider->set_range(min, max); + //_value_spinner->set_range(min, max); +} + + +void +SliderControl::set_name(const string& name) +{ + string name_label = ""; + name_label += name + ""; + _name_label->set_markup(name_label); +} + + +void +SliderControl::enable() +{ + _slider->property_sensitive() = true; + //_min_spinner->property_sensitive() = true; + //_max_spinner->property_sensitive() = true; + _value_spinner->property_sensitive() = true; + _name_label->property_sensitive() = true; +} + + +void +SliderControl::disable() +{ + _slider->property_sensitive() = false; + //_min_spinner->property_sensitive() = false; + //_max_spinner->property_sensitive() = false; + _value_spinner->property_sensitive() = false; + _name_label->property_sensitive() = false; +} + + +void +SliderControl::update_value_from_slider() +{ + if (_enable_signal) { + float value = _slider->get_value(); + bool change = true; + + _enable_signal = false; + + if (_port_model->is_integer()) { + value = lrintf(value); + if (value == lrintf(_port_model->value().get_float())) + change = false; + } + + if (change) { + _value_spinner->set_value(value); + _control_panel->value_changed(_port_model, value); + } + + _enable_signal = true; + } +} + + +void +SliderControl::update_value_from_spinner() +{ + if (_enable_signal) { + _enable_signal = false; + const float value = _value_spinner->get_value(); + + set_value(value); + + _control_panel->value_changed(_port_model, value); + + //m_port_model->value(value); + _enable_signal = true; + } +} + + +/** Callback for when slider is grabbed so we can ignore set_control + * events for this port (and avoid nasty feedback issues). + */ +bool +SliderControl::slider_pressed(GdkEvent* ev) +{ + //cerr << "Pressed: " << ev->type << endl; + if (ev->type == GDK_BUTTON_PRESS) { + _enabled = false; + //GtkClientInterface::instance()->set_ignore_port(_port_model->path()); + } else if (ev->type == GDK_BUTTON_RELEASE) { + _enabled = true; + //GtkClientInterface::instance()->clear_ignore_port(); + } + + return false; +} + + +// ///////////// IntegerControl ////////////// // + +#if 0 +IntegerControl::IntegerControl(ControlPanel* panel, SharedPtr pm) +: Control(panel, pm), + _enable_signal(false), + _alignment(0.5, 0.5, 0.0, 0.0), + _name_label(pm->path().name()), + _spinner(1.0, 0) +{ + set_name(pm->path().name()); + + _spinner.set_range(-99999, 99999); + _spinner.set_value(_port_model->value()); + _spinner.signal_value_changed().connect( + sigc::mem_fun(*this, &IntegerControl::update_value)); + _spinner.set_increments(1, 10); + + _alignment.add(_spinner); + pack_start(_name_label); + pack_start(_alignment); + + _enable_signal = true; + + show_all(); +} + + +void +IntegerControl::set_name(const string& name) +{ + string name_label = ""; + name_label += name + ""; + _name_label->set_markup(name_label); +} + + +void +IntegerControl::set_value(float val) +{ + //cerr << "[IntegerControl] Setting value to " << val << endl; + _enable_signal = false; + _spinner.set_value(val); + _enable_signal = true; +} + + +void +IntegerControl::enable() +{ + _spinner.property_sensitive() = true; + _name_label->property_sensitive() = true; +} + + +void +IntegerControl::disable() +{ + _spinner.property_sensitive() = false; + _name_label->property_sensitive() = false; +} + + +void +IntegerControl::update_value() +{ + if (_enable_signal) { + float value = _spinner.get_value(); + _control_panel->value_changed(_port_model, value); + //m_port_model->value(value); + } +} +#endif + + +// ///////////// ToggleControl ////////////// // + + +ToggleControl::ToggleControl(BaseObjectType* cobject, const Glib::RefPtr& xml) + : Control(cobject, xml) +{ + xml->get_widget("toggle_control_name_label", _name_label); + xml->get_widget("toggle_control_check", _checkbutton); +} + + +void +ToggleControl::init(ControlPanel* panel, SharedPtr pm) +{ + _enable_signal = false; + + Control::init(panel, pm); + + assert(_name_label); + assert(_checkbutton); + + set_name(pm->path().name()); + + _checkbutton->signal_toggled().connect(sigc::mem_fun(*this, &ToggleControl::toggled)); + set_value(pm->value()); + + _enable_signal = true; + show_all(); +} + + +void +ToggleControl::set_name(const string& name) +{ + string name_label = ""; + name_label += name + ""; + _name_label->set_markup(name_label); +} + + +void +ToggleControl::set_value(const Atom& val) +{ + bool enable = false; + switch (val.type()) { + case Atom::FLOAT: + enable = (val.get_float() != 0.0f); + break; + case Atom::INT: + enable = (val.get_int32() != 0); + break; + case Atom::BOOL: + enable = (val.get_bool()); + default: + cerr << "Unsupported value type for toggle control" << endl; + } + + _enable_signal = false; + _checkbutton->set_active(enable); + _enable_signal = true; +} + + +void +ToggleControl::enable() +{ + _checkbutton->property_sensitive() = true; + _name_label->property_sensitive() = true; +} + + +void +ToggleControl::disable() +{ + _checkbutton->property_sensitive() = false; + _name_label->property_sensitive() = false; +} + + +void +ToggleControl::toggled() +{ + if (_enable_signal) { + float value = _checkbutton->get_active() ? 1.0f : 0.0f; + _control_panel->value_changed(_port_model, value); + //m_port_model->value(value); + } +} + + +} // namespace GUI +} // namespace Ingen diff --git a/src/libs/gui/Controls.hpp b/src/libs/gui/Controls.hpp new file mode 100644 index 00000000..8a9c4064 --- /dev/null +++ b/src/libs/gui/Controls.hpp @@ -0,0 +1,164 @@ +/* This file is part of Ingen. + * Copyright (C) 2007 Dave Robillard + * + * Ingen is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * Ingen is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef CONTROLGROUPS_H +#define CONTROLGROUPS_H + +#include +#include +#include +#include +#include "client/PortModel.hpp" +#include + +namespace Ingen { namespace Client { class PortModel; } } +using namespace Ingen::Client; + +namespace Ingen { +namespace GUI { + +class ControlPanel; + + +/** A group of controls (for a single Port) in a ControlPanel. + * + * \ingroup GUI + */ +class Control : public Gtk::VBox +{ +public: + Control(BaseObjectType* cobject, const Glib::RefPtr& glade_xml); + virtual ~Control(); + + virtual void init(ControlPanel* panel, SharedPtr pm); + + virtual void enable() = 0; + virtual void disable() = 0; + + inline const SharedPtr port_model() const { return _port_model; } + +protected: + virtual void set_value(const Atom& value) = 0; + virtual void set_range(float min, float max) {} + + void menu_properties(); + + ControlPanel* _control_panel; + SharedPtr _port_model; + sigc::connection _control_connection; + bool _enable_signal; + + Gtk::Menu* _menu; + Gtk::MenuItem* _menu_properties; +}; + + +/** A slider for a continuous control. + * + * \ingroup GUI + */ +class SliderControl : public Control +{ +public: + SliderControl(BaseObjectType* cobject, const Glib::RefPtr& glade_xml); + void init(ControlPanel* panel, SharedPtr pm); + + void enable(); + void disable(); + + void set_min(float val); + void set_max(float val); + +private: + void set_name(const string& name); + void set_value(const Atom& value); + void set_range(float min, float max); + + void port_variable_change(const string& key, const Raul::Atom& value); + + void update_range(); + void update_value_from_slider(); + void update_value_from_spinner(); + + bool slider_pressed(GdkEvent* ev); + bool clicked(GdkEventButton* ev); + + bool _enabled; + + Gtk::Label* _name_label; + Gtk::SpinButton* _value_spinner; + Gtk::HScale* _slider; +}; + + +#if 0 + +/** A spinbutton for integer controls. + * + * \ingroup GUI + */ +class IntegerControl : public Control +{ +public: + IntegerControl(ControlPanel* panel, SharedPtr pm); + + void enable(); + void disable(); + +private: + void set_name(const string& name); + void set_value(float val); + + void update_value(); + + bool _enable_signal; + Gtk::Alignment _alignment; + Gtk::Label _name_label; + Gtk::SpinButton _spinner; +}; +#endif + + +/** A radio button for toggle controls. + * + * \ingroup GUI + */ +class ToggleControl : public Control +{ +public: + ToggleControl(BaseObjectType* cobject, const Glib::RefPtr& xml); + + void init(ControlPanel* panel, SharedPtr pm); + + void enable(); + void disable(); + +private: + void set_name(const string& name); + void set_value(const Atom& value); + + void toggled(); + + Gtk::Label* _name_label; + Gtk::CheckButton* _checkbutton; +}; + + +} // namespace GUI +} // namespace Ingen + +#endif // CONTROLGROUPS_H diff --git a/src/libs/gui/Makefile.am b/src/libs/gui/Makefile.am index 9e55afab..17672a29 100644 --- a/src/libs/gui/Makefile.am +++ b/src/libs/gui/Makefile.am @@ -54,10 +54,10 @@ libingen_gui_la_SOURCES = \ ConnectWindow.cpp \ ConnectWindow.hpp \ Connection.hpp \ - ControlGroups.cpp \ - ControlGroups.hpp \ ControlPanel.cpp \ ControlPanel.hpp \ + Controls.cpp \ + Controls.hpp \ GladeFactory.cpp \ GladeFactory.hpp \ LoadPatchWindow.cpp \ diff --git a/src/libs/gui/NodeControlWindow.cpp b/src/libs/gui/NodeControlWindow.cpp index c0698230..95a07b2b 100644 --- a/src/libs/gui/NodeControlWindow.cpp +++ b/src/libs/gui/NodeControlWindow.cpp @@ -22,7 +22,7 @@ #include "App.hpp" #include "NodeControlWindow.hpp" #include "GladeFactory.hpp" -#include "ControlGroups.hpp" +#include "Controls.hpp" #include "ControlPanel.hpp" #include "PatchWindow.hpp" diff --git a/src/libs/gui/PortPropertiesWindow.cpp b/src/libs/gui/PortPropertiesWindow.cpp index 707c8d76..0129993b 100644 --- a/src/libs/gui/PortPropertiesWindow.cpp +++ b/src/libs/gui/PortPropertiesWindow.cpp @@ -21,7 +21,7 @@ #include "client/NodeModel.hpp" #include "client/PluginModel.hpp" #include "App.hpp" -#include "ControlGroups.hpp" +#include "Controls.hpp" #include "PortPropertiesWindow.hpp" using std::string; diff --git a/src/libs/gui/ingen_gui.glade b/src/libs/gui/ingen_gui.glade index d8ab7bb5..d885914e 100644 --- a/src/libs/gui/ingen_gui.glade +++ b/src/libs/gui/ingen_gui.glade @@ -376,12 +376,12 @@ - + True Press 'e' to toggle edit mode True - + True gtk-info 1 @@ -473,62 +473,53 @@ 3 12 - + True - True - Clear filter text (show all plugins) - gtk-clear - True - 0 + 1 + Node Name: + True - 2 - 3 + 2 + 3 GTK_FILL - + True - Name contains: + 1 + 2 + 1 + 2 GTK_FILL - - + True - True - True - Search string to filter plugin list - * - 1 - 2 - 6 + 1 + 2 + GTK_FILL + GTK_FILL - + True - False - True - Add selected plugin to patch - gtk-add - True - 0 2 3 - 2 - 3 + 1 + 2 GTK_FILL - + GTK_FILL @@ -571,51 +562,60 @@ - + True + False + True + Add selected plugin to patch + gtk-add + True + 0 2 3 - 1 - 2 + 2 + 3 GTK_FILL - GTK_FILL + - + True + True + True + Search string to filter plugin list + * - 1 - 2 - GTK_FILL - GTK_FILL + 1 + 2 + 6 - + True + Name contains: - 1 - 2 - 1 - 2 GTK_FILL + - + True - 1 - Node Name: - True + True + Clear filter text (show all plugins) + gtk-clear + True + 0 - 2 - 3 + 2 + 3 GTK_FILL @@ -646,61 +646,61 @@ 2 2 - + True - True - True - * - True + 0 + Name: - 1 - 2 - - 4 + GTK_FILL + GTK_EXPAND + 5 - + True - True - 1 0 100 1 10 10 - 1 + 0 + Polyphony: - 1 - 2 1 2 GTK_FILL - - 4 + GTK_EXPAND + 5 - + True - 0 - Polyphony: + True + 1 0 100 1 10 10 + 1 + 1 + 2 1 2 GTK_FILL - GTK_EXPAND - 5 + + 4 - + True - 0 - Name: + True + True + * + True - GTK_FILL - GTK_EXPAND - 5 + 1 + 2 + + 4 @@ -802,71 +802,63 @@ 12 4 - + True - - - True - True - Specify the name for the new patch - Specify: - True - 0 - True - load_subpatch_name_from_file_radio - - - False - False - - - - - True - False - True - Specify the name for the new patch - * - True - - - False - 1 - - + 0 + <b>Name: </b> + True - 3 - 4 - GTK_FILL + GTK_FILL + - + True 0 + <b>Polyphony: </b> + True - 2 - 3 + 1 + 2 GTK_FILL - + True True - Set polyphony to the same value as the parent (containing) patch - Same as parent (?) + Use the name stored in the patch file + Load from file True 0 + True True - load_subpatch_poly_from_file_radio - 2 - 3 + 1 + 2 + GTK_FILL + + + + + + True + True + Use the polyphony value stored in the patch file + Load from file + True + 0 + True + True + + + 1 + 2 1 2 GTK_FILL @@ -917,19 +909,19 @@ - + True True - Use the polyphony value stored in the patch file - Load from file + Set polyphony to the same value as the parent (containing) patch + Same as parent (?) True 0 - True True + load_subpatch_poly_from_file_radio - 1 - 2 + 2 + 3 1 2 GTK_FILL @@ -937,47 +929,55 @@ - - True - True - Use the name stored in the patch file - Load from file - True - 0 - True - True - - - 1 - 2 - GTK_FILL - - - - - + True 0 - <b>Polyphony: </b> - True - 1 - 2 + 2 + 3 GTK_FILL - + True - 0 - <b>Name: </b> - True + + + True + True + Specify the name for the new patch + Specify: + True + 0 + True + load_subpatch_name_from_file_radio + + + False + False + + + + + True + False + True + Specify the name for the new patch + * + True + + + False + 1 + + - GTK_FILL - + 3 + 4 + GTK_FILL @@ -1038,6 +1038,54 @@ 4 12 4 + + + True + 0 + <b>Polyphony: </b> + True + + + GTK_FILL + + + + + + True + True + Use the same polyphony as the current patch + Keep current + True + 0 + True + True + + + 1 + 2 + GTK_FILL + + + + + + True + True + Use the polyphony value stored in the patch file + Load from file + True + 0 + True + load_patch_poly_from_current_radio + + + 2 + 3 + GTK_FILL + + + True @@ -1078,54 +1126,6 @@ GTK_FILL - - - True - True - Use the polyphony value stored in the patch file - Load from file - True - 0 - True - load_patch_poly_from_current_radio - - - 2 - 3 - GTK_FILL - - - - - - True - True - Use the same polyphony as the current patch - Keep current - True - 0 - True - True - - - 1 - 2 - GTK_FILL - - - - - - True - 0 - <b>Polyphony: </b> - True - - - GTK_FILL - - - False @@ -1174,8 +1174,74 @@ True - 4 + 5 2 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + 0 + 1 + 4 + <b>Name</b> + True + True + + + False + False + + + + + True + 1 + 0 + 1 + 1 + 4 + + + True + + + + + 1 + + + + + True + True + 0 + True + + + False + 2 + + + + + False + False + + + + + 4 + 5 + 8 + + @@ -1189,22 +1255,50 @@ - + + + + True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - + + True + 0 + + + True + True + GTK_POLICY_NEVER + GTK_POLICY_AUTOMATIC + + + True + GTK_SHADOW_NONE + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + + + + + + + + True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True - + True - 0 - 4 - 4 - <b>Name</b> - True - True + True + Apply changed controls to all voices + All Voices + True + 0 + True False @@ -1212,67 +1306,54 @@ - + True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 1 - 1 - 0 - 0 - 2 - 2 - 2 + 5 - + True True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 12 - 0 -9.9999999999999999e+45 1.0000000000000001e+63 1 10 10 - 4 + Apply changed controls to one voice only + Specific Voice: + True + 0 + True + control_panel_all_voices_radio + + + False + False + + + + + True + False + True + Voice control changes are applied to + 1 1 100 1 10 10 + 1 True + + 1 + + False + False 1 False - False - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 0 -1e+113 1e+137 0 0 0 - 63 - False - - - False + 5 1 - - 3 - 4 - - - - - True - - - 1 - 2 - GTK_FILL - @@ -1535,47 +1616,32 @@ - + True + + + 1 + 2 + GTK_FILL + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - True - 0 - - - True - True - GTK_POLICY_NEVER - GTK_POLICY_AUTOMATIC - - - True - GTK_SHADOW_NONE - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - - - - - - - - + True - True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - + True - True - Apply changed controls to all voices - All Voices - True - 0 - True + 0 + 1 + 4 + <b>Name</b> + True + True False @@ -1583,54 +1649,64 @@ - + True - 5 - - - True - True - Apply changed controls to one voice only - Specific Voice: - True - 0 - True - control_panel_all_voices_radio - - - False - False - - + 1 + 0 + 1 + 1 + 4 - + True - False - True - Voice control changes are applied to - 1 1 100 1 10 10 - 1 - True - - 1 - - False - False 1 + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 12 + 0 -9.9999999999999999e+45 1.0000000000000001e+63 1 10 10 + 4 + True + + + False + 2 + + + + + False + False + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 9.0923076923076922e+136 -1e+113 1e+137 0 0 0 + 63 + False False - 5 1 + + 3 + 4 + 8 + @@ -1720,51 +1796,51 @@ 2 2 - + True - 0 + <b>Patch Search Path: </b> + True - 1 - 2 GTK_FILL - + True - <i>Example: /foo/bar:/home/john/patches:/usr/share/om/patches</i> - True + True + * 1 2 - 1 - 2 - GTK_FILL - + True - True - * + <i>Example: /foo/bar:/home/john/patches:/usr/share/om/patches</i> + True 1 2 + 1 + 2 + GTK_FILL - + True - <b>Patch Search Path: </b> - True + 0 + 1 + 2 GTK_FILL @@ -2043,8 +2119,8 @@ 8 Node Properties - Ingen - ingen.svg GTK_WIN_POS_MOUSE + ingen.svg True @@ -2141,7 +2217,7 @@ 10 6 - + True 0 - @@ -2149,34 +2225,28 @@ 1 2 - 2 - 3 GTK_FILL - + True 0 - Name: + Type: - 2 - 3 GTK_FILL - + True 0 - - + URI: - 1 - 2 1 2 GTK_FILL @@ -2184,12 +2254,14 @@ - + True 0 - URI: + - + 1 + 2 1 2 GTK_FILL @@ -2197,18 +2269,20 @@ - + True 0 - Type: + Name: + 2 + 3 GTK_FILL - + True 0 - @@ -2216,6 +2290,8 @@ 1 2 + 2 + 3 GTK_FILL @@ -2231,7 +2307,6 @@ True GDK_WINDOW_TYPE_HINT_NORMAL - Ingen Copyright (C) 2005-2007 Dave Robillard <http://drobilla.net> http://drobilla.net/software/ingen Licensed under the GNU GPL, Version 2. @@ -2295,7 +2370,7 @@ Contributors: ingen.svg GDK_WINDOW_TYPE_HINT_DIALOG - + True 6 @@ -2369,33 +2444,64 @@ Contributors: 2 8 - + True - 0 + + + True + False + True + 16180 1 65535 1 10 10 + 1 + True + + + False + False + + + + + 1 + 2 + 1 + 2 + GTK_FILL + 8 + + + + + True + + + True + True + * + True + 28 + osc.udp://localhost:16180 + + 1 2 - 2 - 3 GTK_FILL - + GTK_FILL + 8 - + True - False True - Use internal engine + Connect to running server at: True 0 True - connect_server_radiobutton - 2 - 3 GTK_FILL @@ -2418,66 +2524,35 @@ Contributors: - + True + False True - Connect to running server at: + Use internal engine True 0 True + connect_server_radiobutton + 2 + 3 GTK_FILL - + True - - - True - True - * - True - 28 - osc.udp://localhost:16180 - - + 0 1 2 + 2 + 3 GTK_FILL - GTK_FILL - 8 - - - - - True - - - True - False - True - 16180 1 65535 1 10 10 - 1 - True - - - False - False - - - - - 1 - 2 - 1 - 2 - GTK_FILL - 8 + @@ -2491,7 +2566,7 @@ Contributors: - + True GTK_BUTTONBOX_END @@ -2724,7 +2799,7 @@ Contributors: Load Remote Patch GDK_WINDOW_TYPE_HINT_DIALOG - + True 8 @@ -2783,7 +2858,7 @@ Contributors: - + True GTK_BUTTONBOX_END @@ -2826,7 +2901,7 @@ Contributors: False GDK_WINDOW_TYPE_HINT_DIALOG - + True 9 @@ -2836,26 +2911,19 @@ Contributors: 2 8 - - True - 0 - Short Name: - - - 1 - 2 - GTK_FILL - - - - - + True - 0 - Symbol: + True + Enter a short name suitable for use as an identifier or filename. + +The first character must be one of _, a-z or A-Z and subsequenct characters can be from _, a-z, A-Z or 0-9. + + * + True - GTK_FILL + 1 + 2 @@ -2876,19 +2944,26 @@ Contributors: - + True - True - Enter a short name suitable for use as an identifier or filename. - -The first character must be one of _, a-z or A-Z and subsequenct characters can be from _, a-z, A-Z or 0-9. - - * - True + 0 + Symbol: - 1 - 2 + GTK_FILL + + + + + + True + 0 + Short Name: + + + 1 + 2 + GTK_FILL @@ -2927,7 +3002,7 @@ Thank you for contributing. - + True GTK_BUTTONBOX_END @@ -3020,7 +3095,7 @@ Thank you for contributing. False GTK_WIN_POS_MOUSE - + True 8 @@ -3031,26 +3106,17 @@ Thank you for contributing. 2 4 - - True - 0 - Maximum Value: - - - 1 - 2 - GTK_FILL - - - - - + True - 0 - Minimum Value: + True + 0 -100000000 100000000 1 10 10 + 1 + 5 + True - GTK_FILL + 1 + 2 @@ -3072,17 +3138,26 @@ Thank you for contributing. - + True - True - 0 -100000000 100000000 1 10 10 - 1 - 5 - True + 0 + Minimum Value: - 1 - 2 + GTK_FILL + + + + + + True + 0 + Maximum Value: + + + 1 + 2 + GTK_FILL @@ -3092,7 +3167,7 @@ Thank you for contributing. - + True GTK_BUTTONBOX_END @@ -3177,10 +3252,10 @@ Thank you for contributing. - + True - + True -- cgit v1.2.1