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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llmenugl.h
  3.  * @brief Declaration of the opengl based menu system.
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-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_LLMENUGL_H
  33. #define LL_LLMENUGL_H
  34. #include <list>
  35. #include "llstring.h"
  36. #include "v4color.h"
  37. #include "llframetimer.h"
  38. #include "llkeyboard.h"
  39. #include "llfloater.h"
  40. #include "lluistring.h"
  41. #include "llview.h"
  42. #include <boost/function.hpp>
  43. extern S32 MENU_BAR_HEIGHT;
  44. extern S32 MENU_BAR_WIDTH;
  45. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  46. // Class LLMenuItemGL
  47. //
  48. // The LLMenuItemGL represents a single menu item in a menu. 
  49. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  50. class LLMenuItemGL : public LLUICtrl
  51. {
  52. public:
  53. struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
  54. {
  55. Optional<std::string> shortcut;
  56. Optional<KEY> jump_key;
  57. Optional<bool> use_mac_ctrl;
  58. Ignored rect,
  59. left,
  60. top,
  61. right,
  62. bottom,
  63. width,
  64. height,
  65. bottom_delta,
  66. left_delta;
  67. Optional<LLUIColor> enabled_color,
  68. disabled_color,
  69. highlight_bg_color,
  70. highlight_fg_color;
  71. Params();
  72. };
  73. protected:
  74. LLMenuItemGL(const Params&);
  75. friend class LLUICtrlFactory;
  76. public:
  77. // LLView overrides
  78. /*virtual*/ void handleVisibilityChange(BOOL new_visibility);
  79. /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
  80. /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
  81. /*virtual*/ BOOL handleRightMouseUp(S32 x, S32 y, MASK mask);
  82. // LLUICtrl overrides
  83. /*virtual*/ void setValue(const LLSD& value);
  84. virtual BOOL handleAcceleratorKey(KEY key, MASK mask);
  85. LLColor4 getHighlightBgColor() { return mHighlightBackground.get(); }
  86. void setJumpKey(KEY key);
  87. KEY getJumpKey() const { return mJumpKey; }
  88. // set the font used by this item.
  89. void setFont(const LLFontGL* font) { mFont = font; }
  90. const LLFontGL* getFont() const { return mFont; }
  91. // returns the height in pixels for the current font.
  92. virtual U32 getNominalHeight( void ) const;
  93. // Marks item as not needing space for check marks or accelerator keys
  94. virtual void setBriefItem(BOOL brief);
  95. virtual BOOL isBriefItem() const;
  96. virtual BOOL addToAcceleratorList(std::list<LLKeyBinding*> *listp);
  97. void setAllowKeyRepeat(BOOL allow) { mAllowKeyRepeat = allow; }
  98. BOOL getAllowKeyRepeat() const { return mAllowKeyRepeat; }
  99. // change the label
  100. void setLabel( const LLStringExplicit& label ) { mLabel = label; }
  101. std::string getLabel( void ) const { return mLabel.getString(); }
  102. virtual BOOL setLabelArg( const std::string& key, const LLStringExplicit& text );
  103. // Get the parent menu for this item
  104. virtual class LLMenuGL* getMenu() const;
  105. // returns the normal width of this control in pixels - this is
  106. // used for calculating the widest item, as well as for horizontal
  107. // arrangement.
  108. virtual U32 getNominalWidth( void ) const;
  109. // buildDrawLabel() - constructs the string used during the draw()
  110. // function. This reduces the overall string manipulation, but can
  111. // lead to visual errors if the state of the object changes
  112. // without the knowledge of the menu item. For example, if a
  113. // boolean being watched is changed outside of the menu item's
  114. // onCommit() function, the draw buffer will not be updated and will
  115. // reflect the wrong value. If this ever becomes an issue, there
  116. // are ways to fix this.
  117. // Returns the enabled state of the item.
  118. virtual void buildDrawLabel( void );
  119. // for branching menu items, bring sub menus up to root level of menu hierarchy
  120. virtual void updateBranchParent( LLView* parentp ){};
  121. virtual void onCommit( void );
  122. virtual void setHighlight( BOOL highlight );
  123. virtual BOOL getHighlight() const { return mHighlight; }
  124. // determine if this represents an active sub-menu
  125. virtual BOOL isActive( void ) const { return FALSE; }
  126. // determine if this represents an open sub-menu
  127. virtual BOOL isOpen( void ) const { return FALSE; }
  128. virtual void setEnabledSubMenus(BOOL enable){};
  129. // LLView Functionality
  130. virtual BOOL handleKeyHere( KEY key, MASK mask );
  131. virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask );
  132. virtual BOOL handleMouseUp( S32 x, S32 y, MASK mask );
  133. virtual BOOL handleScrollWheel( S32 x, S32 y, S32 clicks );
  134. virtual void draw( void );
  135. BOOL getHover() const { return mGotHover; }
  136. void setDrawTextDisabled(BOOL disabled) { mDrawTextDisabled = disabled; }
  137. BOOL getDrawTextDisabled() const { return mDrawTextDisabled; }
  138. protected:
  139. void setHover(BOOL hover) { mGotHover = hover; }
  140. // This function appends the character string representation of
  141. // the current accelerator key and mask to the provided string.
  142. void appendAcceleratorString( std::string& st ) const;
  143. protected:
  144. KEY mAcceleratorKey;
  145. MASK mAcceleratorMask;
  146. // mLabel contains the actual label specified by the user.
  147. LLUIString mLabel;
  148. // The draw labels contain some of the labels that we draw during
  149. // the draw() routine. This optimizes away some of the string
  150. // manipulation.
  151. LLUIString mDrawBoolLabel;
  152. LLUIString mDrawAccelLabel;
  153. LLUIString mDrawBranchLabel;
  154. LLUIColor mEnabledColor;
  155. LLUIColor mDisabledColor;
  156. LLUIColor mHighlightBackground;
  157. LLUIColor mHighlightForeground;
  158. BOOL mHighlight;
  159. private:
  160. // Keyboard and mouse variables
  161. BOOL mAllowKeyRepeat;
  162. BOOL mGotHover;
  163. // If true, suppress normal space for check marks on the left and accelerator
  164. // keys on the right.
  165. BOOL mBriefItem;
  166. // Font for this item
  167. const LLFontGL* mFont;
  168. BOOL mDrawTextDisabled;
  169. KEY mJumpKey;
  170. };
  171. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  172. // Class LLMenuItemSeparatorGL
  173. //
  174. // This class represents a separator.
  175. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  176. class LLMenuItemSeparatorGL : public LLMenuItemGL
  177. {
  178. public:
  179. struct Params : public LLInitParam::Block<Params, LLMenuItemGL::Params>
  180. {
  181. Params();
  182. };
  183. LLMenuItemSeparatorGL(const LLMenuItemSeparatorGL::Params& p = LLMenuItemSeparatorGL::Params());
  184. /*virtual*/ void draw( void );
  185. /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
  186. /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
  187. /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
  188. /*virtual*/ U32 getNominalHeight( void ) const;
  189. };
  190. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  191. // Class LLMenuItemCallGL
  192. //
  193. // The LLMenuItemCallerGL represents a single menu item in a menu that
  194. // calls a user defined callback.
  195. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  196. class LLMenuItemCallGL : public LLMenuItemGL
  197. {
  198. public:
  199. struct Params : public LLInitParam::Block<Params, LLMenuItemGL::Params>
  200. {
  201. Optional<EnableCallbackParam > on_enable;
  202. Optional<CommitCallbackParam > on_click;
  203. Optional<EnableCallbackParam > on_visible;
  204. Params()
  205. : on_enable("on_enable"),
  206.   on_click("on_click"),
  207.   on_visible("on_visible")
  208. {}
  209. };
  210. protected:
  211. LLMenuItemCallGL(const Params&);
  212. friend class LLUICtrlFactory;
  213. void updateEnabled( void );
  214. void updateVisible( void );
  215. public:
  216. void initFromParams(const Params& p);
  217. // called to rebuild the draw label
  218. virtual void buildDrawLabel( void );
  219. virtual void onCommit( void );
  220. virtual BOOL handleAcceleratorKey(KEY key, MASK mask);
  221. virtual BOOL handleKeyHere(KEY key, MASK mask);
  222. //virtual void draw();
  223. boost::signals2::connection setClickCallback( const commit_signal_t::slot_type& cb )
  224. {
  225. return setCommitCallback(cb);
  226. }
  227. boost::signals2::connection setEnableCallback( const enable_signal_t::slot_type& cb )
  228. {
  229. return mEnableSignal.connect(cb);
  230. }
  231. private:
  232. enable_signal_t mEnableSignal;
  233. enable_signal_t mVisibleSignal;
  234. };
  235. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  236. // Class LLMenuItemCheckGL
  237. //
  238. // The LLMenuItemCheckGL is an extension of the LLMenuItemCallGL
  239. // class, by allowing another method to be specified which determines
  240. // if the menu item should consider itself checked as true or not.  Be
  241. // careful that the provided callback is fast - it needs to be VERY
  242. // FUCKING EFFICIENT, because it may need to be checked a lot.
  243. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  244. class LLMenuItemCheckGL 
  245. : public LLMenuItemCallGL
  246. {
  247. public:
  248. struct Params : public LLInitParam::Block<Params, LLMenuItemCallGL::Params>
  249. {
  250. Optional<EnableCallbackParam > on_check;
  251. Params()
  252. : on_check("on_check")
  253. {}
  254. };
  255. protected:
  256. LLMenuItemCheckGL(const Params&);
  257. friend class LLUICtrlFactory;
  258. public:
  259. void initFromParams(const Params& p);
  260. virtual void onCommit( void );
  261. virtual void setValue(const LLSD& value);
  262. // called to rebuild the draw label
  263. virtual void buildDrawLabel( void );
  264. boost::signals2::connection setCheckCallback( const enable_signal_t::slot_type& cb )
  265. {
  266. return mCheckSignal.connect(cb);
  267. }
  268. private:
  269. enable_signal_t mCheckSignal;
  270. };
  271. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  272. // Class LLMenuGL
  273. //
  274. // The Menu class represents a normal rectangular menu somewhere on
  275. // screen. A Menu can have menu items (described above) or sub-menus
  276. // attached to it. Sub-menus are implemented via a specialized
  277. // menu-item type known as a branch. Since it's easy to do wrong, I've
  278. // taken the branch functionality out of public view, and encapsulate
  279. // it in the appendMenu() method.
  280. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  281. // child widget registry
  282. struct MenuRegistry : public LLChildRegistry<MenuRegistry>
  283. {};
  284. class LLMenuGL 
  285. : public LLUICtrl
  286. {
  287. public:
  288. struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
  289. {
  290. Optional<KEY> jump_key;
  291. Optional<bool> horizontal_layout,
  292. can_tear_off,
  293. drop_shadow,
  294. bg_visible,
  295. create_jump_keys,
  296. keep_fixed_size,
  297. scrollable;
  298. Optional<U32> max_scrollable_items;
  299. Optional<U32> preferred_width;
  300. Optional<LLUIColor> bg_color;
  301. Optional<S32> shortcut_pad;
  302. Params()
  303. : jump_key("jump_key", KEY_NONE),
  304. horizontal_layout("horizontal_layout"),
  305. can_tear_off("tear_off", false),
  306. drop_shadow("drop_shadow", true),
  307. bg_visible("bg_visible", true),
  308. create_jump_keys("create_jump_keys", false),
  309. bg_color("bg_color",  LLUIColorTable::instance().getColor( "MenuDefaultBgColor" )),
  310. scrollable("scrollable", false), 
  311. max_scrollable_items("max_scrollable_items", U32_MAX),
  312. preferred_width("preferred_width", U32_MAX),
  313. shortcut_pad("shortcut_pad")
  314. {
  315. addSynonym(bg_visible, "opaque");
  316. addSynonym(bg_color, "color");
  317. name = "menu";
  318. }
  319. };
  320. // my valid children are contained in MenuRegistry
  321. typedef MenuRegistry child_registry_t;
  322. void initFromParams(const Params&);
  323. protected:
  324. LLMenuGL(const LLMenuGL::Params& p);
  325. friend class LLUICtrlFactory;
  326. // let branching menu items use my protected traversal methods
  327. friend class LLMenuItemBranchGL;
  328. public:
  329. virtual ~LLMenuGL( void );
  330. void parseChildXML(LLXMLNodePtr child, LLView* parent);
  331. // LLView Functionality
  332. /*virtual*/ BOOL handleUnicodeCharHere( llwchar uni_char );
  333. /*virtual*/ BOOL handleHover( S32 x, S32 y, MASK mask );
  334. /*virtual*/ BOOL handleScrollWheel( S32 x, S32 y, S32 clicks );
  335. /*virtual*/ void draw( void );
  336. /*virtual*/ void drawBackground(LLMenuItemGL* itemp, F32 alpha);
  337. /*virtual*/ void setVisible(BOOL visible);
  338. /*virtual*/ bool addChild(LLView* view, S32 tab_group = 0);
  339. /*virtual*/ void removeChild( LLView* ctrl);
  340. /*virtual*/ BOOL postBuild();
  341. virtual BOOL handleAcceleratorKey(KEY key, MASK mask);
  342. LLMenuGL* findChildMenuByName(const std::string& name, BOOL recurse) const;
  343. BOOL clearHoverItem();
  344. // return the name label
  345. const std::string& getLabel( void ) const { return mLabel.getString(); }
  346. void setLabel(const LLStringExplicit& label) { mLabel = label; }
  347. // background colors
  348. void setBackgroundColor( const LLUIColor& color ) { mBackgroundColor = color; }
  349. const LLUIColor& getBackgroundColor() const { return mBackgroundColor; }
  350. void setBackgroundVisible( BOOL b ) { mBgVisible = b; }
  351. void setCanTearOff(BOOL tear_off);
  352. // add a separator to this menu
  353. virtual BOOL addSeparator();
  354. // for branching menu items, bring sub menus up to root level of menu hierarchy
  355. virtual void updateParent( LLView* parentp );
  356. // setItemEnabled() - pass the name and the enable flag for a
  357. // menu item. TRUE will make sure it's enabled, FALSE will disable
  358. // it.
  359. void setItemEnabled( const std::string& name, BOOL enable ); 
  360. // propagate message to submenus
  361. void setEnabledSubMenus(BOOL enable);
  362. void setItemVisible( const std::string& name, BOOL visible);
  363. // sets the left,bottom corner of menu, useful for popups
  364. void setLeftAndBottom(S32 left, S32 bottom);
  365. virtual BOOL handleJumpKey(KEY key);
  366. virtual BOOL jumpKeysActive();
  367. virtual BOOL isOpen();
  368. void needsArrange() { mNeedsArrange = TRUE; }
  369. // Shape this menu to fit the current state of the children, and
  370. // adjust the child rects to fit. This is called automatically
  371. // when you add items. *FIX: We may need to deal with visibility
  372. // arrangement.
  373. virtual void arrange( void );
  374. void arrangeAndClear( void );
  375. // remove all items on the menu
  376. void empty( void );
  377. void setItemLastSelected(LLMenuItemGL* item); // must be in menu
  378. U32 getItemCount(); // number of menu items
  379. LLMenuItemGL* getItem(S32 number); // 0 = first item
  380. LLMenuItemGL* getHighlightedItem();
  381. LLMenuItemGL* highlightNextItem(LLMenuItemGL* cur_item, BOOL skip_disabled = TRUE);
  382. LLMenuItemGL* highlightPrevItem(LLMenuItemGL* cur_item, BOOL skip_disabled = TRUE);
  383. void buildDrawLabels();
  384. void createJumpKeys();
  385. // Show popup at a specific location, in the spawn_view's coordinate frame
  386. static void showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y);
  387. // Whether to drop shadow menu bar 
  388. void setDropShadowed( const BOOL shadowed );
  389. void setParentMenuItem( LLMenuItemGL* parent_menu_item ) { mParentMenuItem = parent_menu_item->getHandle(); }
  390. LLMenuItemGL* getParentMenuItem() const { return dynamic_cast<LLMenuItemGL*>(mParentMenuItem.get()); }
  391. void setTornOff(BOOL torn_off);
  392. BOOL getTornOff() { return mTornOff; }
  393. BOOL getCanTearOff() { return mTearOffItem != NULL; }
  394. KEY getJumpKey() const { return mJumpKey; }
  395. void setJumpKey(KEY key) { mJumpKey = key; }
  396. static void setKeyboardMode(BOOL mode) { sKeyboardMode = mode; }
  397. static BOOL getKeyboardMode() { return sKeyboardMode; }
  398. S32 getShortcutPad() { return mShortcutPad; }
  399. void scrollItemsUp();
  400. void scrollItemsDown();
  401. BOOL isScrollable() const { return mScrollable; }
  402. static class LLMenuHolderGL* sMenuContainer;
  403. protected:
  404. void createSpilloverBranch();
  405. void cleanupSpilloverBranch();
  406. // Add the menu item to this menu.
  407. virtual BOOL append( LLMenuItemGL* item );
  408. // add a menu - this will create a cascading menu
  409. virtual BOOL appendMenu( LLMenuGL* menu );
  410. // TODO: create accessor methods for these?
  411. typedef std::list< LLMenuItemGL* > item_list_t;
  412. item_list_t mItems;
  413. LLMenuItemGL*mFirstVisibleItem;
  414. LLMenuItemGL *mArrowUpItem, *mArrowDownItem;
  415. typedef std::map<KEY, LLMenuItemGL*> navigation_key_map_t;
  416. navigation_key_map_t mJumpKeys;
  417. S32 mLastMouseX;
  418. S32 mLastMouseY;
  419. S32 mMouseVelX;
  420. S32 mMouseVelY;
  421. U32 mMaxScrollableItems;
  422. U32 mPreferredWidth;
  423. BOOL mHorizontalLayout;
  424. BOOL mScrollable;
  425. BOOL mKeepFixedSize;
  426. BOOL mNeedsArrange;
  427. private:
  428. static LLColor4 sDefaultBackgroundColor;
  429. static BOOL sKeyboardMode;
  430. LLUIColor mBackgroundColor;
  431. BOOL mBgVisible;
  432. LLHandle<LLView> mParentMenuItem;
  433. LLUIString mLabel;
  434. BOOL mDropShadowed;  //  Whether to drop shadow 
  435. bool mHasSelection;
  436. LLFrameTimer mFadeTimer;
  437. LLTimer mScrollItemsTimer;
  438. BOOL mTornOff;
  439. class LLMenuItemTearOffGL* mTearOffItem;
  440. class LLMenuItemBranchGL* mSpilloverBranch;
  441. LLMenuGL* mSpilloverMenu;
  442. KEY mJumpKey;
  443. BOOL mCreateJumpKeys;
  444. S32 mShortcutPad;
  445. }; // end class LLMenuGL
  446. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  447. // Class LLMenuItemBranchGL
  448. //
  449. // The LLMenuItemBranchGL represents a menu item that has a
  450. // sub-menu. This is used to make cascading menus.
  451. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  452. class LLMenuItemBranchGL : public LLMenuItemGL
  453. {
  454. public:
  455. struct Params : public LLInitParam::Block<Params, LLMenuItemGL::Params>
  456. {
  457. Optional<LLMenuGL*> branch;
  458. };
  459. protected:
  460. LLMenuItemBranchGL(const Params&);
  461. friend class LLUICtrlFactory;
  462. public:
  463. virtual ~LLMenuItemBranchGL();
  464. virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
  465. virtual BOOL handleAcceleratorKey(KEY key, MASK mask);
  466. // check if we've used these accelerators already
  467. virtual BOOL addToAcceleratorList(std::list <LLKeyBinding*> *listp);
  468. // called to rebuild the draw label
  469. virtual void buildDrawLabel( void );
  470. virtual void onCommit( void );
  471. virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
  472. virtual BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent);
  473. // set the hover status (called by it's menu) and if the object is
  474. // active. This is used for behavior transfer.
  475. virtual void setHighlight( BOOL highlight );
  476. virtual BOOL handleKeyHere(KEY key, MASK mask);
  477. virtual BOOL isActive() const;
  478. virtual BOOL isOpen() const;
  479. LLMenuGL* getBranch() const { return (LLMenuGL*)mBranchHandle.get(); }
  480. virtual void updateBranchParent( LLView* parentp );
  481. // LLView Functionality
  482. virtual void handleVisibilityChange( BOOL curVisibilityIn );
  483. virtual void draw();
  484. virtual void setEnabledSubMenus(BOOL enabled) { if (getBranch()) getBranch()->setEnabledSubMenus(enabled); }
  485. virtual void openMenu();
  486. virtual LLView* getChildView(const std::string& name, BOOL recurse = TRUE) const;
  487. virtual LLView* findChildView(const std::string& name, BOOL recurse = TRUE) const;
  488. private:
  489. LLHandle<LLView> mBranchHandle;
  490. }; // end class LLMenuItemBranchGL
  491. //-----------------------------------------------------------------------------
  492. // class LLContextMenu
  493. // A context menu
  494. //-----------------------------------------------------------------------------
  495. class LLContextMenu
  496. : public LLMenuGL
  497. {
  498. public:
  499. struct Params : public LLInitParam::Block<Params, LLMenuGL::Params>
  500. {
  501. Params()
  502. {
  503. visible = false;
  504. }
  505. };
  506. protected:
  507. LLContextMenu(const Params& p);
  508. friend class LLUICtrlFactory;
  509. public:
  510. virtual ~LLContextMenu() {}
  511. // LLView Functionality
  512. // can't set visibility directly, must call show or hide
  513. virtual void setVisible (BOOL visible);
  514. virtual void draw ();
  515. virtual void show (S32 x, S32 y);
  516. virtual void hide ();
  517. virtual BOOL handleHover ( S32 x, S32 y, MASK mask );
  518. virtual BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
  519. virtual BOOL handleRightMouseUp ( S32 x, S32 y, MASK mask );
  520. virtual bool addChild (LLView* view, S32 tab_group = 0);
  521. BOOL appendContextSubMenu(LLContextMenu *menu);
  522. protected:
  523. BOOL mHoveredAnyItem;
  524. LLMenuItemGL* mHoverItem;
  525. };
  526. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  527. // Class LLMenuBarGL
  528. //
  529. // A menu bar displays menus horizontally.
  530. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  531. class LLMenuBarGL : public LLMenuGL
  532. {
  533. public:
  534. struct Params : public LLInitParam::Block<Params, LLMenuGL::Params>
  535. {
  536. Params()
  537. {
  538. can_tear_off = false;
  539. keep_fixed_size = true;
  540. horizontal_layout = true;
  541. visible = true;
  542. drop_shadow = false;
  543. }
  544. };
  545. LLMenuBarGL( const Params& p );
  546. virtual ~LLMenuBarGL();
  547. /*virtual*/ BOOL handleAcceleratorKey(KEY key, MASK mask);
  548. /*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);
  549. /*virtual*/ BOOL handleJumpKey(KEY key);
  550. /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
  551. /*virtual*/ void draw();
  552. /*virtual*/ BOOL jumpKeysActive();
  553. // add a vertical separator to this menu
  554. virtual BOOL addSeparator();
  555. // LLView Functionality
  556. virtual BOOL handleHover( S32 x, S32 y, MASK mask );
  557. // Returns x position of rightmost child, usually Help menu
  558. S32 getRightmostMenuEdge();
  559. void resetMenuTrigger() { mAltKeyTrigger = FALSE; }
  560. private:
  561. // add a menu - this will create a drop down menu.
  562. virtual BOOL appendMenu( LLMenuGL* menu );
  563. // rearrange the child rects so they fit the shape of the menu
  564. // bar.
  565. virtual void arrange( void );
  566. void checkMenuTrigger();
  567. std::list <LLKeyBinding*> mAccelerators;
  568. BOOL mAltKeyTrigger;
  569. };
  570. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  571. // Class LLMenuHolderGL
  572. //
  573. // High level view that serves as parent for all menus
  574. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  575. class LLMenuHolderGL : public LLPanel
  576. {
  577. public:
  578. struct Params : public LLInitParam::Block<Params, LLPanel::Params>
  579. {};
  580. LLMenuHolderGL(const Params& p);
  581. virtual ~LLMenuHolderGL() {}
  582. virtual BOOL hideMenus();
  583. void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
  584. void setCanHide(BOOL can_hide) { mCanHide = can_hide; }
  585. // LLView functionality
  586. virtual void draw();
  587. virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask );
  588. virtual BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
  589. // Close context menus on right mouse up not handled by menus.
  590. /*virtual*/ BOOL handleRightMouseUp( S32 x, S32 y, MASK mask );
  591. virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
  592. virtual const LLRect getMenuRect() const { return getLocalRect(); }
  593. LLView*const getVisibleMenu() const;
  594. virtual BOOL hasVisibleMenu() const {return getVisibleMenu() != NULL;}
  595. static void setActivatedItem(LLMenuItemGL* item);
  596. // Need to detect if mouse-up after context menu spawn has moved.
  597. // If not, need to keep the menu up.
  598. static LLCoordGL sContextMenuSpawnPos;
  599. private:
  600. static LLHandle<LLView> sItemLastSelectedHandle;
  601. static LLFrameTimer sItemActivationTimer;
  602. BOOL mCanHide;
  603. };
  604. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  605. // Class LLTearOffMenu
  606. //
  607. // Floater that hosts a menu
  608. // https://wiki.lindenlab.com/mediawiki/index.php?title=LLTearOffMenu&oldid=81344
  609. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  610. class LLTearOffMenu : public LLFloater
  611. {
  612. public:
  613. static LLTearOffMenu* create(LLMenuGL* menup);
  614. virtual ~LLTearOffMenu();
  615. virtual void draw(void);
  616. virtual void onFocusReceived();
  617. virtual void onFocusLost();
  618. virtual BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent);
  619. virtual BOOL handleKeyHere(KEY key, MASK mask);
  620. virtual void translate(S32 x, S32 y);
  621. private:
  622. LLTearOffMenu(LLMenuGL* menup);
  623. void closeTearOff();
  624. LLView* mOldParent;
  625. LLMenuGL* mMenu;
  626. F32 mTargetHeight;
  627. };
  628. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  629. // Class LLMenuItemTearOffGL
  630. //
  631. // This class represents a separator.
  632. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  633. class LLMenuItemTearOffGL : public LLMenuItemGL
  634. {
  635. public:
  636. struct Params : public LLInitParam::Block<Params, LLMenuItemGL::Params>
  637. {
  638. Params()
  639. {
  640. name = "tear off";
  641. label = "~~~~~~~~~~~";
  642. }
  643. };
  644. LLMenuItemTearOffGL( const Params& );
  645. virtual void onCommit(void);
  646. virtual void draw(void);
  647. virtual U32 getNominalHeight() const;
  648. LLFloater* getParentFloater();
  649. };
  650. // *TODO: this is currently working, so finish implementation
  651. class LLEditMenuHandlerMgr
  652. {
  653. public:
  654. LLEditMenuHandlerMgr& getInstance() {
  655. static LLEditMenuHandlerMgr instance;
  656. return instance;
  657. }
  658. virtual ~LLEditMenuHandlerMgr() {}
  659. private:
  660. LLEditMenuHandlerMgr() {};
  661. };
  662. // *TODO: Eliminate
  663. // For backwards compatability only; generally just use boost::bind
  664. class view_listener_t : public boost::signals2::trackable
  665. {
  666. public:
  667. virtual bool handleEvent(const LLSD& userdata) = 0;
  668. virtual ~view_listener_t() {}
  669. static void addEnable(view_listener_t* listener, const std::string& name)
  670. {
  671. LLUICtrl::EnableCallbackRegistry::currentRegistrar().add(name, boost::bind(&view_listener_t::handleEvent, listener, _2));
  672. }
  673. static void addCommit(view_listener_t* listener, const std::string& name)
  674. {
  675. LLUICtrl::CommitCallbackRegistry::currentRegistrar().add(name, boost::bind(&view_listener_t::handleEvent, listener, _2));
  676. }
  677. static void addMenu(view_listener_t* listener, const std::string& name)
  678. {
  679. // For now, add to both click and enable registries
  680. addEnable(listener, name);
  681. addCommit(listener, name);
  682. }
  683. };
  684. #endif // LL_LLMENUGL_H