summaryrefslogtreecommitdiff
path: root/indra/llui/llviewborder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llui/llviewborder.cpp')
-rw-r--r--indra/llui/llviewborder.cpp337
1 files changed, 337 insertions, 0 deletions
diff --git a/indra/llui/llviewborder.cpp b/indra/llui/llviewborder.cpp
new file mode 100644
index 0000000000..24cc57e709
--- /dev/null
+++ b/indra/llui/llviewborder.cpp
@@ -0,0 +1,337 @@
+/**
+ * @file llviewborder.cpp
+ * @brief LLViewBorder base class
+ *
+ * Copyright (c) 2001-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+// A customizable decorative border. Does not interact with mouse events.
+
+#include "linden_common.h"
+
+#include "llviewborder.h"
+
+#include "llgl.h"
+#include "llui.h"
+#include "llimagegl.h"
+//#include "llviewerimagelist.h"
+#include "llcontrol.h"
+#include "llglheaders.h"
+#include "v2math.h"
+#include "llfocusmgr.h"
+
+LLViewBorder::LLViewBorder( const LLString& name, const LLRect& rect, EBevel bevel, EStyle style, S32 width )
+ :
+ LLView( name, rect, FALSE ),
+ mBevel( bevel ),
+ mStyle( style ),
+ mHighlightLight( LLUI::sColorsGroup->getColor( "DefaultHighlightLight" ) ),
+ mHighlightDark( LLUI::sColorsGroup->getColor( "DefaultHighlightDark" ) ),
+ mShadowLight( LLUI::sColorsGroup->getColor( "DefaultShadowLight" ) ),
+ mShadowDark( LLUI::sColorsGroup->getColor( "DefaultShadowDark" ) ),
+// mKeyboardFocusColor(LLUI::sColorsGroup->getColor( "FocusColor" ) ),
+ mBorderWidth( width ),
+ mTexture( NULL ),
+ mHasKeyboardFocus( FALSE )
+{
+ setFollowsAll();
+}
+
+// virtual
+BOOL LLViewBorder::isCtrl()
+{
+ return FALSE;
+}
+
+void LLViewBorder::setColors( const LLColor4& shadow_dark, const LLColor4& highlight_light )
+{
+ mShadowDark = shadow_dark;
+ mHighlightLight = highlight_light;
+}
+
+void LLViewBorder::setColorsExtended( const LLColor4& shadow_light, const LLColor4& shadow_dark,
+ const LLColor4& highlight_light, const LLColor4& highlight_dark )
+{
+ mShadowDark = shadow_dark;
+ mShadowLight = shadow_light;
+ mHighlightLight = highlight_light;
+ mHighlightDark = highlight_dark;
+}
+
+void LLViewBorder::setTexture( const LLUUID &image_id )
+{
+ mTexture = LLUI::sImageProvider->getUIImageByID(image_id);
+}
+
+
+void LLViewBorder::draw()
+{
+ if( getVisible() )
+ {
+ if( STYLE_LINE == mStyle )
+ {
+ if( 0 == mBorderWidth )
+ {
+ // no visible border
+ }
+ else
+ if( 1 == mBorderWidth )
+ {
+ drawOnePixelLines();
+ }
+ else
+ if( 2 == mBorderWidth )
+ {
+ drawTwoPixelLines();
+ }
+ else
+ {
+ llassert( FALSE ); // not implemented
+ }
+ }
+ else
+ if( STYLE_TEXTURE == mStyle )
+ {
+ if( mTexture )
+ {
+ drawTextures();
+ }
+ }
+
+ // draw the children
+ LLView::draw();
+ }
+}
+
+void LLViewBorder::drawOnePixelLines()
+{
+ LLGLSNoTexture uiNoTexture;
+
+ LLColor4 top_color = mHighlightLight;
+ LLColor4 bottom_color = mHighlightLight;
+ switch( mBevel )
+ {
+ case BEVEL_OUT:
+ top_color = mHighlightLight;
+ bottom_color = mShadowDark;
+ break;
+ case BEVEL_IN:
+ top_color = mShadowDark;
+ bottom_color = mHighlightLight;
+ break;
+ case BEVEL_NONE:
+ // use defaults
+ break;
+ default:
+ llassert(0);
+ }
+
+ if( mHasKeyboardFocus )
+ {
+ F32 lerp_amt = gFocusMgr.getFocusFlashAmt();
+ top_color = gFocusMgr.getFocusColor();
+ bottom_color = top_color;
+
+ LLUI::setLineWidth(lerp(1.f, 3.f, lerp_amt));
+ }
+
+ S32 left = 0;
+ S32 top = mRect.getHeight();
+ S32 right = mRect.getWidth();
+ S32 bottom = 0;
+
+ glColor4fv( top_color.mV );
+ gl_line_2d(left, bottom, left, top);
+ gl_line_2d(left, top, right, top);
+
+ glColor4fv( bottom_color.mV );
+ gl_line_2d(right, top, right, bottom);
+ gl_line_2d(left, bottom, right, bottom);
+
+ LLUI::setLineWidth(1.f);
+}
+
+void LLViewBorder::drawTwoPixelLines()
+{
+ LLGLSNoTexture no_texture;
+
+ LLColor4 focus_color = gFocusMgr.getFocusColor();
+
+ F32* top_in_color = mShadowDark.mV;
+ F32* top_out_color = mShadowDark.mV;
+ F32* bottom_in_color = mShadowDark.mV;
+ F32* bottom_out_color = mShadowDark.mV;
+ switch( mBevel )
+ {
+ case BEVEL_OUT:
+ top_in_color = mHighlightLight.mV;
+ top_out_color = mHighlightDark.mV;
+ bottom_in_color = mShadowLight.mV;
+ bottom_out_color = mShadowDark.mV;
+ break;
+ case BEVEL_IN:
+ top_in_color = mShadowDark.mV;
+ top_out_color = mShadowLight.mV;
+ bottom_in_color = mHighlightDark.mV;
+ bottom_out_color = mHighlightLight.mV;
+ break;
+ case BEVEL_BRIGHT:
+ top_in_color = mHighlightLight.mV;
+ top_out_color = mHighlightLight.mV;
+ bottom_in_color = mHighlightLight.mV;
+ bottom_out_color = mHighlightLight.mV;
+ break;
+ case BEVEL_NONE:
+ // use defaults
+ break;
+ default:
+ llassert(0);
+ }
+
+ if( mHasKeyboardFocus )
+ {
+ top_out_color = focus_color.mV;
+ bottom_out_color = focus_color.mV;
+ }
+
+ S32 left = 0;
+ S32 top = mRect.getHeight();
+ S32 right = mRect.getWidth();
+ S32 bottom = 0;
+
+ // draw borders
+ glColor3fv( top_out_color );
+ gl_line_2d(left, bottom, left, top-1);
+ gl_line_2d(left, top-1, right, top-1);
+
+ glColor3fv( top_in_color );
+ gl_line_2d(left+1, bottom+1, left+1, top-2);
+ gl_line_2d(left+1, top-2, right-1, top-2);
+
+ glColor3fv( bottom_out_color );
+ gl_line_2d(right-1, top-1, right-1, bottom);
+ gl_line_2d(left, bottom, right, bottom);
+
+ glColor3fv( bottom_in_color );
+ gl_line_2d(right-2, top-2, right-2, bottom+1);
+ gl_line_2d(left+1, bottom+1, right-1, bottom+1);
+}
+
+void LLViewBorder::drawTextures()
+{
+ LLGLSUIDefault gls_ui;
+
+ llassert( FALSE ); // TODO: finish implementing
+
+ glColor4fv(UI_VERTEX_COLOR.mV);
+
+ mTexture->bind();
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
+
+ drawTextureTrapezoid( 0.f, mBorderWidth, mRect.getWidth(), 0, 0 );
+ drawTextureTrapezoid( 90.f, mBorderWidth, mRect.getHeight(), (F32)mRect.getWidth(),0 );
+ drawTextureTrapezoid( 180.f, mBorderWidth, mRect.getWidth(), (F32)mRect.getWidth(),(F32)mRect.getHeight() );
+ drawTextureTrapezoid( 270.f, mBorderWidth, mRect.getHeight(), 0, (F32)mRect.getHeight() );
+}
+
+
+void LLViewBorder::drawTextureTrapezoid( F32 degrees, S32 width, S32 length, F32 start_x, F32 start_y )
+{
+ glPushMatrix();
+ {
+ glTranslatef(start_x, start_y, 0.f);
+ glRotatef( degrees, 0, 0, 1 );
+
+ glBegin(GL_QUADS);
+ {
+ // width, width /---------\ length-width, width //
+ // / \ //
+ // / \ //
+ // /---------------\ //
+ // 0,0 length, 0 //
+
+ glTexCoord2f( 0, 0 );
+ glVertex2i( 0, 0 );
+
+ glTexCoord2f( (GLfloat)length, 0 );
+ glVertex2i( length, 0 );
+
+ glTexCoord2f( (GLfloat)(length - width), (GLfloat)width );
+ glVertex2i( length - width, width );
+
+ glTexCoord2f( (GLfloat)width, (GLfloat)width );
+ glVertex2i( width, width );
+ }
+ glEnd();
+ }
+ glPopMatrix();
+}
+
+bool LLViewBorder::getBevelFromAttribute(LLXMLNodePtr node, LLViewBorder::EBevel& bevel_style)
+{
+ if (node->hasAttribute("bevel_style"))
+ {
+ LLString bevel_string;
+ node->getAttributeString("bevel_style", bevel_string);
+ LLString::toLower(bevel_string);
+
+ if (bevel_string == "none")
+ {
+ bevel_style = LLViewBorder::BEVEL_NONE;
+ }
+ else if (bevel_string == "in")
+ {
+ bevel_style = LLViewBorder::BEVEL_IN;
+ }
+ else if (bevel_string == "out")
+ {
+ bevel_style = LLViewBorder::BEVEL_OUT;
+ }
+ else if (bevel_string == "bright")
+ {
+ bevel_style = LLViewBorder::BEVEL_BRIGHT;
+ }
+ return true;
+ }
+ return false;
+}
+
+void LLViewBorder::setValue(const LLSD& val)
+{
+ setRect(LLRect(val));
+}
+
+EWidgetType LLViewBorder::getWidgetType() const
+{
+ return WIDGET_TYPE_VIEW_BORDER;
+}
+
+LLString LLViewBorder::getWidgetTag() const
+{
+ return LL_VIEW_BORDER_TAG;
+}
+
+// static
+LLView* LLViewBorder::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory)
+{
+ LLString name("view_border");
+ node->getAttributeString("name", name);
+
+ LLViewBorder::EBevel bevel_style = LLViewBorder::BEVEL_IN;
+ getBevelFromAttribute(node, bevel_style);
+
+ S32 border_thickness = 1;
+ node->getAttributeS32("border_thickness", border_thickness);
+
+ LLViewBorder* border = new LLViewBorder(name,
+ LLRect(),
+ bevel_style,
+ LLViewBorder::STYLE_LINE,
+ border_thickness);
+
+ border->initFromXML(node, parent);
+
+ return border;
+}