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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llfloater.h
  3.  * @brief LLFloater base class
  4.  *
  5.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2002-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. // Floating "windows" within the GL display, like the inventory floater,
  33. // mini-map floater, etc.
  34. #ifndef LL_FLOATER_H
  35. #define LL_FLOATER_H
  36. #include "llpanel.h"
  37. #include "lluuid.h"
  38. //#include "llnotificationsutil.h"
  39. #include <set>
  40. class LLDragHandle;
  41. class LLResizeHandle;
  42. class LLResizeBar;
  43. class LLButton;
  44. class LLMultiFloater;
  45. class LLFloater;
  46. const BOOL RESIZE_YES = TRUE;
  47. const BOOL RESIZE_NO = FALSE;
  48. const BOOL DRAG_ON_TOP = FALSE;
  49. const BOOL DRAG_ON_LEFT = TRUE;
  50. const BOOL MINIMIZE_YES = TRUE;
  51. const BOOL MINIMIZE_NO = FALSE;
  52. const BOOL CLOSE_YES = TRUE;
  53. const BOOL CLOSE_NO = FALSE;
  54. const BOOL ADJUST_VERTICAL_YES = TRUE;
  55. const BOOL ADJUST_VERTICAL_NO = FALSE;
  56. class LLFloater : public LLPanel
  57. {
  58. friend class LLFloaterView;
  59. friend class LLFloaterReg;
  60. friend class LLMultiFloater;
  61. public:
  62. struct KeyCompare
  63. {
  64. // static bool compare(const LLSD& a, const LLSD& b);
  65. static bool equate(const LLSD& a, const LLSD& b);
  66. /*==========================================================================*|
  67. bool operator()(const LLSD& a, const LLSD& b) const
  68. {
  69. return compare(a, b);
  70. }
  71. |*==========================================================================*/
  72. };
  73. enum EFloaterButton
  74. {
  75. BUTTON_CLOSE = 0,
  76. BUTTON_RESTORE,
  77. BUTTON_MINIMIZE,
  78. BUTTON_TEAR_OFF,
  79. BUTTON_DOCK,
  80. BUTTON_HELP,
  81. BUTTON_COUNT
  82. };
  83. struct Params 
  84. : public LLInitParam::Block<Params, LLPanel::Params>
  85. {
  86. Optional<std::string> title,
  87. short_title;
  88. Optional<bool> single_instance,
  89. auto_tile,
  90. can_resize,
  91. can_minimize,
  92. can_close,
  93. can_drag_on_left,
  94. can_tear_off,
  95. save_rect,
  96. save_visibility,
  97. save_dock_state,
  98. can_dock;
  99. Optional<S32> header_height,
  100. legacy_header_height; // HACK see initFromXML()
  101. // Images for top-right controls
  102. Optional<LLUIImage*> close_image,
  103. restore_image,
  104. minimize_image,
  105. tear_off_image,
  106. dock_image,
  107. help_image;
  108. Optional<LLUIImage*> close_pressed_image,
  109. restore_pressed_image,
  110. minimize_pressed_image,
  111. tear_off_pressed_image,
  112. dock_pressed_image,
  113. help_pressed_image;
  114. Optional<CommitCallbackParam> open_callback,
  115.   close_callback;
  116. Params();
  117. };
  118. // use this to avoid creating your own default LLFloater::Param instance
  119. static const Params& getDefaultParams();
  120. // Load translations for tooltips for standard buttons
  121. static void initClass();
  122. LLFloater(const LLSD& key, const Params& params = getDefaultParams());
  123. virtual ~LLFloater();
  124. // Don't export top/left for rect, only height/width
  125. static void setupParamsForExport(Params& p, LLView* parent);
  126. void initFromParams(const LLFloater::Params& p);
  127. bool initFloaterXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr output_node = NULL);
  128. /*virtual*/ void handleReshape(const LLRect& new_rect, bool by_user = false);
  129. /*virtual*/ BOOL canSnapTo(const LLView* other_view);
  130. /*virtual*/ void setSnappedTo(const LLView* snap_view);
  131. /*virtual*/ void setFocus( BOOL b );
  132. /*virtual*/ void setIsChrome(BOOL is_chrome);
  133. /*virtual*/ void setRect(const LLRect &rect);
  134. void  initFloater(const Params& p);
  135. void openFloater(const LLSD& key = LLSD());
  136. // If allowed, close the floater cleanly, releasing focus.
  137. void closeFloater(bool app_quitting = false);
  138. /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
  139. // Release keyboard and mouse focus
  140. void releaseFocus();
  141. // moves to center of gFloaterView
  142. void center();
  143. LLMultiFloater* getHost();
  144. void applyTitle();
  145. std::string getCurrentTitle() const;
  146. void setTitle( const std::string& title);
  147. std::string getTitle() const;
  148. void setShortTitle( const std::string& short_title );
  149. std::string getShortTitle() const;
  150. void setTitleVisible(bool visible);
  151. virtual void setMinimized(BOOL b);
  152. void moveResizeHandlesToFront();
  153. void addDependentFloater(LLFloater* dependent, BOOL reposition = TRUE);
  154. void addDependentFloater(LLHandle<LLFloater> dependent_handle, BOOL reposition = TRUE);
  155. LLFloater* getDependee() { return (LLFloater*)mDependeeHandle.get(); }
  156. void removeDependentFloater(LLFloater* dependent);
  157. BOOL isMinimized() const { return mMinimized; }
  158. /// isShown() differs from getVisible() in that isShown() also considers
  159. /// isMinimized(). isShown() is true only if visible and not minimized.
  160. bool isShown() const;
  161. /// The static isShown() can accept a NULL pointer (which of course
  162. /// returns false). When non-NULL, it calls the non-static isShown().
  163. static bool isShown(const LLFloater* floater);
  164. BOOL isFirstLook() { return mFirstLook; } // EXT-2653: This function is necessary to prevent overlapping for secondary showed toasts
  165. BOOL isFrontmost();
  166. BOOL isDependent() { return !mDependeeHandle.isDead(); }
  167. void setCanMinimize(BOOL can_minimize);
  168. void setCanClose(BOOL can_close);
  169. void setCanTearOff(BOOL can_tear_off);
  170. virtual void setCanResize(BOOL can_resize);
  171. void setCanDrag(BOOL can_drag);
  172. void setHost(LLMultiFloater* host);
  173. BOOL isResizable() const { return mResizable; }
  174. void setResizeLimits( S32 min_width, S32 min_height );
  175. void getResizeLimits( S32* min_width, S32* min_height ) { *min_width = mMinWidth; *min_height = mMinHeight; }
  176. bool isMinimizeable() const{ return mCanMinimize; }
  177. bool isCloseable() const{ return mCanClose; }
  178. bool isDragOnLeft() const{ return mDragOnLeft; }
  179. S32 getMinWidth() const{ return mMinWidth; }
  180. S32 getMinHeight() const{ return mMinHeight; }
  181. S32 getHeaderHeight() const { return mHeaderHeight; }
  182. virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
  183. virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
  184. virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
  185. virtual BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask);
  186. virtual BOOL handleScrollWheel(S32 x, S32 y, S32 mask);
  187. virtual void draw();
  188. virtual void drawShadow(LLPanel* panel);
  189. virtual void onOpen(const LLSD& key) {}
  190. virtual void onClose(bool app_quitting) {}
  191. // This cannot be "const" until all derived floater canClose()
  192. // methods are const as well.  JC
  193. virtual BOOL canClose() { return TRUE; }
  194. /*virtual*/ void setVisible(BOOL visible); // do not override
  195. /*virtual*/ void handleVisibilityChange ( BOOL new_visibility ); // do not override
  196. void setFrontmost(BOOL take_focus = TRUE);
  197. // Defaults to false.
  198. virtual BOOL canSaveAs() const { return FALSE; }
  199. virtual void saveAs() {}
  200. void setSnapTarget(LLHandle<LLFloater> handle) { mSnappedTo = handle; }
  201. void clearSnapTarget() { mSnappedTo.markDead(); }
  202. LLHandle<LLFloater> getSnapTarget() const { return mSnappedTo; }
  203. LLHandle<LLFloater> getHandle() const { return mHandle; }
  204. const LLSD&  getKey() { return mKey; }
  205. BOOL   matchesKey(const LLSD& key) { return mSingleInstance || KeyCompare::equate(key, mKey); }
  206. const std::string& getInstanceName() { return mInstanceName; }
  207. bool            isDockable() const { return mCanDock; }
  208. void            setCanDock(bool b);
  209. bool            isDocked() const { return mDocked; }
  210. virtual void    setDocked(bool docked, bool pop_on_undock = true);
  211. virtual void    setTornOff(bool torn_off) { mTornOff = torn_off; }
  212. // Return a closeable floater, if any, given the current focus.
  213. static LLFloater* getClosableFloaterFromFocus(); 
  214. // Close the floater returned by getClosableFloaterFromFocus() and 
  215. // handle refocusing.
  216. static void closeFocusedFloater();
  217. // LLNotification::Params contextualNotification(const std::string& name) 
  218. // { 
  219. //     return LLNotification::Params(name).context(mNotificationContext); 
  220. // }
  221. static void onClickClose(LLFloater* floater);
  222. static void onClickMinimize(LLFloater* floater);
  223. static void onClickTearOff(LLFloater* floater);
  224. static void     onClickDock(LLFloater* floater);
  225. static void onClickHelp(LLFloater* floater);
  226. static void setFloaterHost(LLMultiFloater* hostp) {sHostp = hostp; }
  227. static LLMultiFloater* getFloaterHost() {return sHostp; }
  228. protected:
  229. void setRectControl(const std::string& rectname) { mRectControl = rectname; };
  230. virtual void    applySavedVariables();
  231. void applyRectControl();
  232. void applyDockState();
  233. void storeRectControl();
  234. void storeVisibilityControl();
  235. void storeDockStateControl();
  236. void   setKey(const LLSD& key);
  237. void   setInstanceName(const std::string& name);
  238. virtual void bringToFront(S32 x, S32 y);
  239. virtual void setVisibleAndFrontmost(BOOL take_focus=TRUE);    
  240. void setExpandedRect(const LLRect& rect) { mExpandedRect = rect; } // size when not minimized
  241. const LLRect& getExpandedRect() const { return mExpandedRect; }
  242. void setAutoFocus(BOOL focus) { mAutoFocus = focus; } // whether to automatically take focus when opened
  243. BOOL getAutoFocus() const { return mAutoFocus; }
  244. LLDragHandle* getDragHandle() const { return mDragHandle; }
  245. void destroy() { die(); } // Don't call this directly.  You probably want to call closeFloater()
  246. private:
  247. void setForeground(BOOL b); // called only by floaterview
  248. void cleanupHandles(); // remove handles to dead floaters
  249. void createMinimizeButton();
  250. void updateButtons();
  251. void buildButtons(const Params& p);
  252. // Images and tooltips are named in the XML, but we want to look them
  253. // up by index.
  254. static LLUIImage* getButtonImage(const Params& p, EFloaterButton e);
  255. static LLUIImage* getButtonPressedImage(const Params& p, EFloaterButton e);
  256. static std::string getButtonTooltip(const Params& p, EFloaterButton e);
  257. BOOL offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index);
  258. void addResizeCtrls();
  259. void layoutResizeCtrls();
  260. void enableResizeCtrls(bool enable);
  261. void  addDragHandle();
  262. void layoutDragHandle(); // repair layout
  263. public:
  264. // Called when floater is opened, passes mKey
  265. // Public so external views or floaters can watch for this floater opening
  266. commit_signal_t mOpenSignal;
  267. // Called when floater is closed, passes app_qitting as LLSD()
  268. // Public so external views or floaters can watch for this floater closing
  269. commit_signal_t mCloseSignal;
  270. protected:
  271. std::string mRectControl;
  272. std::string mVisibilityControl;
  273. std::string mDocStateControl;
  274. LLSD mKey; // Key used for retrieving instances; set (for now) by LLFLoaterReg
  275. LLDragHandle* mDragHandle;
  276. LLResizeBar* mResizeBar[4];
  277. LLResizeHandle* mResizeHandle[4];
  278. private:
  279. LLRect mExpandedRect;
  280. LLUIString mTitle;
  281. LLUIString mShortTitle;
  282. BOOL mSingleInstance; // TRUE if there is only ever one instance of the floater
  283. std::string mInstanceName; // Store the instance name so we can remove ourselves from the list
  284. BOOL mAutoTile; // TRUE if placement of new instances tiles
  285. BOOL mCanTearOff;
  286. BOOL mCanMinimize;
  287. BOOL mCanClose;
  288. BOOL mDragOnLeft;
  289. BOOL mResizable;
  290. S32 mMinWidth;
  291. S32 mMinHeight;
  292. S32 mHeaderHeight; // height in pixels of header for title, drag bar
  293. S32 mLegacyHeaderHeight;// HACK see initFloaterXML()
  294. BOOL mMinimized;
  295. BOOL mForeground;
  296. LLHandle<LLFloater> mDependeeHandle;
  297. BOOL mFirstLook; // TRUE if the _next_ time this floater is visible will be the first time in the session that it is visible.
  298. typedef std::set<LLHandle<LLFloater> > handle_set_t;
  299. typedef std::set<LLHandle<LLFloater> >::iterator handle_set_iter_t;
  300. handle_set_t mDependents;
  301. bool mButtonsEnabled[BUTTON_COUNT];
  302. LLButton* mButtons[BUTTON_COUNT];
  303. F32 mButtonScale;
  304. BOOL mAutoFocus;
  305. LLHandle<LLFloater> mSnappedTo;
  306. LLHandle<LLFloater> mHostHandle;
  307. LLHandle<LLFloater> mLastHostHandle;
  308. bool            mCanDock;
  309. bool            mDocked;
  310. bool            mTornOff;
  311. static LLMultiFloater* sHostp;
  312. static BOOL sQuitting;
  313. static std::string sButtonNames[BUTTON_COUNT];
  314. static std::string sButtonToolTips[BUTTON_COUNT];
  315. static std::string  sButtonToolTipsIndex[BUTTON_COUNT];
  316. typedef void(*click_callback)(LLFloater*);
  317. static click_callback sButtonCallbacks[BUTTON_COUNT];
  318. typedef std::map<LLHandle<LLFloater>, LLFloater*> handle_map_t;
  319. typedef std::map<LLHandle<LLFloater>, LLFloater*>::iterator handle_map_iter_t;
  320. static handle_map_t sFloaterMap;
  321. std::vector<LLHandle<LLView> > mMinimizedHiddenChildren;
  322. BOOL mHasBeenDraggedWhileMinimized;
  323. S32 mPreviousMinimizedBottom;
  324. S32 mPreviousMinimizedLeft;
  325. // LLFloaterNotificationContext* mNotificationContext;
  326. LLRootHandle<LLFloater> mHandle;
  327. };
  328. /////////////////////////////////////////////////////////////
  329. // LLFloaterView
  330. // Parent of all floating panels
  331. class LLFloaterView : public LLUICtrl
  332. {
  333. protected:
  334. LLFloaterView (const Params& p);
  335. friend class LLUICtrlFactory;
  336. public:
  337. /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
  338. void reshapeFloater(S32 width, S32 height, BOOL called_from_parent, BOOL adjust_vertical);
  339. /*virtual*/ void draw();
  340. /*virtual*/ LLRect getSnapRect() const;
  341. /*virtual*/ void refresh();
  342. LLRect findNeighboringPosition( LLFloater* reference_floater, LLFloater* neighbor );
  343. // Given a child of gFloaterView, make sure this view can fit entirely onscreen.
  344. void adjustToFitScreen(LLFloater* floater, BOOL allow_partial_outside);
  345. void getMinimizePosition( S32 *left, S32 *bottom);
  346. void restoreAll(); // un-minimize all floaters
  347. typedef std::set<LLView*> skip_list_t;
  348. void pushVisibleAll(BOOL visible, const skip_list_t& skip_list = skip_list_t());
  349. void popVisibleAll(const skip_list_t& skip_list = skip_list_t());
  350. void setCycleMode(BOOL mode) { mFocusCycleMode = mode; }
  351. BOOL getCycleMode() const { return mFocusCycleMode; }
  352. void bringToFront( LLFloater* child, BOOL give_focus = TRUE );
  353. void highlightFocusedFloater();
  354. void unhighlightFocusedFloater();
  355. void focusFrontFloater();
  356. void destroyAllChildren();
  357. // attempt to close all floaters
  358. void closeAllChildren(bool app_quitting);
  359. BOOL allChildrenClosed();
  360. LLFloater* getFrontmost() const;
  361. LLFloater* getBackmost() const;
  362. LLFloater* getParentFloater(LLView* viewp) const;
  363. LLFloater* getFocusedFloater() const;
  364. void syncFloaterTabOrder();
  365. // Returns z order of child provided. 0 is closest, larger numbers
  366. // are deeper in the screen. If there is no such child, the return
  367. // value is not defined.
  368. S32 getZOrder(LLFloater* child);
  369. void setSnapOffsetBottom(S32 offset) { mSnapOffsetBottom = offset; }
  370. void setSnapOffsetRight(S32 offset) { mSnapOffsetRight = offset; }
  371. private:
  372. BOOL mFocusCycleMode;
  373. S32 mSnapOffsetBottom;
  374. S32 mSnapOffsetRight;
  375. };
  376. //
  377. // Globals
  378. //
  379. extern LLFloaterView* gFloaterView;
  380. #endif  // LL_FLOATER_H