GafferScene::PathMatcher expandDescendants( Context *context, const GafferScene::PathMatcher &paths, const ScenePlug *scene, int depth ) { GafferScene::PathMatcherData *expandedPaths = const_cast<GafferScene::PathMatcherData *>( context->get<GafferScene::PathMatcherData>( g_expandedPathsName, nullptr ) ); if( !expandedPaths ) { expandedPaths = new GafferScene::PathMatcherData(); context->set( g_expandedPathsName, expandedPaths ); } GafferScene::PathMatcher &expanded = expandedPaths->writable(); bool needUpdate = false; GafferScene::PathMatcher leafPaths; // \todo: parallelize the walk for( GafferScene::PathMatcher::Iterator it = paths.begin(), eIt = paths.end(); it != eIt; ++it ) { needUpdate |= expandWalk( *it, scene, depth + 1, expanded, leafPaths ); } if( needUpdate ) { // We modified the expanded paths in place to avoid unecessary copying, // so the context doesn't know they've changed. So we emit the changed // signal ourselves context->changedSignal()( context, g_expandedPathsName ); } return leafPaths; }
void expand( Context *context, const PathMatcher &paths, bool expandAncestors ) { GafferScene::PathMatcherData *expandedPaths = const_cast<GafferScene::PathMatcherData *>( context->get<GafferScene::PathMatcherData>( g_expandedPathsName, nullptr ) ); if( !expandedPaths ) { expandedPaths = new GafferScene::PathMatcherData(); context->set( g_expandedPathsName, expandedPaths ); } GafferScene::PathMatcher &expanded = expandedPaths->writable(); bool needUpdate = false; if( expandAncestors ) { for( GafferScene::PathMatcher::RawIterator it = paths.begin(), eIt = paths.end(); it != eIt; ++it ) { needUpdate |= expanded.addPath( *it ); } } else { for( GafferScene::PathMatcher::Iterator it = paths.begin(), eIt = paths.end(); it != eIt; ++it ) { needUpdate |= expanded.addPath( *it ); } } if( needUpdate ) { // We modified the expanded paths in place to avoid unecessary copying, // so the context doesn't know they've changed. So we emit the changed // signal ourselves context->changedSignal()( context, g_expandedPathsName ); } }
void SceneView::collapseSelection() { RenderableGadget::Selection &selection = m_renderableGadget->getSelection(); if( !selection.size() ) { return; } set<string> pathsToSelect; vector<const string *> pathsToDeselect; GafferScene::PathMatcherData *expandedData = expandedPaths(); PathMatcher &expanded = expandedData->writable(); for( RenderableGadget::Selection::const_iterator it = selection.begin(), eIt = selection.end(); it != eIt; it++ ) { if( !expanded.removePath( *it ) ) { if( *it == "/" ) { continue; } pathsToDeselect.push_back( &(*it) ); std::string parentPath( *it, 0, it->rfind( '/' ) ); if( parentPath == "" ) { parentPath = "/"; } expanded.removePath( parentPath ); pathsToSelect.insert( parentPath ); } } for( set<string>::const_iterator it = pathsToSelect.begin(), eIt = pathsToSelect.end(); it != eIt; it++ ) { selection.insert( *it ); } for( vector<const string *>::const_iterator it = pathsToDeselect.begin(), eIt = pathsToDeselect.end(); it != eIt; it++ ) { selection.erase( **it ); } // see comment in expandSelection(). getContext()->changedSignal()( getContext(), "ui:scene:expandedPaths" ); // and this will trigger a selection update also via contextChanged(). transferSelectionToContext(); }
void SceneView::collapseSelection() { PathMatcher &selection = const_cast<GafferScene::PathMatcherData *>( m_sceneGadget->getSelection() )->writable(); std::vector<string> toCollapse; selection.paths( toCollapse ); if( !toCollapse.size() ) { return; } GafferScene::PathMatcherData *expandedData = expandedPaths(); PathMatcher &expanded = expandedData->writable(); for( vector<string>::const_iterator it = toCollapse.begin(), eIt = toCollapse.end(); it != eIt; ++it ) { /// \todo It would be nice to be able to get ScenePaths out of /// PathMatcher::paths() directly. ScenePlug::ScenePath path; ScenePlug::stringToPath( *it, path ); if( !expanded.removePath( path ) ) { if( path.size() <= 1 ) { continue; } selection.removePath( path ); path.pop_back(); // now the parent path expanded.removePath( path ); selection.addPath( path ); } } // See comment in expandSelection(). getContext()->changedSignal()( getContext(), "ui:scene:expandedPaths" ); // See comment in expandSelection(). transferSelectionToContext(); }