summaryrefslogtreecommitdiffstats
path: root/src/progs/ingenuity/BreadCrumbBox.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2006-09-13 06:11:25 +0000
committerDavid Robillard <d@drobilla.net>2006-09-13 06:11:25 +0000
commite5675ebfeb93175e16762d0a078bd51d15d05f63 (patch)
tree189249ed9014e4c482cfaed0d6af28ced68570ca /src/progs/ingenuity/BreadCrumbBox.cpp
parent23b7568ab7a87a79c186b8ddf3d3db4f1f934b06 (diff)
downloadingen-e5675ebfeb93175e16762d0a078bd51d15d05f63.tar.gz
ingen-e5675ebfeb93175e16762d0a078bd51d15d05f63.tar.bz2
ingen-e5675ebfeb93175e16762d0a078bd51d15d05f63.zip
Heavy-duty redesign of client library and GUI (now fully signal driven with clean Model/View separation).
Smarter, centralized window creation/management (should make window unification easy (panes?)). Typed metadata system, no more fugly string conversion of floats. Supports OSC fundamental types string, int, float, blob for now (though blob isn't working over the wire yet). git-svn-id: http://svn.drobilla.net/lad/ingen@131 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/progs/ingenuity/BreadCrumbBox.cpp')
-rw-r--r--src/progs/ingenuity/BreadCrumbBox.cpp58
1 files changed, 48 insertions, 10 deletions
diff --git a/src/progs/ingenuity/BreadCrumbBox.cpp b/src/progs/ingenuity/BreadCrumbBox.cpp
index aea1cdf0..8dc0b8a0 100644
--- a/src/progs/ingenuity/BreadCrumbBox.cpp
+++ b/src/progs/ingenuity/BreadCrumbBox.cpp
@@ -34,7 +34,7 @@ BreadCrumbBox::BreadCrumbBox()
* children preserved.
*/
void
-BreadCrumbBox::build(Path path)
+BreadCrumbBox::build(Path path, CountedPtr<PatchView> view)
{
bool old_enable_signal = _enable_signal;
_enable_signal = false;
@@ -42,14 +42,39 @@ BreadCrumbBox::build(Path path)
// Moving to a path we already contain, just switch the active button
if (_breadcrumbs.size() > 0 && (path.is_parent_of(_full_path) || path == _full_path)) {
- for (std::list<BreadCrumb*>::iterator i = _breadcrumbs.begin(); i != _breadcrumbs.end(); ++i)
- (*i)->set_active( ((*i)->path() == path) );
+ for (std::list<BreadCrumb*>::iterator i = _breadcrumbs.begin(); i != _breadcrumbs.end(); ++i) {
+ if ((*i)->path() == path) {
+ (*i)->set_active(true);
+ (*i)->set_view(view);
+ } else {
+ (*i)->set_active(false);
+ }
+ }
_active_path = path;
_enable_signal = old_enable_signal;
return;
}
+ // Moving to a child of the full path, just append crumbs (preserve view cache)
+ if (_breadcrumbs.size() > 0 && (path.is_child_of(_full_path))) {
+ string postfix = path.substr(_full_path.length());
+ while (postfix.length() > 0) {
+ const string name = postfix.substr(0, postfix.find("/"));
+ cerr << "NAME: " << name << endl;
+ _full_path = _full_path.base() + name;
+ BreadCrumb* but = create_crumb(_full_path, view);
+ pack_end(*but, false, false, 1);
+ _breadcrumbs.push_back(but);
+ if (postfix.find("/") == string::npos)
+ break;
+ else
+ postfix = postfix.substr(postfix.find("/")+1);
+ }
+ }
+
+ // Getting here is bad unless absolutely necessary, since the PatchView cache is lost
+
// Otherwise rebuild from scratch
_full_path = path;
_active_path = path;
@@ -60,18 +85,14 @@ BreadCrumbBox::build(Path path)
_breadcrumbs.clear();
// Add root
- BreadCrumb* but = manage(new BreadCrumb("/"));
- but->signal_toggled().connect(sigc::bind(sigc::mem_fun(
- this, &BreadCrumbBox::breadcrumb_clicked), but));
+ BreadCrumb* but = create_crumb("/", view);
pack_start(*but, false, false, 1);
_breadcrumbs.push_front(but);
but->set_active(but->path() == _active_path);
// Add the others
while (path != "/") {
- BreadCrumb* but = manage(new BreadCrumb(path));
- but->signal_toggled().connect(sigc::bind(sigc::mem_fun(
- this, &BreadCrumbBox::breadcrumb_clicked), but));
+ BreadCrumb* but = create_crumb(path, view);
pack_start(*but, false, false, 1);
_breadcrumbs.push_front(but);
but->set_active(but->path() == _active_path);
@@ -84,6 +105,23 @@ BreadCrumbBox::build(Path path)
}
+/** Create a new crumb, assigning it a reference to @a view if their paths
+ * match, otherwise ignoring @a view.
+ */
+BreadCrumb*
+BreadCrumbBox::create_crumb(const Path& path,
+ CountedPtr<PatchView> view)
+{
+ BreadCrumb* but = manage(new BreadCrumb(path,
+ (view && path == view->patch()->path()) ? view : CountedPtr<PatchView>()));
+
+ but->signal_toggled().connect(sigc::bind(sigc::mem_fun(
+ this, &BreadCrumbBox::breadcrumb_clicked), but));
+
+ return but;
+}
+
+
void
BreadCrumbBox::breadcrumb_clicked(BreadCrumb* crumb)
{
@@ -95,7 +133,7 @@ BreadCrumbBox::breadcrumb_clicked(BreadCrumb* crumb)
// Tried to turn off the current active button, bad user!
crumb->set_active(true);
} else {
- signal_patch_selected.emit(crumb->path());
+ signal_patch_selected.emit(crumb->path(), crumb->view());
if (crumb->path() != _active_path)
crumb->set_active(false);
}