summaryrefslogtreecommitdiffstats
path: root/src/client
diff options
context:
space:
mode:
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;