summaryrefslogtreecommitdiff
path: root/indra/newview/llfloaterworldmap.h
blob: 25306d0601cd7a6d9636f444332f47c5a556e575 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
/**
 * @file llfloaterworldmap.h
 * @brief LLFloaterWorldMap class definition
 *
 * $LicenseInfo:firstyear=2003&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$
 */

/*
 * Map of the entire world, with multiple background images,
 * avatar tracking, teleportation by double-click, etc.
 */

#ifndef LL_LLFLOATERWORLDMAP_H
#define LL_LLFLOATERWORLDMAP_H

#include "llfloater.h"
#include "llmapimagetype.h"
#include "lltracker.h"
#include "llslurl.h"

class LLCtrlListInterface;
class LLFriendObserver;
class LLInventoryModel;
class LLInventoryObserver;
class LLItemInfo;
class LLLineEditor;
class LLTabContainer;
class LLWorldMapView;

class LLFloaterWorldMap : public LLFloater
{
public:
    LLFloaterWorldMap(const LLSD& key);
    virtual ~LLFloaterWorldMap();

    // Prefer this to gFloaterWorldMap
    static LLFloaterWorldMap* getInstance();

    static void *createWorldMapView(void* data);
    BOOL postBuild();

    /*virtual*/ void onOpen(const LLSD& key);
    /*virtual*/ void onClose(bool app_quitting);

    static void reloadIcons(void*);

    /*virtual*/ void reshape( S32 width, S32 height, BOOL called_from_parent = TRUE );
    /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
    /*virtual*/ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
    /*virtual*/ void draw();

    /*virtual*/ void onFocusLost();

    // methods for dealing with inventory. The observe() method is
    // called during program startup. inventoryUpdated() will be
    // called by a helper object when an interesting change has
    // occurred.
    void observeInventory(LLInventoryModel* inventory);
    void inventoryChanged();

    // Calls for dealing with changes in friendship
    void observeFriends();
    void friendsChanged();

    // tracking methods
    void            trackAvatar( const LLUUID& avatar_id, const std::string& name );
    void            trackLandmark( const LLUUID& landmark_item_id );
    void            trackLocation(const LLVector3d& pos);
    void            trackEvent(const LLItemInfo &event_info);
    void            trackGenericItem(const LLItemInfo &item);
    void            trackURL(const std::string& region_name, S32 x_coord, S32 y_coord, S32 z_coord);

    static const LLUUID& getHomeID() { return sHomeID; }

    // A z_attenuation of 0.0f collapses the distance into the X-Y plane
    F32             getDistanceToDestination(const LLVector3d& pos_global, F32 z_attenuation = 0.5f) const;

    void            clearLocationSelection(BOOL clear_ui = FALSE, BOOL dest_reached = FALSE);
    void            clearAvatarSelection(BOOL clear_ui = FALSE);
    void            clearLandmarkSelection(BOOL clear_ui = FALSE);

    // Adjust the maximally zoomed out limit of the zoom slider so you can
    // see the whole world, plus a little.
    void            adjustZoomSliderBounds();

    // Catch changes in the sim list
    void            updateSims(bool found_null_sim);

    // teleport to the tracked item, if there is one
    void            teleport();
    void            onChangeMaturity();

    void            onClearBtn();

    //Slapp instigated avatar tracking
    void            avatarTrackFromSlapp( const LLUUID& id );

protected:
    void            onGoHome();

    void            onLandmarkComboPrearrange();
    void            onLandmarkComboCommit();

    void            onAvatarComboPrearrange();
    void            onAvatarComboCommit();

    void            onComboTextEntry( );
    void            onSearchTextEntry( );

    void            onClickTeleportBtn();
    void            onShowTargetBtn();
    void            onShowAgentBtn();
    void            onCopySLURL();

    void            onExpandCollapseBtn();

    void            centerOnTarget(BOOL animate);
    void            updateLocation();

    // fly to the tracked item, if there is one
    void            fly();

    void            buildLandmarkIDLists();
    void            flyToLandmark();
    void            teleportToLandmark();
    void            setLandmarkVisited();

    void            buildAvatarIDList();
    void            flyToAvatar();
    void            teleportToAvatar();

    void            updateSearchEnabled();
    void            onLocationFocusChanged( LLFocusableElement* ctrl );
    void            onLocationCommit();
    void            onCoordinatesCommit();
    void            onCommitSearchResult();

    void            onTeleportFinished();

private:
    LLWorldMapView* mMapView; // Panel displaying the map

    // update display of teleport destination coordinates - pos is in global coordinates
    void updateTeleportCoordsDisplay( const LLVector3d& pos );

    // enable/disable teleport destination coordinates
    void enableTeleportCoordsDisplay( bool enabled );

    std::vector<LLUUID> mLandmarkAssetIDList;
    std::vector<LLUUID> mLandmarkItemIDList;

    static const LLUUID sHomeID;

    LLInventoryModel* mInventory;
    LLInventoryObserver* mInventoryObserver;
    LLFriendObserver* mFriendObserver;

    std::string             mCompletingRegionName;
    // Local position from trackURL() request, used to select final
    // position once region lookup complete.
    LLVector3               mCompletingRegionPos;

    std::string             mLastRegionName;
    BOOL                    mWaitingForTracker;

    BOOL                    mIsClosing;
    BOOL                    mSetToUserPosition;

    LLVector3d              mTrackedLocation;
    LLTracker::ETrackingStatus mTrackedStatus;
    std::string             mTrackedSimName;
    LLUUID                  mTrackedAvatarID;
    LLSLURL                 mSLURL;

    LLCtrlListInterface *   mListFriendCombo;
    LLCtrlListInterface *   mListLandmarkCombo;
    LLCtrlListInterface *   mListSearchResults;

    boost::signals2::connection mTeleportFinishConnection;
};

extern LLFloaterWorldMap* gFloaterWorldMap;


class LLPanelHideBeacon : public LLPanel
{
public:
    static LLPanelHideBeacon* getInstance();

    LLPanelHideBeacon();
    /*virtual*/ BOOL postBuild();
    /*virtual*/ void setVisible(BOOL visible);
    /*virtual*/ void draw();

private:
    static LLPanelHideBeacon* getPanelHideBeacon();
    void onHideButtonClick();
    void updatePosition();

    LLButton* mHideButton;

};

#endif