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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llimfloatercontainer.cpp
  3.  * @brief Multifloater containing active IM sessions in separate tab container tabs
  4.  *
  5.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2009-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 "llimfloatercontainer.h"
  34. #include "llfloaterreg.h"
  35. #include "llimview.h"
  36. #include "llavatariconctrl.h"
  37. #include "llgroupiconctrl.h"
  38. #include "llagent.h"
  39. #include "lltransientfloatermgr.h"
  40. //
  41. // LLIMFloaterContainer
  42. //
  43. LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed)
  44. : LLMultiFloater(seed)
  45. {
  46. mAutoResize = FALSE;
  47. LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, this);
  48. }
  49. LLIMFloaterContainer::~LLIMFloaterContainer()
  50. {
  51. LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this);
  52. }
  53. BOOL LLIMFloaterContainer::postBuild()
  54. {
  55. LLIMModel::instance().mNewMsgSignal.connect(boost::bind(&LLIMFloaterContainer::onNewMessageReceived, this, _1));
  56. // Do not call base postBuild to not connect to mCloseSignal to not close all floaters via Close button
  57. // mTabContainer will be initialized in LLMultiFloater::addChild()
  58. return TRUE;
  59. }
  60. void LLIMFloaterContainer::onOpen(const LLSD& key)
  61. {
  62. LLMultiFloater::onOpen(key);
  63. /*
  64. if (key.isDefined())
  65. {
  66. LLIMFloater* im_floater = LLIMFloater::findInstance(key.asUUID());
  67. if (im_floater)
  68. {
  69. im_floater->openFloater();
  70. }
  71. }
  72. */
  73. }
  74. void LLIMFloaterContainer::addFloater(LLFloater* floaterp, 
  75. BOOL select_added_floater, 
  76. LLTabContainer::eInsertionPoint insertion_point)
  77. {
  78. if(!floaterp) return;
  79. // already here
  80. if (floaterp->getHost() == this)
  81. {
  82. openFloater(floaterp->getKey());
  83. return;
  84. }
  85. LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point);
  86. LLUUID session_id = floaterp->getKey();
  87. LLIconCtrl* icon = 0;
  88. if(gAgent.isInGroup(session_id, TRUE))
  89. {
  90. LLGroupIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLGroupIconCtrl>();
  91. icon_params.group_id = session_id;
  92. icon = LLUICtrlFactory::instance().createWidget<LLGroupIconCtrl>(icon_params);
  93. mSessions[session_id] = floaterp;
  94. floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id));
  95. }
  96. else
  97. {
  98. LLUUID avatar_id = LLIMModel::getInstance()->getOtherParticipantID(session_id);
  99. LLAvatarIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLAvatarIconCtrl>();
  100. icon_params.avatar_id = avatar_id;
  101. icon = LLUICtrlFactory::instance().createWidget<LLAvatarIconCtrl>(icon_params);
  102. mSessions[session_id] = floaterp;
  103. floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id));
  104. }
  105. mTabContainer->setTabImage(floaterp, icon);
  106. }
  107. void LLIMFloaterContainer::onCloseFloater(LLUUID& id)
  108. {
  109. mSessions.erase(id);
  110. }
  111. void LLIMFloaterContainer::onNewMessageReceived(const LLSD& data)
  112. {
  113. LLUUID session_id = data["session_id"].asUUID();
  114. LLFloater* floaterp = get_ptr_in_map(mSessions, session_id);
  115. LLFloater* current_floater = LLMultiFloater::getActiveFloater();
  116. if(floaterp && current_floater && floaterp != current_floater)
  117. {
  118. if(LLMultiFloater::isFloaterFlashing(floaterp))
  119. LLMultiFloater::setFloaterFlashing(floaterp, FALSE);
  120. LLMultiFloater::setFloaterFlashing(floaterp, TRUE);
  121. }
  122. }
  123. LLIMFloaterContainer* LLIMFloaterContainer::findInstance()
  124. {
  125. return LLFloaterReg::findTypedInstance<LLIMFloaterContainer>("im_container");
  126. }
  127. LLIMFloaterContainer* LLIMFloaterContainer::getInstance()
  128. {
  129. return LLFloaterReg::getTypedInstance<LLIMFloaterContainer>("im_container");
  130. }
  131. void LLIMFloaterContainer::setMinimized(BOOL b)
  132. {
  133. if (isMinimized() == b) return;
  134. LLMultiFloater::setMinimized(b);
  135. if (isMinimized()) return;
  136. if (getActiveFloater())
  137. {
  138. getActiveFloater()->setVisible(TRUE);
  139. }
  140. }
  141. // EOF