void renderFilledBorder( const RectI &bounds, const ColorI &borderColor, const ColorI &fillColor ) { RectI fillBounds = bounds; fillBounds.inset( 1, 1 ); GFX->getDrawUtil()->drawRect( bounds, borderColor ); GFX->getDrawUtil()->drawRectFill( fillBounds, fillColor ); }
void renderFilledBorder( const RectI &bounds, const ColorI &borderColor, const ColorI &fillColor, U32 thickness ) { RectI fillBounds = bounds; fillBounds.inset( thickness, thickness ); GFX->getDrawUtil()->drawRectFill( bounds, borderColor ); GFX->getDrawUtil()->drawRectFill( fillBounds, fillColor ); }
void GuiTextListCtrl::onRenderCell(Point2I offset, Point2I cell, bool selected, bool mouseOver) { if ( mList[cell.y].active ) { if (selected || (mProfile->mMouseOverSelected && mouseOver)) { RectI highlightRect = RectI(offset.x, offset.y, mCellSize.x, mCellSize.y); highlightRect.inset( 0, -1 ); renderFilledBorder( highlightRect, mProfile->mBorderColorHL, mProfile->mFillColorHL); GFX->getDrawUtil()->setBitmapModulation(mProfile->mFontColorHL); } else GFX->getDrawUtil()->setBitmapModulation(mouseOver ? mProfile->mFontColorHL : mProfile->mFontColor); } else GFX->getDrawUtil()->setBitmapModulation( mProfile->mFontColorNA ); const char *text = mList[cell.y].text; for(U32 index = 0; index < mColumnOffsets.size(); index++) { const char *nextCol = dStrchr(text, '\t'); if(mColumnOffsets[index] >= 0) { dsize_t slen; if(nextCol) slen = nextCol - text; else slen = dStrlen(text); Point2I pos(offset.x + 4 + mColumnOffsets[index], offset.y); RectI saveClipRect; bool clipped = false; if(mClipColumnText && (index != (mColumnOffsets.size() - 1))) { saveClipRect = GFX->getClipRect(); RectI clipRect(pos, Point2I(mColumnOffsets[index+1] - mColumnOffsets[index] - 4, mCellSize.y)); if(clipRect.intersect(saveClipRect)) { clipped = true; GFX->setClipRect( clipRect ); } } GFX->getDrawUtil()->drawTextN(mFont, pos, text, slen, mProfile->mFontColors); if(clipped) GFX->setClipRect( saveClipRect ); } if(!nextCol) break; text = nextCol+1; } }
// Render out the fixed bitmap borders based on a multiplier into the bitmap array // It renders left and right caps, with a sizable fill area in the middle to reach // the x extent. It does not stretch in the y direction. void renderFixedBitmapBordersFilled( const RectI &bounds, S32 baseMultiplier, GuiControlProfile *profile ) { // Indices into the bitmap array S32 numBitmaps = 3; S32 borderLeft = numBitmaps * baseMultiplier - numBitmaps; S32 fill = 1 + borderLeft; S32 borderRight = 2 + borderLeft; GFXDrawUtil *drawer = GFX->getDrawUtil(); drawer->clearBitmapModulation(); if(profile->mBitmapArrayRects.size() >= (numBitmaps * baseMultiplier)) { RectI destRect; RectI stretchRect; RectI* mBitmapBounds = profile->mBitmapArrayRects.address(); // Draw all corners first. //left border drawer->drawBitmapSR(profile->mTextureObject,Point2I(bounds.point.x,bounds.point.y),mBitmapBounds[borderLeft]); //right border drawer->drawBitmapSR(profile->mTextureObject,Point2I(bounds.point.x + bounds.extent.x - mBitmapBounds[borderRight].extent.x,bounds.point.y),mBitmapBounds[borderRight]); // End drawing corners // Begin drawing fill //fill stretch destRect.point.x = bounds.point.x + mBitmapBounds[borderLeft].extent.x; destRect.extent.x = (bounds.extent.x) - mBitmapBounds[borderLeft].extent.x - mBitmapBounds[borderRight].extent.x; destRect.extent.y = mBitmapBounds[fill].extent.y; destRect.point.y = bounds.point.y; //stretch it stretchRect = mBitmapBounds[fill]; stretchRect.inset(1,0); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); // End drawing fill } }
void GuiSliderCtrl::onRender(Point2I offset, const RectI &updateRect) { Point2I pos(offset.x+mShiftPoint, offset.y); Point2I ext(getWidth() - mShiftExtent, getHeight()); RectI thumb = mThumb; if( mHasTexture ) { if(mTicks > 0) { // TODO: tick marks should be positioned based on the bitmap dimensions. Point2I mid(ext.x, ext.y/2); Point2I oldpos = pos; pos += Point2I(1, 0); PrimBuild::color4f( 0.f, 0.f, 0.f, 1.f ); PrimBuild::begin( GFXLineList, ( mTicks + 2 ) * 2 ); // tick marks for (U32 t = 0; t <= (mTicks+1); t++) { S32 x = (S32)(F32(mid.x+1)/F32(mTicks+1)*F32(t)) + pos.x; S32 y = pos.y + mid.y; PrimBuild::vertex2i(x, y + mShiftPoint); PrimBuild::vertex2i(x, y + mShiftPoint*2 + 2); } PrimBuild::end(); // TODO: it would be nice, if the primitive builder were a little smarter, // so that we could change colors midstream. PrimBuild::color4f(0.9f, 0.9f, 0.9f, 1.0f); PrimBuild::begin( GFXLineList, ( mTicks + 2 ) * 2 ); // tick marks for (U32 t = 0; t <= (mTicks+1); t++) { S32 x = (S32)(F32(mid.x+1)/F32(mTicks+1)*F32(t)) + pos.x + 1; S32 y = pos.y + mid.y + 1; PrimBuild::vertex2i(x, y + mShiftPoint ); PrimBuild::vertex2i(x, y + mShiftPoint * 2 + 3); } PrimBuild::end(); pos = oldpos; } S32 index = SliderButtonNormal; if(mMouseOver) index = SliderButtonHighlight; GFX->getDrawUtil()->clearBitmapModulation(); //left border GFX->getDrawUtil()->drawBitmapSR(mProfile->mTextureObject, Point2I(offset.x,offset.y), mBitmapBounds[SliderLineLeft]); //right border GFX->getDrawUtil()->drawBitmapSR(mProfile->mTextureObject, Point2I(offset.x + getWidth() - mBitmapBounds[SliderLineRight].extent.x, offset.y), mBitmapBounds[SliderLineRight]); //draw our center piece to our slider control's border and stretch it RectI destRect; destRect.point.x = offset.x + mBitmapBounds[SliderLineLeft].extent.x; destRect.extent.x = getWidth() - mBitmapBounds[SliderLineLeft].extent.x - mBitmapBounds[SliderLineRight].extent.x; destRect.point.y = offset.y; destRect.extent.y = mBitmapBounds[SliderLineCenter].extent.y; RectI stretchRect; stretchRect = mBitmapBounds[SliderLineCenter]; stretchRect.inset(1,0); GFX->getDrawUtil()->drawBitmapStretchSR(mProfile->mTextureObject, destRect, stretchRect); //draw our control slider button thumb.point += pos; GFX->getDrawUtil()->drawBitmapSR(mProfile->mTextureObject,Point2I(thumb.point.x,offset.y ),mBitmapBounds[index]); } else if (getWidth() >= getHeight()) { Point2I mid(ext.x, ext.y/2); if(mDisplayValue) mid.set(ext.x, mThumbSize.y/2); PrimBuild::color4f( 0.f, 0.f, 0.f, 1.f ); PrimBuild::begin( GFXLineList, ( mTicks + 2 ) * 2 + 2); // horz rule PrimBuild::vertex2i( pos.x, pos.y + mid.y ); PrimBuild::vertex2i( pos.x + mid.x, pos.y + mid.y ); // tick marks for( U32 t = 0; t <= ( mTicks + 1 ); t++ ) { S32 x = (S32)( F32( mid.x - 1 ) / F32( mTicks + 1 ) * F32( t ) ); PrimBuild::vertex2i( pos.x + x, pos.y + mid.y - mShiftPoint ); PrimBuild::vertex2i( pos.x + x, pos.y + mid.y + mShiftPoint ); } PrimBuild::end(); } else { Point2I mid(ext.x/2, ext.y); PrimBuild::color4f( 0.f, 0.f, 0.f, 1.f ); PrimBuild::begin( GFXLineList, ( mTicks + 2 ) * 2 + 2); // horz rule PrimBuild::vertex2i( pos.x + mid.x, pos.y ); PrimBuild::vertex2i( pos.x + mid.x, pos.y + mid.y ); // tick marks for( U32 t = 0; t <= ( mTicks + 1 ); t++ ) { S32 y = (S32)( F32( mid.y - 1 ) / F32( mTicks + 1 ) * F32( t ) ); PrimBuild::vertex2i( pos.x + mid.x - mShiftPoint, pos.y + y ); PrimBuild::vertex2i( pos.x + mid.x + mShiftPoint, pos.y + y ); } PrimBuild::end(); mDisplayValue = false; } // draw the thumb thumb.point += pos; renderRaisedBox(thumb, mProfile); if(mDisplayValue) { char buf[20]; dSprintf(buf,sizeof(buf),"%0.3f",mValue); Point2I textStart = thumb.point; S32 txt_w = mProfile->mFont->getStrWidth((const UTF8 *)buf); textStart.x += (S32)((thumb.extent.x/2.0f)); textStart.y += thumb.extent.y - 2; //19 textStart.x -= (txt_w/2); if(textStart.x < offset.x) textStart.x = offset.x; else if(textStart.x + txt_w > offset.x+getWidth()) textStart.x -=((textStart.x + txt_w) - (offset.x+getWidth())); GFX->getDrawUtil()->setBitmapModulation(mProfile->mFontColor); GFX->getDrawUtil()->drawText(mProfile->mFont, textStart, buf, mProfile->mFontColors); } renderChildControls(offset, updateRect); }
// Render out the sizable bitmap borders based on a multiplier into the bitmap array // Based on the 'Skinnable GUI Controls in TGE' resource by Justin DuJardin void renderSizableBitmapBordersFilledIndex( const RectI &bounds, S32 startIndex, GuiControlProfile *profile ) { // Indices into the bitmap array S32 numBitmaps = 9; S32 borderTopLeft = startIndex; S32 borderTop = 1 + borderTopLeft; S32 borderTopRight = 2 + borderTopLeft; S32 borderLeft = 3 + borderTopLeft; S32 fill = 4 + borderTopLeft; S32 borderRight = 5 + borderTopLeft; S32 borderBottomLeft = 6 + borderTopLeft; S32 borderBottom = 7 + borderTopLeft; S32 borderBottomRight = 8 + borderTopLeft; GFXDrawUtil *drawer = GFX->getDrawUtil(); drawer->clearBitmapModulation(); if(profile->mBitmapArrayRects.size() >= (startIndex + numBitmaps)) { RectI destRect; RectI stretchRect; RectI* mBitmapBounds = profile->mBitmapArrayRects.address(); // Draw all corners first. //top left border drawer->drawBitmapSR(profile->mTextureObject,Point2I(bounds.point.x,bounds.point.y),mBitmapBounds[borderTopLeft]); //top right border drawer->drawBitmapSR(profile->mTextureObject,Point2I(bounds.point.x + bounds.extent.x - mBitmapBounds[borderTopRight].extent.x,bounds.point.y),mBitmapBounds[borderTopRight]); //bottom left border drawer->drawBitmapSR(profile->mTextureObject,Point2I(bounds.point.x,bounds.point.y + bounds.extent.y - mBitmapBounds[borderBottomLeft].extent.y),mBitmapBounds[borderBottomLeft]); //bottom right border drawer->drawBitmapSR(profile->mTextureObject,Point2I( bounds.point.x + bounds.extent.x - mBitmapBounds[borderBottomRight].extent.x, bounds.point.y + bounds.extent.y - mBitmapBounds[borderBottomRight].extent.y), mBitmapBounds[borderBottomRight]); // End drawing corners // Begin drawing sides and top stretched borders //start with top line stretch destRect.point.x = bounds.point.x + mBitmapBounds[borderTopLeft].extent.x; destRect.extent.x = bounds.extent.x - mBitmapBounds[borderTopRight].extent.x - mBitmapBounds[borderTopLeft].extent.x; destRect.extent.y = mBitmapBounds[borderTop].extent.y; destRect.point.y = bounds.point.y; //stretch it stretchRect = mBitmapBounds[borderTop]; stretchRect.inset(1,0); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); //bottom line stretch destRect.point.x = bounds.point.x + mBitmapBounds[borderBottomLeft].extent.x; destRect.extent.x = bounds.extent.x - mBitmapBounds[borderBottomRight].extent.x - mBitmapBounds[borderBottomLeft].extent.x; destRect.extent.y = mBitmapBounds[borderBottom].extent.y; destRect.point.y = bounds.point.y + bounds.extent.y - mBitmapBounds[borderBottom].extent.y; //stretch it stretchRect = mBitmapBounds[borderBottom]; stretchRect.inset(1,0); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); //left line stretch destRect.point.x = bounds.point.x; destRect.extent.x = mBitmapBounds[borderLeft].extent.x; destRect.extent.y = bounds.extent.y - mBitmapBounds[borderTopLeft].extent.y - mBitmapBounds[borderBottomLeft].extent.y; destRect.point.y = bounds.point.y + mBitmapBounds[borderTopLeft].extent.y; //stretch it stretchRect = mBitmapBounds[borderLeft]; stretchRect.inset(0,1); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); //left line stretch destRect.point.x = bounds.point.x + bounds.extent.x - mBitmapBounds[borderRight].extent.x; destRect.extent.x = mBitmapBounds[borderRight].extent.x; destRect.extent.y = bounds.extent.y - mBitmapBounds[borderTopRight].extent.y - mBitmapBounds[borderBottomRight].extent.y; destRect.point.y = bounds.point.y + mBitmapBounds[borderTopRight].extent.y; //stretch it stretchRect = mBitmapBounds[borderRight]; stretchRect.inset(0,1); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); //fill stretch destRect.point.x = bounds.point.x + mBitmapBounds[borderLeft].extent.x; destRect.extent.x = (bounds.extent.x) - mBitmapBounds[borderLeft].extent.x - mBitmapBounds[borderRight].extent.x; destRect.extent.y = bounds.extent.y - mBitmapBounds[borderTop].extent.y - mBitmapBounds[borderBottom].extent.y; destRect.point.y = bounds.point.y + mBitmapBounds[borderTop].extent.y; //stretch it stretchRect = mBitmapBounds[fill]; stretchRect.inset(1,1); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); // End drawing sides and top stretched borders } }
void renderBorder( const RectI &bounds, GuiControlProfile *profile ) { S32 l = bounds.point.x, r = bounds.point.x + bounds.extent.x - 1; S32 t = bounds.point.y, b = bounds.point.y + bounds.extent.y - 1; GFXDrawUtil *drawer = GFX->getDrawUtil(); switch(profile->mBorder) { case 1: drawer->drawRect(bounds, profile->mBorderColor); break; case 2: drawer->drawLine(l + 1, t + 1, l + 1, b - 2, profile->mBevelColorHL); drawer->drawLine(l + 2, t + 1, r - 2, t + 1, profile->mBevelColorHL); drawer->drawLine(r, t, r, b, profile->mBevelColorHL); drawer->drawLine(l, b, r - 1, b, profile->mBevelColorHL); drawer->drawLine(l, t, r - 1, t, profile->mBorderColorNA); drawer->drawLine(l, t + 1, l, b - 1, profile->mBorderColorNA); drawer->drawLine(l + 1, b - 1, r - 1, b - 1, profile->mBorderColorNA); drawer->drawLine(r - 1, t + 1, r - 1, b - 2, profile->mBorderColorNA); break; case 3: drawer->drawLine(l, b, r, b, profile->mBevelColorHL); drawer->drawLine(r, t, r, b - 1, profile->mBevelColorHL); drawer->drawLine(l + 1, b - 1, r - 1, b - 1, profile->mFillColor); drawer->drawLine(r - 1, t + 1, r - 1, b - 2, profile->mFillColor); drawer->drawLine(l, t, l, b - 1, profile->mBorderColorNA); drawer->drawLine(l + 1, t, r - 1, t, profile->mBorderColorNA); drawer->drawLine(l + 1, t + 1, l + 1, b - 2, profile->mBevelColorLL); drawer->drawLine(l + 2, t + 1, r - 2, t + 1, profile->mBevelColorLL); break; case 4: drawer->drawLine(l, t, l, b - 1, profile->mBevelColorHL); drawer->drawLine(l + 1, t, r, t, profile->mBevelColorHL); drawer->drawLine(l, b, r, b, profile->mBevelColorLL); drawer->drawLine(r, t + 1, r, b - 1, profile->mBevelColorLL); drawer->drawLine(l + 1, b - 1, r - 1, b - 1, profile->mBorderColor); drawer->drawLine(r - 1, t + 1, r - 1, b - 2, profile->mBorderColor); break; case 5: renderFilledBorder( bounds, profile ); break; // case -1: // Draw a simple sizable border with corners // Taken from the 'Skinnable GUI Controls in TGE' resource by Justin DuJardin if(profile->mBitmapArrayRects.size() >= 8) { drawer->clearBitmapModulation(); RectI destRect; RectI stretchRect; RectI* mBitmapBounds = profile->mBitmapArrayRects.address(); // Indices into the bitmap array enum { BorderTopLeft = 0, BorderTop, BorderTopRight, BorderLeft, //Fill, BorderRight, BorderBottomLeft, BorderBottom, BorderBottomRight, NumBitmaps }; // Draw all corners first. //top left border drawer->drawBitmapSR(profile->mTextureObject,Point2I(bounds.point.x,bounds.point.y),mBitmapBounds[BorderTopLeft]); //top right border drawer->drawBitmapSR(profile->mTextureObject,Point2I(bounds.point.x + bounds.extent.x - mBitmapBounds[BorderTopRight].extent.x,bounds.point.y),mBitmapBounds[BorderTopRight]); //bottom left border drawer->drawBitmapSR(profile->mTextureObject,Point2I(bounds.point.x,bounds.point.y + bounds.extent.y - mBitmapBounds[BorderBottomLeft].extent.y),mBitmapBounds[BorderBottomLeft]); //bottom right border drawer->drawBitmapSR(profile->mTextureObject,Point2I( bounds.point.x + bounds.extent.x - mBitmapBounds[BorderBottomRight].extent.x, bounds.point.y + bounds.extent.y - mBitmapBounds[BorderBottomRight].extent.y), mBitmapBounds[BorderBottomRight]); // End drawing corners // Begin drawing sides and top stretched borders //start with top line stretch destRect.point.x = bounds.point.x + mBitmapBounds[BorderTopLeft].extent.x; destRect.extent.x = bounds.extent.x - mBitmapBounds[BorderTopRight].extent.x - mBitmapBounds[BorderTopLeft].extent.x; destRect.extent.y = mBitmapBounds[BorderTop].extent.y; destRect.point.y = bounds.point.y; //stretch it stretchRect = mBitmapBounds[BorderTop]; stretchRect.inset(1,0); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); //bottom line stretch destRect.point.x = bounds.point.x + mBitmapBounds[BorderBottomLeft].extent.x; destRect.extent.x = bounds.extent.x - mBitmapBounds[BorderBottomRight].extent.x - mBitmapBounds[BorderBottomLeft].extent.x; destRect.extent.y = mBitmapBounds[BorderBottom].extent.y; destRect.point.y = bounds.point.y + bounds.extent.y - mBitmapBounds[BorderBottom].extent.y; //stretch it stretchRect = mBitmapBounds[BorderBottom]; stretchRect.inset(1,0); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); //left line stretch destRect.point.x = bounds.point.x; destRect.extent.x = mBitmapBounds[BorderLeft].extent.x; destRect.extent.y = bounds.extent.y - mBitmapBounds[BorderTopLeft].extent.y - mBitmapBounds[BorderBottomLeft].extent.y; destRect.point.y = bounds.point.y + mBitmapBounds[BorderTopLeft].extent.y; //stretch it stretchRect = mBitmapBounds[BorderLeft]; stretchRect.inset(0,1); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); //right line stretch destRect.point.x = bounds.point.x + bounds.extent.x - mBitmapBounds[BorderRight].extent.x; destRect.extent.x = mBitmapBounds[BorderRight].extent.x; destRect.extent.y = bounds.extent.y - mBitmapBounds[BorderTopRight].extent.y - mBitmapBounds[BorderBottomRight].extent.y; destRect.point.y = bounds.point.y + mBitmapBounds[BorderTopRight].extent.y; //stretch it stretchRect = mBitmapBounds[BorderRight]; stretchRect.inset(0,1); //draw it drawer->drawBitmapStretchSR(profile->mTextureObject,destRect,stretchRect); // End drawing sides and top stretched borders break; } case -2: // Draw a simple sizable border with corners that is filled in renderSizableBitmapBordersFilled(bounds, 1, profile); break; case -3: // Draw a simple fixed height border with center fill horizontally. renderFixedBitmapBordersFilled( bounds, 1, profile ); break; } }
void GuiFormCtrl::onRender(Point2I offset, const RectI &updateRect) { // Fill in the control's child area RectI boundsRect(offset, getExtent()); boundsRect.point.y += mThumbSize.y; boundsRect.extent.y -= mThumbSize.y; // draw the border of the form if specified if (mProfile->mOpaque) GFX->getDrawUtil()->drawRectFill(boundsRect, mProfile->mFillColor); if (mProfile->mBorder) renderBorder(boundsRect, mProfile); // If we don't have a child, put some text in the child area if( empty() ) { GFX->getDrawUtil()->setBitmapModulation(ColorI(0,0,0)); renderJustifiedText(boundsRect.point, boundsRect.extent, "[none]"); } S32 textWidth = 0; // Draw our little bar, too if (mProfile->mBitmapArrayRects.size() >= 5) { //GFX->getDrawUtil()->clearBitmapModulation(); // Copyright (C) 2013 WinterLeaf Entertainment LLC. S32 barStart = offset.x + textWidth; S32 barTop = mThumbSize.y / 2 + offset.y - mProfile->mBitmapArrayRects[3].extent.y / 2; Point2I barOffset(barStart, barTop); // Draw the start of the bar... GFX->getDrawUtil()->drawBitmapStretchSR(mProfile->mTextureObject ,RectI(barOffset, mProfile->mBitmapArrayRects[2].extent), mProfile->mBitmapArrayRects[2] ); // Now draw the middle... barOffset.x += mProfile->mBitmapArrayRects[2].extent.x; S32 barMiddleSize = (getExtent().x - (barOffset.x - offset.x)) - mProfile->mBitmapArrayRects[4].extent.x + 1; if (barMiddleSize > 0) { // We have to do this inset to prevent nasty stretching artifacts RectI foo = mProfile->mBitmapArrayRects[3]; foo.inset(1,0); GFX->getDrawUtil()->drawBitmapStretchSR( mProfile->mTextureObject, RectI(barOffset, Point2I(barMiddleSize, mProfile->mBitmapArrayRects[3].extent.y)), foo ); } // And the end barOffset.x += barMiddleSize; GFX->getDrawUtil()->drawBitmapStretchSR( mProfile->mTextureObject, RectI(barOffset, mProfile->mBitmapArrayRects[4].extent), mProfile->mBitmapArrayRects[4]); GFX->getDrawUtil()->setBitmapModulation((mMouseOver ? mProfile->mFontColorHL : mProfile->mFontColor)); renderJustifiedText(Point2I(mThumbSize.x, 0) + offset, Point2I(getWidth() - mThumbSize.x - mProfile->mBitmapArrayRects[4].extent.x, mThumbSize.y), (mUseSmallCaption ? mSmallCaption : mCaption) ); } // Render the children renderChildControls(offset, updateRect); }
bool GuiSplitContainer::layoutControls( RectI &clientRect ) { if ( size() < 2 ) return false; GuiContainer *panelOne = dynamic_cast<GuiContainer*>( at(0) ); GuiContainer *panelTwo = dynamic_cast<GuiContainer*>( at(1) ); // AssertFatal( panelOne && panelTwo, "GuiSplitContainer::layoutControl - Missing/Invalid Subordinate Controls! Split contained controls must derive from GuiContainer!" ); RectI panelOneRect = RectI( clientRect.point, Point2I( 0, 0 ) ); RectI panelTwoRect; RectI splitRect; solvePanelConstraints( getSplitPoint(), panelOne, panelTwo, clientRect ); switch( mOrientation ) { case Horizontal: panelOneRect.extent = Point2I( clientRect.extent.x, getSplitPoint().y ); panelTwoRect = panelOneRect; panelTwoRect.intersect( clientRect ); panelTwoRect.point.y = panelOneRect.extent.y; panelTwoRect.extent.y = clientRect.extent.y - panelOneRect.extent.y; // Generate new Splitter Rectangle splitRect = panelTwoRect; splitRect.extent.y = 0; splitRect.inset( 0, -mSplitterSize ); panelOneRect.extent.y -= mSplitterSize; panelTwoRect.point.y += mSplitterSize; panelTwoRect.extent.y -= mSplitterSize; break; case Vertical: panelOneRect.extent = Point2I( getSplitPoint().x, clientRect.extent.y ); panelTwoRect = panelOneRect; panelTwoRect.intersect( clientRect ); panelTwoRect.point.x = panelOneRect.extent.x; panelTwoRect.extent.x = clientRect.extent.x - panelOneRect.extent.x; // Generate new Splitter Rectangle splitRect = panelTwoRect; splitRect.extent.x = 0; splitRect.inset( -mSplitterSize, 0 ); panelOneRect.extent.x -= mSplitterSize; panelTwoRect.point.x += mSplitterSize; panelTwoRect.extent.x -= mSplitterSize; break; } // Update Split Rect mSplitRect = splitRect; // Dock Appropriately if( !( mFixedPanel == FirstPanel && !panelOne->isVisible() ) ) dockControl( panelOne, panelOne->getDocking(), panelOneRect ); if( !( mFixedPanel == FirstPanel && !panelTwo->isVisible() ) ) dockControl( panelTwo, panelOne->getDocking(), panelTwoRect ); // return false; }
void GuiPaneControl::onRender(Point2I offset, const RectI &updateRect) { // Render our awesome little doogong if(mProfile->mBitmapArrayRects.size() >= 2 && mCollapsable) { S32 idx = mCollapsed ? 0 : 1; GFX->getDrawUtil()->clearBitmapModulation(); GFX->getDrawUtil()->drawBitmapStretchSR( mProfile->mTextureObject, RectI(offset, mProfile->mBitmapArrayRects[idx].extent), mProfile->mBitmapArrayRects[idx] ); } S32 textWidth = 0; if(!mBarBehindText) { GFX->getDrawUtil()->setBitmapModulation((mMouseOver ? mProfile->mFontColorHL : mProfile->mFontColor)); textWidth = GFX->getDrawUtil()->drawText( mProfile->mFont, Point2I(mThumbSize.x, 0) + offset, mCaption, mProfile->mFontColors ); } // Draw our little bar, too if(mProfile->mBitmapArrayRects.size() >= 5) { GFX->getDrawUtil()->clearBitmapModulation(); S32 barStart = mThumbSize.x + offset.x + textWidth; S32 barTop = mThumbSize.y/2 + offset.y - mProfile->mBitmapArrayRects[3].extent.y /2; Point2I barOffset(barStart, barTop); // Draw the start of the bar... GFX->getDrawUtil()->drawBitmapStretchSR( mProfile->mTextureObject, RectI(barOffset, mProfile->mBitmapArrayRects[2].extent), mProfile->mBitmapArrayRects[2] ); // Now draw the middle... barOffset.x += mProfile->mBitmapArrayRects[2].extent.x; S32 barMiddleSize = (getExtent().x - (barOffset.x - offset.x)) - mProfile->mBitmapArrayRects[4].extent.x; if(barMiddleSize>0) { // We have to do this inset to prevent nasty stretching artifacts RectI foo = mProfile->mBitmapArrayRects[3]; foo.inset(1,0); GFX->getDrawUtil()->drawBitmapStretchSR( mProfile->mTextureObject, RectI(barOffset, Point2I(barMiddleSize, mProfile->mBitmapArrayRects[3].extent.y)), foo ); } // And the end barOffset.x += barMiddleSize; GFX->getDrawUtil()->drawBitmapStretchSR( mProfile->mTextureObject, RectI(barOffset, mProfile->mBitmapArrayRects[4].extent), mProfile->mBitmapArrayRects[4] ); } if(mBarBehindText) { GFX->getDrawUtil()->setBitmapModulation((mMouseOver ? mProfile->mFontColorHL : mProfile->mFontColor)); GFX->getDrawUtil()->drawText( mProfile->mFont, Point2I(mThumbSize.x, 0) + offset, mCaption, mProfile->mFontColors ); } // Draw child controls if appropriate if(!mCollapsed) renderChildControls(offset, updateRect); }