diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/Port.cpp | 15 | ||||
-rw-r--r-- | src/gui/Port.hpp | 1 | ||||
-rw-r--r-- | src/gui/PortMenu.cpp | 24 | ||||
-rw-r--r-- | src/gui/PortPropertiesWindow.cpp | 166 | ||||
-rw-r--r-- | src/gui/PortPropertiesWindow.hpp | 69 | ||||
-rw-r--r-- | src/gui/wscript | 1 |
6 files changed, 22 insertions, 254 deletions
diff --git a/src/gui/Port.cpp b/src/gui/Port.cpp index 2bdf2e43..0d82d0cd 100644 --- a/src/gui/Port.cpp +++ b/src/gui/Port.cpp @@ -89,6 +89,8 @@ Port::Port(App& app, show_control(); pm->signal_property().connect( sigc::mem_fun(this, &Port::property_changed)); + pm->signal_property_removed().connect( + sigc::mem_fun(this, &Port::property_removed)); pm->signal_value_changed().connect( sigc::mem_fun(this, &Port::value_changed)); } @@ -121,7 +123,7 @@ void Port::update_metadata() { SPtr<const PortModel> pm = _port_model.lock(); - if (_app.can_control(pm.get()) && pm->is_numeric()) { + if (pm && _app.can_control(pm.get()) && pm->is_numeric()) { SPtr<const BlockModel> parent = dynamic_ptr_cast<const BlockModel>(pm->parent()); if (parent) { float min = 0.0f; @@ -435,13 +437,22 @@ Port::property_changed(const Raul::URI& key, const Atom& value) } } +void +Port::property_removed(const Raul::URI& key, const Atom& value) +{ + const URIs& uris = _app.uris(); + if (key == uris.lv2_minimum || key == uris.lv2_maximum) { + update_metadata(); + } +} + bool Port::on_selected(gboolean b) { if (b) { SPtr<const PortModel> pm = _port_model.lock(); if (pm) { - SPtr<const BlockModel> block = dynamic_ptr_cast<BlockModel>(pm->parent()); + SPtr<const BlockModel> block = dynamic_ptr_cast<const BlockModel>(pm->parent()); GraphWindow* win = _app.window_factory()->parent_graph_window(block); if (win && win->documentation_is_visible() && block->plugin_model()) { bool html = false; diff --git a/src/gui/Port.hpp b/src/gui/Port.hpp index a8d16095..216b8356 100644 --- a/src/gui/Port.hpp +++ b/src/gui/Port.hpp @@ -78,6 +78,7 @@ private: GraphBox* get_graph_box() const; void property_changed(const Raul::URI& key, const Atom& value); + void property_removed(const Raul::URI& key, const Atom& value); void moved(); void on_value_changed(double value); diff --git a/src/gui/PortMenu.cpp b/src/gui/PortMenu.cpp index 9c428dd8..138ee397 100644 --- a/src/gui/PortMenu.cpp +++ b/src/gui/PortMenu.cpp @@ -121,22 +121,14 @@ PortMenu::on_menu_set_max() void PortMenu::on_menu_reset_range() { - const URIs& uris = _app->uris(); - SPtr<const PortModel> model = dynamic_ptr_cast<const PortModel>(_object); - SPtr<const BlockModel> parent = dynamic_ptr_cast<const BlockModel>(_object->parent()); - - float min, max; - parent->default_port_value_range(model, min, max); - - if (!std::isnan(min)) - _app->interface()->set_property(_object->uri(), - uris.lv2_minimum, - _app->forge().make(min)); - - if (!std::isnan(max)) - _app->interface()->set_property(_object->uri(), - uris.lv2_maximum, - _app->forge().make(max)); + const URIs& uris = _app->uris(); + SPtr<const PortModel> model = dynamic_ptr_cast<const PortModel>(_object); + + // Remove lv2:minimum and lv2:maximum properties + Resource::Properties remove; + remove.insert({uris.lv2_minimum, Resource::Property(uris.patch_wildcard)}); + remove.insert({uris.lv2_maximum, Resource::Property(uris.patch_wildcard)}); + _app->interface()->delta(_object->uri(), remove, Resource::Properties()); } void diff --git a/src/gui/PortPropertiesWindow.cpp b/src/gui/PortPropertiesWindow.cpp deleted file mode 100644 index e4aec41d..00000000 --- a/src/gui/PortPropertiesWindow.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2012 David Robillard <http://drobilla.net/> - - Ingen is free software: you can redistribute it and/or modify it under the - terms of the GNU Affero General Public License as published by the Free - Software Foundation, either version 3 of the License, or 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 Affero General Public License for details. - - You should have received a copy of the GNU Affero General Public License - along with Ingen. If not, see <http://www.gnu.org/licenses/>. -*/ - -#include <cassert> -#include <list> - -#include "ingen/Interface.hpp" -#include "ingen/client/BlockModel.hpp" -#include "ingen/client/PluginModel.hpp" - -#include "App.hpp" -#include "PortPropertiesWindow.hpp" - -using namespace std; - -namespace Ingen { -using namespace Client; -namespace GUI { - -PortPropertiesWindow::PortPropertiesWindow(BaseObjectType* cobject, - const Glib::RefPtr<Gtk::Builder>& xml) - : Window(cobject) - , _initial_min(0.0f) - , _initial_max(1.0f) -{ - 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::present(SPtr<const PortModel> pm) -{ - assert(pm); - - for (auto& c : _connections) - c.disconnect(); - - _connections.clear(); - - _port_model = pm; - - set_title(pm->path() + " Properties - Ingen"); - - float min = 0.0f, max = 1.0f; - SPtr<BlockModel> parent = dynamic_ptr_cast<BlockModel>(_port_model->parent()); - if (parent) - parent->port_value_range(_port_model, min, max, - _app->sample_rate()); - - _initial_min = min; - _initial_max = max; - - _min_spinner->set_value(min); - _connections.push_back( - _min_spinner->signal_value_changed().connect( - sigc::mem_fun(*this, &PortPropertiesWindow::min_changed))); - - _max_spinner->set_value(max); - _connections.push_back( - _max_spinner->signal_value_changed().connect( - sigc::mem_fun(*this, &PortPropertiesWindow::max_changed))); - - _connections.push_back( - pm->signal_property().connect( - sigc::mem_fun(this, &PortPropertiesWindow::property_changed))); - - Gtk::Window::present(); -} - -void -PortPropertiesWindow::property_changed(const Raul::URI& key, - const Atom& value) -{ - const URIs& uris = _app->uris(); - if (value.type() == uris.forge.Float) { - if (key == uris.lv2_minimum) - _min_spinner->set_value(value.get<float>()); - else if (key == uris.lv2_maximum) - _max_spinner->set_value(value.get<float>()); - } -} - -void -PortPropertiesWindow::min_changed() -{ - const float val = _port_model->value().get<float>(); - float min = _min_spinner->get_value(); - float max = _max_spinner->get_value(); - - if (min > val) { - _min_spinner->set_value(val); - return; // avoid recursion - } - - if (max <= min) { - max = min + 1.0; - _max_spinner->set_value(max); - } -} - -void -PortPropertiesWindow::max_changed() -{ - const float val = _port_model->value().get<float>(); - float min = _min_spinner->get_value(); - float max = _max_spinner->get_value(); - - if (max < val) { - _max_spinner->set_value(val); - return; // avoid recursion - } - - if (min >= max) { - min = max - 1.0; - _min_spinner->set_value(min); - } -} - -void -PortPropertiesWindow::cancel() -{ - hide(); -} - -void -PortPropertiesWindow::ok() -{ - const URIs& uris = _app->uris(); - Resource::Properties props; - props.insert( - make_pair(uris.lv2_minimum, - _app->forge().make(float(_min_spinner->get_value())))); - props.insert( - make_pair(uris.lv2_maximum, - _app->forge().make(float(_max_spinner->get_value())))); - _app->interface()->put(_port_model->uri(), props); - hide(); -} - -} // namespace GUI -} // namespace Ingen - diff --git a/src/gui/PortPropertiesWindow.hpp b/src/gui/PortPropertiesWindow.hpp deleted file mode 100644 index 684a2dfb..00000000 --- a/src/gui/PortPropertiesWindow.hpp +++ /dev/null @@ -1,69 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2012 David Robillard <http://drobilla.net/> - - Ingen is free software: you can redistribute it and/or modify it under the - terms of the GNU Affero General Public License as published by the Free - Software Foundation, either version 3 of the License, or 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 Affero General Public License for details. - - You should have received a copy of the GNU Affero General Public License - along with Ingen. If not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_GUI_PORTPROPERTIESWINDOW_HPP -#define INGEN_GUI_PORTPROPERTIESWINDOW_HPP - -#include <list> - -#include <gtkmm/builder.h> -#include <gtkmm/spinbutton.h> - -#include "ingen/client/PortModel.hpp" -#include "ingen/types.hpp" - -#include "Window.hpp" - -namespace Ingen { -namespace GUI { - -/** Port properties window. - * - * Loaded from XML as a derived object. - * - * \ingroup GUI - */ -class PortPropertiesWindow : public Window -{ -public: - PortPropertiesWindow(BaseObjectType* cobject, - const Glib::RefPtr<Gtk::Builder>& xml); - - void present(SPtr<const Client::PortModel> port_model); - -private: - void property_changed(const Raul::URI& key, const Atom& value); - void min_changed(); - void max_changed(); - - void ok(); - void cancel(); - - float _initial_min; - float _initial_max; - - SPtr<const Client::PortModel> _port_model; - Gtk::SpinButton* _min_spinner; - Gtk::SpinButton* _max_spinner; - Gtk::Button* _cancel_button; - Gtk::Button* _ok_button; - std::list<sigc::connection> _connections; -}; - -} // namespace GUI -} // namespace Ingen - -#endif // INGEN_GUI_PORTPROPERTIESWINDOW_HPP diff --git a/src/gui/wscript b/src/gui/wscript index 62731abe..153c4d15 100644 --- a/src/gui/wscript +++ b/src/gui/wscript @@ -47,7 +47,6 @@ def build(bld): PluginMenu.cpp Port.cpp PortMenu.cpp - PortPropertiesWindow.cpp PropertiesWindow.cpp RDFS.cpp RenameWindow.cpp |