diff options
Diffstat (limited to 'src/gui/Port.cpp')
-rw-r--r-- | src/gui/Port.cpp | 71 |
1 files changed, 57 insertions, 14 deletions
diff --git a/src/gui/Port.cpp b/src/gui/Port.cpp index ba4e0482..91e64f3a 100644 --- a/src/gui/Port.cpp +++ b/src/gui/Port.cpp @@ -21,11 +21,13 @@ #include "flowcanvas/Module.hpp" #include "client/PatchModel.hpp" #include "client/PortModel.hpp" -#include "Configuration.hpp" #include "App.hpp" +#include "Configuration.hpp" +#include "GladeFactory.hpp" +#include "PatchWindow.hpp" #include "Port.hpp" #include "PortMenu.hpp" -#include "GladeFactory.hpp" +#include "WindowFactory.hpp" using namespace Ingen::Client; using namespace std; @@ -48,6 +50,7 @@ Port::Port( flip ? (!pm->is_input()) : pm->is_input(), App::instance().configuration()->get_port_color(pm.get())) , _port_model(pm) + , _pressed(false) , _flipped(flip) { assert(module); @@ -65,21 +68,14 @@ Port::Port( if (pm->type().is_control()) { set_toggled(pm->is_toggle()); show_control(); - - float min = 0.0f, max = 1.0f; - boost::shared_ptr<NodeModel> parent = PtrCast<NodeModel>(pm->parent()); - if (parent) - parent->port_value_range(pm, min, max); - - set_control_min(min); - set_control_max(max); - pm->signal_property.connect(sigc::mem_fun(this, &Port::property_changed)); pm->signal_value_changed.connect(sigc::mem_fun(this, &Port::value_changed)); } pm->signal_activity.connect(sigc::mem_fun(this, &Port::activity)); + update_metadata(); + value_changed(pm->value()); } @@ -91,6 +87,24 @@ Port::~Port() void +Port::update_metadata() +{ + SharedPtr<PortModel> pm = _port_model.lock(); + if (pm && pm->type().is_control()) { + boost::shared_ptr<NodeModel> parent = PtrCast<NodeModel>(pm->parent()); + if (parent) { + float min = 0.0f; + float max = 1.0f; + parent->port_value_range(pm, min, max); + set_control_min(min); + set_control_max(max); + } + } +} + + + +void Port::create_menu() { PortMenu* menu = NULL; @@ -112,13 +126,32 @@ Port::moved() void Port::value_changed(const Atom& value) { - if (value.type() == Atom::FLOAT) + if (_pressed) + return; + else if (value.type() == Atom::FLOAT) FlowCanvas::Port::set_control(value.get_float()); else cerr << "WARNING: Unknown port value type " << (unsigned)value.type() << endl; } +bool +Port::on_event(GdkEvent* ev) +{ + switch (ev->type) { + case GDK_BUTTON_PRESS: + _pressed = true; + break; + case GDK_BUTTON_RELEASE: + _pressed = false; + default: + break; + } + + return false; +} + + void Port::activity() { @@ -132,6 +165,14 @@ Port::set_control(float value, bool signal) if (signal) { if (model()->type() == PortType::CONTROL) { App::instance().engine()->set_port_value(model()->path(), Atom(value)); + PatchWindow* pw = App::instance().window_factory()->patch_window( + PtrCast<PatchModel>(model()->parent())); + if (!pw) + pw = App::instance().window_factory()->patch_window( + PtrCast<PatchModel>(model()->parent()->parent())); + if (pw) + pw->show_port_status(model().get(), value); + } else if (model()->type() == PortType::EVENTS) { App::instance().engine()->set_port_value(model()->path(), Atom("<http://example.org/ev#BangEvent>", 0, NULL)); @@ -146,9 +187,11 @@ void Port::property_changed(const URI& key, const Atom& value) { if (value.type() == Atom::FLOAT) { - if ((key.str() == "lv2:minimum")) + if (key.str() == "ingen:value") + set_control(value.get_float(), false); + else if (key.str() == "lv2:minimum") set_control_min(value.get_float()); - else if ((key.str() == "lv2:maximum")) + else if (key.str() == "lv2:maximum") set_control_max(value.get_float()); } else if (value.type() == Atom::BOOL) { if ((key.str() == "lv2:toggled")) |