llflatlistview.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:13k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llflatlistview.h
  3.  * @brief LLFlatListView base class
  4.  *
  5.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2009-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_LLFLATLISTVIEW_H
  33. #define LL_LLFLATLISTVIEW_H
  34. #include "llpanel.h"
  35. #include "llscrollcontainer.h"
  36. #include "lltextbox.h"
  37. /**
  38.  * LLFlatListView represents a flat list ui control that operates on items in a form of LLPanel's.
  39.  * LLSD can be associated with each added item, it can keep data from an item in digested form.
  40.  * Associated LLSD's can be of any type (singular, a map etc.).
  41.  * Items (LLPanel's subclasses) can be of different height.
  42.  * The list is LLPanel created in itself and grows in height while new items are added. 
  43.  * 
  44.  * The control can manage selection of its items when the flag "allow_select" is set. Also ability to select
  45.  * multiple items (by using CTRL) is enabled through setting the flag "multi_select" - if selection is not allowed that flag 
  46.  * is ignored. The option "keep_one_selected" forces at least one item to be selected at any time (only for mouse events on items)
  47.  * since any item of the list was selected.
  48.  *
  49.  * Examples of using this control are presented in Picks panel (My Profile and Profile View), where this control is used to 
  50.  * manage the list of pick items.
  51.  *
  52.  * ASSUMPTIONS AND STUFF
  53.  * - NULL pointers and undefined LLSD's are not accepted by any method of this class unless specified otherwise
  54.  * - Order of returned selected items are not guaranteed
  55.  * - The control assumes that all items being added are unique.
  56.  */
  57. class LLFlatListView : public LLScrollContainer
  58. {
  59. public:
  60. /**
  61.  * Abstract comparator for comparing flat list items in a form of LLPanel
  62.  */
  63. class ItemComparator
  64. {
  65. public:
  66. ItemComparator() {};
  67. virtual ~ItemComparator() {};
  68. /** Returns true if item1 < item2, false otherwise */
  69. virtual bool compare(const LLPanel* item1, const LLPanel* item2) const = 0;
  70. };
  71. /**
  72.  * Represents reverse comparator which acts as a decorator for a comparator that need to be reversed
  73.  */
  74. class ItemReverseComparator : public ItemComparator
  75. {
  76. public:
  77. ItemReverseComparator(const ItemComparator& comparator) : mComparator(comparator) {};
  78. virtual ~ItemReverseComparator() {};
  79. virtual bool compare(const LLPanel* item1, const LLPanel* item2) const
  80. {
  81. return mComparator.compare(item2, item1);
  82. }
  83. private:
  84. const ItemComparator& mComparator;
  85. };
  86. struct Params : public LLInitParam::Block<Params, LLScrollContainer::Params>
  87. {
  88. /** turning on/off selection support */
  89. Optional<bool> allow_select;
  90. /** turning on/off multiple selection (works while clicking and holding CTRL)*/
  91. Optional<bool> multi_select;
  92. /** don't allow to deselect all selected items (for mouse events on items only) */
  93. Optional<bool> keep_one_selected;
  94. /** padding between items */
  95. Optional<U32> item_pad; 
  96. /** textbox with info message when list is empty*/
  97. Optional<LLTextBox::Params> no_items_text;
  98. Params();
  99. };
  100. virtual ~LLFlatListView() { clear(); };
  101. /**
  102.  * Connects callback to signal called when Return key is pressed.
  103.  */
  104. boost::signals2::connection setReturnCallback( const commit_signal_t::slot_type& cb ) { return mOnReturnSignal.connect(cb); }
  105. /** Overridden LLPanel's reshape, height is ignored, the list sets its height to accommodate all items */
  106. virtual void reshape(S32 width, S32 height, BOOL called_from_parent  = TRUE);
  107. /** Returns full rect of child panel */
  108. const LLRect& getItemsRect() const;
  109. LLRect getRequiredRect() { return getItemsRect(); }
  110. /** Returns distance between items */
  111. const S32 getItemsPad() { return mItemPad; }
  112. /**
  113.  * Adds and item and LLSD value associated with it to the list at specified position
  114.  * @return true if the item was added, false otherwise 
  115.  */
  116. virtual bool addItem(LLPanel * item, const LLSD& value = LLUUID::null, EAddPosition pos = ADD_BOTTOM, bool rearrange = true);
  117. /**
  118.  * Insert item_to_add along with associated value to the list right after the after_item.
  119.  * @return true if the item was successfully added, false otherwise
  120.  */
  121. virtual bool insertItemAfter(LLPanel* after_item, LLPanel* item_to_add, const LLSD& value = LLUUID::null);
  122. /** 
  123.  * Remove specified item
  124.  * @return true if the item was removed, false otherwise 
  125.  */
  126. virtual bool removeItem(LLPanel* item);
  127. /** 
  128.  * Remove an item specified by value
  129.  * @return true if the item was removed, false otherwise 
  130.  */
  131. virtual bool removeItemByValue(const LLSD& value);
  132. /** 
  133.  * Remove an item specified by uuid
  134.  * @return true if the item was removed, false otherwise 
  135.  */
  136. virtual bool removeItemByUUID(const LLUUID& uuid);
  137. /** 
  138.  * Get an item by value 
  139.  * @return the item as LLPanel if associated with value, NULL otherwise
  140.  */
  141. virtual LLPanel* getItemByValue(const LLSD& value) const;
  142. template<class T>
  143. T* getTypedItemByValue(const LLSD& value) const
  144. {
  145. return dynamic_cast<T*>(getItemByValue(value));
  146. }
  147. /** 
  148.  * Select or deselect specified item based on select
  149.  * @return true if succeed, false otherwise
  150.  */
  151. virtual bool selectItem(LLPanel* item, bool select = true);
  152. /** 
  153.  * Select or deselect an item by associated value based on select
  154.  * @return true if succeed, false otherwise
  155.  */
  156. virtual bool selectItemByValue(const LLSD& value, bool select = true);
  157. /** 
  158.  * Select or deselect an item by associated uuid based on select
  159.  * @return true if succeed, false otherwise
  160.  */
  161. virtual bool selectItemByUUID(const LLUUID& uuid, bool select = true);
  162. /**
  163.  * Get all panels stored in the list.
  164.  */
  165. virtual void getItems(std::vector<LLPanel*>& items) const;
  166. /**
  167.  * Get all items values.
  168.  */
  169. virtual void getValues(std::vector<LLSD>& values) const;
  170. /**
  171.  * Get LLSD associated with the first selected item
  172.  */
  173. virtual LLSD getSelectedValue() const;
  174. /**
  175.  * Get LLSD's associated with selected items.
  176.  * @param selected_values std::vector being populated with LLSD associated with selected items
  177.    */
  178. virtual void getSelectedValues(std::vector<LLSD>& selected_values) const;
  179. /** 
  180.  * Get LLUUID associated with selected item
  181.  * @return LLUUID if such was associated with selected item 
  182.  */
  183. virtual LLUUID getSelectedUUID() const;
  184. /** 
  185.  * Get LLUUIDs associated with selected items
  186.  * @param selected_uuids An std::vector being populated with LLUUIDs associated with selected items
  187.  */
  188. virtual void getSelectedUUIDs(std::vector<LLUUID>& selected_uuids) const;
  189. /** Get the top selected item */
  190. virtual LLPanel* getSelectedItem() const;
  191. /** 
  192.  * Get selected items
  193.  * @param selected_items An std::vector being populated with pointers to selected items
  194.  */
  195. virtual void getSelectedItems(std::vector<LLPanel*>& selected_items) const;
  196. /**
  197.  * Resets selection of items.
  198.  * 
  199.  * It calls onCommit callback if setCommitOnSelectionChange(bool b) was called with "true"
  200.  * argument for current Flat List.
  201.  * @param no_commit_on_deselection - if true onCommit callback will not be called
  202.  */
  203. virtual void resetSelection(bool no_commit_on_deselection = false);
  204. /**
  205.  * Sets comment text which will be shown in the list is it is empty.
  206.  *
  207.  * Textbox to hold passed text is created while this method is called at the first time.
  208.  *
  209.  * @param comment_text - string to be shown as a comment.
  210.  */
  211. void setNoItemsCommentText( const std::string& comment_text);
  212. /** Turn on/off multiple selection support */
  213. void setAllowMultipleSelection(bool allow) { mMultipleSelection = allow; }
  214. /** Turn on/off selection support */
  215. void setAllowSelection(bool can_select) { mAllowSelection = can_select; }
  216. /** Sets flag whether onCommit should be fired if selection was changed */
  217. void setCommitOnSelectionChange(bool b) { mCommitOnSelectionChange = b; }
  218. /** Get number of selected items in the list */
  219. U32 numSelected() const {return mSelectedItemPairs.size(); }
  220. /** Get number of items in the list */
  221. U32 size() const { return mItemPairs.size(); }
  222. /** Removes all items from the list */
  223. virtual void clear();
  224. /**
  225.  * Removes all items that can be detached from the list but doesn't destroy
  226.  * them, caller responsible to manage items after they are detached.
  227.  * Detachable item should accept "detach" action via notify() method,
  228.  * where it disconnect all callbacks, does other valuable routines and
  229.  * return 1.
  230.  */
  231. void detachItems(std::vector<LLPanel*>& detached_items);
  232. /**
  233.  * Set comparator to use for future sorts.
  234.  * 
  235.  * This class does NOT manage lifetime of the comparator
  236.  * but assumes that the comparator is always alive.
  237.  */
  238. void setComparator(const ItemComparator* comp) { mItemComparator = comp; }
  239. void sort();
  240. bool updateValue(const LLSD& old_value, const LLSD& new_value);
  241. void selectFirstItem ();
  242. void selectLastItem ();
  243. virtual S32 notify(const LLSD& info) ;
  244. protected:
  245. /** Pairs LLpanel representing a single item LLPanel and LLSD associated with it */
  246. typedef std::pair<LLPanel*, LLSD> item_pair_t;
  247. typedef std::list<item_pair_t*> pairs_list_t;
  248. typedef pairs_list_t::iterator pairs_iterator_t;
  249. typedef pairs_list_t::const_iterator pairs_const_iterator_t;
  250. /** An adapter for a ItemComparator */
  251. struct ComparatorAdaptor
  252. {
  253. ComparatorAdaptor(const ItemComparator& comparator) : mComparator(comparator) {};
  254. bool operator()(const item_pair_t* item_pair1, const item_pair_t* item_pair2)
  255. {
  256. return mComparator.compare(item_pair1->first, item_pair2->first);
  257. }
  258. const ItemComparator& mComparator;
  259. };
  260. friend class LLUICtrlFactory;
  261. LLFlatListView(const LLFlatListView::Params& p);
  262. /** Manage selection on mouse events */
  263. void onItemMouseClick(item_pair_t* item_pair, MASK mask);
  264. void onItemRightMouseClick(item_pair_t* item_pair, MASK mask);
  265. /**
  266.  * Updates position of items.
  267.  * It does not take into account invisible items.
  268.  */
  269. virtual void rearrangeItems();
  270. virtual item_pair_t* getItemPair(LLPanel* item) const;
  271. virtual item_pair_t* getItemPair(const LLSD& value) const;
  272. virtual bool selectItemPair(item_pair_t* item_pair, bool select);
  273. virtual bool selectNextItemPair(bool is_up_direction, bool reset_selection);
  274. virtual bool selectAll();
  275. virtual bool isSelected(item_pair_t* item_pair) const;
  276. virtual bool removeItemPair(item_pair_t* item_pair);
  277. /**
  278.  * Notify parent about changed size of internal controls with "size_changes" action
  279.  * 
  280.  * Size includes Items Rect width and either Items Rect height or comment text height.
  281.  * Comment text height is included if comment text is set and visible.
  282.  * List border size is also included into notified size.
  283.  */
  284. void notifyParentItemsRectChanged();
  285. virtual BOOL handleKeyHere(KEY key, MASK mask);
  286. virtual BOOL postBuild();
  287. virtual void onFocusReceived();
  288. virtual void onFocusLost();
  289. virtual void draw();
  290. LLRect getLastSelectedItemRect();
  291. void   ensureSelectedVisible();
  292. private:
  293. void setItemsNoScrollWidth(S32 new_width) {mItemsNoScrollWidth = new_width - 2 * mBorderThickness;}
  294. void setNoItemsCommentVisible(bool visible) const;
  295. private:
  296. /** Comparator to use when sorting the list. */
  297. const ItemComparator* mItemComparator;
  298. LLPanel* mItemsPanel;
  299. S32 mItemsNoScrollWidth;
  300. S32 mBorderThickness;
  301. /** Items padding */
  302. S32 mItemPad;
  303. /** Selection support flag */
  304. bool mAllowSelection;
  305. /** Multiselection support flag, ignored if selection is not supported */
  306. bool mMultipleSelection;
  307. /**
  308.  * Flag specified whether onCommit be called if selection is changed in the list.
  309.  * 
  310.  * Can be ignored in the resetSelection() method.
  311.  * @see resetSelection()
  312.  */
  313. bool mCommitOnSelectionChange;
  314. bool mKeepOneItemSelected;
  315. /** All pairs of the list */
  316. pairs_list_t mItemPairs;
  317. /** Selected pairs for faster access */
  318. pairs_list_t mSelectedItemPairs;
  319. /**
  320.  * Rectangle contained previous size of items parent notified last time.
  321.  * Is used to reduce amount of parentNotify() calls if size was not changed.
  322.  */
  323. LLRect mPrevNotifyParentRect;
  324. LLTextBox* mNoItemsCommentTextbox;
  325. LLViewBorder* mSelectedItemsBorder;
  326. commit_signal_t mOnReturnSignal;
  327. };
  328. #endif