From 67fff73eaa9c78cfbae53ac1948f38fe3812c77f Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 23 Apr 2007 02:41:20 +0000 Subject: Moved range controls from node controls window to popup dialog to declutter. git-svn-id: http://svn.drobilla.net/lad/ingen@472 a436a847-0d15-0410-975c-d299462d15a1 --- src/progs/ingenuity/ControlGroups.cpp | 118 +++++------ src/progs/ingenuity/ControlGroups.h | 17 +- src/progs/ingenuity/Makefile.am | 2 + src/progs/ingenuity/NodePropertiesWindow.h | 2 +- src/progs/ingenuity/PortPropertiesWindow.cpp | 173 +++++++++++++++ src/progs/ingenuity/PortPropertiesWindow.h | 68 ++++++ src/progs/ingenuity/ingenuity.glade | 306 +++++++++++++++++++++------ 7 files changed, 548 insertions(+), 138 deletions(-) create mode 100644 src/progs/ingenuity/PortPropertiesWindow.cpp create mode 100644 src/progs/ingenuity/PortPropertiesWindow.h diff --git a/src/progs/ingenuity/ControlGroups.cpp b/src/progs/ingenuity/ControlGroups.cpp index 9bd96204..d7e2c6c1 100644 --- a/src/progs/ingenuity/ControlGroups.cpp +++ b/src/progs/ingenuity/ControlGroups.cpp @@ -23,6 +23,8 @@ #include "PluginModel.h" #include "NodeModel.h" #include "PortModel.h" +#include "PortPropertiesWindow.h" +#include "GladeFactory.h" #include "App.h" using std::cerr; using std::cout; using std::endl; @@ -60,7 +62,6 @@ ControlGroup::init(ControlPanel* panel, SharedPtr pm, bool separator) } */ - pm->metadata_update_sig.connect(sigc::mem_fun(this, &ControlGroup::metadata_update)); pm->control_change_sig.connect(sigc::mem_fun(this, &ControlGroup::set_value)); } @@ -73,9 +74,14 @@ SliderControlGroup::SliderControlGroup(BaseObjectType* cobject, const Glib::RefP _enabled(true) { xml->get_widget("control_strip_name_label", _name_label); - xml->get_widget("control_strip_min_spinner", _min_spinner); - xml->get_widget("control_strip_max_spinner", _max_spinner); xml->get_widget("control_strip_slider", _slider); + + 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)); } @@ -85,12 +91,22 @@ SliderControlGroup::init(ControlPanel* panel, SharedPtr pm, bool sepa ControlGroup::init(panel, pm, separator); assert(_name_label); - assert(_min_spinner); - assert(_max_spinner); assert(_slider); + set_name(pm->path().name()); + _slider->set_draw_value(true); + _slider->set_value(_port_model->value()); + + _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)); + + // FIXME: code duplication w/ PortPropertiesWindow.cpp float min = 0.0f; float max = 1.0f; @@ -117,28 +133,37 @@ SliderControlGroup::init(ControlPanel* panel, SharedPtr pm, bool sepa if (max <= min) max = min + 1.0f; - set_name(pm->path().name()); + _slider->set_range(min, max); - _min_spinner->set_value(min); - _min_spinner->signal_value_changed().connect(sigc::mem_fun(*this, &SliderControlGroup::min_changed)); - _max_spinner->set_value(max); - _max_spinner->signal_value_changed().connect(sigc::mem_fun(*this, &SliderControlGroup::max_changed)); + set_value(pm->value()); - _slider->set_value(_port_model->value()); + _enable_signal = true; - _slider->signal_event().connect( - sigc::mem_fun(*this, &SliderControlGroup::slider_pressed)); + show_all(); +} - _slider->signal_value_changed().connect( - sigc::mem_fun(*this, &SliderControlGroup::update_value_from_slider)); - _slider->set_range(min, max); +bool +SliderControlGroup::clicked(GdkEventButton* ev) +{ + if (ev->button == 3) { + _menu->popup(ev->button, ev->time); + return true; + } else { + return false; + } +} - set_value(pm->value()); - _enable_signal = true; +void +SliderControlGroup::menu_properties() +{ + Glib::RefPtr xml = GladeFactory::new_glade_reference(); - show_all(); + PortPropertiesWindow* dialog; + xml->get_widget_derived("port_properties_win", dialog); + dialog->init(this, _port_model); + dialog->run(); } @@ -156,16 +181,9 @@ SliderControlGroup::set_value(float val) void -SliderControlGroup::metadata_update(const string& key, const Atom& value) +SliderControlGroup::set_range(float min, float max) { - _enable_signal = false; - - if ( (key == "min") && value.type() == Atom::FLOAT) - _min_spinner->set_value(value.get_float()); - else if ( (key == "max") && value.type() == Atom::FLOAT) - _max_spinner->set_value(value.get_float()); - - _enable_signal = true; + _slider->set_range(min, max); } @@ -182,8 +200,8 @@ void SliderControlGroup::enable() { _slider->property_sensitive() = true; - _min_spinner->property_sensitive() = true; - _max_spinner->property_sensitive() = true; + //_min_spinner->property_sensitive() = true; + //_max_spinner->property_sensitive() = true; //m_value_spinner.property_sensitive() = true; _name_label->property_sensitive() = true; } @@ -193,49 +211,13 @@ void SliderControlGroup::disable() { _slider->property_sensitive() = false; - _min_spinner->property_sensitive() = false; - _max_spinner->property_sensitive() = false; + //_min_spinner->property_sensitive() = false; + //_max_spinner->property_sensitive() = false; //m_value_spinner.property_sensitive() = false; _name_label->property_sensitive() = false; } -void -SliderControlGroup::min_changed() -{ - float min = _min_spinner->get_value(); - const float max = _max_spinner->get_value(); - - if (min >= max) { - min = max - 1.0; - _min_spinner->set_value(min); - } - - _slider->set_range(min, max); - - if (_enable_signal) - App::instance().engine()->set_metadata(_port_model->path(), "min", min); -} - - -void -SliderControlGroup::max_changed() -{ - const float min = _min_spinner->get_value(); - float max = _max_spinner->get_value(); - - if (max <= min) { - max = min + 1.0; - _max_spinner->set_value(max); - } - - _slider->set_range(min, max); - - if (_enable_signal) - App::instance().engine()->set_metadata(_port_model->path(), "max", max); -} - - void SliderControlGroup::update_value_from_slider() { diff --git a/src/progs/ingenuity/ControlGroups.h b/src/progs/ingenuity/ControlGroups.h index 1cbf34d7..a05cceee 100644 --- a/src/progs/ingenuity/ControlGroups.h +++ b/src/progs/ingenuity/ControlGroups.h @@ -31,6 +31,7 @@ using namespace Ingen::Client; namespace Ingenuity { class ControlPanel; +class PortPropertiesWindow; /** A group of controls (for a single Port) in a NodeControlWindow. @@ -52,9 +53,10 @@ public: } protected: + friend class PortPropertiesWindow; virtual void set_value(float value) = 0; - virtual void metadata_update(const string& key, const Atom& value) = 0; + virtual void set_range(float min, float max) {} ControlPanel* _control_panel; SharedPtr _port_model; @@ -82,15 +84,17 @@ public: private: void set_name(const string& name); - virtual void metadata_update(const string& key, const Atom& value); + + bool clicked(GdkEventButton* ev); void set_value(float value); + void set_range(float min, float max); - void min_changed(); - void max_changed(); void update_range(); void update_value_from_slider(); void update_value_from_spinner(); + + void menu_properties(); //void slider_grabbed(bool b); @@ -99,10 +103,11 @@ private: bool _enabled; Gtk::Label* _name_label; - Gtk::SpinButton* _min_spinner; - Gtk::SpinButton* _max_spinner; //Gtk::SpinButton* _value_spinner; Gtk::VScale* _slider; + + Gtk::Menu* _menu; + Gtk::MenuItem* _menu_properties; }; diff --git a/src/progs/ingenuity/Makefile.am b/src/progs/ingenuity/Makefile.am index 932e47df..07420b48 100644 --- a/src/progs/ingenuity/Makefile.am +++ b/src/progs/ingenuity/Makefile.am @@ -92,6 +92,8 @@ ingenuity_SOURCES = \ RenameWindow.cpp \ NodePropertiesWindow.h \ NodePropertiesWindow.cpp \ + PortPropertiesWindow.h \ + PortPropertiesWindow.cpp \ PatchTreeWindow.h \ PatchTreeWindow.cpp diff --git a/src/progs/ingenuity/NodePropertiesWindow.h b/src/progs/ingenuity/NodePropertiesWindow.h index c45ab59c..b6d90062 100644 --- a/src/progs/ingenuity/NodePropertiesWindow.h +++ b/src/progs/ingenuity/NodePropertiesWindow.h @@ -27,7 +27,7 @@ using namespace Ingen::Client; namespace Ingenuity { -/** 'New Patch' Window. +/** Node properties window. * * Loaded by libglade as a derived object. * diff --git a/src/progs/ingenuity/PortPropertiesWindow.cpp b/src/progs/ingenuity/PortPropertiesWindow.cpp new file mode 100644 index 00000000..b7a78ebc --- /dev/null +++ b/src/progs/ingenuity/PortPropertiesWindow.cpp @@ -0,0 +1,173 @@ +/* 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 "PortPropertiesWindow.h" +#include +#include +#include "NodeModel.h" +#include "PluginModel.h" +#include "ModelEngineInterface.h" +#include "ControlGroups.h" +#include "App.h" + +using std::string; + +namespace Ingenuity { + + +PortPropertiesWindow::PortPropertiesWindow(BaseObjectType* cobject, const Glib::RefPtr& xml) + : Gtk::Dialog(cobject) + , _enable_signal(false) + , _control(NULL) +{ + xml->get_widget("port_properties_min_spinner", _min_spinner); + xml->get_widget("port_properties_max_spinner", _max_spinner); + xml->get_widget("port_properties_cancel_button", _cancel_button); + xml->get_widget("port_properties_ok_button", _ok_button); + + _cancel_button->signal_clicked().connect(sigc::mem_fun(this, + &PortPropertiesWindow::cancel)); + + _ok_button->signal_clicked().connect(sigc::mem_fun(this, + &PortPropertiesWindow::ok)); +} + + +/** Set the port this window is associated with. + * This function MUST be called before using this object in any way. + */ +void +PortPropertiesWindow::init(ControlGroup* control, SharedPtr pm) +{ + assert(pm); + assert(control); + + _port_model = pm; + _control = control; + + + set_title(pm->path() + " Properties"); + + // FIXME: code duplication w/ ControlGroups.cpp + float min = 0.0f; + float max = 1.0f; + + const Atom& min_atom = pm->get_metadata("min"); + const Atom& max_atom = pm->get_metadata("max"); + if (min_atom.type() == Atom::FLOAT && max_atom.type() == Atom::FLOAT) { + min = min_atom.get_float(); + max = max_atom.get_float(); + } + + const SharedPtr parent = PtrCast(pm->parent()); + + if (parent && parent->plugin() && parent->plugin()->type() == PluginModel::LV2) { + min = slv2_port_get_minimum_value( + parent->plugin()->slv2_plugin(), + slv2_plugin_get_port_by_symbol(parent->plugin()->slv2_plugin(), + pm->path().name().c_str())); + max = slv2_port_get_maximum_value( + parent->plugin()->slv2_plugin(), + slv2_plugin_get_port_by_symbol(parent->plugin()->slv2_plugin(), + pm->path().name().c_str())); + } + + if (max <= min) + max = min + 1.0f; + + _initial_min = min; + _initial_max = max; + + _min_spinner->set_value(min); + _min_spinner->signal_value_changed().connect(sigc::mem_fun(*this, &PortPropertiesWindow::min_changed)); + _max_spinner->set_value(max); + _max_spinner->signal_value_changed().connect(sigc::mem_fun(*this, &PortPropertiesWindow::max_changed)); + + pm->metadata_update_sig.connect(sigc::mem_fun(this, &PortPropertiesWindow::metadata_update)); + + _enable_signal = true; +} + + +void +PortPropertiesWindow::metadata_update(const string& key, const Atom& value) +{ + _enable_signal = false; + + if ( (key == "min") && value.type() == Atom::FLOAT) + _min_spinner->set_value(value.get_float()); + else if ( (key == "max") && value.type() == Atom::FLOAT) + _max_spinner->set_value(value.get_float()); + + _enable_signal = true; +} + + +void +PortPropertiesWindow::min_changed() +{ + float min = _min_spinner->get_value(); + const float max = _max_spinner->get_value(); + + if (min >= max) { + min = max - 1.0; + _min_spinner->set_value(min); + } + + _control->set_range(min, max); + + if (_enable_signal) + App::instance().engine()->set_metadata(_port_model->path(), "min", min); +} + + +void +PortPropertiesWindow::max_changed() +{ + const float min = _min_spinner->get_value(); + float max = _max_spinner->get_value(); + + if (max <= min) { + max = min + 1.0; + _max_spinner->set_value(max); + } + + _control->set_range(min, max); + + if (_enable_signal) + App::instance().engine()->set_metadata(_port_model->path(), "max", max); +} + + +void +PortPropertiesWindow::cancel() +{ + App::instance().engine()->set_metadata(_port_model->path(), "min", _initial_min); + App::instance().engine()->set_metadata(_port_model->path(), "max", _initial_max); + delete this; +} + + +void +PortPropertiesWindow::ok() +{ + delete this; +} + + +} // namespace Ingenuity + diff --git a/src/progs/ingenuity/PortPropertiesWindow.h b/src/progs/ingenuity/PortPropertiesWindow.h new file mode 100644 index 00000000..cd22cb09 --- /dev/null +++ b/src/progs/ingenuity/PortPropertiesWindow.h @@ -0,0 +1,68 @@ +/* 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 PORTPROPERTIESWINDOW_H +#define PORTPROPERTIESWINDOW_H + +#include +#include +#include "raul/SharedPtr.h" +#include "PortModel.h" +using namespace Ingen::Client; + +namespace Ingenuity { + +class ControlGroup; + + +/** Port properties window. + * + * Loaded by libglade as a derived object. + * + * \ingroup Ingenuity + */ +class PortPropertiesWindow : public Gtk::Dialog +{ +public: + PortPropertiesWindow(BaseObjectType* cobject, const Glib::RefPtr& refGlade); + + void init(ControlGroup* control, SharedPtr port_model); + +private: + void metadata_update(const string& key, const Atom& value); + void min_changed(); + void max_changed(); + + void ok(); + void cancel(); + + bool _enable_signal; + + float _initial_min; + float _initial_max; + + ControlGroup* _control; + SharedPtr _port_model; + Gtk::SpinButton* _min_spinner; + Gtk::SpinButton* _max_spinner; + Gtk::Button* _cancel_button; + Gtk::Button* _ok_button; +}; + +} // namespace Ingenuity + +#endif // PORTPROPERTIESWINDOW_H diff --git a/src/progs/ingenuity/ingenuity.glade b/src/progs/ingenuity/ingenuity.glade index 6c80dc08..fddef5b4 100644 --- a/src/progs/ingenuity/ingenuity.glade +++ b/src/progs/ingenuity/ingenuity.glade @@ -1718,27 +1718,41 @@ 0 - + True - True - GTK_POLICY_NEVER - GTK_POLICY_AUTOMATIC - GTK_SHADOW_NONE - GTK_CORNER_TOP_LEFT + 0.5 + 0.5 + 0 + 1 + 0 + 0 + 0 + 0 - + True + True + GTK_POLICY_NEVER + GTK_POLICY_AUTOMATIC GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT - + True - True - 4 + GTK_SHADOW_NONE - + + True + True + 4 + + + + + @@ -2215,31 +2229,25 @@ + + + True + + + 0 + 1 + 1 + 2 + fill + + + True False 0 - - - True - True - 1 - 3 - True - GTK_UPDATE_ALWAYS - False - False - 1 -99999 99999 1 10 10 - - - 0 - False - False - - - True @@ -2309,45 +2317,13 @@ True - - - - True - True - 1 - 3 - True - GTK_UPDATE_ALWAYS - False - False - 0 -99999 99999 1 10 10 - - - 0 - False - False - - 1 2 0 1 - shrink|fill - - - - - - True - - - 0 - 1 - 1 - 2 - fill + shrink @@ -4469,4 +4445,208 @@ Thank you for contributing. + + + + + True + _Properties... + True + + + + + True + gtk-properties + 1 + 0.5 + 0.5 + 0 + 0 + + + + + + + + 8 + Port Properties + GTK_WINDOW_POPUP + GTK_WIN_POS_MOUSE + False + False + False + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + False + True + + + + True + False + 8 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + True + -6 + + + + + + True + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + True + -5 + + + + + 0 + False + True + GTK_PACK_END + + + + + + True + 2 + 2 + False + 4 + 2 + + + + True + True + 1 + 5 + True + GTK_UPDATE_ALWAYS + False + False + 0 -100000000 100000000 1 10 10 + + + 1 + 2 + 0 + 1 + + + + + + + True + True + 1 + 5 + True + GTK_UPDATE_ALWAYS + False + False + 1 -99999 99999 1 10 10 + + + 1 + 2 + 1 + 2 + + + + + + + True + Minimum Value: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + Maximum Value: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + 0 + True + True + + + + + + -- cgit v1.2.1