summaryrefslogtreecommitdiffstats
path: root/src/gui/Port.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/Port.cpp')
-rw-r--r--src/gui/Port.cpp71
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"))