diff options
author | David Robillard <d@drobilla.net> | 2008-12-02 05:49:41 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2008-12-02 05:49:41 +0000 |
commit | cb42d2cc4daa09c7d1db5515e39e94b9a5a43447 (patch) | |
tree | fa903dc4954836d0a3dbf4f6d43dc7c1b17784c4 /src/gui | |
parent | 5c150e73611323d739cc4a29d7f6ba529f136f87 (diff) | |
download | ingen-cb42d2cc4daa09c7d1db5515e39e94b9a5a43447.tar.gz ingen-cb42d2cc4daa09c7d1db5515e39e94b9a5a43447.tar.bz2 ingen-cb42d2cc4daa09c7d1db5515e39e94b9a5a43447.zip |
Rewrite pretty much everything to do with paths in Serialiser to actually make an ounce of sense.
Fix various things with nested patches (fix tickets #286 #289).
Cascade successive pastes nicely.
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@1840 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/LoadPatchWindow.cpp | 15 | ||||
-rw-r--r-- | src/gui/LoadRemotePatchWindow.cpp | 6 | ||||
-rw-r--r-- | src/gui/LoadSubpatchWindow.cpp | 3 | ||||
-rw-r--r-- | src/gui/PatchCanvas.cpp | 46 | ||||
-rw-r--r-- | src/gui/PatchCanvas.hpp | 1 | ||||
-rw-r--r-- | src/gui/ThreadedLoader.cpp | 27 | ||||
-rw-r--r-- | src/gui/ThreadedLoader.hpp | 14 |
7 files changed, 67 insertions, 45 deletions
diff --git a/src/gui/LoadPatchWindow.cpp b/src/gui/LoadPatchWindow.cpp index 5da4b459..0373ee80 100644 --- a/src/gui/LoadPatchWindow.cpp +++ b/src/gui/LoadPatchWindow.cpp @@ -137,15 +137,16 @@ LoadPatchWindow::ok_clicked() if (_replace) App::instance().engine()->clear_patch(_patch->path()); - //if (_patch->path() != "/") - // parent = _patch->path().parent(); - parent = _patch->path(); - + if (_patch->path() != "/") { + parent = _patch->path().parent(); + symbol = _patch->symbol(); + } + _patch.reset(); hide(); - - App::instance().loader()->load_patch(true, get_uri(), "/", - _initial_data, parent, symbol); + + App::instance().loader()->load_patch(true, get_uri(), Path("/"), + parent, symbol, _initial_data); } diff --git a/src/gui/LoadRemotePatchWindow.cpp b/src/gui/LoadRemotePatchWindow.cpp index c2979e80..dab1cd0e 100644 --- a/src/gui/LoadRemotePatchWindow.cpp +++ b/src/gui/LoadRemotePatchWindow.cpp @@ -134,8 +134,6 @@ LoadRemotePatchWindow::open_clicked() { Glib::ustring uri = _uri_entry->get_text(); - cerr << "OPEN URI: " << uri << endl; - // If unset load_patch will load values optional<Path> parent; optional<Symbol> symbol; @@ -146,8 +144,8 @@ LoadRemotePatchWindow::open_clicked() if (_patch->path() != "/") parent = _patch->path().parent(); - App::instance().loader()->load_patch(true, uri, "/", - _initial_data, parent, symbol); + App::instance().loader()->load_patch(true, uri, Path("/"), + parent, symbol, _initial_data); hide(); } diff --git a/src/gui/LoadSubpatchWindow.cpp b/src/gui/LoadSubpatchWindow.cpp index 5bdd8ea6..f6ec41d2 100644 --- a/src/gui/LoadSubpatchWindow.cpp +++ b/src/gui/LoadSubpatchWindow.cpp @@ -169,7 +169,8 @@ LoadSubpatchWindow::ok_clicked() Atom& y = _initial_data["ingenuity:canvas-y"]; y = Atom(y.get_float() + 20.0f); - App::instance().loader()->load_patch(false, *i, "/", _initial_data, _patch->path(), symbol); + App::instance().loader()->load_patch(false, *i, Path("/"), + _patch->path(), symbol, _initial_data); } hide(); diff --git a/src/gui/PatchCanvas.cpp b/src/gui/PatchCanvas.cpp index 852aca5e..8a580b88 100644 --- a/src/gui/PatchCanvas.cpp +++ b/src/gui/PatchCanvas.cpp @@ -58,6 +58,7 @@ PatchCanvas::PatchCanvas(SharedPtr<PatchModel> patch, int width, int height) , _patch(patch) , _last_click_x(0) , _last_click_y(0) + , _paste_count(0) , _refresh_menu(false) , _human_names(true) , _show_port_names(true) @@ -632,6 +633,7 @@ PatchCanvas::copy_selection() } string result = serialiser.finish(); + _paste_count = 0; Glib::RefPtr<Gtk::Clipboard> clipboard = Gtk::Clipboard::get(); clipboard->set_text(result); @@ -649,30 +651,51 @@ PatchCanvas::paste() } clear_selection(); + ++_paste_count; Builder builder(*App::instance().engine()); ClientStore clipboard; clipboard.set_plugins(App::instance().store()->plugins()); + + // mkdir -p + string to_create = _patch->path().substr(1); + string created = "/"; clipboard.new_patch("/", _patch->poly()); + size_t first_slash; + while (to_create != "/" && to_create != "" + && (first_slash = to_create.find("/")) != string::npos) { + created += to_create.substr(0, first_slash); + assert(Path::is_valid(created)); + clipboard.new_patch(created, _patch->poly()); + to_create = to_create.substr(first_slash + 1); + } + + if (_patch->path() != "/") + clipboard.new_patch(_patch->path(), _patch->poly()); - ClashAvoider avoider(*App::instance().store().get(), _patch->path(), clipboard, &clipboard); - parser->parse_string(App::instance().world(), &avoider, str, "/", _patch->path()); + boost::optional<Raul::Path> data_path; + boost::optional<Raul::Path> parent; + boost::optional<Raul::Symbol> symbol; + + if (_patch->path() != "/") { + parent = _patch->path(); + } + + ClashAvoider avoider(*App::instance().store().get(), clipboard, &clipboard); + parser->parse_string(App::instance().world(), &avoider, str, "", data_path, + parent, symbol); for (Store::iterator i = clipboard.begin(); i != clipboard.end(); ++i) { - //cout << "************ OBJECT: " << i->first << endl; if (_patch->path() == "/" && i->first == "/") { - //cout << "SKIPPING ROOT " << _patch->path() << " :: " << i->first << endl; - continue; - } else if (i->first.parent() != "/") { - //cout << "SKIPPING NON ROOTED OBJECT " << i->first << endl; + //cout << "Skipping root" << endl; continue; } GraphObject::Variables::iterator x = i->second->variables().find("ingenuity:canvas-x"); if (x != i->second->variables().end()) - x->second = x->second.get_float() + 20.0f; + x->second = x->second.get_float() + (20.0f * _paste_count); GraphObject::Variables::iterator y = i->second->variables().find("ingenuity:canvas-y"); if (y != i->second->variables().end()) - y->second = y->second.get_float() + 20.0f; + y->second = y->second.get_float() + (20.0f * _paste_count); if (i->first.parent() == "/") { GraphObject::Properties::iterator s = i->second->properties().find("ingen:selected"); if (s != i->second->properties().end()) @@ -680,11 +703,11 @@ PatchCanvas::paste() else i->second->properties().insert(make_pair("ingen:selected", true)); } - builder.build(_patch->path(), i->second); + builder.build(i->second); } // Successful connections - SharedPtr<PatchModel> root = PtrCast<PatchModel>(clipboard.object("/")); + SharedPtr<PatchModel> root = PtrCast<PatchModel>(clipboard.object(_patch->path())); assert(root); for (Patch::Connections::const_iterator i = root->connections().begin(); i != root->connections().end(); ++i) { @@ -694,6 +717,7 @@ PatchCanvas::paste() // Orphan connections (just in case...) for (ClientStore::ConnectionRecords::const_iterator i = clipboard.connection_records().begin(); i != clipboard.connection_records().end(); ++i) { + cout << "WARNING: Orphan connection paste: " << i->first << " -> " << i->second << endl; App::instance().engine()->connect(i->first, i->second); } } diff --git a/src/gui/PatchCanvas.hpp b/src/gui/PatchCanvas.hpp index 67553284..f257da4e 100644 --- a/src/gui/PatchCanvas.hpp +++ b/src/gui/PatchCanvas.hpp @@ -128,6 +128,7 @@ private: int _last_click_x; int _last_click_y; + int _paste_count; typedef std::multimap<const std::string, Gtk::Menu*> ClassMenus; ClassMenus _class_menus; diff --git a/src/gui/ThreadedLoader.cpp b/src/gui/ThreadedLoader.cpp index d2bfec76..ec39abf3 100644 --- a/src/gui/ThreadedLoader.cpp +++ b/src/gui/ThreadedLoader.cpp @@ -81,12 +81,12 @@ ThreadedLoader::_whipped() } void -ThreadedLoader::load_patch(bool merge, - const Glib::ustring& data_base_uri, - const Path& data_path, - GraphObject::Variables engine_data, - optional<Path> engine_parent, - optional<Symbol> engine_symbol) +ThreadedLoader::load_patch(bool merge, + const Glib::ustring& document_uri, + optional<Path> data_path, + optional<Path> engine_parent, + optional<Symbol> engine_symbol, + optional<GraphObject::Variables> engine_data) { _mutex.lock(); @@ -99,26 +99,23 @@ ThreadedLoader::load_patch(bool merge, } // Filthy hack to load deprecated patches based on file extension - if (data_base_uri.substr(data_base_uri.length()-3) == ".om") { + if (document_uri.substr(document_uri.length()-3) == ".om") { _events.push_back(sigc::hide_return(sigc::bind( sigc::mem_fun(_deprecated_loader, &DeprecatedLoader::load_patch), - data_base_uri, + document_uri, merge, engine_parent, engine_symbol, - engine_data, + *engine_data, false))); } else { - if (merge && (!engine_parent || engine_parent.get() == "/")) - engine_base = engine_base.substr(0, engine_base.find_last_of("/")); - _events.push_back(sigc::hide_return(sigc::bind( sigc::mem_fun(_parser.get(), &Ingen::Serialisation::Parser::parse_document), App::instance().world(), App::instance().world()->engine.get(), - data_base_uri, // document - data_base_uri + data_path.substr(1), // object URI document - engine_base, + document_uri, + data_path, + engine_parent, engine_symbol, engine_data))); } diff --git a/src/gui/ThreadedLoader.hpp b/src/gui/ThreadedLoader.hpp index fee298d8..50e5deb1 100644 --- a/src/gui/ThreadedLoader.hpp +++ b/src/gui/ThreadedLoader.hpp @@ -57,13 +57,13 @@ class ThreadedLoader : public Raul::Slave public: ThreadedLoader(SharedPtr<EngineInterface> engine); - void load_patch(bool merge, - const Glib::ustring& data_base_uri, - const Path& data_path, - GraphObject::Variables engine_data, - optional<Path> engine_parent = optional<Path>(), - optional<Symbol> engine_symbol = optional<Symbol>()); - + void load_patch(bool merge, + const Glib::ustring& document_uri, + optional<Path> data_path, + optional<Path> engine_parent, + optional<Symbol> engine_symbol, + optional<GraphObject::Variables> engine_data); + void save_patch(SharedPtr<PatchModel> model, const string& filename); SharedPtr<Parser> parser(); |