void LLSlider::updateThumbRect() { const S32 DEFAULT_THUMB_SIZE = 16; F32 t = (getValueF32() - mMinValue) / (mMaxValue - mMinValue); S32 thumb_width = mThumbImage ? mThumbImage->getWidth() : DEFAULT_THUMB_SIZE; S32 thumb_height = mThumbImage ? mThumbImage->getHeight() : DEFAULT_THUMB_SIZE; if ( mOrientation == HORIZONTAL ) { S32 left_edge = (thumb_width / 2); S32 right_edge = getRect().getWidth() - (thumb_width / 2); S32 x = left_edge + S32( t * (right_edge - left_edge) ); mThumbRect.mLeft = x - (thumb_width / 2); mThumbRect.mRight = mThumbRect.mLeft + thumb_width; mThumbRect.mBottom = getLocalRect().getCenterY() - (thumb_height / 2); mThumbRect.mTop = mThumbRect.mBottom + thumb_height; } else { S32 top_edge = (thumb_height / 2); S32 bottom_edge = getRect().getHeight() - (thumb_height / 2); S32 y = top_edge + S32( t * (bottom_edge - top_edge) ); mThumbRect.mLeft = getLocalRect().getCenterX() - (thumb_width / 2); mThumbRect.mRight = mThumbRect.mLeft + thumb_width; mThumbRect.mBottom = y - (thumb_height / 2); mThumbRect.mTop = mThumbRect.mBottom + thumb_height; } }
void LLSlider::draw() { F32 alpha = getDrawContext().mAlpha; // since thumb image might still be decoding, need thumb to accomodate image size updateThumbRect(); // Draw background and thumb. // drawing solids requires texturing be disabled gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); // Track LLRect track_rect(mThumbImage->getWidth() / 2, getLocalRect().getCenterY() + (mTrackImage->getHeight() / 2), getRect().getWidth() - mThumbImage->getWidth() / 2, getLocalRect().getCenterY() - (mTrackImage->getHeight() / 2) ); LLRect highlight_rect(track_rect.mLeft, track_rect.mTop, mThumbRect.getCenterX(), track_rect.mBottom); mTrackImage->draw(track_rect, LLColor4::white % alpha); mTrackHighlightImage->draw(highlight_rect, LLColor4::white % alpha); // Thumb if (hasFocus()) { // Draw focus highlighting. mThumbImage->drawBorder(mThumbRect, gFocusMgr.getFocusColor() % alpha, gFocusMgr.getFocusFlashWidth()); } if( hasMouseCapture() ) { // Show ghost where thumb was before dragging began. if (mThumbImage.notNull()) { mThumbImage->draw(mDragStartThumbRect, mThumbCenterColor % (0.3f * alpha)); mThumbImage->draw(mThumbRect, mThumbOutlineColor % alpha); } } else if(!getEnabled()) { if (mThumbImage.notNull()) { mThumbImage->draw(mThumbRect, mThumbCenterColor % (0.3f * alpha)); } } else { if (mThumbImage.notNull()) { mThumbImage->draw(mThumbRect, mThumbCenterColor % alpha); } } // Fill in the thumb. LLUICtrl::draw(); }
//! ---|> Component void Menu::doDisplay(const Geometry::Rect & region) { enableLocalDisplayProperties(); displayDefaultShapes(); getGUI().displayShape(PROPERTY_MENU_SHAPE,getLocalRect()); disableLocalDisplayProperties(); displayChildren(region,true); getGUI().displayShape(PROPERTY_MENU_OUTER_SHAPE,getLocalRect()); }
void Shape::updateBoundingBox(Vector point) { if(point.x < getLocalRect().left) mBoundingBox.left = point.x; else if(point.x > getLocalRect().right) mBoundingBox.right = point.x; if(point.y < getLocalRect().top) mBoundingBox.top = point.y; else if(point.y > getLocalRect().bottom) mBoundingBox.bottom = point.y; }
void LLChatHistory::initFromParams(const LLChatHistory::Params& p) { static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0); LLRect stack_rect = getLocalRect(); stack_rect.mRight -= scrollbar_size; LLLayoutStack::Params layout_p; layout_p.rect = stack_rect; layout_p.follows.flags = FOLLOWS_ALL; layout_p.orientation = "vertical"; layout_p.mouse_opaque = false; LLLayoutStack* stackp = LLUICtrlFactory::create<LLLayoutStack>(layout_p, this); const S32 NEW_TEXT_NOTICE_HEIGHT = 20; LLLayoutPanel::Params panel_p; panel_p.name = "spacer"; panel_p.background_visible = false; panel_p.has_border = false; panel_p.mouse_opaque = false; panel_p.min_dim = 30; panel_p.max_dim = S32_MAX; panel_p.auto_resize = true; panel_p.user_resize = false; stackp->addPanel(LLUICtrlFactory::create<LLLayoutPanel>(panel_p), LLLayoutStack::ANIMATE); panel_p.name = "new_text_notice_holder"; LLRect new_text_notice_rect = getLocalRect(); new_text_notice_rect.mTop = new_text_notice_rect.mBottom + NEW_TEXT_NOTICE_HEIGHT; panel_p.rect = new_text_notice_rect; panel_p.background_opaque = true; panel_p.background_visible = true; panel_p.visible = false; panel_p.min_dim = 0; panel_p.auto_resize = false; panel_p.user_resize = false; mMoreChatPanel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p); LLTextBox::Params text_p(p.more_chat_text); text_p.rect = mMoreChatPanel->getLocalRect(); text_p.follows.flags = FOLLOWS_ALL; text_p.name = "more_chat_text"; mMoreChatText = LLUICtrlFactory::create<LLTextBox>(text_p, mMoreChatPanel); mMoreChatText->setClickedCallback(boost::bind(&LLChatHistory::onClickMoreText, this)); stackp->addPanel(mMoreChatPanel, LLLayoutStack::ANIMATE); }
void LLExpandableTextBox::draw() { if(mBGVisible && !mExpanded) { gl_rect_2d(getLocalRect(), mBGColor.get(), TRUE); } if(mExpandedBGVisible && mExpanded) { gl_rect_2d(getLocalRect(), mExpandedBGColor.get(), TRUE); } collapseIfPosChanged(); LLUICtrl::draw(); }
void LLAccordionCtrl::initNoTabsWidget(const LLTextBox::Params& tb_params) { LLTextBox::Params tp = tb_params; tp.rect(getLocalRect()); mNoMatchedTabsOrigString = tp.initial_value().asString(); mNoVisibleTabsHelpText = LLUICtrlFactory::create<LLTextBox>(tp, this); }
LLExpandableTextBox::LLExpandableTextBox(const Params& p) : LLUICtrl(p), mMaxHeight(p.max_height), mBGVisible(p.bg_visible), mExpandedBGVisible(p.expanded_bg_visible), mBGColor(p.bg_color), mExpandedBGColor(p.expanded_bg_color), mExpanded(false) { LLRect rc = getLocalRect(); LLScrollContainer::Params scroll_params = p.scroll; scroll_params.rect(rc); mScroll = LLUICtrlFactory::create<LLScrollContainer>(scroll_params); addChild(mScroll); LLTextBoxEx::Params textbox_params = p.textbox; textbox_params.rect(rc); mTextBox = LLUICtrlFactory::create<LLTextBoxEx>(textbox_params); mScroll->addChild(mTextBox); updateTextBoxRect(); mTextBox->setCommitCallback(boost::bind(&LLExpandableTextBox::onExpandClicked, this)); }
void LLTextBox::draw() { if (mBorderVisible) { gl_rect_2d_offset_local(getLocalRect(), 2, FALSE); } if( mBorderDropShadowVisible ) { static LLColor4 color_drop_shadow = LLUI::sColorsGroup->getColor("ColorDropShadow"); static S32 drop_shadow_tooltip = LLUI::sConfigGroup->getS32("DropShadowTooltip"); gl_drop_shadow(0, getRect().getHeight(), getRect().getWidth(), 0, color_drop_shadow, drop_shadow_tooltip); } if (mBackgroundVisible) { LLRect r( 0, getRect().getHeight(), getRect().getWidth(), 0 ); gl_rect_2d( r, mBackgroundColor ); } S32 text_x = 0; switch( mHAlign ) { case LLFontGL::LEFT: text_x = mHPad; break; case LLFontGL::HCENTER: text_x = getRect().getWidth() / 2; break; case LLFontGL::RIGHT: text_x = getRect().getWidth() - mHPad; break; } S32 text_y = getRect().getHeight() - mVPad; if ( getEnabled() ) { if(mHasHover) { drawText( text_x, text_y, mHoverColor ); } else { drawText( text_x, text_y, mTextColor ); } } else { drawText( text_x, text_y, mDisabledColor ); } if (sDebugRects) { drawDebugRect(); } mHasHover = FALSE; // This is reset every frame. }
void LLLayoutStack::draw() { updateLayout(); // always clip to stack itself LLLocalClipRect clip(getLocalRect()); BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) { // clip to layout rectangle, not bounding rectangle LLRect clip_rect = panelp->getRect(); // scale clipping rectangle by visible amount if (mOrientation == HORIZONTAL) { clip_rect.mRight = clip_rect.mLeft + panelp->getVisibleDim(); } else { clip_rect.mBottom = clip_rect.mTop - panelp->getVisibleDim(); } {LLLocalClipRect clip(clip_rect, mClip); // only force drawing invisible children if visible amount is non-zero drawChild(panelp, 0, 0, !clip_rect.isEmpty()); } if (panelp->getResizeBar()->getVisible()) { drawChild(panelp->getResizeBar()); } }
void LLProgressBar::draw() { static LLTimer timer; F32 alpha = getDrawContext().mAlpha; LLColor4 image_bar_color = mColorBackground.get(); image_bar_color.setAlpha(alpha); mImageBar->draw(getLocalRect(), image_bar_color); alpha *= 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32())); LLColor4 bar_color = mColorBar.get(); bar_color.mV[VALPHA] *= alpha; // modulate alpha LLRect progress_rect = getLocalRect(); progress_rect.mRight = llround(getRect().getWidth() * (mPercentDone / 100.f)); mImageFill->draw(progress_rect, bar_color); }
// LLView functionality void LLScrollContainer::reshape(S32 width, S32 height, BOOL called_from_parent) { LLUICtrl::reshape( width, height, called_from_parent ); mInnerRect = getLocalRect(); mInnerRect.stretch( -getBorderWidth() ); if (mScrolledView) { const LLRect& scrolled_rect = mScrolledView->getRect(); S32 visible_width = 0; S32 visible_height = 0; BOOL show_v_scrollbar = FALSE; BOOL show_h_scrollbar = FALSE; calcVisibleSize( &visible_width, &visible_height, &show_h_scrollbar, &show_v_scrollbar ); mScrollbar[VERTICAL]->setDocSize( scrolled_rect.getHeight() ); mScrollbar[VERTICAL]->setPageSize( visible_height ); mScrollbar[HORIZONTAL]->setDocSize( scrolled_rect.getWidth() ); mScrollbar[HORIZONTAL]->setPageSize( visible_width ); updateScroll(); } }
//! ---|> Component bool Connector::coversLocalPosition(const Geometry::Vec2 & pos){ if(!getLocalRect().changeSizeCentered(10,10).contains(pos)) return false; Geometry::Vec2 p1; Geometry::Vec2 p2; for(Component * c=getFirstChild();c!=nullptr;c=c->getNext()){ p1=p2; p2=c->getPosition(); if(c==getFirstChild()) continue; float length=p1.distance(p2); if(length==0) continue; float u= ( (pos.x() - p1.x()) * (p2.x()-p1.x()) + (pos.y() - p1.y()) * (p2.y()-p1.y())) / (length*length); if(u<0.0f || u >1.0f ){ continue; } float dist=pos.distance(p1 + (p2-p1)*u); if(dist<=5){ return true; } } return false; }
void LLScrollContainer::setBorderVisible(BOOL b) { mBorder->setVisible( b ); // Recompute inner rect, as border visibility changes it mInnerRect = getLocalRect(); mInnerRect.stretch( -getBorderWidth() ); }
// The order in which the points gets added is important void Shape::addPoint(Vector point) { // Calculate the bounding box if(point.x < getLocalRect().left) mBoundingBox.left = point.x; else if(point.x > getLocalRect().right) mBoundingBox.right = point.x; if(point.y < getLocalRect().top) mBoundingBox.top = point.y; else if(point.y > getLocalRect().bottom) mBoundingBox.bottom = point.y; mSides++; pointList.push_back(point); }
void LLProgressBar::draw() { static LLTimer timer; LLUIImagePtr shadow_imagep = LLUI::getUIImage("rounded_square_soft.tga"); LLUIImagePtr bar_fg_imagep = LLUI::getUIImage("progressbar_fill.tga"); LLUIImagePtr bar_bg_imagep = LLUI::getUIImage("progressbar_track.tga"); LLUIImagePtr bar_imagep = LLUI::getUIImage("rounded_square.tga"); LLColor4 background_color = LLUI::sColorsGroup->getColor("LoginProgressBarBgColor"); bar_bg_imagep->draw(getLocalRect(), background_color); LLRect progress_rect = getLocalRect(); progress_rect.mRight = llround(getRect().getWidth() * (mPercentDone / 100.f)); bar_fg_imagep->draw(progress_rect); }
void LLPanel::addBorder(LLViewBorder::Params p) { removeBorder(); p.rect = getLocalRect(); mBorder = LLUICtrlFactory::create<LLViewBorder>(p); addChild( mBorder ); }
void LLIconCtrl::draw() { if( mImagep.notNull() ) { mImagep->draw(getLocalRect(), mColor.get() % getDrawContext().mAlpha ); } LLUICtrl::draw(); }
void LLIconCtrl::draw() { if( mImagep.notNull() ) { mImagep->draw(getLocalRect(), mColor ); } LLUICtrl::draw(); }
void LLFloaterExperiencePicker::drawFrustum() { if(mFrustumOrigin.get()) { LLView * frustumOrigin = mFrustumOrigin.get(); LLRect origin_rect; frustumOrigin->localRectToOtherView(frustumOrigin->getLocalRect(), &origin_rect, this); // draw context cone connecting color picker with color swatch in parent floater LLRect local_rect = getLocalRect(); if (hasFocus() && frustumOrigin->isInVisibleChain() && mContextConeOpacity > 0.001f) { gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); LLGLEnable(GL_CULL_FACE); gGL.begin(LLRender::QUADS); { gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); gGL.vertex2i(origin_rect.mLeft, origin_rect.mTop); gGL.vertex2i(origin_rect.mRight, origin_rect.mTop); gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); gGL.vertex2i(local_rect.mRight, local_rect.mTop); gGL.vertex2i(local_rect.mLeft, local_rect.mTop); gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); gGL.vertex2i(local_rect.mLeft, local_rect.mTop); gGL.vertex2i(local_rect.mLeft, local_rect.mBottom); gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); gGL.vertex2i(origin_rect.mLeft, origin_rect.mBottom); gGL.vertex2i(origin_rect.mLeft, origin_rect.mTop); gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); gGL.vertex2i(local_rect.mRight, local_rect.mBottom); gGL.vertex2i(local_rect.mRight, local_rect.mTop); gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); gGL.vertex2i(origin_rect.mRight, origin_rect.mTop); gGL.vertex2i(origin_rect.mRight, origin_rect.mBottom); gGL.color4f(0.f, 0.f, 0.f, mContextConeOutAlpha * mContextConeOpacity); gGL.vertex2i(local_rect.mLeft, local_rect.mBottom); gGL.vertex2i(local_rect.mRight, local_rect.mBottom); gGL.color4f(0.f, 0.f, 0.f, mContextConeInAlpha * mContextConeOpacity); gGL.vertex2i(origin_rect.mRight, origin_rect.mBottom); gGL.vertex2i(origin_rect.mLeft, origin_rect.mBottom); } gGL.end(); } if (gFocusMgr.childHasMouseCapture(getDragHandle())) { mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"), LLCriticalDamp::getInterpolant(mContextConeFadeTime)); } else { mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLCriticalDamp::getInterpolant(mContextConeFadeTime)); } } }
void LLComboBox::updateLayout() { LLRect rect = getLocalRect(); if (mAllowTextEntry) { S32 shadow_size = LLUI::sConfigGroup->getS32("DropShadowButton"); mButton->setRect(LLRect( getRect().getWidth() - llmax(8,mArrowImage->getWidth()) - 2 * shadow_size, rect.mTop, rect.mRight, rect.mBottom)); mButton->setTabStop(FALSE); if (!mTextEntry) { LLRect text_entry_rect(0, getRect().getHeight(), getRect().getWidth(), 0); text_entry_rect.mRight -= llmax(8,mArrowImage->getWidth()) + 2 * LLUI::sConfigGroup->getS32("DropShadowButton"); // clear label on button std::string cur_label = mButton->getLabelSelected(); mTextEntry = new LLLineEditor(std::string("combo_text_entry"), text_entry_rect, LLStringUtil::null, LLFontGL::getFontSansSerifSmall(), mMaxChars, onTextCommit, onTextEntry, NULL, this); mTextEntry->setSelectAllonFocusReceived(TRUE); mTextEntry->setHandleEditKeysDirectly(TRUE); mTextEntry->setCommitOnFocusLost(FALSE); mTextEntry->setText(cur_label); mTextEntry->setIgnoreTab(TRUE); mTextEntry->setFollowsAll(); addChild(mTextEntry); } else { mTextEntry->setVisible(TRUE); mTextEntry->setMaxTextLength(mMaxChars); } // clear label on button setLabel(LLStringUtil::null); mButton->setFollows(FOLLOWS_BOTTOM | FOLLOWS_TOP | FOLLOWS_RIGHT); } else if (!mAllowTextEntry) { mButton->setRect(rect); mButton->setTabStop(TRUE); if (mTextEntry) { mTextEntry->setVisible(FALSE); } mButton->setFollowsAll(); } }
void LLIconCtrl::draw() { if( mImagep.notNull() ) { const F32 alpha = mUseDrawContextAlpha ? getDrawContext().mAlpha : getCurrentTransparency(); mImagep->draw(getLocalRect(), mColor.get() % alpha ); } LLUICtrl::draw(); }
void LLIconCtrl::draw() { if( mImagep.notNull() ) { const F32 alpha = getDrawContext().mAlpha; mImagep->draw(getLocalRect(), mColor % alpha ); } LLUICtrl::draw(); }
void LLMediaCtrl::setBorderVisible( BOOL border_visible ) { if(border_visible && !mBorder) { mBorder = new LLViewBorder( std::string("web control border"), getLocalRect(), LLViewBorder::BEVEL_IN ); addChild( mBorder ); } if(mBorder) mBorder->setVisible(border_visible); };
void LLButton::drawBorder(const LLColor4& color, S32 size) { if (mScaleImage) { mImagep->drawBorder(getLocalRect(), color, size); } else { mImagep->drawBorder(0, 0, color, size); } }
void LLProgressBar::draw() { static LLTimer timer; LLUIImagePtr shadow_imagep = LLUI::getUIImage("rounded_square_soft.tga"); LLUIImagePtr bar_fg_imagep = LLUI::getUIImage("progressbar_fill.tga"); LLUIImagePtr bar_bg_imagep = LLUI::getUIImage("progressbar_track.tga"); LLUIImagePtr bar_imagep = LLUI::getUIImage("rounded_square.tga"); LLColor4 background_color = LLUI::sColorsGroup->getColor("LoginProgressBarBgColor"); bar_bg_imagep->draw(getLocalRect(), background_color); F32 alpha = 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32())); LLColor4 bar_color = LLUI::sColorsGroup->getColor("LoginProgressBarFgColor"); bar_color.mV[3] = alpha; LLRect progress_rect = getLocalRect(); progress_rect.mRight = llround(getRect().getWidth() * (mPercentDone / 100.f)); bar_fg_imagep->draw(progress_rect); }
LLTextureCtrl::LLTextureCtrl(const LLTextureCtrl::Params& p) : LLUICtrl(p), mDragCallback(NULL), mDropCallback(NULL), mOnCancelCallback(NULL), mOnSelectCallback(NULL), mBorderColor( p.border_color() ), mAllowNoTexture( FALSE ), mImmediateFilterPermMask( PERM_NONE ), mNonImmediateFilterPermMask( PERM_NONE ), mCanApplyImmediately( FALSE ), mNeedsRawImageData( FALSE ), mValid( TRUE ), mShowLoadingPlaceholder( TRUE ), mImageAssetID(p.image_id), mDefaultImageAssetID(p.default_image_id), mDefaultImageName(p.default_image_name), mFallbackImage(p.fallback_image) { setAllowNoTexture(p.allow_no_texture); setCanApplyImmediately(p.can_apply_immediately); mCommitOnSelection = !p.no_commit_on_selection; LLTextBox::Params params(p.caption_text); params.name(p.label); params.rect(LLRect( 0, BTN_HEIGHT_SMALL, getRect().getWidth(), 0 )); params.initial_value(p.label()); params.follows.flags(FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_BOTTOM); mCaption = LLUICtrlFactory::create<LLTextBox> (params); addChild( mCaption ); S32 image_top = getRect().getHeight(); S32 image_bottom = BTN_HEIGHT_SMALL; S32 image_middle = (image_top + image_bottom) / 2; S32 line_height = llround(LLFontGL::getFontSansSerifSmall()->getLineHeight()); LLTextBox::Params tentative_label_p(p.multiselect_text); tentative_label_p.name("Multiple"); tentative_label_p.rect(LLRect (0, image_middle + line_height / 2, getRect().getWidth(), image_middle - line_height / 2 )); tentative_label_p.follows.flags(FOLLOWS_ALL); mTentativeLabel = LLUICtrlFactory::create<LLTextBox> (tentative_label_p); addChild( mTentativeLabel ); LLRect border_rect = getLocalRect(); border_rect.mBottom += BTN_HEIGHT_SMALL; LLViewBorder::Params vbparams(p.border); vbparams.name("border"); vbparams.rect(border_rect); mBorder = LLUICtrlFactory::create<LLViewBorder> (vbparams); addChild(mBorder); mLoadingPlaceholderString = LLTrans::getString("texture_loading"); }
void LLButton::drawBorder(LLUIImage* imagep, const LLColor4& color, S32 size) { if (imagep == NULL) return; if (mScaleImage) { imagep->drawBorder(getLocalRect(), color, size); } else { imagep->drawBorder(0, 0, color, size); } }
void LLExpandableTextBox::updateTextBoxRect() { LLRect rc = getLocalRect(); rc.mLeft += mScroll->getBorderWidth(); rc.mRight -= mScroll->getBorderWidth(); rc.mTop -= mScroll->getBorderWidth(); rc.mBottom += mScroll->getBorderWidth(); mTextBox->reshape(rc.getWidth(), rc.getHeight()); mTextBox->setRect(rc); }
void LLSlider::draw() { // since thumb image might still be decoding, need thumb to accomodate image size updateThumbRect(); // Draw background and thumb. // drawing solids requires texturing be disabled gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); F32 opacity = getEnabled() ? 1.f : 0.3f; LLColor4 center_color = (mThumbCenterColor % opacity); LLColor4 track_color = (mTrackColor % opacity); // Track LLRect track_rect(mThumbImage->getWidth() / 2, getLocalRect().getCenterY() + (mTrackImage->getHeight() / 2), getRect().getWidth() - mThumbImage->getWidth() / 2, getLocalRect().getCenterY() - (mTrackImage->getHeight() / 2) ); LLRect highlight_rect(track_rect.mLeft, track_rect.mTop, mThumbRect.getCenterX(), track_rect.mBottom); mTrackImage->draw(track_rect); mTrackHighlightImage->draw(highlight_rect); // Thumb if( hasMouseCapture() ) { // Show ghost where thumb was before dragging began. mThumbImage->draw(mDragStartThumbRect, mThumbCenterColor % 0.3f); } if (hasFocus()) { // Draw focus highlighting. mThumbImage->drawBorder(mThumbRect, gFocusMgr.getFocusColor(), gFocusMgr.getFocusFlashWidth()); } // Fill in the thumb. mThumbImage->draw(mThumbRect, hasMouseCapture() ? mThumbOutlineColor : center_color); LLUICtrl::draw(); }