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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llnavigationbar.cpp
  3.  * @brief Navigation bar implementation
  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 "llnavigationbar.h"
  34. #include "v2math.h"
  35. #include "llregionhandle.h"
  36. #include "llfloaterreg.h"
  37. #include "llfocusmgr.h"
  38. #include "lliconctrl.h"
  39. #include "llmenugl.h"
  40. #include "llagent.h"
  41. #include "llviewerregion.h"
  42. #include "lllandmarkactions.h"
  43. #include "lllocationhistory.h"
  44. #include "lllocationinputctrl.h"
  45. #include "llteleporthistory.h"
  46. #include "llsearchcombobox.h"
  47. #include "llsidetray.h"
  48. #include "llslurl.h"
  49. #include "llurlsimstring.h"
  50. #include "llurlregistry.h"
  51. #include "llurldispatcher.h"
  52. #include "llviewerinventory.h"
  53. #include "llviewermenu.h"
  54. #include "llviewerparcelmgr.h"
  55. #include "llworldmapmessage.h"
  56. #include "llappviewer.h"
  57. #include "llviewercontrol.h"
  58. #include "llfloatermediabrowser.h"
  59. #include "llweb.h"
  60. #include "llinventorymodel.h"
  61. #include "lllandmarkactions.h"
  62. #include "llfavoritesbar.h"
  63. #include "llagentui.h"
  64. #include <boost/regex.hpp>
  65. //-- LLTeleportHistoryMenuItem -----------------------------------------------
  66. /**
  67.  * Item look varies depending on the type (backward/current/forward). 
  68.  */
  69. class LLTeleportHistoryMenuItem : public LLMenuItemCallGL
  70. {
  71. public:
  72. typedef enum e_item_type
  73. {
  74. TYPE_BACKWARD,
  75. TYPE_CURRENT,
  76. TYPE_FORWARD,
  77. } EType;
  78. struct Params : public LLInitParam::Block<Params, LLMenuItemCallGL::Params>
  79. {
  80. Mandatory<EType> item_type;
  81. Optional<const LLFontGL*> back_item_font,
  82. current_item_font,
  83. forward_item_font;
  84. Optional<std::string> back_item_image,
  85. forward_item_image;
  86. Optional<S32> image_hpad,
  87. image_vpad;
  88. Params()
  89. : item_type(),
  90. back_item_font("back_item_font"),
  91. current_item_font("current_item_font"),
  92. forward_item_font("forward_item_font"),
  93. back_item_image("back_item_image"),
  94. forward_item_image("forward_item_image"),
  95. image_hpad("image_hpad"),
  96. image_vpad("image_vpad")
  97. {}
  98. };
  99. /*virtual*/ void draw();
  100. /*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
  101. /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
  102. private:
  103. LLTeleportHistoryMenuItem(const Params&);
  104. friend class LLUICtrlFactory;
  105. static const S32 ICON_WIDTH = 16;
  106. static const S32 ICON_HEIGHT = 16;
  107. LLIconCtrl* mArrowIcon;
  108. };
  109. static LLDefaultChildRegistry::Register<LLTeleportHistoryMenuItem> r("teleport_history_menu_item");
  110. LLTeleportHistoryMenuItem::LLTeleportHistoryMenuItem(const Params& p)
  111. : LLMenuItemCallGL(p),
  112. mArrowIcon(NULL)
  113. {
  114. // Set appearance depending on the item type.
  115. if (p.item_type == TYPE_BACKWARD)
  116. {
  117. setFont( p.back_item_font );
  118. }
  119. else if (p.item_type == TYPE_CURRENT)
  120. {
  121. setFont( p.current_item_font );
  122. }
  123. else
  124. {
  125. setFont( p.forward_item_font );
  126. }
  127. LLIconCtrl::Params icon_params;
  128. icon_params.name("icon");
  129. LLRect rect(0, ICON_HEIGHT, ICON_WIDTH, 0);
  130. rect.translate( p.image_hpad, p.image_vpad );
  131. icon_params.rect( rect );
  132. icon_params.mouse_opaque(false);
  133. icon_params.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
  134. icon_params.visible(false);
  135. mArrowIcon = LLUICtrlFactory::create<LLIconCtrl> (icon_params);
  136. // no image for the current item
  137. if (p.item_type == TYPE_BACKWARD)
  138. mArrowIcon->setValue( p.back_item_image() );
  139. else if (p.item_type == TYPE_FORWARD)
  140. mArrowIcon->setValue( p.forward_item_image() );
  141. addChild(mArrowIcon);
  142. }
  143. void LLTeleportHistoryMenuItem::draw()
  144. {
  145. // Draw menu item itself.
  146. LLMenuItemCallGL::draw();
  147. // Draw children if any. *TODO: move this to LLMenuItemGL?
  148. LLUICtrl::draw();
  149. }
  150. void LLTeleportHistoryMenuItem::onMouseEnter(S32 x, S32 y, MASK mask)
  151. {
  152. mArrowIcon->setVisible(TRUE);
  153. }
  154. void LLTeleportHistoryMenuItem::onMouseLeave(S32 x, S32 y, MASK mask)
  155. {
  156. mArrowIcon->setVisible(FALSE);
  157. }
  158. static LLDefaultChildRegistry::Register<LLPullButton> menu_button("pull_button");
  159. LLPullButton::LLPullButton(const LLPullButton::Params& params) :
  160. LLButton(params)
  161. {
  162. setDirectionFromName(params.direction);
  163. }
  164. boost::signals2::connection LLPullButton::setClickDraggingCallback(const commit_signal_t::slot_type& cb)
  165. {
  166. return mClickDraggingSignal.connect(cb);
  167. }
  168. /*virtual*/
  169. void LLPullButton::onMouseLeave(S32 x, S32 y, MASK mask)
  170. {
  171. LLButton::onMouseLeave(x, y, mask);
  172. if (mMouseDownTimer.getStarted()) //an user have done a mouse down, if the timer started. see LLButton::handleMouseDown for details
  173. {
  174. const LLVector2 cursor_direction = LLVector2(F32(x), F32(y)) - mLastMouseDown;
  175. /* For now cursor_direction points to the direction of mouse movement
  176.  * Need to decide whether should we fire a signal. 
  177.  * We fire if angle between mDraggingDirection and cursor_direction is less that 45 degree
  178.  * Note:
  179.  * 0.5 * F_PI_BY_TWO equals to PI/4 radian that equals to angle of 45 degrees
  180.  */
  181. if (angle_between(mDraggingDirection, cursor_direction) < 0.5 * F_PI_BY_TWO)//call if angle < pi/4 
  182. {
  183. mClickDraggingSignal(this, LLSD());
  184. }
  185. }
  186. }
  187. /*virtual*/
  188. BOOL LLPullButton::handleMouseDown(S32 x, S32 y, MASK mask)
  189. {
  190. BOOL handled = LLButton::handleMouseDown(x, y, mask);
  191. if (handled)
  192. {
  193. //if mouse down was handled by button, 
  194. //capture mouse position to calculate the direction of  mouse move  after mouseLeave event 
  195. mLastMouseDown.set(F32(x), F32(y));
  196. }
  197. return handled;
  198. }
  199. /*virtual*/
  200. BOOL LLPullButton::handleMouseUp(S32 x, S32 y, MASK mask)
  201. {
  202. // reset data to get ready for next circle 
  203. mLastMouseDown.clear();
  204. return LLButton::handleMouseUp(x, y, mask);
  205. }
  206. /**
  207.  * this function is setting up dragging direction vector. 
  208.  * Last one is just unit vector. It points to direction of mouse drag that we need to handle   
  209.  */
  210. void LLPullButton::setDirectionFromName(const std::string& name)
  211. {
  212. if (name == "left")
  213. {
  214. mDraggingDirection.set(F32(-1), F32(0));
  215. }
  216. else if (name == "right")
  217. {
  218. mDraggingDirection.set(F32(0), F32(1));
  219. }
  220. else if (name == "down")
  221. {
  222. mDraggingDirection.set(F32(0), F32(-1));
  223. }
  224. else if (name == "up")
  225. {
  226. mDraggingDirection.set(F32(0), F32(1));
  227. }
  228. }
  229. //-- LNavigationBar ----------------------------------------------------------
  230. /*
  231. TODO:
  232. - Load navbar height from saved settings (as it's done for status bar) or think of a better way.
  233. */
  234. LLNavigationBar::LLNavigationBar()
  235. : mTeleportHistoryMenu(NULL),
  236. mBtnBack(NULL),
  237. mBtnForward(NULL),
  238. mBtnHome(NULL),
  239. mCmbLocation(NULL),
  240. mSearchComboBox(NULL),
  241. mPurgeTPHistoryItems(false),
  242. mSaveToLocationHistory(false)
  243. {
  244. LLUICtrlFactory::getInstance()->buildPanel(this, "panel_navigation_bar.xml");
  245. // set a listener function for LoginComplete event
  246. LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLNavigationBar::handleLoginComplete, this));
  247. // Necessary for focus movement among child controls
  248. setFocusRoot(TRUE);
  249. }
  250. LLNavigationBar::~LLNavigationBar()
  251. {
  252. mTeleportFinishConnection.disconnect();
  253. mTeleportFailedConnection.disconnect();
  254. }
  255. BOOL LLNavigationBar::postBuild()
  256. {
  257. mBtnBack = getChild<LLPullButton>("back_btn");
  258. mBtnForward = getChild<LLPullButton>("forward_btn");
  259. mBtnHome = getChild<LLButton>("home_btn");
  260. mCmbLocation= getChild<LLLocationInputCtrl>("location_combo"); 
  261. mSearchComboBox = getChild<LLSearchComboBox>("search_combo_box");
  262. fillSearchComboBox();
  263. mBtnBack->setEnabled(FALSE);
  264. mBtnBack->setClickedCallback(boost::bind(&LLNavigationBar::onBackButtonClicked, this));
  265. mBtnBack->setHeldDownCallback(boost::bind(&LLNavigationBar::onBackOrForwardButtonHeldDown, this,_1, _2));
  266. mBtnBack->setClickDraggingCallback(boost::bind(&LLNavigationBar::showTeleportHistoryMenu, this,_1));
  267. mBtnForward->setEnabled(FALSE);
  268. mBtnForward->setClickedCallback(boost::bind(&LLNavigationBar::onForwardButtonClicked, this));
  269. mBtnForward->setHeldDownCallback(boost::bind(&LLNavigationBar::onBackOrForwardButtonHeldDown, this, _1, _2));
  270. mBtnForward->setClickDraggingCallback(boost::bind(&LLNavigationBar::showTeleportHistoryMenu, this,_1));
  271. mBtnHome->setClickedCallback(boost::bind(&LLNavigationBar::onHomeButtonClicked, this));
  272. mCmbLocation->setCommitCallback(boost::bind(&LLNavigationBar::onLocationSelection, this));
  273. mSearchComboBox->setCommitCallback(boost::bind(&LLNavigationBar::onSearchCommit, this));
  274. mTeleportFinishConnection = LLViewerParcelMgr::getInstance()->
  275. setTeleportFinishedCallback(boost::bind(&LLNavigationBar::onTeleportFinished, this, _1));
  276. mTeleportFailedConnection = LLViewerParcelMgr::getInstance()->
  277. setTeleportFailedCallback(boost::bind(&LLNavigationBar::onTeleportFailed, this));
  278. mDefaultNbRect = getRect();
  279. mDefaultFpRect = getChild<LLFavoritesBarCtrl>("favorite")->getRect();
  280. // we'll be notified on teleport history changes
  281. LLTeleportHistory::getInstance()->setHistoryChangedCallback(
  282. boost::bind(&LLNavigationBar::onTeleportHistoryChanged, this));
  283. return TRUE;
  284. }
  285. void LLNavigationBar::setVisible(BOOL visible)
  286. {
  287. // change visibility of grandparent layout_panel to animate in and out
  288. if (getParent()) 
  289. {
  290. //to avoid some mysterious bugs like EXT-3352, at least try to log an incorrect parent to ping  about a problem. 
  291. if(getParent()->getName() != "nav_bar_container")
  292. {
  293. LL_WARNS("LLNavigationBar")<<"NavigationBar has an unknown name of the parent: "<<getParent()->getName()<< LL_ENDL;
  294. }
  295. getParent()->setVisible(visible);
  296. }
  297. }
  298. void LLNavigationBar::fillSearchComboBox()
  299. {
  300. if(!mSearchComboBox)
  301. {
  302. return;
  303. }
  304. LLSearchHistory::getInstance()->load();
  305. LLSearchHistory::search_history_list_t search_list = 
  306. LLSearchHistory::getInstance()->getSearchHistoryList();
  307. LLSearchHistory::search_history_list_t::const_iterator it = search_list.begin();
  308. for( ; search_list.end() != it; ++it)
  309. {
  310. LLSearchHistory::LLSearchHistoryItem item = *it;
  311. mSearchComboBox->add(item.search_query);
  312. }
  313. }
  314. void LLNavigationBar::draw()
  315. {
  316. if(mPurgeTPHistoryItems)
  317. {
  318. LLTeleportHistory::getInstance()->purgeItems();
  319. onTeleportHistoryChanged();
  320. mPurgeTPHistoryItems = false;
  321. }
  322. if (isBackgroundVisible())
  323. {
  324. static LLUICachedControl<S32> drop_shadow_floater ("DropShadowFloater", 0);
  325. static LLUIColor color_drop_shadow = LLUIColorTable::instance().getColor("ColorDropShadow");
  326. gl_drop_shadow(0, getRect().getHeight(), getRect().getWidth(), 0,
  327.                            color_drop_shadow, drop_shadow_floater );
  328. }
  329. LLPanel::draw();
  330. }
  331. BOOL LLNavigationBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
  332. {
  333. BOOL handled = childrenHandleRightMouseDown( x, y, mask) != NULL;
  334. if(!handled && !gMenuHolder->hasVisibleMenu())
  335. {
  336. show_navbar_context_menu(this,x,y);
  337. handled = true;
  338. }
  339. return handled;
  340. }
  341. void LLNavigationBar::onBackButtonClicked()
  342. {
  343. LLTeleportHistory::getInstance()->goBack();
  344. }
  345. void LLNavigationBar::onBackOrForwardButtonHeldDown(LLUICtrl* ctrl, const LLSD& param)
  346. {
  347. if (param["count"].asInteger() == 0)
  348. showTeleportHistoryMenu(ctrl);
  349. }
  350. void LLNavigationBar::onForwardButtonClicked()
  351. {
  352. LLTeleportHistory::getInstance()->goForward();
  353. }
  354. void LLNavigationBar::onHomeButtonClicked()
  355. {
  356. gAgent.teleportHome();
  357. }
  358. void LLNavigationBar::onSearchCommit()
  359. {
  360. std::string search_query = mSearchComboBox->getSimple();
  361. if(!search_query.empty())
  362. {
  363. LLSearchHistory::getInstance()->addEntry(search_query);
  364. }
  365. invokeSearch(search_query);
  366. }
  367. void LLNavigationBar::onTeleportHistoryMenuItemClicked(const LLSD& userdata)
  368. {
  369. int idx = userdata.asInteger();
  370. LLTeleportHistory::getInstance()->goToItem(idx);
  371. }
  372. // This is called when user presses enter in the location input
  373. // or selects a location from the typed locations dropdown.
  374. void LLNavigationBar::onLocationSelection()
  375. {
  376. std::string typed_location = mCmbLocation->getSimple();
  377. LLStringUtil::trim(typed_location);
  378. // Will not teleport to empty location.
  379. if (typed_location.empty())
  380. return;
  381. LLSD value = mCmbLocation->getSelectedValue();
  382. if(value.has("item_type"))
  383. {
  384. switch(value["item_type"].asInteger())
  385. {
  386. case LANDMARK:
  387. if(value.has("AssetUUID"))
  388. {
  389. gAgent.teleportViaLandmark( LLUUID(value["AssetUUID"].asString()));
  390. return;
  391. }
  392. else
  393. {
  394. LLInventoryModel::item_array_t landmark_items =
  395. LLLandmarkActions::fetchLandmarksByName(typed_location,
  396. FALSE);
  397. if (!landmark_items.empty())
  398. {
  399. gAgent.teleportViaLandmark( landmark_items[0]->getAssetUUID());
  400. return; 
  401. }
  402. }
  403. break;
  404. case TELEPORT_HISTORY:
  405. //in case of teleport item was selected, teleport by position too.
  406. case TYPED_REGION_SURL:
  407. if(value.has("global_pos"))
  408. {
  409. gAgent.teleportViaLocation(LLVector3d(value["global_pos"]));
  410. return;
  411. }
  412. break;
  413. default:
  414. break;
  415. }
  416. }
  417. //Let's parse surl or region name
  418. std::string region_name;
  419. LLVector3 local_coords(128, 128, 0);
  420. S32 x = 0, y = 0, z = 0;
  421. // Is the typed location a SLURL?
  422. if (LLSLURL::isSLURL(typed_location))
  423. {
  424. // Yes. Extract region name and local coordinates from it.
  425. if (LLURLSimString::parse(LLSLURL::stripProtocol(typed_location), &region_name, &x, &y, &z))
  426. local_coords.set(x, y, z);
  427. else
  428. return;
  429. }else
  430. {
  431. // assume that an user has typed the {region name} or possible {region_name, parcel}
  432. region_name  = typed_location.substr(0,typed_location.find(','));
  433. }
  434. // Resolve the region name to its global coordinates.
  435. // If resolution succeeds we'll teleport.
  436. LLWorldMapMessage::url_callback_t cb = boost::bind(
  437. &LLNavigationBar::onRegionNameResponse, this,
  438. typed_location, region_name, local_coords, _1, _2, _3, _4);
  439. mSaveToLocationHistory = true;
  440. LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name, cb, std::string("unused"), false);
  441. }
  442. void LLNavigationBar::onTeleportFailed()
  443. {
  444. mSaveToLocationHistory = false;
  445. }
  446. void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos)
  447. {
  448. if (!mSaveToLocationHistory)
  449. return;
  450. LLLocationHistory* lh = LLLocationHistory::getInstance();
  451. //TODO*: do we need convert surl into readable format?
  452. std::string location;
  453. /*NOTE:
  454.  * We can't use gAgent.getPositionAgent() in case of local teleport to build location.
  455.  * At this moment gAgent.getPositionAgent() contains previous coordinates.
  456.  * according to EXT-65 agent position is being reseted on each frame.  
  457.  */
  458. LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_NO_MATURITY,
  459. gAgent.getPosAgentFromGlobal(global_agent_pos));
  460. std::string tooltip (LLSLURL::buildSLURLfromPosGlobal(gAgent.getRegion()->getName(), global_agent_pos, false));
  461. LLLocationHistoryItem item (location,
  462. global_agent_pos, tooltip,TYPED_REGION_SURL);// we can add into history only TYPED location
  463. //Touch it, if it is at list already, add new location otherwise
  464. if ( !lh->touchItem(item) ) {
  465. lh->addItem(item);
  466. }
  467. lh->save();
  468. mSaveToLocationHistory = false;
  469. }
  470. void LLNavigationBar::onTeleportHistoryChanged()
  471. {
  472. // Update navigation controls.
  473. LLTeleportHistory* h = LLTeleportHistory::getInstance();
  474. int cur_item = h->getCurrentItemIndex();
  475. mBtnBack->setEnabled(cur_item > 0);
  476. mBtnForward->setEnabled(cur_item < ((int)h->getItems().size() - 1));
  477. }
  478. void LLNavigationBar::rebuildTeleportHistoryMenu()
  479. {
  480. // Has the pop-up menu been built?
  481. if (mTeleportHistoryMenu)
  482. {
  483. // Clear it.
  484. mTeleportHistoryMenu->empty();
  485. }
  486. else
  487. {
  488. // Create it.
  489. LLMenuGL::Params menu_p;
  490. menu_p.name("popup");
  491. menu_p.can_tear_off(false);
  492. menu_p.visible(false);
  493. menu_p.bg_visible(true);
  494. menu_p.scrollable(true);
  495. mTeleportHistoryMenu = LLUICtrlFactory::create<LLMenuGL>(menu_p);
  496. addChild(mTeleportHistoryMenu);
  497. }
  498. // Populate the menu with teleport history items.
  499. LLTeleportHistory* hist = LLTeleportHistory::getInstance();
  500. const LLTeleportHistory::slurl_list_t& hist_items = hist->getItems();
  501. int cur_item = hist->getCurrentItemIndex();
  502. // Items will be shown in the reverse order, just like in Firefox.
  503. for (int i = (int)hist_items.size()-1; i >= 0; i--)
  504. {
  505. LLTeleportHistoryMenuItem::EType type;
  506. if (i < cur_item)
  507. type = LLTeleportHistoryMenuItem::TYPE_BACKWARD;
  508. else if (i > cur_item)
  509. type = LLTeleportHistoryMenuItem::TYPE_FORWARD;
  510. else
  511. type = LLTeleportHistoryMenuItem::TYPE_CURRENT;
  512. LLTeleportHistoryMenuItem::Params item_params;
  513. item_params.label = item_params.name = hist_items[i].mTitle;
  514. item_params.item_type = type;
  515. item_params.on_click.function(boost::bind(&LLNavigationBar::onTeleportHistoryMenuItemClicked, this, i));
  516. LLTeleportHistoryMenuItem* new_itemp = LLUICtrlFactory::create<LLTeleportHistoryMenuItem>(item_params);
  517. //new_itemp->setFont()
  518. mTeleportHistoryMenu->addChild(new_itemp);
  519. }
  520. }
  521. void LLNavigationBar::onRegionNameResponse(
  522. std::string typed_location,
  523. std::string region_name,
  524. LLVector3 local_coords,
  525. U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)
  526. {
  527. // Invalid location?
  528. if (!region_handle)
  529. {
  530. // handle any secondlife:// SLapps, or
  531. // display http:// URLs in the media browser, or
  532. // anything else is sent to the search floater
  533. if (LLUrlRegistry::instance().isUrl(typed_location))
  534. {
  535. if (! LLURLDispatcher::dispatchFromTextEditor(typed_location))
  536. {
  537. LLWeb::loadURL(typed_location);
  538. }
  539. }
  540. else
  541. {
  542. invokeSearch(typed_location);
  543. }
  544. return;
  545. }
  546. // Teleport to the location.
  547. LLVector3d region_pos = from_region_handle(region_handle);
  548. LLVector3d global_pos = region_pos + (LLVector3d) local_coords;
  549. llinfos << "Teleporting to: " << LLSLURL::buildSLURLfromPosGlobal(region_name, global_pos, false)  << llendl;
  550. gAgent.teleportViaLocation(global_pos);
  551. }
  552. void LLNavigationBar::showTeleportHistoryMenu(LLUICtrl* btn_ctrl)
  553. {
  554. // Don't show the popup if teleport history is empty.
  555. if (LLTeleportHistory::getInstance()->isEmpty())
  556. {
  557. lldebugs << "Teleport history is empty, will not show the menu." << llendl;
  558. return;
  559. }
  560. rebuildTeleportHistoryMenu();
  561. if (mTeleportHistoryMenu == NULL)
  562. return;
  563. mTeleportHistoryMenu->updateParent(LLMenuGL::sMenuContainer);
  564. const S32 MENU_SPAWN_PAD = -1;
  565. LLMenuGL::showPopup(btn_ctrl, mTeleportHistoryMenu, 0, MENU_SPAWN_PAD);
  566. LLButton* nav_button = dynamic_cast<LLButton*>(btn_ctrl);
  567. if(nav_button)
  568. {
  569. if(mHistoryMenuConnection.connected())
  570. {
  571. LL_WARNS("Navgationbar")<<"mHistoryMenuConnection should be disconnected at this moment."<<LL_ENDL;
  572. mHistoryMenuConnection.disconnect();
  573. }
  574. mHistoryMenuConnection = gMenuHolder->setMouseUpCallback(boost::bind(&LLNavigationBar::onNavigationButtonHeldUp, this, nav_button));
  575. // pressed state will be update after mouseUp in  onBackOrForwardButtonHeldUp();
  576. nav_button->setForcePressedState(true);
  577. }
  578. // *HACK pass the mouse capturing to the drop-down menu
  579. // it need to let menu handle mouseup event
  580. gFocusMgr.setMouseCapture(gMenuHolder);
  581. }
  582. /**
  583.  * Taking into account the HACK above,  this callback-function is responsible for correct handling of mouseUp event in case of holding-down the navigation buttons..
  584.  * We need to process this case separately to update a pressed state of navigation button.
  585.  */
  586. void LLNavigationBar::onNavigationButtonHeldUp(LLButton* nav_button)
  587. {
  588. if(nav_button)
  589. {
  590. nav_button->setForcePressedState(false);
  591. }
  592. if(gFocusMgr.getMouseCapture() == gMenuHolder)
  593. {
  594. // we had passed mouseCapture in  showTeleportHistoryMenu()
  595. // now we MUST release mouseCapture to continue a proper mouseevent workflow. 
  596. gFocusMgr.setMouseCapture(NULL);
  597. }
  598. //gMenuHolder is using to display bunch of menus. Disconnect signal to avoid unnecessary calls.    
  599. mHistoryMenuConnection.disconnect();
  600. }
  601. void LLNavigationBar::handleLoginComplete()
  602. {
  603. mCmbLocation->handleLoginComplete();
  604. }
  605. void LLNavigationBar::invokeSearch(std::string search_text)
  606. {
  607. LLFloaterReg::showInstance("search", LLSD().with("category", "all").with("id", LLSD(search_text)));
  608. }
  609. void LLNavigationBar::clearHistoryCache()
  610. {
  611. mCmbLocation->removeall();
  612. LLLocationHistory* lh = LLLocationHistory::getInstance();
  613. lh->removeItems();
  614. lh->save();
  615. mPurgeTPHistoryItems= true;
  616. }
  617. int LLNavigationBar::getDefNavBarHeight()
  618. {
  619. return mDefaultNbRect.getHeight();
  620. }
  621. int LLNavigationBar::getDefFavBarHeight()
  622. {
  623. return mDefaultFpRect.getHeight();
  624. }
  625. void LLNavigationBar::showNavigationPanel(BOOL visible)
  626. {
  627. bool fpVisible = gSavedSettings.getBOOL("ShowNavbarFavoritesPanel");
  628. LLFavoritesBarCtrl* fb = getChild<LLFavoritesBarCtrl>("favorite");
  629. LLPanel* navPanel = getChild<LLPanel>("navigation_panel");
  630. LLRect nbRect(getRect());
  631. LLRect fbRect(fb->getRect());
  632. navPanel->setVisible(visible);
  633. if (visible)
  634. {
  635. if (fpVisible)
  636. {
  637. // Navigation Panel must be shown. Favorites Panel is visible.
  638. nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), mDefaultNbRect.getHeight());
  639. fbRect.setLeftTopAndSize(fbRect.mLeft, mDefaultFpRect.mTop, fbRect.getWidth(), fbRect.getHeight());
  640. // this is duplicated in 'else' section because it should be called BEFORE fb->reshape
  641. reshape(nbRect.getWidth(), nbRect.getHeight());
  642. setRect(nbRect);
  643. // propagate size to parent container
  644. getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
  645. fb->reshape(fbRect.getWidth(), fbRect.getHeight());
  646. fb->setRect(fbRect);
  647. }
  648. else
  649. {
  650. // Navigation Panel must be shown. Favorites Panel is hidden.
  651. S32 height = mDefaultNbRect.getHeight() - mDefaultFpRect.getHeight();
  652. nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), height);
  653. reshape(nbRect.getWidth(), nbRect.getHeight());
  654. setRect(nbRect);
  655. getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
  656. }
  657. }
  658. else
  659. {
  660. if (fpVisible)
  661. {
  662. // Navigation Panel must be hidden. Favorites Panel is visible.
  663. nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), fbRect.getHeight());
  664. fbRect.setLeftTopAndSize(fbRect.mLeft, fbRect.getHeight(), fbRect.getWidth(), fbRect.getHeight());
  665. // this is duplicated in 'else' section because it should be called BEFORE fb->reshape
  666. reshape(nbRect.getWidth(), nbRect.getHeight());
  667. setRect(nbRect);
  668. getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
  669. fb->reshape(fbRect.getWidth(), fbRect.getHeight());
  670. fb->setRect(fbRect);
  671. }
  672. else
  673. {
  674. // Navigation Panel must be hidden. Favorites Panel is hidden.
  675. nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), 0);
  676. reshape(nbRect.getWidth(), nbRect.getHeight());
  677. setRect(nbRect);
  678. getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
  679. }
  680. }
  681. childSetVisible("bg_icon", fpVisible);
  682. childSetVisible("bg_icon_no_fav", !fpVisible);
  683. }
  684. void LLNavigationBar::showFavoritesPanel(BOOL visible)
  685. {
  686. bool npVisible = gSavedSettings.getBOOL("ShowNavbarNavigationPanel");
  687. LLFavoritesBarCtrl* fb = getChild<LLFavoritesBarCtrl>("favorite");
  688. LLRect nbRect(getRect());
  689. LLRect fbRect(fb->getRect());
  690. if (visible)
  691. {
  692. if (npVisible)
  693. {
  694. // Favorites Panel must be shown. Navigation Panel is visible.
  695. S32 fbHeight = fbRect.getHeight();
  696. S32 newHeight = nbRect.getHeight() + fbHeight;
  697. nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), newHeight);
  698. fbRect.setLeftTopAndSize(mDefaultFpRect.mLeft, mDefaultFpRect.mTop, fbRect.getWidth(), fbRect.getHeight());
  699. }
  700. else
  701. {
  702. // Favorites Panel must be shown. Navigation Panel is hidden.
  703. S32 fpHeight = mDefaultFpRect.getHeight();
  704. nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), fpHeight);
  705. fbRect.setLeftTopAndSize(fbRect.mLeft, fpHeight, fbRect.getWidth(), fpHeight);
  706. }
  707. reshape(nbRect.getWidth(), nbRect.getHeight());
  708. setRect(nbRect);
  709. getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
  710. fb->reshape(fbRect.getWidth(), fbRect.getHeight());
  711. fb->setRect(fbRect);
  712. }
  713. else
  714. {
  715. if (npVisible)
  716. {
  717. // Favorites Panel must be hidden. Navigation Panel is visible.
  718. S32 fbHeight = fbRect.getHeight();
  719. S32 newHeight = nbRect.getHeight() - fbHeight;
  720. nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), newHeight);
  721. }
  722. else
  723. {
  724. // Favorites Panel must be hidden. Navigation Panel is hidden.
  725. nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), 0);
  726. }
  727. reshape(nbRect.getWidth(), nbRect.getHeight());
  728. setRect(nbRect);
  729. getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
  730. }
  731. childSetVisible("bg_icon", visible);
  732. childSetVisible("bg_icon_no_fav", !visible);
  733. fb->setVisible(visible);
  734. }