diff options
Diffstat (limited to 'indra/llui')
-rw-r--r-- | indra/llui/llbutton.cpp | 12 | ||||
-rw-r--r-- | indra/llui/llbutton.h | 4 | ||||
-rw-r--r-- | indra/llui/llcheckboxctrl.cpp | 21 | ||||
-rw-r--r-- | indra/llui/llcheckboxctrl.h | 6 | ||||
-rw-r--r-- | indra/llui/llcombobox.cpp | 21 | ||||
-rw-r--r-- | indra/llui/llcombobox.h | 4 | ||||
-rw-r--r-- | indra/llui/llctrlselectioninterface.h | 2 | ||||
-rw-r--r-- | indra/llui/llfloater.cpp | 9 | ||||
-rw-r--r-- | indra/llui/lllineeditor.cpp | 56 | ||||
-rw-r--r-- | indra/llui/lllineeditor.h | 5 | ||||
-rw-r--r-- | indra/llui/llradiogroup.h | 2 | ||||
-rw-r--r-- | indra/llui/llscrolllistctrl.cpp | 31 | ||||
-rw-r--r-- | indra/llui/llscrolllistctrl.h | 8 | ||||
-rw-r--r-- | indra/llui/lltexteditor.cpp | 26 | ||||
-rw-r--r-- | indra/llui/lltexteditor.h | 1 | ||||
-rw-r--r-- | indra/llui/lluictrl.h | 4 |
16 files changed, 175 insertions, 37 deletions
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index bdf1c12b79..2fe43c04f2 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -69,8 +69,7 @@ LLButton::LLButton( const LLString& name, const LLRect& rect, const LLString& co mCurGlowStrength(0.f), mNeedsHighlight(FALSE), mCommitOnReturn(TRUE), - mImagep( NULL ), - mIsDirty( FALSE ) + mImagep( NULL ) { mUnselectedLabel = name; mSelectedLabel = name; @@ -255,8 +254,6 @@ void LLButton::onCommit() { (*mClickedCallback)( mCallbackUserData ); } - - mIsDirty = TRUE; } @@ -271,7 +268,6 @@ BOOL LLButton::handleUnicodeCharHere(llwchar uni_char, BOOL called_from_parent) (*mClickedCallback)( mCallbackUserData ); } handled = TRUE; - mIsDirty = TRUE; } return handled; } @@ -288,7 +284,6 @@ BOOL LLButton::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent ) (*mClickedCallback)( mCallbackUserData ); } handled = TRUE; - mIsDirty = TRUE; } } return handled; @@ -348,9 +343,7 @@ BOOL LLButton::handleMouseUp(S32 x, S32 y, MASK mask) if (mClickedCallback) { (*mClickedCallback)( mCallbackUserData ); - } - - mIsDirty = TRUE; + } } mMouseDownTimer.stop(); @@ -753,7 +746,6 @@ void LLButton::setToggleState(BOOL b) void LLButton::setValue(const LLSD& value ) { mToggleState = value.asBoolean(); - mIsDirty = FALSE; } LLSD LLButton::getValue() const diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h index a638b5be49..9c737956ba 100644 --- a/indra/llui/llbutton.h +++ b/indra/llui/llbutton.h @@ -80,8 +80,6 @@ public: // HACK: "committing" a button is the same as clicking on it. virtual void onCommit(); - virtual BOOL isDirty() { return mIsDirty; }; // Returns TRUE if the user has clicked on the button at all - void setUnselectedLabelColor( const LLColor4& c ) { mUnselectedLabelColor = c; } void setSelectedLabelColor( const LLColor4& c ) { mSelectedLabelColor = c; } @@ -259,8 +257,6 @@ protected: LLPointer<LLImageGL> mImagep; - BOOL mIsDirty; - static LLFrameTimer sFlashingTimer; }; diff --git a/indra/llui/llcheckboxctrl.cpp b/indra/llui/llcheckboxctrl.cpp index 6c181acc94..318268bdb6 100644 --- a/indra/llui/llcheckboxctrl.cpp +++ b/indra/llui/llcheckboxctrl.cpp @@ -39,7 +39,8 @@ LLCheckBoxCtrl::LLCheckBoxCtrl(const LLString& name, const LLRect& rect, mTextEnabledColor( LLUI::sColorsGroup->getColor( "LabelTextColor" ) ), mTextDisabledColor( LLUI::sColorsGroup->getColor( "LabelDisabledColor" ) ), mRadioStyle( use_radio_style ), - mInitialValue( initial_value ) + mInitialValue( initial_value ), + mSetValue( initial_value ) { if (font) { @@ -208,7 +209,8 @@ void LLCheckBoxCtrl::draw() //virtual void LLCheckBoxCtrl::setValue(const LLSD& value ) { - mButton->setToggleState( value.asBoolean() ); + mSetValue = value.asBoolean(); + mButton->setToggleState( mSetValue ); } //virtual @@ -249,16 +251,27 @@ void LLCheckBoxCtrl::setControlName(const LLString& control_name, LLView* contex // virtual Returns TRUE if the user has modified this control. -BOOL LLCheckBoxCtrl::isDirty() +BOOL LLCheckBoxCtrl::isDirty() const { if ( mButton ) { - return mButton->isDirty(); + return (mSetValue != mButton->getToggleState()); } return FALSE; // Shouldn't get here } +// virtual Clear dirty state +void LLCheckBoxCtrl::resetDirty() +{ + if ( mButton ) + { + mSetValue = mButton->getToggleState(); + } +} + + + // virtual LLXMLNodePtr LLCheckBoxCtrl::getXML(bool save_children) const { diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h index 76b197125d..3b1883ce8d 100644 --- a/indra/llui/llcheckboxctrl.h +++ b/indra/llui/llcheckboxctrl.h @@ -90,7 +90,8 @@ public: static void onButtonPress(void *userdata); - virtual BOOL isDirty(); // Returns TRUE if the user has modified this control. + virtual BOOL isDirty() const; // Returns TRUE if the user has modified this control. + virtual void resetDirty(); // Clear dirty state protected: // note: value is stored in toggle state of button @@ -100,7 +101,8 @@ protected: LLColor4 mTextEnabledColor; LLColor4 mTextDisabledColor; BOOL mRadioStyle; - BOOL mInitialValue; + BOOL mInitialValue; // Value set in constructor + BOOL mSetValue; // Value set programmatically BOOL mKeyboardFocusOnClick; LLViewBorder* mBorder; }; diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index d63a53fdff..5eeb1d19c8 100644 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -227,6 +227,27 @@ void LLComboBox::onCommit() LLUICtrl::onCommit(); } +// virtual +BOOL LLComboBox::isDirty() const +{ + BOOL grubby = FALSE; + if ( mList ) + { + grubby = mList->isDirty(); + } + return grubby; +} + +// virtual Clear dirty state +void LLComboBox::resetDirty() +{ + if ( mList ) + { + mList->resetDirty(); + } +} + + // add item "name" to menu void LLComboBox::add(const LLString& name, EAddPosition pos, BOOL enabled) { diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h index 02aa0084ed..fea54c554e 100644 --- a/indra/llui/llcombobox.h +++ b/indra/llui/llcombobox.h @@ -68,6 +68,8 @@ public: virtual void clear(); // select nothing virtual void onCommit(); virtual BOOL acceptsTextInput() const { return mAllowTextEntry; } + virtual BOOL isDirty() const; // Returns TRUE if the user has modified this control. + virtual void resetDirty(); // Clear dirty state virtual void setFocus(BOOL b); @@ -127,7 +129,7 @@ public: virtual BOOL getCanSelect() const { return TRUE; } virtual BOOL selectFirstItem() { return setCurrentByIndex(0); } virtual BOOL selectNthItem( S32 index ) { return setCurrentByIndex(index); } - virtual S32 getFirstSelectedIndex() { return getCurrentIndex(); } + virtual S32 getFirstSelectedIndex() const { return getCurrentIndex(); } virtual BOOL setCurrentByID( const LLUUID& id ); virtual LLUUID getCurrentID(); // LLUUID::null if no items in menu virtual BOOL setSelectedByValue(LLSD value, BOOL selected); diff --git a/indra/llui/llctrlselectioninterface.h b/indra/llui/llctrlselectioninterface.h index 9df7475a6c..daa84712d4 100644 --- a/indra/llui/llctrlselectioninterface.h +++ b/indra/llui/llctrlselectioninterface.h @@ -36,7 +36,7 @@ public: virtual BOOL selectFirstItem() = 0; virtual BOOL selectNthItem( S32 index ) = 0; - virtual S32 getFirstSelectedIndex() = 0; + virtual S32 getFirstSelectedIndex() const = 0; // TomY TODO: Simply cast the UUIDs to LLSDs, using the selectByValue function virtual BOOL setCurrentByID( const LLUUID& id ) = 0; diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 17b4dffa3f..9ea4165ea4 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -1232,10 +1232,13 @@ BOOL LLFloater::getEditModeEnabled() //static void LLFloater::show(LLFloater* floaterp) { - if (floaterp) floaterp->open(); - if (floaterp->getHost()) + if (floaterp) { - floaterp->getHost()->open(); + floaterp->open(); + if (floaterp->getHost()) + { + floaterp->getHost()->open(); + } } } diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 5e043ecea3..ccf18a3506 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -118,6 +118,8 @@ LLLineEditor::LLLineEditor(const LLString& name, const LLRect& rect, mSelectionEnd( 0 ), mLastSelectionX(-1), mLastSelectionY(-1), + mLastSelectionStart(-1), + mLastSelectionEnd(-1), mPrevalidateFunc( prevalidate_func ), mCursorColor( LLUI::sColorsGroup->getColor( "TextCursorColor" ) ), mFgColor( LLUI::sColorsGroup->getColor( "TextFgColor" ) ), @@ -227,6 +229,19 @@ void LLLineEditor::onCommit() selectAll(); } +// virtual +BOOL LLLineEditor::isDirty() const +{ + return ( mText.getString() != mPrevText ); +} + +// virtual +void LLLineEditor::resetDirty() +{ + mPrevText = mText.getString(); +} + + // line history support void LLLineEditor::updateHistory() { @@ -448,8 +463,38 @@ BOOL LLLineEditor::handleDoubleClick(S32 x, S32 y, MASK mask) } else { - // otherwise select everything - selectAll(); + const LLWString& wtext = mText.getWString(); + + BOOL doSelectAll = TRUE; + + // Select the word we're on + if( isPartOfWord( wtext[mCursorPos] ) ) + { + S32 old_selection_start = mLastSelectionStart; + S32 old_selection_end = mLastSelectionEnd; + + // Select word the cursor is over + while ((mCursorPos > 0) && isPartOfWord( wtext[mCursorPos-1] )) + { // Find the start of the word + mCursorPos--; + } + startSelection(); + + while ((mCursorPos < (S32)wtext.length()) && isPartOfWord( wtext[mCursorPos] ) ) + { // Find the end of the word + mCursorPos++; + } + mSelectionEnd = mCursorPos; + + // If nothing changed, then the word was already selected. Select the whole line. + doSelectAll = (old_selection_start == mSelectionStart) && + (old_selection_end == mSelectionEnd); + } + + if ( doSelectAll ) + { // Select everything + selectAll(); + } } // We don't want handleMouseUp() to "finish" the selection (and thereby @@ -476,6 +521,9 @@ BOOL LLLineEditor::handleMouseDown(S32 x, S32 y, MASK mask) } else { + mLastSelectionStart = -1; + mLastSelectionStart = -1; + setFocus( TRUE ); if (mask & MASK_SHIFT) @@ -519,6 +567,10 @@ BOOL LLLineEditor::handleMouseDown(S32 x, S32 y, MASK mask) } else { + // Save selection for word/line selecting on double-click + mLastSelectionStart = mSelectionStart; + mLastSelectionEnd = mSelectionEnd; + // Move cursor and deselect for regular click setCursorAtLocalPos( x ); deselect(); diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 110e40b92d..db6aea8432 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -107,7 +107,8 @@ public: virtual void setRect(const LLRect& rect); virtual BOOL acceptsTextInput() const; virtual void onCommit(); - virtual BOOL isDirty() { return ( mText.getString() != mPrevText ); }; // Returns TRUE if the user has changed value at all + virtual BOOL isDirty() const; // Returns TRUE if the user has changed value at all + virtual void resetDirty(); // Clear dirty state // assumes UTF8 text virtual void setValue(const LLSD& value ); @@ -237,6 +238,8 @@ protected: S32 mSelectionEnd; S32 mLastSelectionX; S32 mLastSelectionY; + S32 mLastSelectionStart; + S32 mLastSelectionEnd; S32 (*mPrevalidateFunc)(const LLWString &str); diff --git a/indra/llui/llradiogroup.h b/indra/llui/llradiogroup.h index 2a856ee6cf..38b56a179e 100644 --- a/indra/llui/llradiogroup.h +++ b/indra/llui/llradiogroup.h @@ -95,7 +95,7 @@ public: /*virtual*/ BOOL getCanSelect() const { return TRUE; } /*virtual*/ BOOL selectFirstItem() { return setSelectedIndex(0); } /*virtual*/ BOOL selectNthItem( S32 index ) { return setSelectedIndex(index); } - /*virtual*/ S32 getFirstSelectedIndex() { return getSelectedIndex(); } + /*virtual*/ S32 getFirstSelectedIndex() const { return getSelectedIndex(); } /*virtual*/ BOOL setCurrentByID( const LLUUID& id ); /*virtual*/ LLUUID getCurrentID(); // LLUUID::null if no items in menu /*virtual*/ BOOL setSelectedByValue(LLSD value, BOOL selected); diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index e802b3426b..ffad4809e9 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -427,6 +427,8 @@ LLScrollListCtrl::LLScrollListCtrl(const LLString& name, const LLRect& rect, mSortColumn(-1), mSortAscending(TRUE), mSorted(TRUE), + mDirty(FALSE), + mOriginalSelection(-1), mDrewSelected(FALSE) { mItemListRect.setOriginAndSize( @@ -515,6 +517,7 @@ void LLScrollListCtrl::clearRows() mScrollLines = 0; mLastSelected = NULL; updateMaxContentWidth(NULL); + mDirty = FALSE; } @@ -547,10 +550,10 @@ std::vector<LLScrollListItem*> LLScrollListCtrl::getAllSelected() const return ret; } -S32 LLScrollListCtrl::getFirstSelectedIndex() +S32 LLScrollListCtrl::getFirstSelectedIndex() const { S32 CurSelectedIndex = 0; - item_list::iterator iter; + item_list::const_iterator iter; for (iter = mItemList.begin(); iter != mItemList.end(); iter++) { LLScrollListItem* item = *iter; @@ -865,6 +868,7 @@ BOOL LLScrollListCtrl::selectFirstItem() selectItem(itemp); } success = TRUE; + mOriginalSelection = 0; } else { @@ -898,6 +902,7 @@ BOOL LLScrollListCtrl::selectNthItem( S32 target_index ) { selectItem(itemp); success = TRUE; + mOriginalSelection = target_index; } } else @@ -1721,6 +1726,7 @@ BOOL LLScrollListCtrl::handleMouseUp(S32 x, S32 y, MASK mask) // always commit when mouse operation is completed inside list if (mItemListRect.pointInRect(x,y)) { + mDirty |= mSelectionChanged; mSelectionChanged = FALSE; onCommit(); } @@ -2121,6 +2127,7 @@ void LLScrollListCtrl::commitIfChanged() { if (mSelectionChanged) { + mDirty = TRUE; mSelectionChanged = FALSE; onCommit(); } @@ -2979,6 +2986,26 @@ void LLScrollListCtrl::setFocus(BOOL b) LLUICtrl::setFocus(b); } + +// virtual +BOOL LLScrollListCtrl::isDirty() const +{ + BOOL grubby = mDirty; + if ( !mAllowMultipleSelection ) + { + grubby = (mOriginalSelection != getFirstSelectedIndex()); + } + return grubby; +} + +// Clear dirty state +void LLScrollListCtrl::resetDirty() +{ + mDirty = FALSE; + mOriginalSelection = getFirstSelectedIndex(); +} + + //virtual void LLScrollListCtrl::onFocusReceived() { diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h index 9604b0569c..c7dfa870fb 100644 --- a/indra/llui/llscrolllistctrl.h +++ b/indra/llui/llscrolllistctrl.h @@ -440,7 +440,7 @@ public: LLUUID getStringUUIDSelectedItem(); LLScrollListItem* getFirstSelected() const; - virtual S32 getFirstSelectedIndex(); + virtual S32 getFirstSelectedIndex() const; std::vector<LLScrollListItem*> getAllSelected() const; LLScrollListItem* getLastSelectedItem() const { return mLastSelected; } @@ -495,6 +495,9 @@ public: virtual void onFocusReceived(); virtual void onFocusLost(); + virtual BOOL isDirty() const; + virtual void resetDirty(); // Clear dirty state + virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); virtual void arrange(S32 max_width, S32 max_height); virtual LLRect getRequiredRect(); @@ -638,6 +641,9 @@ protected: std::map<LLString, LLScrollListColumn> mColumns; std::vector<LLScrollListColumn*> mColumnsIndexed; + BOOL mDirty; + S32 mOriginalSelection; + public: // HACK: Did we draw one selected item this frame? BOOL mDrewSelected; diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index ea5897e28e..52f8c19ebd 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -334,6 +334,8 @@ LLTextEditor::LLTextEditor( appendText(default_text, FALSE, FALSE); + resetDirty(); // Update saved text state + mParseHTML=FALSE; mHTML=""; } @@ -509,6 +511,8 @@ void LLTextEditor::setText(const LLString &utf8str) updateLineStartList(); updateScrollFromCursor(); + + resetDirty(); } void LLTextEditor::setWText(const LLWString &wtext) @@ -525,6 +529,8 @@ void LLTextEditor::setWText(const LLWString &wtext) updateLineStartList(); updateScrollFromCursor(); + + resetDirty(); } void LLTextEditor::setValue(const LLSD& value) @@ -3427,6 +3433,7 @@ void LLTextEditor::appendText(const LLString &new_text, bool allow_undo, bool pr BOOL was_scrolled_to_bottom = (mScrollbar->getDocPos() == mScrollbar->getDocPosMax()); S32 selection_start = mSelectionStart; S32 selection_end = mSelectionEnd; + BOOL was_selecting = mIsSelecting; S32 cursor_pos = mCursorPos; S32 old_length = getLength(); BOOL cursor_was_at_end = (mCursorPos == old_length); @@ -3459,17 +3466,23 @@ void LLTextEditor::appendText(const LLString &new_text, bool allow_undo, bool pr updateLineStartList(old_length); // Set the cursor and scroll position - // Maintain the scroll position unless the scroll was at the end of the doc - // (in which case, move it to the new end of the doc) - if( was_scrolled_to_bottom ) + // Maintain the scroll position unless the scroll was at the end of the doc (in which + // case, move it to the new end of the doc) or unless the user was doing actively selecting + if( was_scrolled_to_bottom && !was_selecting ) { + if( selection_start != selection_end ) + { + // maintain an existing non-active selection + mSelectionStart = selection_start; + mSelectionEnd = selection_end; + } endOfDoc(); } else if( selection_start != selection_end ) { mSelectionStart = selection_start; - mSelectionEnd = selection_end; + mIsSelecting = was_selecting; setCursorPos(cursor_pos); } else if( cursor_was_at_end ) @@ -3606,6 +3619,11 @@ BOOL LLTextEditor::tryToRevertToPristineState() return isPristine(); // TRUE => success } +// virtual Return TRUE if changes have been made +BOOL LLTextEditor::isDirty() const +{ + return( mLastCmd != NULL || (mPristineCmd && (mPristineCmd != mLastCmd)) ); +} void LLTextEditor::updateTextRect() diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index 0b6e291843..7c7ec9c13b 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -89,6 +89,7 @@ public: virtual void clear(); virtual void setFocus( BOOL b ); virtual BOOL acceptsTextInput() const; + virtual BOOL isDirty() const; // LLEditMenuHandler interface virtual void undo(); diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h index 7b96ec5655..1355b12924 100644 --- a/indra/llui/lluictrl.h +++ b/indra/llui/lluictrl.h @@ -129,7 +129,9 @@ public: }; // Returns TRUE if the user has modified this control. Editable controls should override this. - virtual BOOL isDirty() { return FALSE; }; + virtual BOOL isDirty() const { return FALSE; }; + // Clear the dirty state + virtual void resetDirty() {}; protected: virtual void onFocusReceived(); |