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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltoast.cpp
  3.  * @brief This class implements a placeholder for any notification panel.
  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 "llviewerprecompiledheaders.h" // must be first include
  33. #include "lltoast.h"
  34. #include "llbutton.h"
  35. #include "llfocusmgr.h"
  36. #include "llnotifications.h"
  37. #include "llviewercontrol.h"
  38. using namespace LLNotificationsUI;
  39. //--------------------------------------------------------------------------
  40. LLToast::Params::Params() 
  41. : can_fade("can_fade", true),
  42. can_be_stored("can_be_stored", true),
  43. is_modal("is_modal", false),
  44. is_tip("is_tip", false),
  45. enable_hide_btn("enable_hide_btn", true),
  46. force_show("force_show", false),
  47. force_store("force_store", false),
  48. fading_time_secs("fading_time_secs", gSavedSettings.getS32("ToastFadingTime")),
  49. lifetime_secs("lifetime_secs", gSavedSettings.getS32("NotificationToastLifeTime"))
  50. {};
  51. LLToast::LLToast(const LLToast::Params& p) 
  52. : LLModalDialog(LLSD(), p.is_modal),
  53. mPanel(p.panel), 
  54. mToastLifetime(p.lifetime_secs),
  55. mToastFadingTime(p.fading_time_secs),
  56. mNotificationID(p.notif_id),  
  57. mSessionID(p.session_id),
  58. mCanFade(p.can_fade),
  59. mCanBeStored(p.can_be_stored),
  60. mHideBtnEnabled(p.enable_hide_btn),
  61. mHideBtn(NULL),
  62. mNotification(p.notification),
  63. mIsHidden(false),
  64. mHideBtnPressed(false),
  65. mIsTip(p.is_tip),
  66. mWrapperPanel(NULL)
  67. {
  68. LLUICtrlFactory::getInstance()->buildFloater(this, "panel_toast.xml", NULL);
  69. setCanDrag(FALSE);
  70. mWrapperPanel = getChild<LLPanel>("wrapper_panel");
  71. mWrapperPanel->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this));
  72. mWrapperPanel->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this));
  73. if(mPanel)
  74. {
  75. insertPanel(mPanel);
  76. }
  77. if(mHideBtnEnabled)
  78. {
  79. mHideBtn = getChild<LLButton>("hide_btn");
  80. mHideBtn->setClickedCallback(boost::bind(&LLToast::hide,this));
  81. mHideBtn->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this));
  82. mHideBtn->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this));
  83. }
  84. // init callbacks if present
  85. if(!p.on_delete_toast().empty())
  86. mOnDeleteToastSignal.connect(p.on_delete_toast());
  87. if(!p.on_mouse_enter().empty())
  88. mOnMouseEnterSignal.connect(p.on_mouse_enter());
  89. }
  90. //--------------------------------------------------------------------------
  91. BOOL LLToast::postBuild()
  92. {
  93. if(!mCanFade)
  94. {
  95. mTimer.stop();
  96. }
  97. if (mIsTip)
  98. {
  99. mTextEditor = mPanel->getChild<LLTextEditor>("text_editor_box");
  100. if (mTextEditor)
  101. {
  102. mTextEditor->setMouseUpCallback(boost::bind(&LLToast::hide,this));
  103. mPanel->setMouseUpCallback(boost::bind(&LLToast::handleTipToastClick, this, _2, _3, _4));
  104. }
  105. }
  106. return TRUE;
  107. }
  108. //--------------------------------------------------------------------------
  109. void LLToast::handleTipToastClick(S32 x, S32 y, MASK mask)
  110. {
  111. if (!mTextEditor->getRect().pointInRect(x, y))
  112. {
  113. hide();
  114. }
  115. }
  116. //--------------------------------------------------------------------------
  117. void LLToast::setHideButtonEnabled(bool enabled)
  118. {
  119. if(mHideBtn)
  120. mHideBtn->setEnabled(enabled);
  121. }
  122. //--------------------------------------------------------------------------
  123. LLToast::~LLToast()
  124. {
  125. mOnToastDestroyedSignal(this);
  126. }
  127. //--------------------------------------------------------------------------
  128. void LLToast::setAndStartTimer(F32 period)
  129. {
  130. if(mCanFade)
  131. {
  132. mToastLifetime = period;
  133. mTimer.start();
  134. }
  135. }
  136. //--------------------------------------------------------------------------
  137. bool LLToast::lifetimeHasExpired()
  138. {
  139. if (mTimer.getStarted())
  140. {
  141. F32 elapsed_time = mTimer.getElapsedTimeF32();
  142. if ((mToastLifetime - elapsed_time) <= mToastFadingTime) 
  143. {
  144. setBackgroundOpaque(FALSE);
  145. }
  146. if (elapsed_time > mToastLifetime) 
  147. {
  148. return true;
  149. }
  150. }
  151. return false;
  152. }
  153. //--------------------------------------------------------------------------
  154. void LLToast::hide()
  155. {
  156. setVisible(FALSE);
  157. mTimer.stop();
  158. mIsHidden = true;
  159. mOnFadeSignal(this); 
  160. }
  161. void LLToast::onFocusLost()
  162. {
  163. if(mWrapperPanel && !isBackgroundVisible())
  164. {
  165. // Lets make wrapper panel behave like a floater
  166. setBackgroundOpaque(FALSE);
  167. }
  168. }
  169. void LLToast::onFocusReceived()
  170. {
  171. if(mWrapperPanel && !isBackgroundVisible())
  172. {
  173. // Lets make wrapper panel behave like a floater
  174. setBackgroundOpaque(TRUE);
  175. }
  176. }
  177. S32 LLToast::getTopPad()
  178. {
  179. if(mWrapperPanel)
  180. {
  181. return getRect().getHeight() - mWrapperPanel->getRect().getHeight();
  182. }
  183. return 0;
  184. }
  185. S32 LLToast::getRightPad()
  186. {
  187. if(mWrapperPanel)
  188. {
  189. return getRect().getWidth() - mWrapperPanel->getRect().getWidth();
  190. }
  191. return 0;
  192. }
  193. //--------------------------------------------------------------------------
  194. void LLToast::setCanFade(bool can_fade) 
  195. mCanFade = can_fade; 
  196. if(!mCanFade)
  197. mTimer.stop();
  198. }
  199. //--------------------------------------------------------------------------
  200. void LLToast::tick()
  201. {
  202. if(mCanFade)
  203. {
  204. hide();
  205. }
  206. }
  207. //--------------------------------------------------------------------------
  208. void LLToast::reshapeToPanel()
  209. {
  210. LLPanel* panel = getPanel();
  211. if(!panel)
  212. return;
  213. LLRect panel_rect = panel->getRect();
  214. panel_rect.setLeftTopAndSize(0, panel_rect.getHeight(), panel_rect.getWidth(), panel_rect.getHeight());
  215. panel->setShape(panel_rect);
  216. LLRect toast_rect = getRect();
  217. toast_rect.setLeftTopAndSize(toast_rect.mLeft, toast_rect.mTop,
  218. panel_rect.getWidth() + getRightPad(), panel_rect.getHeight() + getTopPad());
  219. setShape(toast_rect);
  220. }
  221. void LLToast::insertPanel(LLPanel* panel)
  222. {
  223. mWrapperPanel->addChild(panel);
  224. reshapeToPanel();
  225. }
  226. //--------------------------------------------------------------------------
  227. void LLToast::draw()
  228. {
  229. if(lifetimeHasExpired())
  230. {
  231. tick();
  232. }
  233. LLFloater::draw();
  234. if(!isBackgroundVisible())
  235. {
  236. // Floater background is invisible, lets make wrapper panel look like a 
  237. // floater - draw shadow.
  238. drawShadow(mWrapperPanel);
  239. // Shadow will probably overlap close button, lets redraw the button
  240. if(mHideBtn)
  241. {
  242. drawChild(mHideBtn);
  243. }
  244. }
  245. }
  246. //--------------------------------------------------------------------------
  247. void LLToast::setVisible(BOOL show)
  248. {
  249. if(mIsHidden)
  250. {
  251. // this toast is invisible after fade until its ScreenChannel will allow it
  252. //
  253. // (EXT-1849) according to this bug a toast can be resurrected from
  254. // invisible state if it faded during a teleportation
  255. // then it fades a second time and causes a crash
  256. return;
  257. }
  258. if(show)
  259. {
  260. setBackgroundOpaque(TRUE);
  261. if(!mTimer.getStarted() && mCanFade)
  262. {
  263. mTimer.start();
  264. }
  265. LLModalDialog::setFrontmost(FALSE);
  266. }
  267. LLFloater::setVisible(show);
  268. if(mPanel)
  269. {
  270. if(!mPanel->isDead())
  271. {
  272. mPanel->setVisible(show);
  273. }
  274. }
  275. }
  276. void LLToast::onToastMouseEnter()
  277. {
  278. LLRect panel_rc = mWrapperPanel->calcScreenRect();
  279. LLRect button_rc;
  280. if(mHideBtn)
  281. {
  282. button_rc = mHideBtn->calcScreenRect();
  283. }
  284. S32 x, y;
  285. LLUI::getMousePositionScreen(&x, &y);
  286. if(panel_rc.pointInRect(x, y) || button_rc.pointInRect(x, y))
  287. {
  288. mOnToastHoverSignal(this, MOUSE_ENTER);
  289. setBackgroundOpaque(TRUE);
  290. //toasts fading is management by Screen Channel
  291. sendChildToFront(mHideBtn);
  292. if(mHideBtn && mHideBtn->getEnabled())
  293. {
  294. mHideBtn->setVisible(TRUE);
  295. }
  296. mOnMouseEnterSignal(this);
  297. mToastMouseEnterSignal(this, getValue());
  298. }
  299. }
  300. void LLToast::onToastMouseLeave()
  301. {
  302. LLRect panel_rc = mWrapperPanel->calcScreenRect();
  303. LLRect button_rc;
  304. if(mHideBtn)
  305. {
  306. button_rc = mHideBtn->calcScreenRect();
  307. }
  308. S32 x, y;
  309. LLUI::getMousePositionScreen(&x, &y);
  310. if( !panel_rc.pointInRect(x, y) && !button_rc.pointInRect(x, y))
  311. {
  312. mOnToastHoverSignal(this, MOUSE_LEAVE);
  313. //toasts fading is management by Screen Channel
  314. if(mHideBtn && mHideBtn->getEnabled())
  315. {
  316. if( mHideBtnPressed )
  317. {
  318. mHideBtnPressed = false;
  319. return;
  320. }
  321. mHideBtn->setVisible(FALSE);
  322. }
  323. mToastMouseLeaveSignal(this, getValue());
  324. }
  325. }
  326. void LLToast::setBackgroundOpaque(BOOL b)
  327. {
  328. if(mWrapperPanel && !isBackgroundVisible())
  329. {
  330. mWrapperPanel->setBackgroundOpaque(b);
  331. }
  332. else
  333. {
  334. LLModalDialog::setBackgroundOpaque(b);
  335. }
  336. }
  337. void LLNotificationsUI::LLToast::stopFading()
  338. {
  339. if(mCanFade)
  340. {
  341. stopTimer();
  342. }
  343. }
  344. void LLNotificationsUI::LLToast::startFading()
  345. {
  346. if(mCanFade)
  347. {
  348. resetTimer();
  349. }
  350. }
  351. bool LLToast::isHovered()
  352. {
  353. S32 x, y;
  354. LLUI::getMousePositionScreen(&x, &y);
  355. return mWrapperPanel->calcScreenRect().pointInRect(x, y);
  356. }
  357. //--------------------------------------------------------------------------
  358. BOOL LLToast::handleMouseDown(S32 x, S32 y, MASK mask)
  359. {
  360. if(mHideBtn && mHideBtn->getEnabled())
  361. {
  362. mHideBtnPressed = mHideBtn->getRect().pointInRect(x, y);
  363. }
  364. return LLFloater::handleMouseDown(x, y, mask);
  365. }
  366. //--------------------------------------------------------------------------
  367. bool LLToast::isNotificationValid()
  368. {
  369. if(mNotification)
  370. {
  371. return !mNotification->isCancelled();
  372. }
  373. return false;
  374. }
  375. //--------------------------------------------------------------------------