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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lldockablefloater.cpp
  3.  * @brief Creates a panel of a specific kind for a toast
  4.  *
  5.  * $LicenseInfo:firstyear=2000&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2000-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 "linden_common.h"
  33. #include "lldockablefloater.h"
  34. #include "llfloaterreg.h"
  35. //static
  36. LLHandle<LLFloater> LLDockableFloater::sInstanceHandle;
  37. //static
  38. void LLDockableFloater::init(LLDockableFloater* thiz)
  39. {
  40. thiz->setDocked(thiz->mDockControl.get() != NULL
  41. && thiz->mDockControl.get()->isDockVisible());
  42. thiz->resetInstance();
  43. // all dockable floaters should have close, dock and minimize buttons
  44. thiz->setCanClose(TRUE);
  45. thiz->setCanDock(true);
  46. thiz->setCanMinimize(TRUE);
  47. }
  48. LLDockableFloater::LLDockableFloater(LLDockControl* dockControl,
  49. const LLSD& key, const Params& params) :
  50. LLFloater(key, params), mDockControl(dockControl), mUniqueDocking(true)
  51. , mOverlapsScreenChannel(false)
  52. {
  53. init(this);
  54. mUseTongue = true;
  55. }
  56. LLDockableFloater::LLDockableFloater(LLDockControl* dockControl, bool uniqueDocking,
  57. const LLSD& key, const Params& params) :
  58. LLFloater(key, params), mDockControl(dockControl), mUniqueDocking(uniqueDocking)
  59. {
  60. init(this);
  61. mUseTongue = true;
  62. }
  63. LLDockableFloater::LLDockableFloater(LLDockControl* dockControl, bool uniqueDocking,
  64. bool useTongue, const LLSD& key, const Params& params) :
  65. LLFloater(key, params), mDockControl(dockControl), mUseTongue(useTongue), mUniqueDocking(uniqueDocking)
  66. {
  67. init(this);
  68. }
  69. LLDockableFloater::~LLDockableFloater()
  70. {
  71. }
  72. BOOL LLDockableFloater::postBuild()
  73. {
  74. mDockTongue = LLUI::getUIImage("windows/Flyout_Pointer.png");
  75. LLFloater::setDocked(true);
  76. return LLView::postBuild();
  77. }
  78. //static
  79. void LLDockableFloater::toggleInstance(const LLSD& sdname)
  80. {
  81. LLSD key;
  82. std::string name = sdname.asString();
  83. LLDockableFloater* instance =
  84. dynamic_cast<LLDockableFloater*> (LLFloaterReg::findInstance(name));
  85. // if floater closed or docked
  86. if (instance == NULL || (instance && instance->isDocked()))
  87. {
  88. LLFloaterReg::toggleInstance(name, key);
  89. // restore button toggle state
  90. if (instance != NULL)
  91. {
  92. instance->storeVisibilityControl();
  93. }
  94. }
  95. // if floater undocked
  96. else if (instance != NULL)
  97. {
  98. instance->setMinimized(FALSE);
  99. if (instance->getVisible())
  100. {
  101. instance->setVisible(FALSE);
  102. }
  103. else
  104. {
  105. instance->setVisible(TRUE);
  106. gFloaterView->bringToFront(instance);
  107. }
  108. }
  109. }
  110. void LLDockableFloater::resetInstance()
  111. {
  112. if (mUniqueDocking && sInstanceHandle.get() != this)
  113. {
  114. if (sInstanceHandle.get() != NULL && sInstanceHandle.get()->isDocked())
  115. {
  116. sInstanceHandle.get()->setVisible(FALSE);
  117. }
  118. sInstanceHandle = getHandle();
  119. }
  120. }
  121. void LLDockableFloater::setVisible(BOOL visible)
  122. {
  123. if(visible && isDocked())
  124. {
  125. resetInstance();
  126. }
  127. if (visible && mDockControl.get() != NULL)
  128. {
  129. mDockControl.get()->repositionDockable();
  130. }
  131. if (visible)
  132. {
  133. LLFloater::setFrontmost(getAutoFocus());
  134. }
  135. LLFloater::setVisible(visible);
  136. }
  137. void LLDockableFloater::setMinimized(BOOL minimize)
  138. {
  139. if(minimize)
  140. {
  141. setVisible(FALSE);
  142. }
  143. }
  144. LLView * LLDockableFloater::getDockWidget()
  145. {
  146. LLView * res = NULL;
  147. if (getDockControl() != NULL) {
  148. res = getDockControl()->getDock();
  149. }
  150. return res;
  151. }
  152. void LLDockableFloater::onDockHidden()
  153. {
  154. setCanDock(FALSE);
  155. }
  156. void LLDockableFloater::onDockShown()
  157. {
  158. if (!isMinimized())
  159. {
  160. setCanDock(TRUE);
  161. }
  162. }
  163. void LLDockableFloater::setDocked(bool docked, bool pop_on_undock)
  164. {
  165. if (mDockControl.get() != NULL && mDockControl.get()->isDockVisible())
  166. {
  167. if (docked)
  168. {
  169. resetInstance();
  170. mDockControl.get()->on();
  171. }
  172. else
  173. {
  174. mDockControl.get()->off();
  175. }
  176. if (!docked && pop_on_undock)
  177. {
  178. // visually pop up a little bit to emphasize the undocking
  179. translate(0, UNDOCK_LEAP_HEIGHT);
  180. }
  181. }
  182. else
  183. {
  184. docked = false;
  185. }
  186. LLFloater::setDocked(docked, pop_on_undock);
  187. }
  188. void LLDockableFloater::draw()
  189. {
  190. if (mDockControl.get() != NULL)
  191. {
  192. mDockControl.get()->repositionDockable();
  193. if (isDocked())
  194. {
  195. mDockControl.get()->drawToungue();
  196. }
  197. }
  198. LLFloater::draw();
  199. }
  200. void LLDockableFloater::setDockControl(LLDockControl* dockControl, bool docked /* = true */)
  201. {
  202. mDockControl.reset(dockControl);
  203. setDocked(docked && mDockControl.get() != NULL && mDockControl.get()->isDockVisible());
  204. }
  205. const LLUIImagePtr& LLDockableFloater::getDockTongue()
  206. {
  207. return mDockTongue;
  208. }
  209. LLDockControl* LLDockableFloater::getDockControl()
  210. {
  211. return mDockControl.get();
  212. }