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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llteleporthistory.h
  3.  * @brief Teleport history
  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. #ifndef LL_LLTELEPORTHISTORY_H
  33. #define LL_LLTELEPORTHISTORY_H
  34. #include "llsingleton.h" // for LLSingleton
  35. #include <vector>
  36. #include <string>
  37. #include <boost/function.hpp>
  38. #include <boost/signals2.hpp>
  39. /**
  40.  * An item of the teleport history.
  41.  * 
  42.  * Contains the location's global coordinates and its title.
  43.  */
  44. class LLTeleportHistoryItem
  45. {
  46. public:
  47. LLTeleportHistoryItem()
  48. {}
  49. LLTeleportHistoryItem(std::string title, LLVector3d global_pos)
  50. : mTitle(title), mGlobalPos(global_pos)
  51. {}
  52. /**
  53.  * @return title formatted according to the current value of the 
  54.  * NavBarShowCoordinates setting.
  55.  */
  56. const std::string& getTitle() const;
  57. std::string mTitle; // human-readable location title
  58. std::string mFullTitle; // human-readable location title including coordinates
  59. LLVector3d mGlobalPos; // global position
  60. LLUUID mRegionID; // region ID for getting the region info 
  61. };
  62. /**
  63.  * Teleport history.
  64.  * 
  65.  * Along with the navigation bar "Back" and "Forward" buttons
  66.  * implements web browser-like navigation functionality.
  67.  * 
  68.  * @see LLNavigationBar
  69.  */
  70. class LLTeleportHistory: public LLSingleton<LLTeleportHistory>
  71. {
  72. LOG_CLASS(LLTeleportHistory);
  73. public:
  74. typedef std::vector<LLTeleportHistoryItem> slurl_list_t;
  75. typedef boost::function<void()> history_callback_t;
  76. typedef boost::signals2::signal<void()> history_signal_t;
  77. LLTeleportHistory();
  78. ~LLTeleportHistory();
  79. /**
  80.  * Go back in the history.
  81.  */
  82. void goBack() { goToItem(getCurrentItemIndex() - 1); }
  83. /**
  84.  * Go forward in the history.
  85.  */
  86. void goForward() { goToItem(getCurrentItemIndex() + 1); }
  87. /**
  88.  * Go to specific item in the history.
  89.  * 
  90.  * The item is specified by its index (starting from 0).
  91.  */ 
  92. void goToItem(int idx);
  93. /**
  94.  * @return history items.
  95.  */
  96. const slurl_list_t& getItems() const { return mItems; }
  97. void                    purgeItems();
  98. /**
  99.  * Is the history empty?
  100.  * 
  101.  * History containing single item is treated as empty
  102.  * because the item points to the current location.
  103.  */ 
  104. bool isEmpty() const { return mItems.size() <= 1; }
  105. /**
  106.  * Get index of the current location in the history.
  107.  */
  108. int getCurrentItemIndex() const { return mCurrentItem; }
  109. /**
  110.  * Set a callback to be called upon history changes.
  111.  * 
  112.  * Multiple callbacks can be set.
  113.  */
  114. boost::signals2::connection setHistoryChangedCallback(history_callback_t cb);
  115. /**
  116.  * Save history to a file so that we can restore it on startup.
  117.  * 
  118.  * @see load()
  119.  */
  120. void dump() const;
  121. private:
  122. /**
  123.  * Called by when a teleport fails.
  124.  * 
  125.  * Called via callback set on the LLViewerParcelMgr "teleport failed" signal.
  126.  * 
  127.  * @see mTeleportFailedConn
  128.  */
  129. void onTeleportFailed();
  130. /**
  131.  * Update current location.
  132.  * 
  133.  * @param new_pos Current agent global position. After local teleports we
  134.  *                cannot rely on gAgent.getPositionGlobal(),
  135.  *                so the new position gets passed explicitly.
  136.  * 
  137.  * Called when a teleport finishes.
  138.  * Called via callback set on the LLViewerParcelMgr "teleport finished" signal.
  139.  *
  140.  * Takes mRequestedItem into consideration: if it's not -1
  141.  * (i.e. user is teleporting to an arbitrary location, not to a history item)
  142.  * we purge forward items and append a new one, making it current. Otherwise
  143.  * we just modify mCurrentItem.
  144.  * 
  145.  * @see mRequestedItem
  146.  * @see mGotInitialUpdate
  147.  */
  148. void updateCurrentLocation(const LLVector3d& new_pos);
  149. /**
  150.  * Invokes the "history changed" callback(s).
  151.  */
  152. void onHistoryChanged();
  153. /**
  154.  * Format current agent location in a human-readable manner.
  155.  * 
  156.  * @param full whether to include coordinates
  157.  * @param local_pos_override hack: see description of updateCurrentLocation()
  158.  * @return
  159.  */
  160. static std::string getCurrentLocationTitle(bool full, const LLVector3& local_pos_override);
  161. /**
  162.  * Actually, the teleport history.
  163.  */
  164. slurl_list_t mItems;
  165. /**
  166.  * Current position within the history.
  167.  */
  168. int mCurrentItem;
  169. /**
  170.  * Requested position within the history.
  171.  * 
  172.  * When a teleport succeeds, this is checked by updateCurrentLocation() to tell
  173.  * if this is a teleport within the history (mRequestedItem >=0) or not (-1).
  174.  * 
  175.  * Set by goToItem(); reset by onTeleportFailed() (if teleport fails).
  176.  * 
  177.  * @see goToItem()
  178.  * @see updateCurrentLocation()
  179.  */
  180. int mRequestedItem;
  181. /**
  182.  * Have we received the initial location update?
  183.  * 
  184.  * @see updateCurrentLocation()
  185.  */
  186. bool mGotInitialUpdate;
  187. /**
  188.  * Signal emitted when the history gets changed.
  189.  * 
  190.  * Invokes callbacks set with setHistoryChangedCallback().
  191.  */
  192. history_signal_t mHistoryChangedSignal;
  193. /**
  194.  * Teleport success notification connection.
  195.  * 
  196.  * Using this connection we get notified when a teleport finishes
  197.  * or initial location update occurs.
  198.  */
  199. boost::signals2::connection mTeleportFinishedConn;
  200. /**
  201.  * Teleport failure notification connection.
  202.  * 
  203.  * Using this connection we get notified when a teleport fails.
  204.  */
  205. boost::signals2::connection mTeleportFailedConn;
  206. };
  207. #endif