void StGLSwitchTextured::setVisibility(bool isVisible, bool isForce) { // setup opacity StGLWidget::setVisibility(isVisible, isForce); for(StGLWidget* aChild = getChildren()->getStart(); aChild != NULL; aChild = aChild->getNext()) { aChild->setVisibility(isVisible, isForce); } }
void StGLMenu::stglResize() { // Since all children should be StGLMenuItem implementing delayed resize, // just postpone resize until items will be actually rendered. //StGLWidget::stglResize(); for(StGLWidget* aChild = getChildren()->getStart(); aChild != NULL; aChild = aChild->getNext()) { ((StGLMenuItem* )aChild)->changeRectPx(); } StGLContext& aCtx = getContext(); StArray<StGLVec2> aVertices(4); getRectGl(aVertices); myVertexBuf.init(aCtx, aVertices); if(myToDrawBounds) { StRectI_t aRectBnd = getRectPxAbsolute(); aRectBnd.left() -= 1; aRectBnd.right() += 1; aRectBnd.top() -= 1; aRectBnd.bottom() += 1; myRoot->getRectGl(aRectBnd, aVertices); myVertexBndBuf.init(aCtx, aVertices); } myIsResized = false; }
bool StGLMenu::tryUnClick(const StClickEvent& theEvent, bool& theIsItemUnclicked) { myKeepActive = false; bool wasSomeClickedBefore = theIsItemUnclicked; bool isSelfClicked = StGLWidget::tryUnClick(theEvent, theIsItemUnclicked); bool isSelfItemClicked = !wasSomeClickedBefore && theIsItemUnclicked; if(myKeepActive) { return isSelfClicked; } for(StGLWidget* aChild = getChildren()->getStart(); aChild != NULL; aChild = aChild->getNext()) { StGLMenuItem* anItem = (StGLMenuItem* )aChild; if(anItem->hasSubMenu() && anItem->getSubMenu()->myKeepActive) { myKeepActive = true; return isSelfClicked; } anItem->setSelected(false); } if(myIsRootMenu && !isSelfItemClicked) { setActive(false); // deactivate root menu } if(myIsContextual) { myRoot->destroyWithDelay(this); } return isSelfClicked; }
void StGLMenu::stglUpdateSubmenuLayout() { stglInit(); for(StGLWidget* aChild = getChildren()->getStart(); aChild != NULL; aChild = aChild->getNext()) { StGLMenuItem* aMenuItem = (StGLMenuItem* )aChild; if(aMenuItem->getSubMenu() != NULL) { aMenuItem->getSubMenu()->stglUpdateSubmenuLayout(); } } }
void StGLMenu::setOpacity(const float theOpacity, bool theToSetChildren) { bool wasVisible = StGLMenu::isVisible(); StGLWidget::setOpacity(theOpacity, theToSetChildren); if(!StGLMenu::isVisible() && wasVisible) { for(StGLWidget* aChild = getChildren()->getStart(); aChild != NULL; aChild = aChild->getNext()) { ((StGLMenuItem* )aChild)->setSelected(false); } } }
bool StGLWidget::isChild(StGLWidget* theWidget, const bool theIsRecursive) { for(StGLWidget* aChild = myChildren.getStart(); aChild != NULL; aChild = aChild->getNext()) { if(aChild == theWidget) { return true; } else if(theIsRecursive && aChild->isChild(theWidget, true)) { return true; } } return false; }
bool StGLSwitchTextured::tryUnClick(const StPointD_t& theCursorZo, const int& theMouseBtn, bool& isItemUnclicked) { if(!isVisible()) { return false; // nothing to see - nothing to click... } bool isSelfClicked = isClicked(theMouseBtn) && isPointIn(theCursorZo); setClicked(theMouseBtn, false); if(!isItemUnclicked && isSelfClicked) { isItemUnclicked = true; int32_t anActiveValue = myTrackValue->getValue(); StGLRadioButtonTextured* aRadioBtn = NULL; for(StGLWidget* aChild = getChildren()->getStart(); aChild != NULL;) { /// TODO (Kirill Gavrilov#9) - adding children with another type is not allowed /// hovewer not protected thus this cast is not thread-safe! aRadioBtn = (StGLRadioButtonTextured* )aChild; aChild = aChild->getNext(); if(anActiveValue == aRadioBtn->getValueOn()) { // switch to next while(aChild != NULL) { aRadioBtn = (StGLRadioButtonTextured* )aChild; if(!mySkipValues.contains(aRadioBtn->getValueOn())) { myTrackValue->setValue(aRadioBtn->getValueOn()); break; } aChild = aChild->getNext(); } if(aChild == NULL) { // switch to first aRadioBtn = (StGLRadioButtonTextured* )getChildren()->getStart(); myTrackValue->setValue(aRadioBtn->getValueOn()); } break; } } return true; } return false; }
void StGLSwitchTextured::stglDraw(unsigned int theView) { if(!isVisible()) { return; } int32_t anActiveValue = myTrackValue->getValue(); StGLRadioButtonTextured* aRadioBtn = NULL; for(StGLWidget* aChild = getChildren()->getStart(); aChild != NULL;) { /// TODO (Kirill Gavrilov#9) - adding children with another type is not allowed /// hovewer not protected thus this cast is not thread-safe! aRadioBtn = (StGLRadioButtonTextured* )aChild; aChild = aChild->getNext(); // show only active item if(anActiveValue == aRadioBtn->getValueOn()) { aRadioBtn->stglDraw(theView); return; } } // show first item anyway StGLWidget* aChild = getChildren()->getStart(); if(aChild != NULL) { aChild->stglDraw(theView); } }
inline void setClickedWithChildren(StGLWidgetList& theList, const int theMouseBtn, bool isClicked) { for(StGLWidget* aChild = theList.getStart(); aChild != NULL; aChild = aChild->getNext()) { aChild->setClicked(theMouseBtn, isClicked); setClickedWithChildren(*aChild->getChildren(), theMouseBtn, isClicked); } }
void StGLMenu::DeleteWithSubMenus(StGLMenu* theMenu) { if(theMenu == NULL) { return; } for(StGLWidget* aChild = theMenu->getChildren()->getStart(); aChild != NULL; aChild = aChild->getNext()) { StGLMenuItem* anItem = (StGLMenuItem* )aChild; if(anItem->getSubMenu() != NULL) { DeleteWithSubMenus(anItem->getSubMenu()); } } delete theMenu; }
bool StGLMenu::stglInit() { myWidth = 0; myIsInitialized = StGLWidget::stglInit(); if(!myIsInitialized) { return false; } int aMarginLeft = 0; for(StGLWidget* aChild = getChildren()->getStart(); aChild != NULL; aChild = aChild->getNext()) { StGLMenuItem* anItem = (StGLMenuItem* )aChild; aMarginLeft = stMax(aMarginLeft, anItem->getMargins().left); int anItemW = anItem->getMargins().left + anItem->computeTextWidth() + anItem->getMargins().right; if(myOrient == MENU_HORIZONTAL) { anItem->changeRectPx().moveLeftTo(myWidth); anItem->changeRectPx().right() = anItem->getRectPx().left() + anItemW; anItem->setTextWidth(anItemW - anItem->getMargins().left); myWidth += anItemW; } else { myWidth = stMax(myWidth, anItemW); } if(anItem->getSubMenu() != NULL) { if(myOrient == MENU_HORIZONTAL) { anItem->getSubMenu()->changeRectPx().moveTopLeftTo(anItem->getRectPxAbsolute().left(), anItem->getRectPxAbsolute().bottom()); } else if(myOrient == MENU_VERTICAL || myOrient == MENU_VERTICAL_COMPACT) { anItem->getSubMenu()->changeRectPx().moveTopLeftTo(anItem->getRectPxAbsolute().right() - myRoot->scale(10), anItem->getRectPxAbsolute().top()); } } } StGLWidget* aChildLast = getChildren()->getLast(); if(aChildLast != NULL) { changeRectPx().right() = getRectPx().left() + aChildLast->getRectPx().right(); changeRectPx().bottom() = getRectPx().top() + aChildLast->getRectPx().bottom(); } int aWidth = stMax(myWidthMin, myWidth); if(myOrient == MENU_VERTICAL || myOrient == MENU_VERTICAL_COMPACT) { changeRectPx().right() = getRectPx().left() + aWidth; int anItemCount = 0; for(StGLWidget* aChild = getChildren()->getStart(); aChild != NULL; aChild = aChild->getNext(), ++anItemCount) { StGLMenuItem* anItem = (StGLMenuItem* )aChild; anItem->changeRectPx().moveTopTo(anItemCount * myItemHeight); anItem->changeRectPx().right() = anItem->getRectPx().left() + aWidth; anItem->setTextWidth(aWidth); if(anItem->getSubMenu() != NULL) { anItem->getSubMenu()->changeRectPx().moveTopLeftTo(getRectPxAbsolute().right() - myRoot->scale(10), anItem->getRectPxAbsolute().top()); } } changeRectPx().bottom() = getRectPx().top() + anItemCount * myItemHeight; } // already initialized? if(myVertexBuf.isValid()) { // synchronize menu items visibility setOpacity(myOpacity, true); return true; } stglResize(); return myIsInitialized; }