phoenix-firestorm/indra/newview/llteleporthistory.h

253 lines
7.6 KiB
C++

/**
* @file llteleporthistory.h
* @brief Teleport history
*
* $LicenseInfo:firstyear=2009&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_LLTELEPORTHISTORY_H
#define LL_LLTELEPORTHISTORY_H
#include "llsingleton.h" // for LLSingleton
#include <vector>
#include <string>
#include <boost/function.hpp>
#include <boost/signals2.hpp>
#include "llteleporthistorystorage.h"
#include "llslurl.h" // <FS/> Access to LLSLURL
/**
* An item of the teleport history.
*
* Contains the location's global coordinates and its title.
*/
class LLTeleportHistoryItem
{
public:
LLTeleportHistoryItem()
{}
// <FS> [FIRE-35355] OpenSim requires knowing the grid to teleport correctly if changing grids
//LLTeleportHistoryItem(std::string title, LLVector3d global_pos)
// : mTitle(title), mGlobalPos(global_pos)
LLTeleportHistoryItem(std::string title, LLVector3d global_pos, const LLSLURL& slurl = LLSLURL())
: mTitle(title), mGlobalPos(global_pos), mSLURL(slurl)
{}
/**
* @return title formatted according to the current value of the
* NavBarShowCoordinates setting.
*/
const std::string& getTitle() const;
std::string mTitle; // human-readable location title
std::string mFullTitle; // human-readable location title including coordinates
LLVector3d mGlobalPos; // global position
LLUUID mRegionID; // region ID for getting the region info
LLSLURL mSLURL; // <FS/> [FIRE-35355] slurl for the location required for OpenSim
};
/**
* Teleport history.
*
* Along with the navigation bar "Back" and "Forward" buttons
* implements web browser-like navigation functionality.
*
* @see LLNavigationBar
*/
class LLTeleportHistory: public LLSingleton<LLTeleportHistory>
{
LLSINGLETON(LLTeleportHistory);
~LLTeleportHistory();
LOG_CLASS(LLTeleportHistory);
public:
typedef std::vector<LLTeleportHistoryItem> slurl_list_t;
typedef boost::function<void()> history_callback_t;
typedef boost::signals2::signal<void()> history_signal_t;
/**
* Go back in the history.
*/
void goBack() { goToItem(getCurrentItemIndex() - 1); }
/**
* Go forward in the history.
*/
void goForward() { goToItem(getCurrentItemIndex() + 1); }
/**
* Go to specific item in the history.
*
* The item is specified by its index (starting from 0).
*/
void goToItem(int idx);
/**
* @return history items.
*/
const slurl_list_t& getItems() const { return mItems; }
void purgeItems();
/**
* Is the history empty?
*
* History containing single item is treated as empty
* because the item points to the current location.
*/
bool isEmpty() const { return mItems.size() <= 1; }
/**
* Get index of the current location in the history.
*/
int getCurrentItemIndex() const { return mCurrentItem; }
/**
* Set a callback to be called upon history changes.
*
* Multiple callbacks can be set.
*/
boost::signals2::connection setHistoryChangedCallback(history_callback_t cb);
/**
* Save history to a file so that we can restore it on startup.
*
* @see load()
*/
void dump() const;
/**
* Process login complete event. Basically put current location into history
*/
void handleLoginComplete();
private:
/**
* Called by when a teleport fails.
*
* Called via callback set on the LLViewerParcelMgr "teleport failed" signal.
*
* @see mTeleportFailedConn
*/
void onTeleportFailed();
/**
* Update current location.
*
* @param new_pos Current agent global position. After local teleports we
* cannot rely on gAgent.getPositionGlobal(),
* so the new position gets passed explicitly.
*
* Called when a teleport finishes.
* Called via callback set on the LLViewerParcelMgr "teleport finished" signal.
*
* Takes mRequestedItem into consideration: if it's not -1
* (i.e. user is teleporting to an arbitrary location, not to a history item)
* we purge forward items and append a new one, making it current. Otherwise
* we just modify mCurrentItem.
*
* @see mRequestedItem
* @see mGotInitialUpdate
*/
void updateCurrentLocation(const LLVector3d& new_pos);
/**
* Invokes the "history changed" callback(s).
*/
void onHistoryChanged();
/**
* Format current agent location in a human-readable manner.
*
* @param full whether to include coordinates
* @param local_pos_override hack: see description of updateCurrentLocation()
* @return
*/
static std::string getCurrentLocationTitle(bool full, const LLVector3& local_pos_override);
// <FS> [FIRE-35355] Callback for OpenSim so we can teleport to the correct global position on another grid
void regionNameCallback(int idx, U64 handle, const LLSLURL& slurl, const LLUUID& snapshot_id, bool teleport);
// </FS>
/**
* Actually, the teleport history.
*/
slurl_list_t mItems;
/**
* Current position within the history.
*/
int mCurrentItem;
/**
* Requested position within the history.
*
* When a teleport succeeds, this is checked by updateCurrentLocation() to tell
* if this is a teleport within the history (mRequestedItem >=0) or not (-1).
*
* Set by goToItem(); reset by onTeleportFailed() (if teleport fails).
*
* @see goToItem()
* @see updateCurrentLocation()
*/
int mRequestedItem;
/**
* Have we received the initial location update?
*
* @see updateCurrentLocation()
*/
bool mGotInitialUpdate;
LLTeleportHistoryStorage* mTeleportHistoryStorage;
/**
* Signal emitted when the history gets changed.
*
* Invokes callbacks set with setHistoryChangedCallback().
*/
history_signal_t mHistoryChangedSignal;
/**
* Teleport success notification connection.
*
* Using this connection we get notified when a teleport finishes
* or initial location update occurs.
*/
boost::signals2::connection mTeleportFinishedConn;
/**
* Teleport failure notification connection.
*
* Using this connection we get notified when a teleport fails.
*/
boost::signals2::connection mTeleportFailedConn;
// [RLVa:KB] - Checked: 2010-09-03 (RLVa-1.2.1b) | Added: RLVa-1.2.1b
friend class RlvUIEnabler;
// [/RLVa:KB]
};
#endif