void GuiRolloutCtrl::onRender( Point2I offset, const RectI &updateRect ) { if( !mProfile || mProfile->mFont == NULL ) return; // Calculate actual world bounds for rendering RectI worldBounds( offset, getExtent() ); // if opaque, fill the update rect with the fill color if ( mProfile->mOpaque ) GFX->getDrawUtil()->drawRectFill( worldBounds, mProfile->mFillColor ); if ( mProfile->mBitmapArrayRects.size() >= NumBitmaps ) { GFX->getDrawUtil()->clearBitmapModulation(); // Draw Rollout From Skin if ( !mIsExpanded && !mIsAnimating ) renderFixedBitmapBordersFilled( worldBounds, 1, mProfile ); else if ( mHideHeader ) renderSizableBitmapBordersFilledIndex( worldBounds, MidPageLeft, mProfile ); else renderSizableBitmapBordersFilledIndex( worldBounds, TopLeftHeader, mProfile ); } if ( !(mIsExpanded && mHideHeader ) ) { // Draw Caption ( Vertically Centered ) ColorI currColor; GFX->getDrawUtil()->getBitmapModulation( &currColor ); Point2I textPosition = mHeader.point + offset + mProfile->mTextOffset; GFX->getDrawUtil()->setBitmapModulation( mProfile->mFontColor ); renderJustifiedText( textPosition, mHeader.extent, mCaption ); GFX->getDrawUtil()->setBitmapModulation( currColor ); } // If we're collapsed we contain the first child as our content // thus we don't render it when collapsed. but to support modified // rollouts with custom header buttons etc we still render our other // children. -JDD GuiControl *pChild = dynamic_cast<GuiControl*>( at(0) ); if ( pChild ) { if ( !mIsExpanded && !mIsAnimating && pChild->isVisible() ) { pChild->setVisible( false ); } else if ( (mIsExpanded || mIsAnimating) && !pChild->isVisible() ) { pChild->setVisible( true ); } } renderChildControls( offset, updateRect ); // Render our border should we have it specified in our profile. renderBorder(worldBounds, mProfile); }
void GuiTabBookCtrl::renderTab(const RectI& tabRect, GuiTabPageCtrl *tab) { StringTableEntry text = tab->getText(); ColorI oldColor; GFX->getDrawUtil()->getBitmapModulation( &oldColor ); // Is this a skinned control? if( mHasTexture && mProfile->mBitmapArrayRects.size() >= 9 ) { S32 indexMultiplier = 1; switch( mTabPosition ) { case AlignTop: case AlignBottom: if ( mActivePage == tab ) indexMultiplier += TabSelected; else if( mHoverTab == tab ) indexMultiplier += TabHover; else indexMultiplier += TabNormal; break; } renderFixedBitmapBordersFilled( tabRect, indexMultiplier, mProfile ); } else { // If this isn't a skinned control or the bitmap is simply missing, handle it WELL if ( mActivePage == tab ) GFX->getDrawUtil()->drawRectFill(tabRect, mProfile->mFillColor); else if( mHoverTab == tab ) GFX->getDrawUtil()->drawRectFill(tabRect, mProfile->mFillColorHL); else GFX->getDrawUtil()->drawRectFill(tabRect, mProfile->mFillColorNA); } GFX->getDrawUtil()->setBitmapModulation(mProfile->mFontColor); switch( mTabPosition ) { case AlignTop: case AlignBottom: renderJustifiedText( tabRect.point, tabRect.extent, text); break; } GFX->getDrawUtil()->setBitmapModulation( oldColor); }
void GuiInspectorField::onRender( Point2I offset, const RectI &updateRect ) { RectI ctrlRect(offset, getExtent()); // Render fillcolor... if ( mProfile->mOpaque ) GFX->getDrawUtil()->drawRectFill(ctrlRect, mProfile->mFillColor); // Render caption... if ( mCaption && mCaption[0] ) { // Backup current ClipRect RectI clipBackup = GFX->getClipRect(); RectI clipRect = updateRect; // The rect within this control in which our caption must fit. RectI rect( offset + mCaptionRect.point + mProfile->mTextOffset, mCaptionRect.extent + Point2I(1,1) - Point2I(5,0) ); // Now clipRect is the amount of our caption rect that is actually visible. bool hit = clipRect.intersect( rect ); if ( hit ) { GFX->setClipRect( clipRect ); GFXDrawUtil *drawer = GFX->getDrawUtil(); // Backup modulation color ColorI currColor; drawer->getBitmapModulation( &currColor ); // Draw caption background... if( !isActive() ) GFX->getDrawUtil()->drawRectFill( clipRect, mProfile->mFillColorNA ); else if ( mHighlighted ) GFX->getDrawUtil()->drawRectFill( clipRect, mProfile->mFillColorHL ); // Draw caption text... drawer->setBitmapModulation( !isActive() ? mProfile->mFontColorNA : mHighlighted ? mProfile->mFontColorHL : mProfile->mFontColor ); // Clip text with '...' if too long to fit String clippedText( mCaption ); clipText( clippedText, clipRect.extent.x ); renderJustifiedText( offset + mProfile->mTextOffset, getExtent(), clippedText ); // Restore modulation color drawer->setBitmapModulation( currColor ); // Restore previous ClipRect GFX->setClipRect( clipBackup ); } } // Render Children... renderChildControls(offset, updateRect); // Render border... if ( mProfile->mBorder ) renderBorder(ctrlRect, mProfile); // Render divider... Point2I worldPnt = mEditCtrlRect.point + offset; GFX->getDrawUtil()->drawLine( worldPnt.x - 5, worldPnt.y, worldPnt.x - 5, worldPnt.y + getHeight(), !isActive() ? mProfile->mBorderColorNA : mHighlighted ? mProfile->mBorderColorHL : mProfile->mBorderColor ); }
void GuiGameListMenuCtrl::onRender(Point2I offset, const RectI &updateRect) { GuiGameListMenuProfile * profile = (GuiGameListMenuProfile *) mProfile; F32 xScale = (float) getWidth() / profile->getRowWidth(); bool profileHasIcons = profile->hasArrows(); S32 rowHeight = profile->getRowHeight(); Point2I currentOffset = offset; Point2I extent = getExtent(); Point2I rowExtent(extent.x, rowHeight); Point2I textOffset(profile->mTextOffset.x * xScale, profile->mTextOffset.y); Point2I textExtent(extent.x - textOffset.x, rowHeight); Point2I iconExtent, iconOffset(0.0f, 0.0f); if (profileHasIcons) { iconExtent = profile->getIconExtent(); // icon is centered vertically plus any specified offset S32 iconOffsetY = (rowHeight - iconExtent.y) >> 1; iconOffsetY += profile->mIconOffset.y; iconOffset = Point2I(profile->mIconOffset.x * xScale, iconOffsetY); } for (Vector<Row *>::iterator row = mRows.begin(); row < mRows.end(); ++row) { if (row != mRows.begin()) { // rows other than the first can have padding above them currentOffset.y += (*row)->mHeightPad; currentOffset.y += rowHeight; } // select appropriate colors and textures ColorI fontColor; U32 buttonTextureIndex; S32 iconIndex = (*row)->mIconIndex; bool useHighlightIcon = (*row)->mUseHighlightIcon; if (! (*row)->mEnabled) { buttonTextureIndex = Profile::TEX_DISABLED; fontColor = profile->mFontColorNA; } else if (row == &mRows[mSelected]) { if (iconIndex != NO_ICON) { iconIndex++; } buttonTextureIndex = Profile::TEX_SELECTED; fontColor = profile->mFontColorSEL; } else if ((mHighlighted != NO_ROW) && (row == &mRows[mHighlighted])) { if (iconIndex != NO_ICON && useHighlightIcon) { iconIndex++; } buttonTextureIndex = Profile::TEX_HIGHLIGHT; fontColor = profile->mFontColorHL; } else { buttonTextureIndex = Profile::TEX_NORMAL; fontColor = profile->mFontColor; } // render the row bitmap GFX->getDrawUtil()->clearBitmapModulation(); GFX->getDrawUtil()->drawBitmapStretchSR(profile->mTextureObject, RectI(currentOffset, rowExtent), profile->getBitmapArrayRect(buttonTextureIndex)); // render the row icon if it has one if ((iconIndex != NO_ICON) && profileHasIcons && (! profile->getBitmapArrayRect((U32)iconIndex).extent.isZero())) { iconIndex += Profile::TEX_FIRST_ICON; GFX->getDrawUtil()->clearBitmapModulation(); GFX->getDrawUtil()->drawBitmapStretchSR(profile->mTextureObject, RectI(currentOffset + iconOffset, iconExtent), profile->getBitmapArrayRect(iconIndex)); } // render the row text GFX->getDrawUtil()->setBitmapModulation(fontColor); renderJustifiedText(currentOffset + textOffset, textExtent, (*row)->mLabel); } if (mDebugRender) { onDebugRender(offset); } renderChildControls(offset, updateRect); }
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); }