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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llscreenchannel.h
  3.  * @brief Class implements a channel on a screen in which appropriate toasts may appear.
  4.  *
  5.  * $LicenseInfo:firstyear=2003&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2003-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_LLSCREENCHANNEL_H
  33. #define LL_LLSCREENCHANNEL_H
  34. #include "lltoast.h"
  35. #include <map>
  36. #include <boost/shared_ptr.hpp>
  37. namespace LLNotificationsUI
  38. {
  39. typedef enum e_notification_toast_alignment
  40. {
  41. NA_TOP, 
  42. NA_CENTRE,
  43. NA_BOTTOM,
  44. } EToastAlignment;
  45. typedef enum e_channel_alignment
  46. {
  47. CA_LEFT, 
  48. CA_CENTRE,
  49. CA_RIGHT,
  50. } EChannelAlignment;
  51. class LLScreenChannelBase : public LLUICtrl
  52. {
  53. friend class LLChannelManager;
  54. public:
  55. LLScreenChannelBase(const LLUUID& id);
  56. ~LLScreenChannelBase();
  57. // Channel's outfit-functions
  58. // update channel's size and position in the World View
  59. virtual void updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect);
  60. // initialization of channel's shape and position
  61. virtual void init(S32 channel_left, S32 channel_right);
  62. virtual void setToastAlignment(EToastAlignment align) {mToastAlignment = align;}
  63. virtual void setChannelAlignment(EChannelAlignment align) {mChannelAlignment = align;}
  64. // kill or modify a toast by its ID
  65. virtual void killToastByNotificationID(LLUUID id) {};
  66. virtual void modifyToastNotificationByID(LLUUID id, LLSD data) {};
  67. // hide all toasts from screen, but not remove them from a channel
  68. virtual void hideToastsFromScreen() {};
  69. // removes all toasts from a channel
  70. virtual void removeToastsFromChannel() {};
  71. // show all toasts in a channel
  72. virtual void redrawToasts() {};
  73. virtual void  closeOverflowToastPanel() {};
  74. virtual void  hideOverflowToastPanel() {};
  75. // Channel's behavior-functions
  76. // set whether a channel will control hovering inside itself or not
  77. virtual void setControlHovering(bool control) { mControlHovering = control; }
  78. bool isHovering();
  79. void setCanStoreToasts(bool store) { mCanStoreToasts = store; }
  80. void setDisplayToastsAlways(bool display_toasts) { mDisplayToastsAlways = display_toasts; }
  81. bool getDisplayToastsAlways() { return mDisplayToastsAlways; }
  82. // get number of hidden notifications from a channel
  83. S32  getNumberOfHiddenToasts() { return mHiddenToastsNum;}
  84. void setShowToasts(bool show) { mShowToasts = show; }
  85. bool getShowToasts() { return mShowToasts; }
  86. // get toast allignment preset for a channel
  87. e_notification_toast_alignment getToastAlignment() {return mToastAlignment;}
  88. // get ID of a channel
  89. LLUUID getChannelID() { return mID; }
  90. protected:
  91. // Channel's flags
  92. bool mControlHovering;
  93. LLToast* mHoveredToast;
  94. bool mCanStoreToasts;
  95. bool mDisplayToastsAlways;
  96. // controls whether a channel shows toasts or not
  97. bool mShowToasts;
  98. // 
  99. EToastAlignment mToastAlignment;
  100. EChannelAlignment mChannelAlignment;
  101. S32 mHiddenToastsNum;
  102. // channel's ID
  103. LLUUID mID;
  104. // store a connection to prevent futher crash that is caused by sending a signal to a destroyed channel
  105. boost::signals2::connection mWorldViewRectConnection;
  106. };
  107. /**
  108.  * Screen channel manages toasts visibility and positioning on the screen.
  109.  */
  110. class LLScreenChannel : public LLScreenChannelBase
  111. {
  112. friend class LLChannelManager;
  113. public:
  114. LLScreenChannel(LLUUID& id);
  115. virtual ~LLScreenChannel();
  116. class Matcher
  117. {
  118. public:
  119. Matcher(){}
  120. virtual ~Matcher() {}
  121. virtual bool matches(const LLNotificationPtr) const = 0;
  122. };
  123. std::list<LLToast*> findToasts(const Matcher& matcher);
  124. // Channel's outfit-functions
  125. // update channel's size and position in the World View
  126. void updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect);
  127. // initialization of channel's shape and position
  128. void init(S32 channel_left, S32 channel_right);
  129. // Operating with toasts
  130. // add a toast to a channel
  131. void addToast(const LLToast::Params& p);
  132. // kill or modify a toast by its ID
  133. void killToastByNotificationID(LLUUID id);
  134. void killMatchedToasts(const Matcher& matcher);
  135. void modifyToastByNotificationID(LLUUID id, LLPanel* panel);
  136. // hide all toasts from screen, but not remove them from a channel
  137. void hideToastsFromScreen();
  138. // hide toast by notification id
  139. void hideToast(const LLUUID& notification_id);
  140. // removes all toasts from a channel
  141. void removeToastsFromChannel();
  142. // show all toasts in a channel
  143. void redrawToasts();
  144. //
  145. void loadStoredToastsToChannel();
  146. // finds a toast among stored by its Notification ID and throws it on a screen to a channel
  147. void loadStoredToastByNotificationIDToChannel(LLUUID id);
  148. // removes a toast from stored finding it by its Notification ID 
  149. void removeStoredToastByNotificationID(LLUUID id);
  150. // removes from channel all toasts that belongs to the certain IM session 
  151. void removeToastsBySessionID(LLUUID id);
  152. // remove all storable toasts from screen and store them
  153. void removeAndStoreAllStorableToasts();
  154. // close the StartUp Toast
  155. void closeStartUpToast();
  156. /** Stop fading all toasts */
  157. virtual void stopFadingToasts();
  158. /** Start fading all toasts */
  159. virtual void startFadingToasts();
  160. // get StartUp Toast's state
  161. static bool getStartUpToastShown() { return mWasStartUpToastShown; }
  162. // tell all channels that the StartUp toast was shown and allow them showing of toasts
  163. static void setStartUpToastShown() { mWasStartUpToastShown = true; }
  164. // let a channel update its ShowToast flag
  165. void updateShowToastsState();
  166. // Channel's other interface functions functions
  167. // update number of notifications in the StartUp Toast
  168. void updateStartUpString(S32 num);
  169. LLToast* getToastByNotificationID(LLUUID id);
  170. // Channel's signals
  171. // signal on storing of faded toasts event
  172. typedef boost::function<void (LLPanel* info_panel, const LLUUID id)> store_tost_callback_t;
  173. typedef boost::signals2::signal<void (LLPanel* info_panel, const LLUUID id)> store_tost_signal_t;
  174. store_tost_signal_t mOnStoreToast;
  175. boost::signals2::connection setOnStoreToastCallback(store_tost_callback_t cb) { return mOnStoreToast.connect(cb); }
  176. // signal on rejecting of a toast event
  177. typedef boost::function<void (LLUUID id)> reject_tost_callback_t;
  178. typedef boost::signals2::signal<void (LLUUID id)> reject_tost_signal_t;
  179. reject_tost_signal_t mRejectToastSignal; boost::signals2::connection setOnRejectToastCallback(reject_tost_callback_t cb) { return mRejectToastSignal.connect(cb); }
  180. private:
  181. struct ToastElem
  182. {
  183. LLUUID id;
  184. LLToast* toast;
  185. ToastElem(LLToast::Params p) : id(p.notif_id)
  186. {
  187. toast = new LLToast(p);
  188. }
  189. ToastElem(const ToastElem& toast_elem)
  190. {
  191. id = toast_elem.id;
  192. toast = toast_elem.toast;
  193. }
  194. bool operator == (const LLUUID &id_op) const
  195. {
  196. return (id == id_op);
  197. }
  198. bool operator == (LLPanel* panel_op) const
  199. {
  200. return (toast == panel_op);
  201. }
  202. };
  203. // Channel's handlers
  204. void onToastHover(LLToast* toast, bool mouse_enter);
  205. void onToastFade(LLToast* toast);
  206. void onToastDestroyed(LLToast* toast);
  207. void onStartUpToastHide();
  208. //
  209. void storeToast(ToastElem& toast_elem);
  210. // send signal to observers about destroying of a toast, update channel's Hovering state, close the toast
  211. void deleteToast(LLToast* toast);
  212. // show-functions depending on allignment of toasts
  213. void showToastsBottom();
  214. void showToastsCentre();
  215. void showToastsTop();
  216. // create the StartUp Toast
  217. void createStartUpToast(S32 notif_num, F32 timer);
  218. /**
  219.  * Notification channel and World View ratio(0.0 - always show 1 notification, 1.0 - max ratio).
  220.  */
  221. static F32 getHeightRatio();
  222. // Channel's flags
  223. static bool mWasStartUpToastShown;
  224. // attributes for the StartUp Toast
  225. LLToast* mStartUpToastPanel;
  226. std::vector<ToastElem> mToastList;
  227. std::vector<ToastElem> mStoredToastList;
  228. };
  229. }
  230. #endif