summaryrefslogtreecommitdiff
path: root/indra/newview/llnavigationbar.h
blob: 2bb6af24bcc98b3748ed3d41b62e2e1809b70c0a (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
/**
 * @file llnavigationbar.h
 * @brief Navigation bar definition
 *
 * $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_LLNAVIGATIONBAR_H
#define LL_LLNAVIGATIONBAR_H

#include "llpanel.h"
#include "llbutton.h"
#include "lllayoutstack.h"
#include "llinitdestroyclass.h"

class LLLocationInputCtrl;
class LLMenuGL;
class LLSearchEditor;
class LLSearchComboBox;

/**
 * This button is able to handle click-dragging mouse event.
 * It has appropriated signal for this event.
 * Dragging direction can be set from xml attribute called 'direction'
 *
 * *TODO: move to llui?
 */

class LLPullButton: public LLButton
{
    LOG_CLASS(LLPullButton);

public:
    struct Params: public LLInitParam::Block<Params, LLButton::Params>
    {
        Optional<std::string> direction; // left, right, down, up

        Params()
        :   direction("direction", "down")
        {
        }
    };

    /*virtual*/ bool handleMouseDown(S32 x, S32 y, MASK mask);

    /*virtual*/ bool handleMouseUp(S32 x, S32 y, MASK mask);

    /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);

    boost::signals2::connection setClickDraggingCallback(const commit_signal_t::slot_type& cb);

protected:
    friend class LLUICtrlFactory;
    // convert string name into direction vector
    void setDirectionFromName(const std::string& name);
    LLPullButton(const LLPullButton::Params& params);

    commit_signal_t mClickDraggingSignal;
    LLVector2 mLastMouseDown;
    LLVector2 mDraggingDirection;
};

/**
 * Web browser-like navigation bar.
 */
class LLNavigationBar
    :   public LLPanel, public LLSingleton<LLNavigationBar>, private LLDestroyClass<LLNavigationBar>
{
    LLSINGLETON(LLNavigationBar);
    virtual ~LLNavigationBar();
    LOG_CLASS(LLNavigationBar);
    friend class LLDestroyClass<LLNavigationBar>;

public:

    /*virtual*/ void    draw() override;
    /*virtual*/ bool handleRightMouseDown(S32 x, S32 y, MASK mask) override;
    /*virtual*/ bool    postBuild() override;
    /*virtual*/ void    setVisible(bool visible) override;

    void handleLoginComplete();
    void clearHistoryCache();

    int getDefNavBarHeight();
    int getDefFavBarHeight();

    bool isRebakeNavMeshAvailable();

private:
    // the distance between navigation panel and favorites panel in pixels
    const static S32 FAVBAR_TOP_PADDING = 10;

    void rebuildTeleportHistoryMenu();
    void showTeleportHistoryMenu(LLUICtrl* btn_ctrl);
    void invokeSearch(std::string search_text);
    void resizeLayoutPanel();
    // callbacks
    void onTeleportHistoryMenuItemClicked(const LLSD& userdata);
    void onTeleportHistoryChanged();
    void onBackButtonClicked();
    void onBackOrForwardButtonHeldDown(LLUICtrl* ctrl, const LLSD& param);
    void onNavigationButtonHeldUp(LLButton* nav_button);
    void onForwardButtonClicked();
    void onHomeButtonClicked();
    void onLandmarksButtonClicked();
    void onLocationSelection();
    void onLocationPrearrange(const LLSD& data);
    void onTeleportFinished(const LLVector3d& global_agent_pos);
    void onTeleportFailed();
    void onNavbarResized();
    void onRegionNameResponse(
            std::string typed_location,
            std::string region_name,
            LLVector3 local_coords,
            U64 region_handle, const std::string& url,
            const LLUUID& snapshot_id, bool teleport);

    static void destroyClass()
    {
        if (LLNavigationBar::instanceExists())
        {
            LLNavigationBar::getInstance()->setEnabled(false);
        }
    }

    S32                         mNavPanWidth;
    LLMenuGL*                   mTeleportHistoryMenu;
    LLPullButton*               mBtnBack;
    LLPullButton*               mBtnForward;
    LLButton*                   mBtnHome;
    LLButton*                   mBtnLandmarks;
    LLLocationInputCtrl*        mCmbLocation;
    LLRect                      mDefaultNbRect;
    LLRect                      mDefaultFpRect;
    LLLayoutPanel*              mNavigationPanel;
    LLLayoutPanel*              mFavoritePanel;
    boost::signals2::connection mTeleportFailedConnection;
    boost::signals2::connection mTeleportFinishConnection;
    boost::signals2::connection mHistoryMenuConnection;
    // if true, save location to location history when teleport finishes
    bool                        mSaveToLocationHistory;
};

#endif