forked from teamnwah/openmw-tes3coop
385 lines
14 KiB
C++
385 lines
14 KiB
C++
/*!
|
||
@file
|
||
@author Albert Semenov
|
||
@date 04/2008
|
||
@module
|
||
*/
|
||
/*
|
||
This file is part of MyGUI.
|
||
|
||
MyGUI 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, either version 3 of the License, or
|
||
(at your option) any later version.
|
||
|
||
MyGUI 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.
|
||
|
||
You should have received a copy of the GNU Lesser General Public License
|
||
along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
|
||
*/
|
||
#ifndef __MYGUI_MULTI_LIST_H__
|
||
#define __MYGUI_MULTI_LIST_H__
|
||
|
||
#include "MyGUI_Prerequest.h"
|
||
#include "MyGUI_Widget.h"
|
||
#include "MyGUI_List.h"
|
||
#include "MyGUI_Any.h"
|
||
#include "MyGUI_BiIndexBase.h"
|
||
#include "MyGUI_EventPair.h"
|
||
|
||
namespace MyGUI
|
||
{
|
||
|
||
//OBSOLETE
|
||
typedef delegates::CDelegate5<Widget*, size_t, const UString &, const UString &, bool &> EventHandle_WidgetIntUTFStringUTFStringBool;
|
||
|
||
typedef delegates::CDelegate5<MultiList*, size_t, const UString &, const UString &, bool &> EventHandle_MultiListPtrSizeTCUTFStringRefCUTFStringRefBoolRef;
|
||
typedef delegates::CDelegate2<MultiList*, size_t> EventHandle_MultiListPtrSizeT;
|
||
|
||
class MYGUI_EXPORT MultiList :
|
||
public Widget,
|
||
public BiIndexBase
|
||
{
|
||
MYGUI_RTTI_DERIVED( MultiList )
|
||
|
||
public:
|
||
MultiList();
|
||
|
||
//------------------------------------------------------------------------------//
|
||
// Methods for work with columns (RU:методы для работы со столбцами)
|
||
//------------------------------------------------------------------------------//
|
||
// манипуляции айтемами
|
||
|
||
//! Get number of columns
|
||
size_t getColumnCount() { return mVectorColumnInfo.size(); }
|
||
|
||
/** Insert new column
|
||
@param _column New column will be inserted before _column
|
||
@param _name Name of new column
|
||
@param _width Width of new column
|
||
*/
|
||
void insertColumnAt(size_t _column, const UString& _name, int _width, Any _data = Any::Null);
|
||
|
||
/** Add new column at last position
|
||
@param _width Width of new column
|
||
@param _name Name of new column
|
||
*/
|
||
void addColumn(const UString& _name, int _width, Any _data = Any::Null) { insertColumnAt(ITEM_NONE, _name, _width, _data); }
|
||
|
||
/** Delete column */
|
||
void removeColumnAt(size_t _column);
|
||
|
||
/** Delete all columns */
|
||
void removeAllColumns();
|
||
|
||
|
||
//------------------------------------------------------------------------------//
|
||
// манипуляции отображением
|
||
|
||
/** Set column name
|
||
@param _column Index of column
|
||
@param _name New name of column
|
||
*/
|
||
void setColumnNameAt(size_t _column, const UString& _name);
|
||
|
||
/** Set column width
|
||
@param _column Index of column
|
||
@param _name New width of column
|
||
*/
|
||
void setColumnWidthAt(size_t _column, int _width);
|
||
|
||
/** Get _column name */
|
||
const UString& getColumnNameAt(size_t _column);
|
||
|
||
/** Get _column width */
|
||
int getColumnWidthAt(size_t _column);
|
||
|
||
/** Sort multilist by column */
|
||
void sortByColumn(size_t _column, bool _backward = false);
|
||
|
||
//------------------------------------------------------------------------------//
|
||
// манипуляции данными
|
||
|
||
//! Replace an item data at a specified position
|
||
void setColumnDataAt(size_t _index, Any _data);
|
||
|
||
//! Clear an item data at a specified position
|
||
void clearColumnDataAt(size_t _index) { setColumnDataAt(_index, Any::Null); }
|
||
|
||
//! Get item data from specified position
|
||
template <typename ValueType>
|
||
ValueType * getColumnDataAt(size_t _index, bool _throw = true)
|
||
{
|
||
MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.size(), "MultiList::getItemDataAt");
|
||
return mVectorColumnInfo[_index].data.castType<ValueType>(_throw);
|
||
}
|
||
|
||
//------------------------------------------------------------------------------//
|
||
// Methods for work with lines (RU:методы для работы со строками)
|
||
/** @note
|
||
All indexes used here is indexes of unsorted Multilist. Even if you sorted
|
||
it - all items indexes will be same as before sort.
|
||
*/
|
||
|
||
//------------------------------------------------------------------------------//
|
||
// манипуляции айтемами
|
||
|
||
/** Get number of items (lines) */
|
||
size_t getItemCount() const;
|
||
|
||
/** Insert new item before _index line */
|
||
void insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null);
|
||
|
||
/** Add new item at the end */
|
||
void addItem(const UString& _name, Any _data = Any::Null) { insertItemAt(ITEM_NONE, _name, _data); }
|
||
|
||
//! Remove item at a specified position
|
||
void removeItemAt(size_t _index);
|
||
|
||
/** Delete all items */
|
||
void removeAllItems();
|
||
|
||
//! Swap items at a specified positions
|
||
void swapItemsAt(size_t _index1, size_t _index2);
|
||
|
||
|
||
//------------------------------------------------------------------------------//
|
||
// манипуляции отображением
|
||
|
||
//! Replace an item name
|
||
void setItemNameAt(size_t _index, const UString& _name) { setSubItemNameAt(0, _index, _name); }
|
||
|
||
//! Get item name from specified position
|
||
const UString& getItemNameAt(size_t _index) { return getSubItemNameAt(0, _index); }
|
||
|
||
|
||
//------------------------------------------------------------------------------//
|
||
// манипуляции выделениями
|
||
|
||
/** Get index of selected item (ITEM_NONE if none selected) */
|
||
size_t getIndexSelected() { return mItemSelected; }
|
||
|
||
/** Select specified _index */
|
||
void setIndexSelected(size_t _index);
|
||
|
||
/** Clear item selection */
|
||
void clearIndexSelected() { setIndexSelected(ITEM_NONE); }
|
||
|
||
|
||
//------------------------------------------------------------------------------//
|
||
// манипуляции данными
|
||
|
||
//! Replace an item data at a specified position
|
||
void setItemDataAt(size_t _index, Any _data) { setSubItemDataAt(0, _index, _data); }
|
||
|
||
//! Clear an item data at a specified position
|
||
void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); }
|
||
|
||
//! Get item data from specified position
|
||
template <typename ValueType>
|
||
ValueType * getItemDataAt(size_t _index, bool _throw = true)
|
||
{
|
||
return getSubItemDataAt<ValueType>(0, _index, _throw);
|
||
}
|
||
|
||
|
||
//------------------------------------------------------------------------------//
|
||
// Methods for work with sub lines (RU:методы для работы со саб строками)
|
||
//------------------------------------------------------------------------------//
|
||
// манипуляции данными
|
||
|
||
/** Set sub item
|
||
@param _column Index of column
|
||
@param _index Index of line
|
||
@param _name New sub item value
|
||
*/
|
||
void setSubItemNameAt(size_t _column, size_t _index, const UString& _name);
|
||
|
||
/** Get sub item name*/
|
||
const UString& getSubItemNameAt(size_t _column, size_t _index);
|
||
|
||
/** Search item in specified _column, returns index of the first occurrence in column or ITEM_NONE if item not found */
|
||
size_t findSubItemWith(size_t _column, const UString& _name);
|
||
|
||
//------------------------------------------------------------------------------//
|
||
// манипуляции данными
|
||
|
||
//! Replace an item data at a specified position
|
||
void setSubItemDataAt(size_t _column, size_t _index, Any _data);
|
||
|
||
//! Clear an item data at a specified position
|
||
void clearSubItemDataAt(size_t _column, size_t _index) { setSubItemDataAt(_column, _index, Any::Null); }
|
||
|
||
//! Get item data from specified position
|
||
template <typename ValueType>
|
||
ValueType * getSubItemDataAt(size_t _column, size_t _index, bool _throw = true)
|
||
{
|
||
MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(), "MultiList::getSubItemDataAt");
|
||
MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(), "MultiList::getSubItemDataAt");
|
||
|
||
size_t index = BiIndexBase::convertToBack(_index);
|
||
return mVectorColumnInfo[_column].list->getItemDataAt<ValueType>(index, _throw);
|
||
}
|
||
|
||
/*internal:*/
|
||
virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name);
|
||
|
||
/*event:*/
|
||
/** Event : Enter pressed or double click.\n
|
||
signature : void method(MyGUI::MultiList* _sender, size_t _index)\n
|
||
@param _sender widget that called this event
|
||
@param _index of selected item
|
||
*/
|
||
EventPair<EventHandle_WidgetSizeT, EventHandle_MultiListPtrSizeT> eventListSelectAccept;
|
||
|
||
/** Event : Selected item position changed.\n
|
||
signature : void method(MyGUI::MultiList* _sender, size_t _index)\n
|
||
@param _sender widget that called this event
|
||
@param _index of new item
|
||
*/
|
||
EventPair<EventHandle_WidgetSizeT, EventHandle_MultiListPtrSizeT> eventListChangePosition;
|
||
|
||
/** Event : Less than operator for sort multilist by columns.\n
|
||
signature : void method(MyGUI::MultiList* _sender, size_t _column, const UString& _firstItem, const UString& _secondItem, bool& _less)\n
|
||
@param _sender widget that called this event
|
||
@param _column Index of column
|
||
@param _firstItem Strings for compare
|
||
@param _secondItem Strings for compare
|
||
@param _less Comparsion result (write your value here)
|
||
*/
|
||
EventHandle_MultiListPtrSizeTCUTFStringRefCUTFStringRefBoolRef requestOperatorLess;
|
||
|
||
/*obsolete:*/
|
||
#ifndef MYGUI_DONT_USE_OBSOLETE
|
||
|
||
MYGUI_OBSOLETE("use : size_t MultiList::getIndexSelected()")
|
||
size_t getItemIndexSelected() { return getIndexSelected(); }
|
||
MYGUI_OBSOLETE("use : void MultiList::setIndexSelected(size_t _index)")
|
||
void setItemSelectedAt(size_t _index) { setIndexSelected(_index); }
|
||
MYGUI_OBSOLETE("use : void MultiList::clearIndexSelected()")
|
||
void clearItemSelected() { clearIndexSelected(); }
|
||
|
||
MYGUI_OBSOLETE("use : size_t MultiList::findSubItemWith(size_t _column, const UString& _name)")
|
||
size_t findItem(size_t _column, const UString& _name) { return findSubItemWith(_column, _name); }
|
||
MYGUI_OBSOLETE("use : const UString& MultiList::getSubItemNameAt(size_t _column, size_t _index)")
|
||
const UString& getSubItem(size_t _column, size_t _index) { return getSubItemNameAt(_column, _index); }
|
||
MYGUI_OBSOLETE("use : void MultiList::setSubItemNameAt(size_t _column, size_t _index, const UString& _name)")
|
||
void setSubItem(size_t _column, size_t _index, const UString& _name) { setSubItemNameAt(_column, _index, _name); }
|
||
MYGUI_OBSOLETE("use : void MultiList::removeColumnAt(size_t _column)")
|
||
void deleteColumn(size_t _column) { removeColumnAt(_column); }
|
||
MYGUI_OBSOLETE("use : void MultiList::removeAllColumns()")
|
||
void deleteAllColumns() { removeAllColumns(); }
|
||
MYGUI_OBSOLETE("use : int MultiList::getColumnWidthAt(size_t _column)")
|
||
int getColumnWidth(size_t _column) { return getColumnWidthAt(_column); }
|
||
MYGUI_OBSOLETE("use : const UString& MultiList::getColumnNameAt(size_t _column)")
|
||
const UString& getColumnName(size_t _column) { return getColumnNameAt(_column); }
|
||
MYGUI_OBSOLETE("use : void MultiList::setColumnWidthAt(size_t _column, int _width)")
|
||
void setColumnWidth(size_t _column, int _width) { setColumnWidthAt(_column, _width); }
|
||
MYGUI_OBSOLETE("use : void MultiList::addColumn(const UString& _name, int _width, Any _data)")
|
||
void addColumn(int _width, const UString& _name) { addColumn(_name, _width); }
|
||
MYGUI_OBSOLETE("use : void MultiList::setColumnNameAt(size_t _column, const UString& _name)")
|
||
void setColumnName(size_t _column, const UString& _name) { setColumnNameAt(_column, _name); }
|
||
MYGUI_OBSOLETE("use : void MultiList::insertColumnAt(size_t _column, const UString& _name, int _width, Any _data)")
|
||
void insertColumn(size_t _column, int _width, const UString& _name) { insertColumnAt(_column, _name, _width); }
|
||
MYGUI_OBSOLETE("use : size_t MultiList::getIndexSelected()")
|
||
size_t getItemSelect() { return getIndexSelected(); }
|
||
MYGUI_OBSOLETE("use : void MultiList::clearIndexSelected()")
|
||
void resetItemSelect() { clearIndexSelected(); }
|
||
MYGUI_OBSOLETE("use : void MultiList::setIndexSelected(size_t _index)")
|
||
void setItemSelect(size_t _index) { setIndexSelected(_index); }
|
||
MYGUI_OBSOLETE("use : void MultiList::insertItemAt(size_t _index, const UString& _name, Any _data)")
|
||
void insertItem(size_t _index, const UString& _name) { insertItemAt(_index, _name); }
|
||
MYGUI_OBSOLETE("use : void MultiList::setItemNameAt(size_t _index, const UString& _name)")
|
||
void setItem(size_t _index, const UString& _name) { setItemNameAt(_index, _name); }
|
||
MYGUI_OBSOLETE("use : const UString& MultiList::getItemNameAt(size_t _index)")
|
||
const UString& getItem(size_t _index) { return getItemNameAt(_index); }
|
||
MYGUI_OBSOLETE("use : void MultiList::removeItemAt(size_t _index)")
|
||
void deleteItem(size_t _index) { removeItemAt(_index); }
|
||
MYGUI_OBSOLETE("use : void MultiList::removeAllItems()")
|
||
void deleteAllItems() { removeAllItems(); }
|
||
|
||
#endif // MYGUI_DONT_USE_OBSOLETE
|
||
|
||
protected:
|
||
virtual ~MultiList();
|
||
|
||
void baseChangeWidgetSkin(ResourceSkin* _info);
|
||
|
||
void notifyListChangePosition(List* _sender, size_t _position);
|
||
void notifyListChangeFocus(List* _sender, size_t _position);
|
||
void notifyListChangeScrollPosition(List* _sender, size_t _position);
|
||
void notifyButtonClick(Widget* _sender);
|
||
void notifyListSelectAccept(List* _sender, size_t _position);
|
||
|
||
void updateColumns();
|
||
void redrawButtons();
|
||
void updateOnlyEmpty();
|
||
|
||
bool compare(List* _list, size_t _left, size_t _right);
|
||
void sortList();
|
||
void flipList();
|
||
|
||
Widget* getSeparator(size_t _index);
|
||
|
||
void setButtonImageIndex(Button* _button, size_t _index);
|
||
|
||
void updateBackSelected(size_t _index);
|
||
|
||
private:
|
||
void initialiseWidgetSkin(ResourceSkin* _info);
|
||
void shutdownWidgetSkin();
|
||
|
||
void frameEntered(float _frame);
|
||
|
||
void frameAdvise(bool _advise);
|
||
|
||
private:
|
||
struct ColumnInfo
|
||
{
|
||
List* list;
|
||
Button* button;
|
||
int width;
|
||
UString name;
|
||
Any data;
|
||
};
|
||
|
||
typedef std::vector<ColumnInfo> VectorColumnInfo;
|
||
|
||
enum ImageSort
|
||
{
|
||
SORT_NONE,
|
||
SORT_UP,
|
||
SORT_DOWN
|
||
};
|
||
|
||
private:
|
||
int mHeightButton;
|
||
int mWidthBar;
|
||
std::string mSkinButton, mSkinList;
|
||
Button* mButtonMain;
|
||
|
||
VectorColumnInfo mVectorColumnInfo;
|
||
|
||
VectorWidgetPtr mSeparators;
|
||
|
||
size_t mLastMouseFocusIndex;
|
||
|
||
bool mSortUp;
|
||
size_t mSortColumnIndex;
|
||
|
||
int mWidthSeparator;
|
||
std::string mSkinSeparator;
|
||
int mOffsetButtonSeparator;
|
||
|
||
size_t mItemSelected;
|
||
|
||
bool mFrameAdvise;
|
||
Widget* mClient;
|
||
};
|
||
|
||
} // namespace MyGUI
|
||
|
||
#endif // __MYGUI_MULTI_LIST_H__
|