void LLSlider::setValueAndCommit(F32 value) { F32 old_value = getValueF32(); setValue(value); if (getValueF32() != old_value) { onCommit(); } }
BOOL LLSlider::handleMouseDown(S32 x, S32 y, MASK mask) { // only do sticky-focus on non-chrome widgets if (!getIsChrome()) { setFocus(TRUE); } if (mMouseDownSignal) (*mMouseDownSignal)( this, getValueF32() ); if (MASK_CONTROL & mask) // if CTRL is modifying { setValueAndCommit(mInitialValue); } else { // Find the offset of the actual mouse location from the center of the thumb. if (mThumbRect.pointInRect(x,y)) { mMouseOffset = (mThumbRect.mLeft + mThumbImage->getWidth()/2) - x; } else { mMouseOffset = 0; } // Start dragging the thumb // No handler needed for focus lost since this class has no state that depends on it. gFocusMgr.setMouseCapture( this ); mDragStartThumbRect = mThumbRect; } make_ui_sound("UISndClick"); return TRUE; }
void LLSpinCtrl::onEditorCommit( const LLSD& data ) { BOOL success = FALSE; std::string text = mEditor->getText(); if( LLLineEditor::postvalidateFloat( text ) ) { LLLocale locale(LLLocale::USER_LOCALE); F32 val = (F32) atof(text.c_str()); if (val < mMinValue) val = mMinValue; if (val > mMaxValue) val = mMaxValue; F32 saved_val = getValueF32(); setValue(val); if( !mValidateSignal || (*mValidateSignal)( this, val ) ) { success = TRUE; onCommit(); } else { setValue(saved_val); } } updateEditor(); if( !success ) { reportInvalidData(); } }
LLSlider::LLSlider(const LLSlider::Params& p) : LLF32UICtrl(p), mMouseOffset( 0 ), mOrientation ((p.orientation() == "horizontal") ? HORIZONTAL : VERTICAL), mTrackColor(p.track_color()), mThumbOutlineColor(p.thumb_outline_color()), mThumbCenterColor(p.thumb_center_color()), mThumbImage(p.thumb_image), mThumbImagePressed(p.thumb_image_pressed), mThumbImageDisabled(p.thumb_image_disabled), mTrackImageHorizontal(p.track_image_horizontal), mTrackImageVertical(p.track_image_vertical), mTrackHighlightHorizontalImage(p.track_highlight_horizontal_image), mTrackHighlightVerticalImage(p.track_highlight_vertical_image), mMouseDownSignal(NULL), mMouseUpSignal(NULL) { mViewModel->setValue(p.initial_value); updateThumbRect(); mDragStartThumbRect = mThumbRect; setControlName(p.control_name, NULL); setValue(getValueF32()); if (p.mouse_down_callback.isProvided()) { setMouseDownCallback(initCommitCallback(p.mouse_down_callback)); } if (p.mouse_up_callback.isProvided()) { setMouseUpCallback(initCommitCallback(p.mouse_up_callback)); } }
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 LLSliderCtrl::updateText() { if( mEditor || mTextBox ) { LLLocale locale(LLLocale::USER_LOCALE); // Don't display very small negative values as -0.000 F32 displayed_value = (F32)(floor(getValueF32() * pow(10.0, (F64)mPrecision) + 0.5) / pow(10.0, (F64)mPrecision)); std::string format = llformat("%%.%df", mPrecision); std::string text = llformat(format.c_str(), displayed_value); if( mEditor ) { // Setting editor text here to "" before using actual text is here because if text which // is set is the same as the one which is actually typed into lineeditor, LLLineEditor::setText() // will exit at it's beginning, so text for revert on escape won't be saved. (EXT-8536) mEditor->setText( LLStringUtil::null ); mEditor->setText( text ); } else { mTextBox->setText( text ); } } }
BOOL LLSlider::handleScrollWheel(S32 x, S32 y, S32 clicks) { if ( mOrientation == VERTICAL ) { F32 new_val = getValueF32() - clicks * getIncrement(); setValueAndCommit(new_val); return TRUE; } return LLF32UICtrl::handleScrollWheel(x,y,clicks); }
//no matter if Editor has the focus, update the value void LLSpinCtrl::forceSetValue(const LLSD& value ) { F32 v = (F32)value.asReal(); if (getValueF32() != v || !mbHasBeenSet) { mbHasBeenSet = TRUE; LLF32UICtrl::setValue(value); updateEditor(); } }
BOOL LLSlider::handleKeyHere(KEY key, MASK mask) { BOOL handled = FALSE; switch(key) { case KEY_DOWN: case KEY_LEFT: setValueAndCommit(getValueF32() - getIncrement()); handled = TRUE; break; case KEY_UP: case KEY_RIGHT: setValueAndCommit(getValueF32() + getIncrement()); handled = TRUE; break; default: break; } return handled; }
void LLMultiSliderCtrl::onCommit() { setTentative(FALSE); if( mEditor ) { mEditor->setTentative(FALSE); } setControlValue(getValueF32()); LLF32UICtrl::onCommit(); }
void LLSlider::setValue(F32 value, BOOL from_event) { value = llclamp( value, mMinValue, mMaxValue ); // Round to nearest increment (bias towards rounding down) value -= mMinValue; value += mIncrement/2.0001f; value -= fmod(value, mIncrement); value += mMinValue; if (!from_event && getValueF32() != value) { setControlValue(value); } LLF32UICtrl::setValue(value); updateThumbRect(); }
BOOL LLSlider::handleMouseUp(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; if( hasMouseCapture() ) { gFocusMgr.setMouseCapture( NULL ); if (mMouseUpSignal) (*mMouseUpSignal)( this, getValueF32() ); handled = TRUE; make_ui_sound("UISndClickRelease"); } else { handled = TRUE; } return handled; }
void LLSliderCtrl::updateText() { if( mEditor || mTextBox ) { LLLocale locale(LLLocale::USER_LOCALE); // Don't display very small negative values as -0.000 F32 displayed_value = (F32)(floor(getValueF32() * pow(10.0, (F64)mPrecision) + 0.5) / pow(10.0, (F64)mPrecision)); std::string format = llformat("%%.%df", mPrecision); std::string text = llformat(format.c_str(), displayed_value); if( mEditor ) { mEditor->setText( text ); } else { mTextBox->setText( text ); } } }
LLSlider::LLSlider( const std::string& name, const LLRect& rect, void (*on_commit_callback)(LLUICtrl* ctrl, void* userdata), void* callback_userdata, F32 initial_value, F32 min_value, F32 max_value, F32 increment, BOOL volume, const std::string& control_name) : LLUICtrl( name, rect, TRUE, on_commit_callback, callback_userdata, FOLLOWS_LEFT | FOLLOWS_TOP), mValue( initial_value ), mInitialValue( initial_value ), mMinValue( min_value ), mMaxValue( max_value ), mIncrement( increment ), mVolumeSlider( volume ), mMouseOffset( 0 ), mTrackColor( LLUI::sColorsGroup->getColor( "SliderTrackColor" ) ), mThumbOutlineColor( LLUI::sColorsGroup->getColor( "SliderThumbOutlineColor" ) ), mThumbCenterColor( LLUI::sColorsGroup->getColor( "SliderThumbCenterColor" ) ), mMouseDownSignal( NULL ), mMouseUpSignal( NULL ) { mThumbImage = LLUI::getUIImage("icn_slide-thumb_dark.tga"); mTrackImage = LLUI::getUIImage("icn_slide-groove_dark.tga"); mTrackHighlightImage = LLUI::getUIImage("icn_slide-highlight.tga"); // properly handle setting the starting thumb rect // do it this way to handle both the operating-on-settings // and standalone ways of using this setControlName(control_name, NULL); setValue(getValueF32()); updateThumbRect(); mDragStartThumbRect = mThumbRect; }
void LLSpinCtrl::onCommit() { setTentative(FALSE); setControlValue(getValueF32()); LLF32UICtrl::onCommit(); }