summaryrefslogtreecommitdiff
path: root/indra/llui/llcheckboxctrl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llui/llcheckboxctrl.cpp')
-rw-r--r--indra/llui/llcheckboxctrl.cpp315
1 files changed, 315 insertions, 0 deletions
diff --git a/indra/llui/llcheckboxctrl.cpp b/indra/llui/llcheckboxctrl.cpp
new file mode 100644
index 0000000000..3b054d2fec
--- /dev/null
+++ b/indra/llui/llcheckboxctrl.cpp
@@ -0,0 +1,315 @@
+/**
+ * @file llcheckboxctrl.cpp
+ * @brief LLCheckBoxCtrl base class
+ *
+ * Copyright (c) 2001-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+// The mutants are coming!
+
+#include "linden_common.h"
+
+#include "llcheckboxctrl.h"
+
+#include "llgl.h"
+#include "llui.h"
+#include "lluiconstants.h"
+#include "lluictrlfactory.h"
+#include "llcontrol.h"
+
+#include "llstring.h"
+#include "llfontgl.h"
+#include "lltextbox.h"
+#include "llkeyboard.h"
+#include "llviewborder.h"
+
+const U32 MAX_STRING_LENGTH = 10;
+
+
+LLCheckBoxCtrl::LLCheckBoxCtrl(const LLString& name, const LLRect& rect,
+ const LLString& label,
+ const LLFontGL* font,
+ void (*commit_callback)(LLUICtrl* ctrl, void* userdata),
+ void* callback_user_data,
+ BOOL initial_value,
+ BOOL use_radio_style,
+ const LLString& control_which)
+: LLUICtrl(name, rect, TRUE, commit_callback, callback_user_data, FOLLOWS_LEFT | FOLLOWS_TOP),
+ mTextEnabledColor( LLUI::sColorsGroup->getColor( "LabelTextColor" ) ),
+ mTextDisabledColor( LLUI::sColorsGroup->getColor( "LabelDisabledColor" ) ),
+ mRadioStyle( use_radio_style ),
+ mInitialValue( initial_value )
+{
+ if (font)
+ {
+ mFont = font;
+ }
+ else
+ {
+ mFont = LLFontGL::sSansSerifSmall;
+ }
+
+ // must be big enough to hold all children
+ setSpanChildren(TRUE);
+
+ mKeyboardFocusOnClick = TRUE;
+
+ // Label (add a little space to make sure text actually renders)
+ const S32 FUDGE = 10;
+ S32 text_width = mFont->getWidth( label ) + FUDGE;
+ S32 text_height = llround(mFont->getLineHeight());
+ LLRect label_rect;
+ label_rect.setOriginAndSize(
+ LLCHECKBOXCTRL_HPAD + LLCHECKBOXCTRL_BTN_SIZE + LLCHECKBOXCTRL_SPACING,
+ LLCHECKBOXCTRL_VPAD + 1, // padding to get better alignment
+ text_width + LLCHECKBOXCTRL_HPAD,
+ text_height );
+ mLabel = new LLTextBox( "CheckboxCtrl Label", label_rect, label.c_str(), mFont );
+ mLabel->setFollowsLeft();
+ mLabel->setFollowsBottom();
+ addChild(mLabel);
+
+ // Button
+ // Note: button cover the label by extending all the way to the right.
+ LLRect btn_rect;
+ btn_rect.setOriginAndSize(
+ LLCHECKBOXCTRL_HPAD,
+ LLCHECKBOXCTRL_VPAD,
+ LLCHECKBOXCTRL_BTN_SIZE + LLCHECKBOXCTRL_SPACING + text_width + LLCHECKBOXCTRL_HPAD,
+ llmax( text_height, LLCHECKBOXCTRL_BTN_SIZE ) + LLCHECKBOXCTRL_VPAD);
+ LLString active_true_id, active_false_id;
+ LLString inactive_true_id, inactive_false_id;
+ if (mRadioStyle)
+ {
+ active_true_id = "UIImgRadioActiveSelectedUUID";
+ active_false_id = "UIImgRadioActiveUUID";
+ inactive_true_id = "UIImgRadioInactiveSelectedUUID";
+ inactive_false_id = "UIImgRadioInactiveUUID";
+ mButton = new LLButton(
+ "Radio control button", btn_rect,
+ active_false_id, active_true_id, control_which,
+ &LLCheckBoxCtrl::onButtonPress, this, LLFontGL::sSansSerif );
+ mButton->setDisabledImages( inactive_false_id, inactive_true_id );
+ mButton->setHoverGlowStrength(0.35f);
+ }
+ else
+ {
+ active_false_id = "UIImgCheckboxActiveUUID";
+ active_true_id = "UIImgCheckboxActiveSelectedUUID";
+ inactive_true_id = "UIImgCheckboxInactiveSelectedUUID";
+ inactive_false_id = "UIImgCheckboxInactiveUUID";
+ mButton = new LLButton(
+ "Checkbox control button", btn_rect,
+ active_false_id, active_true_id, control_which,
+ &LLCheckBoxCtrl::onButtonPress, this, LLFontGL::sSansSerif );
+ mButton->setDisabledImages( inactive_false_id, inactive_true_id );
+ mButton->setHoverGlowStrength(0.35f);
+ }
+ mButton->setToggleState( initial_value );
+ mButton->setFollowsLeft();
+ mButton->setFollowsBottom();
+ mButton->setCommitOnReturn(FALSE);
+ addChild(mButton);
+}
+
+LLCheckBoxCtrl::~LLCheckBoxCtrl()
+{
+ // Children all cleaned up by default view destructor.
+}
+
+
+// static
+void LLCheckBoxCtrl::onButtonPress( void *userdata )
+{
+ LLCheckBoxCtrl* self = (LLCheckBoxCtrl*) userdata;
+
+ if (self->mRadioStyle)
+ {
+ if (!self->getValue())
+ {
+ self->setValue(TRUE);
+ }
+ }
+ else
+ {
+ self->toggle();
+ }
+ self->setControlValue(self->getValue());
+ self->onCommit();
+
+ if (self->mKeyboardFocusOnClick)
+ {
+ self->setFocus( TRUE );
+ self->onFocusReceived();
+ }
+}
+
+void LLCheckBoxCtrl::onCommit()
+{
+ if( getEnabled() )
+ {
+ setTentative(FALSE);
+ LLUICtrl::onCommit();
+ }
+}
+
+void LLCheckBoxCtrl::setEnabled(BOOL b)
+{
+ LLUICtrl::setEnabled(b);
+ mButton->setEnabled(b);
+}
+
+void LLCheckBoxCtrl::clear()
+{
+ setValue( FALSE );
+}
+
+void LLCheckBoxCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ //stretch or shrink bounding rectangle of label when rebuilding UI at new scale
+ const S32 FUDGE = 10;
+ S32 text_width = mFont->getWidth( mLabel->getText() ) + FUDGE;
+ S32 text_height = llround(mFont->getLineHeight());
+ LLRect label_rect;
+ label_rect.setOriginAndSize(
+ LLCHECKBOXCTRL_HPAD + LLCHECKBOXCTRL_BTN_SIZE + LLCHECKBOXCTRL_SPACING,
+ LLCHECKBOXCTRL_VPAD,
+ text_width,
+ text_height );
+ mLabel->setRect(label_rect);
+
+ LLRect btn_rect;
+ btn_rect.setOriginAndSize(
+ LLCHECKBOXCTRL_HPAD,
+ LLCHECKBOXCTRL_VPAD,
+ LLCHECKBOXCTRL_BTN_SIZE + LLCHECKBOXCTRL_SPACING + text_width,
+ llmax( text_height, LLCHECKBOXCTRL_BTN_SIZE ) );
+ mButton->setRect( btn_rect );
+
+ LLUICtrl::reshape(width, height, called_from_parent);
+}
+
+void LLCheckBoxCtrl::draw()
+{
+ if (mEnabled)
+ {
+ mLabel->setColor( mTextEnabledColor );
+ }
+ else
+ {
+ mLabel->setColor( mTextDisabledColor );
+ }
+
+ // Draw children
+ LLUICtrl::draw();
+}
+
+//virtual
+void LLCheckBoxCtrl::setValue(const LLSD& value )
+{
+ mButton->setToggleState( value.asBoolean() );
+}
+
+//virtual
+LLSD LLCheckBoxCtrl::getValue() const
+{
+ return mButton->getToggleState();
+}
+
+void LLCheckBoxCtrl::setLabel( const LLString& label )
+{
+ mLabel->setText( label );
+ reshape(getRect().getWidth(), getRect().getHeight(), FALSE);
+}
+
+LLString LLCheckBoxCtrl::getLabel() const
+{
+ return mLabel->getText();
+}
+
+BOOL LLCheckBoxCtrl::setLabelArg( const LLString& key, const LLString& text )
+{
+ BOOL res = mLabel->setTextArg(key, text);
+ reshape(getRect().getWidth(), getRect().getHeight(), FALSE);
+ return res;
+}
+
+//virtual
+LLString LLCheckBoxCtrl::getControlName() const
+{
+ return mButton->getControlName();
+}
+
+// virtual
+void LLCheckBoxCtrl::setControlName(const LLString& control_name, LLView* context)
+{
+ mButton->setControlName(control_name, context);
+}
+
+// virtual
+LLXMLNodePtr LLCheckBoxCtrl::getXML(bool save_children) const
+{
+ LLXMLNodePtr node = LLUICtrl::getXML();
+
+ node->createChild("label", TRUE)->setStringValue(mLabel->getText());
+
+ LLString control_name = mButton->getControlName();
+
+ node->createChild("initial_value", TRUE)->setBoolValue(mInitialValue);
+
+ node->createChild("font", TRUE)->setStringValue(LLFontGL::nameFromFont(mFont));
+
+ node->createChild("radio_style", TRUE)->setBoolValue(mRadioStyle);
+
+ return node;
+}
+
+// static
+LLView* LLCheckBoxCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory)
+{
+ LLString name("checkbox");
+ node->getAttributeString("name", name);
+
+ LLString label("");
+ node->getAttributeString("label", label);
+
+ BOOL initial_value = FALSE;
+
+ LLFontGL* font = LLView::selectFont(node);
+
+ BOOL radio_style = FALSE;
+ node->getAttributeBOOL("radio_style", radio_style);
+
+ LLUICtrlCallback callback = NULL;
+
+ if (label.empty())
+ {
+ label.assign(node->getTextContents());
+ }
+
+ LLRect rect;
+ createRect(node, rect, parent, LLRect());
+
+ LLCheckBoxCtrl* checkbox = new LLCheckboxCtrl(name,
+ rect,
+ label,
+ font,
+ callback,
+ NULL,
+ initial_value,
+ radio_style); // if true, draw radio button style icons
+
+ LLColor4 color;
+ color = LLUI::sColorsGroup->getColor( "LabelTextColor" );
+ LLUICtrlFactory::getAttributeColor(node,"text_enabled_color", color);
+ checkbox->setEnabledColor(color);
+
+ color = LLUI::sColorsGroup->getColor( "LabelDisabledColor" );
+ LLUICtrlFactory::getAttributeColor(node,"text_disabled_color", color);
+ checkbox->setDisabledColor(color);
+
+ checkbox->initFromXML(node, parent);
+
+ return checkbox;
+}