summaryrefslogtreecommitdiff
path: root/indra/newview/llmoveview.h
blob: 3690245e1d557802b8f02ef403a36c9df6e0abf9 (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
/**
 * @file llmoveview.h
 * @brief Container for buttons for walking, turning, flying
 *
 * $LicenseInfo:firstyear=2001&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_LLMOVEVIEW_H
#define LL_LLMOVEVIEW_H

// Library includes
#include "llfloater.h"

class LLButton;
class LLJoystickAgentTurn;
class LLJoystickAgentSlide;

//
// Classes
//
class LLFloaterMove
:   public LLFloater
{
    LOG_CLASS(LLFloaterMove);
    friend class LLFloaterReg;

private:
    LLFloaterMove(const LLSD& key);
    ~LLFloaterMove();
public:

    /*virtual*/ bool    postBuild();
    /*virtual*/ void    setVisible(bool visible);
    static F32  getYawRate(F32 time);
    static void setFlyingMode(bool fly);
    void setFlyingModeImpl(bool fly);
    static void setAlwaysRunMode(bool run);
    void setAlwaysRunModeImpl(bool run);
    static void setSittingMode(bool bSitting);
    static void enableInstance();
    /*virtual*/ void onOpen(const LLSD& key);

    static void sUpdateFlyingStatus();

protected:
    void turnLeft();
    void turnRight();

    void moveUp();
    void moveDown();

private:
    typedef enum movement_mode_t
    {
        MM_WALK,
        MM_RUN,
        MM_FLY
    } EMovementMode;
    void onWalkButtonClick();
    void onRunButtonClick();
    void onFlyButtonClick();
    void initMovementMode();
    void setMovementMode(const EMovementMode mode);
    void initModeTooltips();
    void setModeTooltip(const EMovementMode mode);
    void setModeTitle(const EMovementMode mode);
    void initModeButtonMap();
    void setModeButtonToggleState(const EMovementMode mode);
    void updateButtonsWithMovementMode(const EMovementMode newMode);
    void showModeButtons(bool bShow);

public:

    LLJoystickAgentTurn*    mForwardButton;
    LLJoystickAgentTurn*    mBackwardButton;
    LLJoystickAgentSlide*   mSlideLeftButton;
    LLJoystickAgentSlide*   mSlideRightButton;
    LLButton*               mTurnLeftButton;
    LLButton*               mTurnRightButton;
    LLButton*               mMoveUpButton;
    LLButton*               mMoveDownButton;
private:
    LLPanel*                mModeActionsPanel;

    typedef std::map<LLView*, std::string> control_tooltip_map_t;
    typedef std::map<EMovementMode, control_tooltip_map_t> mode_control_tooltip_map_t;
    mode_control_tooltip_map_t mModeControlTooltipsMap;

    typedef std::map<EMovementMode, LLButton*> mode_control_button_map_t;
    mode_control_button_map_t mModeControlButtonMap;
    EMovementMode mCurrentMode;

};


/**
 * This class contains Stand Up and Stop Flying buttons displayed above Move button in bottom tray
 */
class LLPanelStandStopFlying : public LLPanel
{
    LOG_CLASS(LLPanelStandStopFlying);
public:
    typedef enum stand_stop_flying_mode_t
    {
        SSFM_STAND,
        SSFM_STOP_FLYING
    } EStandStopFlyingMode;

    /**
     * Attach or detach the panel to/from the movement controls floater.
     *
     * Called when the floater gets opened/closed, user sits, stands up or starts/stops flying.
     *
     * @param move_view The floater to attach to (not always accessible via floater registry).
     *        If NULL is passed, the panel gets reparented to its original container.
     *
     * @see mAttached
     * @see mOriginalParent
     */
    void reparent(LLFloaterMove* move_view);

    static LLPanelStandStopFlying* getInstance();
    static void setStandStopFlyingMode(EStandStopFlyingMode mode);
    static void clearStandStopFlyingMode(EStandStopFlyingMode mode);
    /*virtual*/ bool postBuild();
    /*virtual*/ void setVisible(bool visible);

    // *HACK: due to hard enough to have this control aligned with "Move" button while resizing
    // let update its position in each frame
    /*virtual*/ void draw(){updatePosition(); LLPanel::draw();}
    /*virtual*/ bool handleToolTip(S32 x, S32 y, MASK mask);


protected:
    LLPanelStandStopFlying();


private:
    static LLPanelStandStopFlying* getStandStopFlyingPanel();
    void onStandButtonClick();
    void onStopFlyingButtonClick();
    void updatePosition();

    LLButton* mStandButton;
    LLButton* mStopFlyingButton;

    /**
     * The original parent of the panel.
     *
     * Makes it possible to move (reparent) the panel to the movement controls floater and back.
     *
     * @see reparent()
     */
    LLHandle<LLPanel> mOriginalParent;

    /**
     * True if the panel is currently attached to the movement controls floater.
     *
     * @see reparent()
     * @see updatePosition()
     */
    bool    mAttached;
};


#endif