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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltoolbar.cpp
  3.  * @author James Cook, Richard Nelson
  4.  * @brief Large friendly buttons at bottom of screen.
  5.  *
  6.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2002-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. #include "llviewerprecompiledheaders.h"
  34. #include "lltoolbar.h"
  35. #include "imageids.h"
  36. #include "llfloaterreg.h"
  37. #include "llfontgl.h"
  38. #include "llflyoutbutton.h"
  39. #include "llrect.h"
  40. #include "llparcel.h"
  41. #include "llagent.h"
  42. #include "llagentwearables.h"
  43. #include "llbutton.h"
  44. #include "llfocusmgr.h"
  45. #include "llviewercontrol.h"
  46. #include "llmenucommands.h"
  47. #include "llimview.h"
  48. #include "lluiconstants.h"
  49. #include "llvoavatarself.h"
  50. #include "lltooldraganddrop.h"
  51. #include "llfloaterinventory.h"
  52. #include "llfloaterchatterbox.h"
  53. #include "llfloatersnapshot.h"
  54. #include "llinventorypanel.h"
  55. #include "lltoolmgr.h"
  56. #include "llui.h"
  57. #include "llviewermenu.h"
  58. //#include "llfirstuse.h"
  59. #include "llpanelblockedlist.h"
  60. #include "llscrolllistctrl.h"
  61. #include "llscrolllistitem.h"
  62. #include "llscrolllistcell.h"
  63. #include "llviewerparcelmgr.h"
  64. #include "lluictrlfactory.h"
  65. #include "llviewerwindow.h"
  66. #include "lltoolgrab.h"
  67. #include "llcombobox.h"
  68. #include "lllayoutstack.h"
  69. #if LL_DARWIN
  70. #include "llresizehandle.h"
  71. #endif // LL_DARWIN
  72. //
  73. // Globals
  74. //
  75. LLToolBar *gToolBar = NULL;
  76. //
  77. // Statics
  78. //
  79. F32 LLToolBar::sInventoryAutoOpenTime = 1.f;
  80. //
  81. // Functions
  82. //
  83. LLToolBar::LLToolBar()
  84. : LLPanel(),
  85. mInventoryAutoOpen(FALSE),
  86. mNumUnreadIMs(0)
  87. #if LL_DARWIN
  88. , mResizeHandle(NULL)
  89. #endif // LL_DARWIN
  90. {
  91. setIsChrome(TRUE);
  92. setFocusRoot(TRUE);
  93. mCommitCallbackRegistrar.add("HandleCommunicate", &LLToolBar::onClickCommunicate);
  94. }
  95. BOOL LLToolBar::postBuild()
  96. {
  97. for (child_list_const_iter_t child_iter = getChildList()->begin();
  98.  child_iter != getChildList()->end(); ++child_iter)
  99. {
  100. LLView *view = *child_iter;
  101. LLButton* buttonp = dynamic_cast<LLButton*>(view);
  102. if(buttonp)
  103. {
  104. buttonp->setSoundFlags(LLView::SILENT);
  105. }
  106. }
  107. #if LL_DARWIN
  108. if(mResizeHandle == NULL)
  109. {
  110. LLRect rect(0, 0, RESIZE_HANDLE_WIDTH, RESIZE_HANDLE_HEIGHT);
  111. LLResizeHandle::Params p;
  112. p.name("");
  113. p.rect(rect);
  114. p.min_width(RESIZE_HANDLE_WIDTH);
  115. p.min_height(RESIZE_HANDLE_HEIGHT);
  116. p.enabled(false);
  117. mResizeHandle = LLUICtrlFactory::create<LLResizeHandle>(p);
  118. addChildInBack(mResizeHandle);
  119. LLLayoutStack* toolbar_stack = getChild<LLLayoutStack>("toolbar_stack");
  120. toolbar_stack->reshape(toolbar_stack->getRect().getWidth() - RESIZE_HANDLE_WIDTH, toolbar_stack->getRect().getHeight());
  121. }
  122. #endif // LL_DARWIN
  123. layoutButtons();
  124. return TRUE;
  125. }
  126. LLToolBar::~LLToolBar()
  127. {
  128. // LLView destructor cleans up children
  129. }
  130. BOOL LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
  131.  EDragAndDropType cargo_type,
  132.  void* cargo_data,
  133.  EAcceptance* accept,
  134.  std::string& tooltip_msg)
  135. {
  136. LLButton* inventory_btn = getChild<LLButton>("inventory_btn");
  137. if (!inventory_btn) return FALSE;
  138. LLRect button_screen_rect;
  139. inventory_btn->localRectToScreen(inventory_btn->getRect(),&button_screen_rect);
  140. const LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
  141. if(active_panel)
  142. {
  143. mInventoryAutoOpen = FALSE;
  144. }
  145. else if (button_screen_rect.pointInRect(x, y))
  146. {
  147. if (mInventoryAutoOpen)
  148. {
  149. if (!active_panel && 
  150. mInventoryAutoOpenTimer.getElapsedTimeF32() > sInventoryAutoOpenTime)
  151. {
  152. LLFloaterInventory::showAgentInventory();
  153. }
  154. }
  155. else
  156. {
  157. mInventoryAutoOpen = TRUE;
  158. mInventoryAutoOpenTimer.reset();
  159. }
  160. }
  161. return LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
  162. }
  163. // static
  164. void LLToolBar::toggle(void*)
  165. {
  166. BOOL show = gSavedSettings.getBOOL("ShowToolBar");                      
  167. gSavedSettings.setBOOL("ShowToolBar", !show);                           
  168. gToolBar->setVisible(!show);
  169. }
  170. // static
  171. BOOL LLToolBar::visible(void*)
  172. {
  173. return gToolBar->getVisible();
  174. }
  175. void LLToolBar::layoutButtons()
  176. {
  177. #if LL_DARWIN
  178. const S32 FUDGE_WIDTH_OF_SCREEN = 4;                                    
  179. S32 width = gViewerWindow->getWindowWidthScaled() + FUDGE_WIDTH_OF_SCREEN;   
  180. S32 pad = 2;
  181. // this function may be called before postBuild(), in which case mResizeHandle won't have been set up yet.
  182. if(mResizeHandle != NULL)
  183. {
  184. if(!gViewerWindow->getWindow()->getFullscreen())
  185. {
  186. // Only when running in windowed mode on the Mac, leave room for a resize widget on the right edge of the bar.
  187. width -= RESIZE_HANDLE_WIDTH;
  188. LLRect r;
  189. r.mLeft = width - pad;
  190. r.mBottom = 0;
  191. r.mRight = r.mLeft + RESIZE_HANDLE_WIDTH;
  192. r.mTop = r.mBottom + RESIZE_HANDLE_HEIGHT;
  193. mResizeHandle->setRect(r);
  194. mResizeHandle->setVisible(TRUE);
  195. }
  196. else
  197. {
  198. mResizeHandle->setVisible(FALSE);
  199. }
  200. }
  201. #endif // LL_DARWIN
  202. }
  203. // virtual
  204. void LLToolBar::reshape(S32 width, S32 height, BOOL called_from_parent)
  205. {
  206. LLPanel::reshape(width, height, called_from_parent);
  207. layoutButtons();
  208. }
  209. // Per-frame updates of visibility
  210. void LLToolBar::refresh()
  211. {
  212. BOOL show = gSavedSettings.getBOOL("ShowToolBar");
  213. BOOL mouselook = gAgent.cameraMouselook();
  214. setVisible(show && !mouselook);
  215. if (isInVisibleChain())
  216. {
  217. updateCommunicateList();
  218. }
  219. }
  220. void LLToolBar::updateCommunicateList()
  221. {
  222. LLFlyoutButton* communicate_button = getChild<LLFlyoutButton>("communicate_btn");
  223. LLSD selected = communicate_button->getValue();
  224. communicate_button->removeall();
  225. //LLFloater* frontmost_floater = LLFloaterChatterBox::getInstance()->getActiveFloater();
  226. LLScrollListItem* itemp = NULL;
  227. LLSD contact_sd;
  228. contact_sd["value"] = "contacts";
  229. /*contact_sd["columns"][0]["value"] = LLFloaterMyFriends::getInstance()->getShortTitle(); 
  230. if (LLFloaterMyFriends::getInstance() == frontmost_floater)
  231. {
  232. contact_sd["columns"][0]["font"]["name"] = "SANSSERIF_SMALL"; 
  233. contact_sd["columns"][0]["font"]["style"] = "BOLD"; 
  234. // make sure current tab is selected in list
  235. if (selected.isUndefined())
  236. {
  237. selected = "contacts";
  238. }
  239. }*/
  240. itemp = communicate_button->addElement(contact_sd, ADD_TOP);
  241. communicate_button->addSeparator(ADD_TOP);
  242. communicate_button->add(getString("Redock Windows"), LLSD("redock"), ADD_TOP);
  243. communicate_button->addSeparator(ADD_TOP);
  244. communicate_button->add(getString("Blocked List"), LLSD("mute list"), ADD_TOP);
  245. std::set<LLHandle<LLFloater> >::const_iterator floater_handle_it;
  246. /*if (gIMMgr->getIMFloaterHandles().size() > 0)
  247. {
  248. communicate_button->addSeparator(ADD_TOP);
  249. }
  250. for(floater_handle_it = gIMMgr->getIMFloaterHandles().begin(); floater_handle_it != gIMMgr->getIMFloaterHandles().end(); ++floater_handle_it)
  251. {
  252. LLFloaterIMPanel* im_floaterp = (LLFloaterIMPanel*)floater_handle_it->get();
  253. if (im_floaterp)
  254. {
  255. std::string floater_title = im_floaterp->getNumUnreadMessages() > 0 ? "*" : "";
  256. floater_title.append(im_floaterp->getShortTitle());
  257. LLSD im_sd;
  258. im_sd["value"] = im_floaterp->getSessionID();
  259. im_sd["columns"][0]["value"] = floater_title;
  260. if (im_floaterp  == frontmost_floater)
  261. {
  262. im_sd["columns"][0]["font"]["name"] = "SANSSERIF_SMALL";
  263. im_sd["columns"][0]["font"]["style"] = "BOLD";
  264. if (selected.isUndefined())
  265. {
  266. selected = im_floaterp->getSessionID();
  267. }
  268. }
  269. itemp = communicate_button->addElement(im_sd, ADD_TOP);
  270. }
  271. }*/
  272. communicate_button->setValue(selected);
  273. }
  274. // static
  275. void LLToolBar::onClickCommunicate(LLUICtrl* ctrl, const LLSD& user_data)
  276. {
  277. LLFlyoutButton* communicate_button = dynamic_cast<LLFlyoutButton*>(ctrl);
  278. llassert_always(communicate_button);
  279. LLSD selected_option = communicate_button->getValue();
  280.     
  281. if (selected_option.asString() == "contacts")
  282. {
  283. LLFloaterReg::showInstance("contacts", "friends");
  284. }
  285. else if (selected_option.asString() == "local chat")
  286. {
  287. LLFloaterReg::showInstance("communicate", "local");
  288. }
  289. else if (selected_option.asString() == "redock")
  290. {
  291. /*LLFloaterChatterBox* chatterbox_instance = LLFloaterChatterBox::getInstance();
  292. if(chatterbox_instance)
  293. {
  294. chatterbox_instance->addFloater(LLFloaterMyFriends::getInstance(), FALSE);
  295. LLUUID session_to_show;
  296. std::set<LLHandle<LLFloater> >::const_iterator floater_handle_it;
  297. for(floater_handle_it = gIMMgr->getIMFloaterHandles().begin(); floater_handle_it != gIMMgr->getIMFloaterHandles().end(); ++floater_handle_it)
  298. {
  299. LLFloater* im_floaterp = floater_handle_it->get();
  300. if (im_floaterp)
  301. {
  302. if (im_floaterp->isFrontmost())
  303. {
  304. session_to_show = ((LLFloaterIMPanel*)im_floaterp)->getSessionID();
  305. }
  306. chatterbox_instance->addFloater(im_floaterp, FALSE);
  307. }
  308. }
  309. LLFloaterReg::showInstance("communicate", session_to_show);
  310. }*/
  311. }
  312. else if (selected_option.asString() == "mute list")
  313. {
  314. LLPanelBlockedList::showPanelAndSelect(LLUUID::null);
  315. }
  316. else if (selected_option.isUndefined()) // user just clicked the communicate button, treat as toggle
  317. {
  318. /*LLFloaterReg::toggleInstance("communicate");*/
  319. }
  320. else // otherwise selection_option is undifined or a specific IM session id
  321. {
  322. /*LLFloaterReg::showInstance("communicate", selected_option);*/
  323. }
  324. }