summaryrefslogtreecommitdiff
path: root/indra/newview/llavatarlistitem.h
blob: 4b24410d821dd7bd7ad25d916d55a251df65eeb3 (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
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
/**
 * @file llavatarlistitem.h
 * @brief avatar list item header file
 *
 * $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_LLAVATARLISTITEM_H
#define LL_LLAVATARLISTITEM_H

#include <boost/signals2.hpp>

#include "llpanel.h"
#include "llbutton.h"
#include "lltextbox.h"
#include "llstyle.h"

#include "llcallingcard.h" // for LLFriendObserver

class LLAvatarIconCtrl;
class LLOutputMonitorCtrl;
class LLAvatarName;
class LLIconCtrl;

class LLAvatarListItem : public LLPanel, public LLFriendObserver
{
public:
    struct Params : public LLInitParam::Block<Params, LLPanel::Params>
    {
        Optional<LLStyle::Params>   default_style,
                                    voice_call_invited_style,
                                    voice_call_joined_style,
                                    voice_call_left_style,
                                    online_style,
                                    offline_style;

        Optional<S32>               name_right_pad;

        Params();
    };

    typedef enum e_item_state_type {
        IS_DEFAULT,
        IS_VOICE_INVITED,
        IS_VOICE_JOINED,
        IS_VOICE_LEFT,
        IS_ONLINE,
        IS_OFFLINE,
    } EItemState;

    /**
     * Creates an instance of LLAvatarListItem.
     *
     * It is not registered with LLDefaultChildRegistry. It is built via LLUICtrlFactory::buildPanel
     * or via registered LLCallbackMap depend on passed parameter.
     *
     * @param not_from_ui_factory if true instance will be build with LLUICtrlFactory::buildPanel
     * otherwise it should be registered via LLCallbackMap before creating.
     */
    LLAvatarListItem(bool not_from_ui_factory = true);
    virtual ~LLAvatarListItem();

    virtual BOOL postBuild();

    /**
     * Processes notification from speaker indicator to update children when indicator's visibility is changed.
     */
    virtual void handleVisibilityChange ( BOOL new_visibility );
    virtual S32 notifyParent(const LLSD& info);
    virtual void onMouseLeave(S32 x, S32 y, MASK mask);
    virtual void onMouseEnter(S32 x, S32 y, MASK mask);
    virtual void setValue(const LLSD& value);
    virtual void changed(U32 mask); // from LLFriendObserver

    void setOnline(bool online);
    void updateAvatarName(); // re-query the name cache
    void setAvatarName(const std::string& name);
    void setAvatarToolTip(const std::string& tooltip);
    void setHighlight(const std::string& highlight);
    void setState(EItemState item_style);
    void setAvatarId(const LLUUID& id, const LLUUID& session_id, bool ignore_status_changes = false, bool is_resident = true);
    void setAvatarArrivalTime(F32 arrival_time);
    void setAvatarDistance(F32 distance);
    void setLastInteractionTime(U32 secs_since);
    //Show/hide profile/info btn, translating speaker indicator and avatar name coordinates accordingly
    void setShowProfileBtn(bool show);
    void setShowInfoBtn(bool show);
    void showSpeakingIndicator(bool show);
    void setShowPermissions(bool show) { mShowPermissions = show; };
    void showAvatarArrivalTime(bool show);
    void showAvatarDistance(bool show);
    void showLastInteractionTime(bool show);
    void setAvatarIconVisible(bool visible);
    void setShowCompleteName(bool show) { mShowCompleteName = show;};

    const LLUUID& getAvatarId() const;
    std::string getAvatarName() const;
    std::string getAvatarToolTip() const;

    void onInfoBtnClick();
    void onProfileBtnClick();

    /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);

