summaryrefslogtreecommitdiff
path: root/indra/newview/llpanelavatar.h
blob: 1b89399771d7974e9955d2cffd3f495d7ffa911c (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
/**
 * @file llpanelavatar.h
 * @brief Legacy profile panel base class
 *
 * $LicenseInfo:firstyear=2019&license=viewerlgpl$
 * Second Life Viewer Source Code
 * Copyright (C) 2019, 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_LLPANELAVATAR_H
#define LL_LLPANELAVATAR_H

#include "llpanel.h"
#include "llavatarpropertiesprocessor.h"
#include "llavatarnamecache.h"

class LLComboBox;
class LLLineEditor;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLProfileDropTarget
//
// This handy class is a simple way to drop something on another
// view. It handles drop events, always setting itself to the size of
// its parent.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

class LLProfileDropTarget : public LLView
{
public:
    struct Params : public LLInitParam::Block<Params, LLView::Params>
    {
        Optional<LLUUID> agent_id;
        Params()
        :   agent_id("agent_id")
        {
            changeDefault(mouse_opaque, false);
            changeDefault(follows.flags, FOLLOWS_ALL);
        }
    };

    LLProfileDropTarget(const Params&);
    ~LLProfileDropTarget() {}

    //
    // LLView functionality
    virtual bool handleDragAndDrop(S32 x, S32 y, MASK mask, bool drop,
                                   EDragAndDropType cargo_type,
                                   void* cargo_data,
                                   EAcceptance* accept,
                                   std::string& tooltip_msg);

    void setAgentID(const LLUUID &agent_id)     { mAgentID = agent_id; }

protected:
    LLUUID mAgentID;
};


/**
* Base class for any Profile View.
*/
class LLPanelProfileTab
    : public LLPanel
{
public:

    /**
     * Sets avatar ID, sets panel as observer of avatar related info replies from server.
     */
    virtual void setAvatarId(const LLUUID& avatar_id);

    /**
     * Returns avatar ID.
     */
    virtual const LLUUID& getAvatarId() const { return mAvatarId; }

    /**
     * Sends update data request to server.
     */
    virtual void updateData() {};

    /**
     * Clears panel data if viewing avatar info for first time and sends update data request.
     */
    virtual void onOpen(const LLSD& key) override;

    /**
     * Clears all data received from server.
     */
    virtual void resetData(){};

    /*virtual*/ ~LLPanelProfileTab();

protected:

    LLPanelProfileTab();

    enum ELoadingState
    {
        PROFILE_INIT,
        PROFILE_LOADING,
        PROFILE_LOADED,
    };


    // mLoading: false: Initial state, can request
    //           true:  Data requested, skip duplicate requests (happens due to LLUI's habit of repeated callbacks)
    // mLoaded:  false: Initial state, show loading indicator
    //           true:  Data recieved, which comes in a single message, hide indicator
    ELoadingState getLoadingState() { return mLoadingState; }
    virtual void setLoaded();
    void setApplyProgress(bool started);

    const bool getSelfProfile() const { return mSelfProfile; }

    bool saveAgentUserInfoCoro(std::string name, LLSD value, std::function<void(bool)> callback = nullptr) const;

public:
    void setIsLoading() { mLoadingState = PROFILE_LOADING; }
    void resetLoading() { mLoadingState = PROFILE_INIT; }

    bool getStarted() { return mLoadingState != PROFILE_INIT; }
    bool getIsLoaded() { return mLoadingState == PROFILE_LOADED; }

    virtual bool hasUnsavedChanges() { return false; }
    virtual void commitUnsavedChanges() {}

private:

    LLUUID  mAvatarId;
    ELoadingState    mLoadingState;
    bool    mSelfProfile;
};

class LLPanelProfilePropertiesProcessorTab
    : public LLPanelProfileTab
    , public LLAvatarPropertiesObserver
{
public:
    LLPanelProfilePropertiesProcessorTab();
    ~LLPanelProfilePropertiesProcessorTab();

    void setAvatarId(const LLUUID& avatar_id) override;

    void updateData() override;

    /**
     * Processes data received from server via LLAvatarPropertiesObserver.
     */
    virtual void processProperties(void* data, EAvatarProcessorType type) override = 0;
};

#endif // LL_LLPANELAVATAR_H