summaryrefslogtreecommitdiffstats
path: root/src/progs/ingenuity/BreadCrumbBox.cpp
diff options
context:
space:
mode:
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);
}