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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltransientfloatermgr.cpp
  3.  * @brief LLFocusMgr 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. #include "llviewerprecompiledheaders.h"
  33. #include "lltransientfloatermgr.h"
  34. #include "llfocusmgr.h"
  35. #include "llrootview.h"
  36. #include "llviewerwindow.h"
  37. #include "lldockablefloater.h"
  38. #include "llmenugl.h"
  39. LLTransientFloaterMgr::LLTransientFloaterMgr()
  40. {
  41. gViewerWindow->getRootView()->addMouseDownCallback(boost::bind(
  42. &LLTransientFloaterMgr::leftMouseClickCallback, this, _1, _2, _3));
  43. mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(GLOBAL, std::set<LLView*>()));
  44. mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(DOCKED, std::set<LLView*>()));
  45. mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(IM, std::set<LLView*>()));
  46. }
  47. void LLTransientFloaterMgr::registerTransientFloater(LLTransientFloater* floater)
  48. {
  49. mTransSet.insert(floater);
  50. }
  51. void LLTransientFloaterMgr::unregisterTransientFloater(LLTransientFloater* floater)
  52. {
  53. mTransSet.erase(floater);
  54. }
  55. void LLTransientFloaterMgr::addControlView(ETransientGroup group, LLView* view)
  56. {
  57. mGroupControls.find(group)->second.insert(view);
  58. }
  59. void LLTransientFloaterMgr::removeControlView(ETransientGroup group, LLView* view)
  60. {
  61. mGroupControls.find(group)->second.erase(view);
  62. }
  63. void LLTransientFloaterMgr::addControlView(LLView* view)
  64. {
  65. addControlView(GLOBAL, view);
  66. }
  67. void LLTransientFloaterMgr::removeControlView(LLView* view)
  68. {
  69. // we will still get focus lost callbacks on this view, but that's ok
  70. // since we run sanity checking logic every time
  71. removeControlView(GLOBAL, view);
  72. }
  73. void LLTransientFloaterMgr::hideTransientFloaters(S32 x, S32 y)
  74. {
  75. for (std::set<LLTransientFloater*>::iterator it = mTransSet.begin(); it
  76. != mTransSet.end(); it++)
  77. {
  78. LLTransientFloater* floater = *it;
  79. if (floater->isTransientDocked())
  80. {
  81. ETransientGroup group = floater->getGroup();
  82. bool hide = isControlClicked(mGroupControls.find(group)->second, x, y);
  83. if (hide)
  84. {
  85. floater->setTransientVisible(FALSE);
  86. }
  87. }
  88. }
  89. }
  90. bool LLTransientFloaterMgr::isControlClicked(std::set<LLView*>& set, S32 x, S32 y)
  91. {
  92. bool res = true;
  93. for (controls_set_t::iterator it = set.begin(); it
  94. != set.end(); it++)
  95. {
  96. LLView* control_view = *it;
  97. if (!control_view->getVisible())
  98. {
  99. continue;
  100. }
  101. LLRect rect = control_view->calcScreenRect();
  102. // if click inside view rect
  103. if (rect.pointInRect(x, y))
  104. {
  105. res = false;
  106. break;
  107. }
  108. }
  109. return res;
  110. }
  111. void LLTransientFloaterMgr::leftMouseClickCallback(S32 x, S32 y,
  112. MASK mask)
  113. {
  114. // don't hide transient floater if any context menu opened
  115. if (LLMenuGL::sMenuContainer->getVisibleMenu() != NULL)
  116. {
  117. return;
  118. }
  119. bool hide = isControlClicked(mGroupControls.find(DOCKED)->second, x, y)
  120. && isControlClicked(mGroupControls.find(GLOBAL)->second, x, y);
  121. if (hide)
  122. {
  123. hideTransientFloaters(x, y);
  124. }
  125. }
  126. void LLTransientFloater::init(LLFloater* thiz)
  127. {
  128. // used since LLTransientFloater(this) can't be used in descendant constructor parameter initialization.
  129. mFloater = thiz;
  130. }