protected:
    /**
     * Contains indicator to show voice activity.
     */
    LLOutputMonitorCtrl* mSpeakingIndicator;

    LLAvatarIconCtrl* mAvatarIcon;

    /// Indicator for permission to see me online.
    LLIconCtrl* mIconPermissionOnline;
    /// Indicator for permission to see my position on the map.
    LLIconCtrl* mIconPermissionMap;
    /// Indicator for permission to edit my objects.
    LLIconCtrl* mIconPermissionEditMine;
    /// Indicator for permission to edit their objects.
    LLIconCtrl* mIconPermissionEditTheirs;

private:

    typedef enum e_online_status {
        E_OFFLINE,
        E_ONLINE,
        E_UNKNOWN,
    } EOnlineStatus;

    /**
     * Enumeration of item elements in order from right to left.
     *
     * updateChildren() assumes that indexes are in the such order to process avatar icon easier.
     *
     * @see updateChildren()
     */
    typedef enum e_avatar_item_child {
        ALIC_SPEAKER_INDICATOR,
        ALIC_PROFILE_BUTTON,
        ALIC_INFO_BUTTON,
        ALIC_PERMISSION_ONLINE,
        ALIC_PERMISSION_MAP,
        ALIC_PERMISSION_EDIT_MINE,
        ALIC_PERMISSION_EDIT_THEIRS,
        ALIC_INTERACTION_TIME,
        ALIC_DISTANCE,
        ALIC_ARRIVAL_TIME,
        ALIC_NAME,
        ALIC_ICON,
        ALIC_COUNT,
    } EAvatarListItemChildIndex;

    void setNameInternal(const std::string& name, const std::string& highlight);
    void onAvatarNameCache(const LLAvatarName& av_name);

    std::string formatSeconds(U32 secs);

    typedef std::map<EItemState, LLColor4> icon_color_map_t;
    static icon_color_map_t& getItemIconColorMap();

    /**
     * Initializes widths of all children to use them while changing visibility of any of them.
     *
     * @see updateChildren()
     */
    static void initChildrenWidths(LLAvatarListItem* self);

    /**
     * Updates position and rectangle of visible children to fit all available item's width.
     */
    void updateChildren();

    /**
     * Update visibility of active permissions icons.
     *
     * Need to call updateChildren() afterwards to sort out their layout.
     */
    bool showPermissions(bool visible);

    /**
     * Gets child view specified by index.
     *
     * This method implemented via switch by all EAvatarListItemChildIndex values.
     * It is used to not store children in array or vector to avoid of increasing memory usage.
     */
    LLView* getItemChildView(EAvatarListItemChildIndex child_index);

    LLTextBox* mAvatarName;
    LLTextBox* mAvatarArrivalTime;
    LLTextBox* mAvatarDistance;
    LLTextBox* mLastInteractionTime;
    LLStyle::Params mAvatarNameStyle;

    LLButton* mInfoBtn;
    LLButton* mProfileBtn;

    LLUUID mAvatarId;
    std::string mHighlihtSubstring; // substring to highlight
    EOnlineStatus mOnlineStatus;
    //Flag indicating that info/profile button shouldn't be shown at all.
    //Speaker indicator and avatar name coords are translated accordingly
    bool mShowInfoBtn;
    bool mShowProfileBtn;

    /// indicates whether to show icons representing permissions granted
    bool mShowPermissions;

    /// true when the mouse pointer is hovering over this item
    bool mHovered;

    bool mShowCompleteName;
    std::string mGreyOutUsername;

    void fetchAvatarName();
    boost::signals2::connection mAvatarNameCacheConnection;

    static bool sStaticInitialized; // this variable is introduced to improve code readability
    static S32  sLeftPadding; // padding to first left visible child (icon or name)
    static S32  sNameRightPadding; // right padding from name to next visible child

    /**
     * Contains widths of each child specified by EAvatarListItemChildIndex
     * including padding to the next right one.
     *
     * @see initChildrenWidths()
     */
    static S32 sChildrenWidths[ALIC_COUNT];

};

#endif //LL_LLAVATARLISTITEM_H