void SoBoxSelectionRenderAction::apply(SoNode * node) { SoGLRenderAction::apply(node); if (this->hlVisible) { if (PRIVATE(this)->searchaction == NULL) { PRIVATE(this)->searchaction = new SoSearchAction; } PRIVATE(this)->searchaction->setType(SoFCSelection::getClassTypeId()); PRIVATE(this)->searchaction->setInterest(SoSearchAction::ALL); PRIVATE(this)->searchaction->apply(node); const SoPathList & pathlist = PRIVATE(this)->searchaction->getPaths(); if (pathlist.getLength() > 0) { for (int i = 0; i < pathlist.getLength(); i++ ) { SoPath * path = pathlist[i]; assert(path); SoFCSelection * selection = (SoFCSelection *) path->getTail(); assert(selection->getTypeId().isDerivedFrom(SoFCSelection::getClassTypeId())); if (selection->selected.getValue() && selection->style.getValue() == SoFCSelection::BOX) { PRIVATE(this)->basecolor->rgb.setValue(selection->colorSelection.getValue()); if (PRIVATE(this)->selectsearch == NULL) { PRIVATE(this)->selectsearch = new SoSearchAction; } PRIVATE(this)->selectsearch->setType(SoShape::getClassTypeId()); PRIVATE(this)->selectsearch->setInterest(SoSearchAction::FIRST); PRIVATE(this)->selectsearch->apply(selection); SoPath* shapepath = PRIVATE(this)->selectsearch->getPath(); if (shapepath) { SoPathList list; list.append(shapepath); this->drawBoxes(path, &list); } PRIVATE(this)->selectsearch->reset(); } else if (selection->isHighlighted() && selection->selected.getValue() == SoFCSelection::NOTSELECTED && selection->style.getValue() == SoFCSelection::BOX) { PRIVATE(this)->basecolor->rgb.setValue(selection->colorHighlight.getValue()); if (PRIVATE(this)->selectsearch == NULL) { PRIVATE(this)->selectsearch = new SoSearchAction; } PRIVATE(this)->selectsearch->setType(SoShape::getClassTypeId()); PRIVATE(this)->selectsearch->setInterest(SoSearchAction::FIRST); PRIVATE(this)->selectsearch->apply(selection); SoPath* shapepath = PRIVATE(this)->selectsearch->getPath(); if (shapepath) { SoPathList list; list.append(shapepath); PRIVATE(this)->highlightPath = path; PRIVATE(this)->highlightPath->ref(); this->drawBoxes(path, &list); } PRIVATE(this)->selectsearch->reset(); } } } PRIVATE(this)->searchaction->reset(); } }
void SoBoxSelectionRenderAction::apply(SoPath * path) { SoGLRenderAction::apply(path); SoNode* node = path->getTail(); if (node && node->getTypeId() == SoFCSelection::getClassTypeId()) { SoFCSelection * selection = (SoFCSelection *) node; // This happens when dehighlighting the current shape if (PRIVATE(this)->highlightPath == path) { PRIVATE(this)->highlightPath->unref(); PRIVATE(this)->highlightPath = 0; // FIXME: Doing a redraw to remove the shown bounding box causes // some problems when moving the mouse from one shape to another // because this will destroy the box immediately selection->touch(); // force a redraw when dehighlighting } else if (selection->isHighlighted() && selection->selected.getValue() == SoFCSelection::NOTSELECTED && selection->style.getValue() == SoFCSelection::BOX) { PRIVATE(this)->basecolor->rgb.setValue(selection->colorHighlight.getValue()); if (PRIVATE(this)->selectsearch == NULL) { PRIVATE(this)->selectsearch = new SoSearchAction; } PRIVATE(this)->selectsearch->setType(SoShape::getClassTypeId()); PRIVATE(this)->selectsearch->setInterest(SoSearchAction::FIRST); PRIVATE(this)->selectsearch->apply(selection); SoPath* shapepath = PRIVATE(this)->selectsearch->getPath(); if (shapepath) { SoPathList list; list.append(shapepath); PRIVATE(this)->highlightPath = path; PRIVATE(this)->highlightPath->ref(); this->drawBoxes(path, &list); } PRIVATE(this)->selectsearch->reset(); } } }