summaryrefslogtreecommitdiff
path: root/indra/llui/lldockablefloater.h
blob: e7ceb235a779a8637362c6717024bfbd4eaf9c83 (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
/**
 * @file lldockablefloater.h
 * @brief Creates a panel of a specific kind for a toast.
 *
 * $LicenseInfo:firstyear=2003&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_DOCKABLEFLOATER_H
#define LL_DOCKABLEFLOATER_H

#include "llerror.h"
#include "llfloater.h"
#include "lldockcontrol.h"
#include <memory>

/**
 * Represents floater that can dock.
 * In case impossibility deriving from LLDockableFloater use LLDockControl.
 */
class LLDockableFloater : public LLFloater
{
    static const U32 UNDOCK_LEAP_HEIGHT = 12;

    static void init(LLDockableFloater* thiz);
public:
    LOG_CLASS(LLDockableFloater);
    LLDockableFloater(LLDockControl* dockControl, const LLSD& key,
            const Params& params = getDefaultParams());

    /**
     * Constructor.
     * @param dockControl a pointer to the doc control instance
     * @param uniqueDocking - a flag defines is docking should work as tab(at one
     * moment only one docked floater can be shown), also this flag defines is dock
     * tongue should be used.
     * @params key a floater key.
     * @params params a floater parameters
     */
    LLDockableFloater(LLDockControl* dockControl, bool uniqueDocking,
            const LLSD& key, const Params& params = getDefaultParams());

    /**
     * Constructor.
     * @param dockControl a pointer to the doc control instance
     * @param uniqueDocking - a flag defines is docking should work as tab(at one
     * moment only one docked floater can be shown).
     * @praram useTongue - a flag defines is dock tongue should be used.
     * @params key a floater key.
     * @params params a floater parameters
     */
    LLDockableFloater(LLDockControl* dockControl, bool uniqueDocking,
            bool useTongue, const LLSD& key,
            const Params& params = getDefaultParams());

    virtual ~LLDockableFloater();

    static LLHandle<LLFloater> getInstanceHandle() { return sInstanceHandle; }

    static void toggleInstance(const LLSD& sdname);

    /**
     *  If descendant class overrides postBuild() in order to perform specific
     *  construction then it must still invoke its superclass' implementation.
     */
    /* virtula */BOOL postBuild();
    /* virtual */void setDocked(bool docked, bool pop_on_undock = true);
    /* virtual */void draw();

    /**
     *  If descendant class overrides setVisible() then it must still invoke its
     *  superclass' implementation.
     */
    /*virtual*/ void setVisible(BOOL visible);

    /**
     *  If descendant class overrides setMinimized() then it must still invoke its
     *  superclass' implementation.
     */
    /*virtual*/ void setMinimized(BOOL minimize);

    LLView * getDockWidget();

    virtual void onDockHidden();
    virtual void onDockShown();

    LLDockControl* getDockControl();

    /**
     * Returns true if screen channel should consider floater's size when drawing toasts.
     *
     * By default returns false.
     */
    virtual bool overlapsScreenChannel() { return mOverlapsScreenChannel && getVisible() && isDocked(); }
    virtual void setOverlapsScreenChannel(bool overlaps) { mOverlapsScreenChannel = overlaps; }

    bool getUniqueDocking() { return mUniqueDocking;    }
    bool getUseTongue() { return mUseTongue; }

    void setUseTongue(bool use_tongue) { mUseTongue = use_tongue;}
private:
    /**
     * Provides unique of dockable floater.
     * If dockable floater already exists it should  be closed.
     */
    void resetInstance();

protected:
    void setDockControl(LLDockControl* dockControl);
    const LLUIImagePtr& getDockTongue(LLDockControl::DocAt dock_side = LLDockControl::TOP);

    // Checks if docking should be forced.
    // It may be useful e.g. if floater created in mouselook mode (see EXT-5609)
    boost::function<BOOL ()> mIsDockedStateForcedCallback;

private:
    std::unique_ptr<LLDockControl> mDockControl;
    LLUIImagePtr mDockTongue;
    static LLHandle<LLFloater> sInstanceHandle;
    /**
     * Provides possibility to define that dockable floaters can be docked
     *  non exclusively.
     */
    bool mUniqueDocking;

    bool mUseTongue;

    bool mOverlapsScreenChannel;

    // Force docking when the floater is being shown for the first time.
    bool mForceDocking;
};

#endif /* LL_DOCKABLEFLOATER_H */