Refactor LLScrollList* and relatives
Breaks out llscrolllistcolumn, llscrolllistcell, and llscrolllistitem from llscrolllistctrl and llflyoutbutton from llcombobox
This commit is contained in:
@@ -1,31 +1,28 @@
|
||||
/**
|
||||
* @file llscrolllistctrl.h
|
||||
* @brief A scrolling list of items. This is the one you want to use
|
||||
* in UI code. LLScrollListCell, LLScrollListItem, etc. are utility
|
||||
* classes.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
@@ -37,293 +34,16 @@
|
||||
|
||||
#include "lluictrl.h"
|
||||
#include "llctrlselectioninterface.h"
|
||||
#include "lldarray.h"
|
||||
//#include "lldarray.h"
|
||||
#include "llfontgl.h"
|
||||
#include "llui.h"
|
||||
#include "llstring.h"
|
||||
#include "llimagegl.h"
|
||||
#include "llstring.h" // LLWString
|
||||
#include "lleditmenuhandler.h"
|
||||
#include "llframetimer.h"
|
||||
#include "llcheckboxctrl.h"
|
||||
#include "llcombobox.h"
|
||||
|
||||
#include "llscrollbar.h"
|
||||
#include "llresizebar.h"
|
||||
#include "lldate.h"
|
||||
// <edit>
|
||||
#include <boost/function.hpp>
|
||||
// </edit>
|
||||
|
||||
/*
|
||||
* Represents a cell in a scrollable table.
|
||||
*
|
||||
* Sub-classes must return height and other properties
|
||||
* though width accessors are implemented by the base class.
|
||||
* It is therefore important for sub-class constructors to call
|
||||
* setWidth() with realistic values.
|
||||
*/
|
||||
class LLScrollListCell
|
||||
{
|
||||
public:
|
||||
LLScrollListCell(S32 width = 0) : mWidth(width) {};
|
||||
virtual ~LLScrollListCell() {};
|
||||
virtual void draw(const LLColor4& color, const LLColor4& highlight_color) const = 0; // truncate to given width, if possible
|
||||
virtual S32 getWidth() const {return mWidth;}
|
||||
virtual S32 getContentWidth() const { return 0; }
|
||||
virtual S32 getHeight() const { return 0; }
|
||||
virtual const LLSD getValue() const { return LLStringUtil::null; }
|
||||
virtual void setValue(const LLSD& value) { }
|
||||
virtual BOOL getVisible() const { return TRUE; }
|
||||
virtual void setWidth(S32 width) { mWidth = width; }
|
||||
virtual void highlightText(S32 offset, S32 num_chars) {}
|
||||
virtual BOOL isText() const { return FALSE; }
|
||||
virtual void setColor(const LLColor4&) {}
|
||||
virtual void onCommit() {};
|
||||
|
||||
virtual BOOL handleClick() { return FALSE; }
|
||||
virtual void setEnabled(BOOL enable) { }
|
||||
|
||||
private:
|
||||
S32 mWidth;
|
||||
};
|
||||
|
||||
/*
|
||||
* Cell displaying a text label.
|
||||
*/
|
||||
class LLScrollListText : public LLScrollListCell
|
||||
{
|
||||
public:
|
||||
LLScrollListText( const std::string& text, const LLFontGL* font, S32 width = 0, U8 font_style = LLFontGL::NORMAL, LLFontGL::HAlign font_alignment = LLFontGL::LEFT, LLColor4& color = LLColor4::black, BOOL use_color = FALSE, BOOL visible = TRUE);
|
||||
/*virtual*/ ~LLScrollListText();
|
||||
|
||||
/*virtual*/ void draw(const LLColor4& color, const LLColor4& highlight_color) const;
|
||||
/*virtual*/ S32 getContentWidth() const;
|
||||
/*virtual*/ S32 getHeight() const;
|
||||
/*virtual*/ void setValue(const LLSD& value);
|
||||
/*virtual*/ const LLSD getValue() const;
|
||||
/*virtual*/ BOOL getVisible() const;
|
||||
/*virtual*/ void highlightText(S32 offset, S32 num_chars);
|
||||
|
||||
/*virtual*/ void setColor(const LLColor4&);
|
||||
/*virtual*/ BOOL isText() const;
|
||||
|
||||
S32 getTextWidth() const { return mTextWidth;}
|
||||
void setTextWidth(S32 value) { mTextWidth = value;}
|
||||
virtual void setWidth(S32 width) { LLScrollListCell::setWidth(width); mTextWidth = width; }
|
||||
|
||||
void setText(const LLStringExplicit& text);
|
||||
void setFontStyle(const U8 font_style);
|
||||
|
||||
private:
|
||||
LLUIString mText;
|
||||
S32 mTextWidth;
|
||||
const LLFontGL* mFont;
|
||||
LLColor4 mColor;
|
||||
U8 mUseColor;
|
||||
U8 mFontStyle;
|
||||
LLFontGL::HAlign mFontAlignment;
|
||||
BOOL mVisible;
|
||||
S32 mHighlightCount;
|
||||
S32 mHighlightOffset;
|
||||
|
||||
LLPointer<LLUIImage> mRoundedRectImage;
|
||||
|
||||
static U32 sCount;
|
||||
};
|
||||
|
||||
/*
|
||||
* Cell displaying an image.
|
||||
*/
|
||||
class LLScrollListIcon : public LLScrollListCell
|
||||
{
|
||||
public:
|
||||
LLScrollListIcon(const LLSD& value, S32 width = 0);
|
||||
/*virtual*/ ~LLScrollListIcon();
|
||||
/*virtual*/ void draw(const LLColor4& color, const LLColor4& highlight_color) const;
|
||||
/*virtual*/ S32 getWidth() const;
|
||||
/*virtual*/ S32 getHeight() const;
|
||||
/*virtual*/ const LLSD getValue() const;
|
||||
/*virtual*/ void setColor(const LLColor4&);
|
||||
/*virtual*/ void setValue(const LLSD& value);
|
||||
// <edit>
|
||||
void setClickCallback(boost::function<bool (void)> cb);
|
||||
virtual BOOL handleClick();
|
||||
// </edit>
|
||||
|
||||
private:
|
||||
LLPointer<LLUIImage> mIcon;
|
||||
LLColor4 mColor;
|
||||
// <edit>
|
||||
boost::function<bool (void)> mCallback;
|
||||
// </edit>
|
||||
};
|
||||
|
||||
/*
|
||||
* An interactive cell containing a check box.
|
||||
*/
|
||||
class LLScrollListCheck : public LLScrollListCell
|
||||
{
|
||||
public:
|
||||
LLScrollListCheck( LLCheckBoxCtrl* check_box, S32 width = 0);
|
||||
/*virtual*/ ~LLScrollListCheck();
|
||||
/*virtual*/ void draw(const LLColor4& color, const LLColor4& highlight_color) const;
|
||||
/*virtual*/ S32 getHeight() const { return 0; }
|
||||
/*virtual*/ const LLSD getValue() const;
|
||||
/*virtual*/ void setValue(const LLSD& value);
|
||||
/*virtual*/ void onCommit();
|
||||
|
||||
/*virtual*/ BOOL handleClick();
|
||||
/*virtual*/ void setEnabled(BOOL enable);
|
||||
|
||||
LLCheckBoxCtrl* getCheckBox() { return mCheckBox; }
|
||||
|
||||
private:
|
||||
LLCheckBoxCtrl* mCheckBox;
|
||||
};
|
||||
|
||||
|
||||
class LLScrollListDate : public LLScrollListText
|
||||
{
|
||||
public:
|
||||
LLScrollListDate( const LLDate& date, const LLFontGL* font, S32 width=0, U8 font_style = LLFontGL::NORMAL, LLFontGL::HAlign font_alignment = LLFontGL::LEFT, LLColor4& color = LLColor4::black, BOOL use_color = FALSE, BOOL visible = TRUE);
|
||||
virtual void setValue(const LLSD& value);
|
||||
virtual const LLSD getValue() const;
|
||||
|
||||
private:
|
||||
LLDate mDate;
|
||||
};
|
||||
|
||||
class LLScrollListColumn;
|
||||
class LLScrollColumnHeader : public LLComboBox
|
||||
{
|
||||
public:
|
||||
LLScrollColumnHeader(const std::string& label, const LLRect &rect, LLScrollListColumn* column, const LLFontGL *font = NULL);
|
||||
~LLScrollColumnHeader();
|
||||
|
||||
/*virtual*/ void draw();
|
||||
/*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
|
||||
|
||||
/*virtual*/ void showList();
|
||||
/*virtual*/ LLView* findSnapEdge(S32& new_edge_val, const LLCoordGL& mouse_dir, ESnapEdge snap_edge, ESnapType snap_type, S32 threshold, S32 padding);
|
||||
/*virtual*/ void handleReshape(const LLRect& new_rect, bool by_user = false);
|
||||
|
||||
void setImage(const std::string &image_name);
|
||||
void setImageOverlay(const std::string &overlay_image, LLFontGL::HAlign alignment = LLFontGL::HCENTER, const LLColor4& color = LLColor4::white);
|
||||
LLScrollListColumn* getColumn() { return mColumn; }
|
||||
void setHasResizableElement(BOOL resizable);
|
||||
void updateResizeBars();
|
||||
BOOL canResize();
|
||||
void enableResizeBar(BOOL enable);
|
||||
std::string getLabel() { return mOrigLabel; }
|
||||
|
||||
void onSelectSort();
|
||||
void onClick();
|
||||
void onMouseDown();
|
||||
|
||||
private:
|
||||
LLScrollListColumn* mColumn;
|
||||
LLResizeBar* mResizeBar;
|
||||
std::string mOrigLabel;
|
||||
LLUIString mAscendingText;
|
||||
LLUIString mDescendingText;
|
||||
BOOL mShowSortOptions;
|
||||
BOOL mHasResizableElement;
|
||||
|
||||
LLPointer<LLUIImage> mImageOverlay;
|
||||
LLFontGL::HAlign mImageOverlayAlignment;
|
||||
LLColor4 mImageOverlayColor;
|
||||
};
|
||||
|
||||
/*
|
||||
* A simple data class describing a column within a scroll list.
|
||||
*/
|
||||
class LLScrollListColumn
|
||||
{
|
||||
public:
|
||||
typedef enum e_sort_direction
|
||||
{
|
||||
DESCENDING,
|
||||
ASCENDING
|
||||
} ESortDirection;
|
||||
LLScrollListColumn();
|
||||
LLScrollListColumn(const LLSD &sd, LLScrollListCtrl* parent);
|
||||
|
||||
void setWidth(S32 width);
|
||||
S32 getWidth() const { return mWidth; }
|
||||
|
||||
// Public data is fine so long as this remains a simple struct-like data class.
|
||||
// If it ever gets any smarter than that, these should all become private
|
||||
// with protected or public accessor methods added as needed. -MG
|
||||
std::string mName;
|
||||
std::string mSortingColumn;
|
||||
ESortDirection mSortDirection;
|
||||
std::string mLabel;
|
||||
F32 mRelWidth;
|
||||
BOOL mDynamicWidth;
|
||||
S32 mMaxContentWidth;
|
||||
S32 mIndex;
|
||||
LLScrollListCtrl* mParentCtrl;
|
||||
LLScrollColumnHeader* mHeader;
|
||||
LLFontGL::HAlign mFontAlignment;
|
||||
|
||||
private:
|
||||
S32 mWidth;
|
||||
|
||||
};
|
||||
|
||||
class LLScrollListItem : public LLHandleProvider<LLScrollListItem>
|
||||
{
|
||||
public:
|
||||
LLScrollListItem( BOOL enabled = TRUE, void* userdata = NULL, const LLUUID& uuid = LLUUID::null )
|
||||
: mSelected(FALSE), mEnabled( enabled ), mUserdata( userdata ), mItemValue( uuid ), mColumns() {}
|
||||
LLScrollListItem( LLSD item_value, void* userdata = NULL )
|
||||
: mSelected(FALSE), mEnabled( TRUE ), mUserdata( userdata ), mItemValue( item_value ), mColumns() {}
|
||||
|
||||
virtual ~LLScrollListItem();
|
||||
|
||||
void setSelected( BOOL b ) { mSelected = b; }
|
||||
BOOL getSelected() const { return mSelected; }
|
||||
|
||||
void setEnabled( BOOL b ) { mEnabled = b; }
|
||||
BOOL getEnabled() const { return mEnabled; }
|
||||
|
||||
void setUserdata( void* userdata ) { mUserdata = userdata; }
|
||||
void* getUserdata() const { return mUserdata; }
|
||||
|
||||
void setToolTip(const std::string tool_tip) { mToolTip=tool_tip; }
|
||||
std::string getToolTip() { return mToolTip; }
|
||||
|
||||
virtual LLUUID getUUID() const { return mItemValue.asUUID(); }
|
||||
LLSD getValue() const { return mItemValue; }
|
||||
|
||||
void setRect(LLRect rect) { mRectangle = rect; }
|
||||
LLRect getRect() const { return mRectangle; }
|
||||
|
||||
// If width = 0, just use the width of the text. Otherwise override with
|
||||
// specified width in pixels.
|
||||
void addColumn( const std::string& text, const LLFontGL* font, S32 width = 0 , U8 font_style = LLFontGL::NORMAL, LLFontGL::HAlign font_alignment = LLFontGL::LEFT, BOOL visible = TRUE)
|
||||
{ mColumns.push_back( new LLScrollListText(text, font, width, font_style, font_alignment, LLColor4::black, FALSE, visible) ); }
|
||||
|
||||
void setNumColumns(S32 columns);
|
||||
|
||||
void setColumn( S32 column, LLScrollListCell *cell );
|
||||
|
||||
S32 getNumColumns() const;
|
||||
|
||||
LLScrollListCell *getColumn(const S32 i) const;
|
||||
|
||||
std::string getContentsCSV() const;
|
||||
|
||||
virtual void draw(const LLRect& rect, const LLColor4& fg_color, const LLColor4& bg_color, const LLColor4& highlight_color, S32 column_padding);
|
||||
|
||||
private:
|
||||
BOOL mSelected;
|
||||
BOOL mEnabled;
|
||||
void* mUserdata;
|
||||
LLSD mItemValue;
|
||||
std::string mToolTip;
|
||||
std::vector<LLScrollListCell *> mColumns;
|
||||
LLRect mRectangle;
|
||||
};
|
||||
|
||||
class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler,
|
||||
public LLCtrlListInterface, public LLCtrlScrollInterface
|
||||
@@ -354,13 +74,10 @@ public:
|
||||
|
||||
|
||||
typedef boost::signals2::signal<S32 (S32,const LLScrollListItem*,const LLScrollListItem*),maximum<S32> > sort_signal_t;
|
||||
LLScrollListCtrl(
|
||||
const std::string& name,
|
||||
const LLRect& rect,
|
||||
commit_callback_t commit_callback,
|
||||
BOOL allow_multiple_selection,
|
||||
BOOL draw_border = TRUE, bool draw_heading = false);
|
||||
|
||||
LLScrollListCtrl(const std::string& name, const LLRect& rect, commit_callback_t commit_callback, bool multi_select, bool has_border = true, bool draw_heading = false);
|
||||
|
||||
public:
|
||||
virtual ~LLScrollListCtrl();
|
||||
|
||||
virtual LLXMLNodePtr getXML(bool save_children = true) const;
|
||||
@@ -372,7 +89,7 @@ public:
|
||||
void deleteAllItems() { clearRows(); }
|
||||
|
||||
// Sets an array of column descriptors
|
||||
void setColumnHeadings(LLSD headings);
|
||||
void setColumnHeadings(const LLSD& headings);
|
||||
void sortByColumnIndex(U32 column, BOOL ascending);
|
||||
|
||||
// LLCtrlListInterface functions
|
||||
@@ -381,7 +98,6 @@ public:
|
||||
virtual void addColumn(const LLSD& column, EAddPosition pos = ADD_BOTTOM);
|
||||
virtual void clearColumns();
|
||||
virtual void setColumnLabel(const std::string& column, const std::string& label);
|
||||
|
||||
virtual LLScrollListColumn* getColumn(S32 index);
|
||||
virtual LLScrollListColumn* getColumn(const std::string& name);
|
||||
virtual S32 getNumColumns() const { return mColumnsIndexed.size(); }
|
||||
@@ -389,7 +105,7 @@ public:
|
||||
// Adds a single element, from an array of:
|
||||
// "columns" => [ "column" => column name, "value" => value, "type" => type, "font" => font, "font-style" => style ], "id" => uuid
|
||||
// Creates missing columns automatically.
|
||||
virtual LLScrollListItem* addElement(const LLSD& value, EAddPosition pos = ADD_BOTTOM, void* userdata = NULL);
|
||||
virtual LLScrollListItem* addElement(const LLSD& element, EAddPosition pos = ADD_BOTTOM, void* userdata = NULL);
|
||||
// Simple add element. Takes a single array of:
|
||||
// [ "value" => value, "font" => font, "font-style" => style ]
|
||||
virtual void clearRows(); // clears all elements
|
||||
@@ -441,8 +157,8 @@ public:
|
||||
S32 getHighlightedItemInx() const { return mHighlightedItem; }
|
||||
|
||||
void setDoubleClickCallback( callback_t cb ) { mOnDoubleClickCallback = cb; }
|
||||
void setMaximumSelectCallback( callback_t cb ) { mOnMaximumSelectCallback = cb; }
|
||||
void setSortChangedCallback( callback_t cb ) { mOnSortChangedCallback = cb; }
|
||||
void setMaximumSelectCallback( callback_t cb) { mOnMaximumSelectCallback = cb; }
|
||||
void setSortChangedCallback( callback_t cb) { mOnSortChangedCallback = cb; }
|
||||
// Convenience function; *TODO: replace with setter above + boost::bind() in calling code
|
||||
void setDoubleClickCallback( boost::function<void (void* userdata)> cb, void* userdata) { mOnDoubleClickCallback = boost::bind(cb, userdata); }
|
||||
|
||||
@@ -463,7 +179,6 @@ public:
|
||||
// one of which can be selected at a time.
|
||||
virtual LLScrollListItem* addSimpleElement(const std::string& value, EAddPosition pos = ADD_BOTTOM, const LLSD& id = LLSD());
|
||||
|
||||
|
||||
BOOL selectItemByLabel( const std::string& item, BOOL case_sensitive = TRUE ); // FALSE if item not found
|
||||
BOOL selectItemByPrefix(const std::string& target, BOOL case_sensitive = TRUE);
|
||||
BOOL selectItemByPrefix(const LLWString& target, BOOL case_sensitive = TRUE);
|
||||
@@ -499,7 +214,7 @@ public:
|
||||
void setBgStripeColor(const LLColor4& c) { mBgStripeColor = c; }
|
||||
void setFgSelectedColor(const LLColor4 &c) { mFgSelectedColor = c; }
|
||||
void setFgUnselectedColor(const LLColor4 &c){ mFgUnselectedColor = c; }
|
||||
void setHighlightedColor(const LLColor4 &c) { mHighlightedColor = c; }
|
||||
void setHighlightedColor(const LLColor4 &c) { mHighlightedColor = c; }
|
||||
void setFgDisableColor(const LLColor4 &c) { mFgDisabledColor = c; }
|
||||
|
||||
void setBackgroundVisible(BOOL b) { mBackgroundVisible = b; }
|
||||
@@ -516,11 +231,11 @@ public:
|
||||
|
||||
virtual S32 getScrollPos() const;
|
||||
virtual void setScrollPos( S32 pos );
|
||||
|
||||
|
||||
// <edit>
|
||||
S32 getPageLines() { return mPageLines; }
|
||||
// </edit>
|
||||
|
||||
|
||||
S32 getSearchColumn();
|
||||
void setSearchColumn(S32 column) { mSearchColumn = column; }
|
||||
S32 getColumnIndexFromOffset(S32 x);
|
||||
@@ -560,7 +275,7 @@ public:
|
||||
LLRect getCellRect(S32 row_index, S32 column_index);
|
||||
|
||||
// Used "internally" by the scroll bar.
|
||||
void onScrollChange( S32 new_pos, LLScrollbar* src);
|
||||
void onScrollChange( S32 new_pos, LLScrollbar* src );
|
||||
|
||||
static void onClickColumn(void *userdata);
|
||||
|
||||
@@ -628,6 +343,7 @@ public:
|
||||
return mSortCallback->connect(cb);
|
||||
}
|
||||
|
||||
|
||||
protected:
|
||||
// "Full" interface: use this when you're creating a list that has one or more of the following:
|
||||
// * contains icons
|
||||
@@ -741,5 +457,4 @@ private:
|
||||
sort_signal_t* mSortCallback;
|
||||
}; // end class LLScrollListCtrl
|
||||
|
||||
|
||||
#endif // LL_SCROLLLISTCTRL_H
|
||||
|
||||
Reference in New Issue
Block a user