summaryrefslogtreecommitdiffstats
path: root/src/client
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2009-12-31 18:27:20 +0000
committerDavid Robillard <d@drobilla.net>2009-12-31 18:27:20 +0000
commit3dded8a655b6cad1925f160cb1012b8334e00c3e (patch)
tree5d743f58c6494ea7e5ed4010f9016c7d3c3f7665 /src/client
parentc11b1bd6fe15f281c5e6b1ab2109590c17e739e9 (diff)
downloadingen-3dded8a655b6cad1925f160cb1012b8334e00c3e.tar.gz
ingen-3dded8a655b6cad1925f160cb1012b8334e00c3e.tar.bz2
ingen-3dded8a655b6cad1925f160cb1012b8334e00c3e.zip
Various fixes related to port values and metadata (fix ticket #459 among other things).
Fix jitterey behaviour of port controls (on module) while dragging. Update value in status bar while dragging port slider (on module). Update plugin data (e.g. port control range) if the plugin is sent to the client after nodes that are instances of it (i.e. more robust plugin state tracking via merging like with objects). Correctly save and restore port values (ticket #459). git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@2327 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/client')
-rw-r--r--src/client/ClientStore.cpp29
-rw-r--r--src/client/NodeModel.hpp1
-rw-r--r--src/client/ObjectModel.cpp2
-rw-r--r--src/client/PluginModel.cpp20
-rw-r--r--src/client/PluginModel.hpp9
5 files changed, 46 insertions, 15 deletions
diff --git a/src/client/ClientStore.cpp b/src/client/ClientStore.cpp
index 74a0faad..64e84494 100644
--- a/src/client/ClientStore.cpp
+++ b/src/client/ClientStore.cpp
@@ -184,11 +184,13 @@ ClientStore::resource(const URI& uri)
void
ClientStore::add_plugin(SharedPtr<PluginModel> pm)
{
- // FIXME: dupes? merge, like with objects?
-
- (*_plugins)[pm->uri()] = pm;
- signal_new_plugin(pm);
- //cerr << "Plugin: " << pm->uri() << ", # plugins: " << _plugins->size() << endl;
+ SharedPtr<PluginModel> existing = this->plugin(pm->uri());
+ if (existing) {
+ existing->set(pm);
+ } else {
+ _plugins->insert(make_pair(pm->uri(), pm));
+ signal_new_plugin(pm);
+ }
}
@@ -300,15 +302,16 @@ ClientStore::put(const URI& uri, const Resource::Properties& properties)
const Resource::Properties::const_iterator p = properties.find("rdf:instanceOf");
SharedPtr<PluginModel> plug;
if (p->second.is_valid() && p->second.type() == Atom::URI) {
- if ((plug = plugin(p->second.get_uri()))) {
- SharedPtr<NodeModel> n(new NodeModel(plug, path));
- n->set_properties(properties);
- add_object(n);
- } else {
- SharedPtr<NodeModel> n(new NodeModel(p->second.get_uri(), path));
- n->set_properties(properties);
- add_object(n);
+ if (!(plug = plugin(p->second.get_uri()))) {
+ cout << "WARNING: Unable to find plugin " << p->second.get_uri() << endl;
+ plug = SharedPtr<PluginModel>(
+ new PluginModel(p->second.get_uri(), "ingen:nil", Resource::Properties()));
+ add_plugin(plug);
}
+
+ SharedPtr<NodeModel> n(new NodeModel(plug, path));
+ n->set_properties(properties);
+ add_object(n);
} else {
cerr << "ERROR: Plugin with no type" << endl;
}
diff --git a/src/client/NodeModel.hpp b/src/client/NodeModel.hpp
index b5af737e..57d2f09c 100644
--- a/src/client/NodeModel.hpp
+++ b/src/client/NodeModel.hpp
@@ -57,6 +57,7 @@ public:
const Raul::URI& plugin_uri() const { return _plugin_uri; }
const Shared::Plugin* plugin() const { return _plugin.get(); }
+ Shared::Plugin* plugin() { return _plugin.get(); }
uint32_t num_ports() const { return _ports.size(); }
const Ports& ports() const { return _ports; }
diff --git a/src/client/ObjectModel.cpp b/src/client/ObjectModel.cpp
index e41be6c9..6c64735d 100644
--- a/src/client/ObjectModel.cpp
+++ b/src/client/ObjectModel.cpp
@@ -83,7 +83,7 @@ ObjectModel::polyphonic() const
/** Merge the data of @a model with self, as much as possible.
*
* This will merge the two models, but with any conflict take the value in
- * @a model as correct. The paths of the two models MUST be equal.
+ * @a o as correct. The paths of the two models MUST be equal.
*/
void
ObjectModel::set(SharedPtr<ObjectModel> o)
diff --git a/src/client/PluginModel.cpp b/src/client/PluginModel.cpp
index 4f1a4626..c40bb7ef 100644
--- a/src/client/PluginModel.cpp
+++ b/src/client/PluginModel.cpp
@@ -128,6 +128,26 @@ PluginModel::get_property(const URI& key) const
}
+void
+PluginModel::set(SharedPtr<PluginModel> p)
+{
+ _type = p->_type;
+ _icon_path = p->_icon_path;
+
+#ifdef HAVE_SLV2
+ if (p->_slv2_plugin)
+ _slv2_plugin = p->_slv2_plugin;
+#endif
+
+ for (Properties::const_iterator v = p->properties().begin(); v != p->properties().end(); ++v) {
+ ResourceImpl::set_property(v->first, v->second);
+ signal_property.emit(v->first, v->second);
+ }
+
+ signal_changed.emit();
+}
+
+
Symbol
PluginModel::default_node_symbol()
{
diff --git a/src/client/PluginModel.hpp b/src/client/PluginModel.hpp
index 90440efe..b9407334 100644
--- a/src/client/PluginModel.hpp
+++ b/src/client/PluginModel.hpp
@@ -89,8 +89,15 @@ public:
static Redland::World* rdf_world() { return _rdf_world; }
+ // Signals
+ sigc::signal<void> signal_changed;
+
+protected:
+ friend class ClientStore;
+ void set(SharedPtr<PluginModel> p);
+
private:
- const Type _type;
+ Type _type;
#ifdef HAVE_SLV2
static SLV2World _slv2_world;