summaryrefslogtreecommitdiff
path: root/indra/newview/lltoolpie.h
blob: ec54e0207d8c8c3a329c486085710333217d2fc5 (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
/**
 * @file lltoolpie.h
 * @brief LLToolPie class header file
 *
 * $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_TOOLPIE_H
#define LL_TOOLPIE_H

#include "lltool.h"
#include "lluuid.h"
#include "llviewerwindow.h" // for LLPickInfo
#include "llhudeffectblob.h" // for LLPointer<LLHudEffectBlob>, apparently

class LLViewerObject;
class LLObjectSelection;

class LLToolPie : public LLTool, public LLSingleton<LLToolPie>
{
    LLSINGLETON(LLToolPie);
    LOG_CLASS(LLToolPie);
public:

    // Virtual functions inherited from LLMouseHandler
    virtual bool        handleAnyMouseClick(S32 x, S32 y, MASK mask, EMouseClickType clicktype, bool down) override;
    virtual bool        handleMouseDown(S32 x, S32 y, MASK mask) override;
    virtual bool        handleRightMouseDown(S32 x, S32 y, MASK mask) override;
    virtual bool        handleMouseUp(S32 x, S32 y, MASK mask) override;
    virtual bool        handleRightMouseUp(S32 x, S32 y, MASK mask) override;
    virtual bool        handleHover(S32 x, S32 y, MASK mask) override;
    virtual bool        handleDoubleClick(S32 x, S32 y, MASK mask) override;
    bool                handleScrollWheelAny(S32 x, S32 y, S32 clicks_x, S32 clicks_y);
    virtual bool        handleScrollWheel(S32 x, S32 y, S32 clicks) override;
    virtual bool        handleScrollHWheel(S32 x, S32 y, S32 clicks) override;
    virtual bool        handleToolTip(S32 x, S32 y, MASK mask) override;

    virtual void        render() override;

    virtual void        stopEditing() override;

    virtual void        onMouseCaptureLost() override;
    virtual void        handleSelect() override;
    virtual void        handleDeselect() override;
    virtual LLTool*     getOverrideTool(MASK mask) override;

    LLPickInfo&         getPick() { return mPick; }
    U8                  getClickAction() { return mClickAction; }
    LLViewerObject*     getClickActionObject() { return mClickActionObject; }
    LLObjectSelection*  getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; }
    void                resetSelection();
    bool                walkToClickedLocation();
    bool                teleportToClickedLocation();
    void                stopClickToWalk();

    static void         selectionPropertiesReceived();

    static void         showAvatarInspector(const LLUUID& avatar_id);
    static void         showObjectInspector(const LLUUID& object_id);
    static void         showObjectInspector(const LLUUID& object_id, const S32& object_face);
    static void         playCurrentMedia(const LLPickInfo& info);
    static void         VisitHomePage(const LLPickInfo& info);

private:
    bool outsideSlop        (S32 x, S32 y, S32 start_x, S32 start_y);
    bool handleLeftClickPick();
    bool handleRightClickPick();
    bool useClickAction     (MASK mask, LLViewerObject* object,LLViewerObject* parent);

    void showVisualContextMenuEffect();
    ECursorType cursorFromObject(LLViewerObject* object);

    enum MediaFirstClickTypes
    {
        MEDIA_FIRST_CLICK_NONE       = 0,         // Special case: Feature is disabled
        MEDIA_FIRST_CLICK_HUD        = 1 << 0,    // 0b00000001 (1)
        MEDIA_FIRST_CLICK_OWN        = 1 << 1,    // 0b00000010 (2)
        MEDIA_FIRST_CLICK_FRIEND     = 1 << 2,    // 0b00000100 (4)
        MEDIA_FIRST_CLICK_GROUP      = 1 << 3,    // 0b00001000 (8)
        MEDIA_FIRST_CLICK_LAND       = 1 << 4,    // 0b00010000 (16)

        // Covers any object with PRIM_MEDIA_FIRST_CLICK_INTERACT (combines all previous flags)
        MEDIA_FIRST_CLICK_ANY        = (1 << 15) - 1, // 0b0111111111111111 (32767)

        // Covers all media regardless of other rules or PRIM_MEDIA_FIRST_CLICK_INTERACT
        MEDIA_FIRST_CLICK_BYPASS_MOAP_FLAG = 1 << 15  // 0b10000000000000000 (32768)
    };
    bool shouldAllowFirstMediaInteraction(const LLPickInfo& info, bool moap_flag);
    bool handleMediaClick(const LLPickInfo& info);
    bool handleMediaDblClick(const LLPickInfo& info);
    bool handleMediaHover(const LLPickInfo& info);
    bool handleMediaMouseUp();
    bool handleTooltipLand(std::string line, std::string tooltip_msg);
    bool handleTooltipObject( LLViewerObject* hover_object, std::string line, std::string tooltip_msg);

    void steerCameraWithMouse(S32 x, S32 y);
    void startCameraSteering();
    void stopCameraSteering();
    bool inCameraSteerMode();

private:
    bool                mMouseButtonDown;
    bool                mMouseOutsideSlop;      // for this drag, has mouse moved outside slop region
    S32                 mMouseDownX;
    S32                 mMouseDownY;
    S32                 mMouseSteerX;
    S32                 mMouseSteerY;
    LLPointer<LLHUDEffectBlob>  mAutoPilotDestination;
    LLPointer<LLHUDEffectBlob>  mMouseSteerGrabPoint;
    bool                mClockwise;
    LLUUID              mMediaMouseCaptureID;
    LLPickInfo          mPick;
    LLPickInfo          mHoverPick;
    LLPickInfo          mSteerPick;
    LLPointer<LLViewerObject> mClickActionObject;
    U8                  mClickAction;
    LLSafeHandle<LLObjectSelection> mLeftClickSelection;
    bool                mClickActionBuyEnabled;
    bool                mClickActionPayEnabled;
    LLFrameTimer mDoubleClickTimer;
};

#endif