aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/advanceddockingsystem/dockareawidget.h
blob: b300b100f9a13a1bdacfc30f0c5fd43683f22dd8 (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
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
/****************************************************************************
**
** Copyright (C) 2020 Uwe Kindler
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or (at your option) any later version.
** The licenses are as published by the Free Software Foundation
** and appearing in the file LICENSE.LGPLv21 included in the packaging
** of this file. Please review the following information to ensure
** the GNU Lesser General Public License version 2.1 requirements
** will be met: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/

#pragma once

#include "ads_globals.h"
#include "dockwidget.h"

#include <QFrame>

QT_BEGIN_NAMESPACE
class QAbstractButton;
class QXmlStreamWriter;
QT_END_NAMESPACE

namespace ADS {

struct DockAreaWidgetPrivate;
class DockManager;
class DockContainerWidget;
class DockContainerWidgetPrivate;
class DockAreaTitleBar;

/**
 * DockAreaWidget manages multiple instances of DockWidgets.
 * It displays a title tab, which is clickable and will switch to
 * the contents associated to the title when clicked.
 */
class ADS_EXPORT DockAreaWidget : public QFrame
{
    Q_OBJECT
private:
    DockAreaWidgetPrivate *d; ///< private data (pimpl)
    friend struct DockAreaWidgetPrivate;
    friend class DockContainerWidget;
    friend class DockContainerWidgetPrivate;
    friend class DockWidgetTab;
    friend class DockWidgetPrivate;
    friend class DockWidget;
    friend class DockManagerPrivate;
    friend class DockManager;

    void onTabCloseRequested(int index);

    /**
     * Reorder the index position of DockWidget at fromIndx to toIndex
     * if a tab in the tabbar is dragged from one index to another one
     */
    void reorderDockWidget(int fromIndex, int toIndex);

protected:
    /**
     * Inserts a dock widget into dock area.
     * All dockwidgets in the dock area tabified in a stacked layout with tabs.
     * The index indicates the index of the new dockwidget in the tabbar and
     * in the stacked layout. If the Activate parameter is true, the new
     * DockWidget will be the active one in the stacked layout
     */
    void insertDockWidget(int index, DockWidget *dockWidget, bool activate = true);

    /**
     * Add a new dock widget to dock area.
     * All dockwidgets in the dock area tabified in a stacked layout with tabs
     */
    void addDockWidget(DockWidget *dockWidget);

    /**
     * Removes the given dock widget from the dock area
     */
    void removeDockWidget(DockWidget *dockWidget);

    /**
     * Called from dock widget if it is opened or closed
     */
    void toggleDockWidgetView(DockWidget *dockWidget, bool open);

    /**
     * This is a helper function to get the next open dock widget to activate
     * if the given DockWidget will be closed or removed.
     * The function returns the next widget that should be activated or
     * nullptr in case there are no more open widgets in this area.
     */
    DockWidget *nextOpenDockWidget(DockWidget *dockWidget) const;

    /**
     * Returns the index of the given DockWidget in the internal layout
     */
    int indexOf(DockWidget *dockWidget);

    /**
     * Call this function, if you already know, that the dock does not
     * contain any visible content (any open dock widgets).
     */
    void hideAreaWithNoVisibleContent();

    /**
     * Updates the dock area layout and components visibility
     */
    void updateTitleBarVisibility();

    /**
     * This is the internal private function for setting the current widget.
     * This function is called by the public setCurrentDockWidget() function
     * and by the dock manager when restoring the state
     */
    void internalSetCurrentDockWidget(DockWidget *dockWidget);

    /**
     * Marks tabs menu to update
     */
    void markTitleBarMenuOutdated();

    void toggleView(bool open);

public:
    using Super = QFrame;

    /**
     * Default Constructor
     */
    DockAreaWidget(DockManager *dockManager, DockContainerWidget *parent);

    /**
     * Virtual Destructor
     */
    ~DockAreaWidget() override;

    /**
     * Returns the dock manager object this dock area belongs to
     */
    DockManager *dockManager() const;

    /**
     * Returns the dock container widget this dock area widget belongs to or 0
     * if there is no
     */
    DockContainerWidget *dockContainer() const;

    /**
     * Returns the rectangle of the title area
     */
    QRect titleBarGeometry() const;

    /**
     * Returns the rectangle of the content
     */
    QRect contentAreaGeometry() const;

    /**
     * Returns the number of dock widgets in this area
     */
    int dockWidgetsCount() const;

    /**
     * Returns a list of all dock widgets in this dock area.
     * This list contains open and closed dock widgets.
     */
    QList<DockWidget *> dockWidgets() const;

    /**
     * Returns the number of open dock widgets in this area
     */
    int openDockWidgetsCount() const;

    /**
     * Returns a list of dock widgets that are not closed.
     */
    QList<DockWidget *> openedDockWidgets() const;

    /**
     * Returns a dock widget by its index
     */
    DockWidget *dockWidget(int indexOf) const;

    /**
     * Returns the index of the current active dock widget or -1 if there
     * are is no active dock widget (ie.e if all dock widgets are closed)
     */
    int currentIndex() const;

    /**
     * Returns the index of the first open dock widgets in the list of
     * dock widgets.
     * This function is here for performance reasons. Normally it would
     * be possible to take the first dock widget from the list returned by
     * openedDockWidgets() function. But that function enumerates all
     * dock widgets while this functions stops after the first open dock widget.
     * If there are no open dock widgets, the function returns -1.
     */
    int indexOfFirstOpenDockWidget() const;

    /**
     * Returns the current active dock widget or a nullptr if there is no
     * active dock widget (i.e. if all dock widgets are closed)
     */
    DockWidget *currentDockWidget() const;

    /**
     * Shows the tab with the given dock widget
     */
    void setCurrentDockWidget(DockWidget *dockWidget);

    /**
     * Saves the state into the given stream
     */
    void saveState(QXmlStreamWriter &stream) const;

    /**
     * This functions returns the dock widget features of all dock widget in
     * this area.
     * A bitwise and is used to combine the flags of all dock widgets. That
     * means, if only one single dock widget does not support a certain flag,
     * the whole dock are does not support the flag. I.e. if one single
     * dock widget in this area is not closable, the whole dock are is not
     * closable.
     */
    DockWidget::DockWidgetFeatures features(eBitwiseOperator mode = BitwiseAnd) const;

    /**
     * Returns the title bar button corresponding to the given title bar
     * button identifier
     */
    QAbstractButton *titleBarButton(eTitleBarButton which) const;

    /**
     * Update the close button if visibility changed
     */
    void setVisible(bool visible) override;

    /**
     * Configures the areas of this particular dock area that are allowed for docking
     */
    void setAllowedAreas(DockWidgetAreas areas);

    /**
     * Returns flags with all allowed drop areas of this particular dock area
     */
    DockWidgetAreas allowedAreas() const;

    /**
     * Returns the title bar of this dock area
     */
    DockAreaTitleBar *titleBar() const;

    /**
     * This activates the tab for the given tab index.
     * If the dock widget for the given tab is not visible, the this function
     * call will make it visible.
     */
    void setCurrentIndex(int indexOf);

    /**
     * Closes the dock area and all dock widgets in this area
     */
    void closeArea();

    /**
     * This function closes all other areas except of this area
     */
    void closeOtherAreas();

    /**
     * Returns the largest minimumSizeHint() of the dock widgets in this
     * area.
     * The minimum size hint is updated if a dock widget is removed or added.
     */
    QSize minimumSizeHint() const override;

signals:
    /**
     * This signal is emitted when user clicks on a tab at an index.
     */
    void tabBarClicked(int indexOf);

    /**
    * This signal is emitted when the tab bar's current tab is about to be changed. The new
    * current has the given index, or -1 if there isn't a new one.
    * @param index
    */
    void currentChanging(int indexOf);

    /**
     * This signal is emitted when the tab bar's current tab changes. The new
     * current has the given index, or -1 if there isn't a new one
     * @param index
     */
    void currentChanged(int indexOf);

    /**
     * This signal is emitted if the visibility of this dock area is toggled
     * via toggle view function
     */
    void viewToggled(bool open);
}; // class DockAreaWidget

} // namespace ADS