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
|
/*
* SPDX-FileCopyrightText: 2014 Emmanuel Pescosta <[email protected]>
* SPDX-FileCopyrightText: 2020 Felix Ernst <[email protected]>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef DOLPHIN_TAB_PAGE_H
#define DOLPHIN_TAB_PAGE_H
#include "global.h"
#include <QPointer>
#include <QSplitter>
#include <QUrl>
#include <QWidget>
class DolphinNavigatorsWidgetAction;
class DolphinViewContainer;
class QVariantAnimation;
class KFileItemList;
class DolphinTabPageSplitter;
class DolphinTabPage : public QWidget
{
Q_OBJECT
public:
explicit DolphinTabPage(const QUrl &primaryUrl, const QUrl &secondaryUrl = QUrl(), QWidget *parent = nullptr);
/**
* @return True if primary view is the active view in this tab.
*/
bool primaryViewActive() const;
/**
* @return True if split view is enabled.
*/
bool splitViewEnabled() const;
/**
* Enables or disables the split view mode.
*
* @param enabled If true, creates a secondary viewContainer in this tab.
* Otherwise deletes it.
* @param animated Decides whether the effects of this method call should
* happen instantly or be transitioned to smoothly.
* @param secondaryUrl If \p enabled is true, the new viewContainer will be opened at this
* parameter. The default value will set the Url of the new viewContainer
* to be the same as the existing one.
*/
void setSplitViewEnabled(bool enabled, Animated animated, const QUrl &secondaryUrl = QUrl());
/**
* @return The primary view container.
*/
DolphinViewContainer *primaryViewContainer() const;
/**
* @return The secondary view container, can be 0 if split view is disabled.
*/
DolphinViewContainer *secondaryViewContainer() const;
/**
* @return DolphinViewContainer of the active view
*/
DolphinViewContainer *activeViewContainer() const;
/**
* @return DolphinViewContainer of the inactive view
* if split view is enabled, or nullptr otherwise.
*/
DolphinViewContainer *inactiveViewContainer() const;
/**
* Returns the selected items. The list is empty if no item has been
* selected.
*/
KFileItemList selectedItems() const;
/**
* Returns the number of selected items (this is faster than
* invoking selectedItems().count()).
*/
int selectedItemsCount() const;
/**
* Connects a navigatorsWidget to this. It will be connected to the DolphinViewContainers
* managed by this tab. For alignment purposes this will from now on notify the
* navigatorsWidget when this tab or its viewContainers are resized.
*/
void connectNavigators(DolphinNavigatorsWidgetAction *navigatorsWidget);
/**
* Makes it so this tab and its DolphinViewContainers aren't controlled by any
* UrlNavigators anymore.
*/
void disconnectNavigators();
void insertNavigatorsWidget(DolphinNavigatorsWidgetAction *navigatorsWidget);
/**
* Marks the items indicated by \p urls to get selected after the
* directory DolphinView::url() has been loaded. Note that nothing
* gets selected if no loading of a directory has been triggered
* by DolphinView::setUrl() or DolphinView::reload().
*/
void markUrlsAsSelected(const QList<QUrl> &urls);
/**
* Marks the item indicated by \p url to be scrolled to and as the
* current item after directory DolphinView::url() has been loaded.
*/
void markUrlAsCurrent(const QUrl &url);
/**
* Refreshes the views of the main window by recreating them according to
* the given Dolphin settings.
*/
void refreshViews();
/**
* Saves all tab related properties (urls, splitter layout, ...).
*
* @return A byte-array which contains all properties.
*/
QByteArray saveState() const;
/**
* Restores all tab related properties (urls, splitter layout, ...) from
* the given \a state.
*/
void restoreState(const QByteArray &state);
/**
* Set whether the tab page is active
*
*/
void setActive(bool active);
void switchActiveView();
/**
* Overwrites the automatically generated label of this tab with @p label.
* This @p label will be kept until it is overwritten by calling this method again.
* Calling this with an empty string will restore the automatic labelling.
*/
void setCustomLabel(const QString &label);
/**
* @see setCustomLabel.
*/
QString customLabel() const;
Q_SIGNALS:
void activeViewChanged(DolphinViewContainer *viewContainer);
void activeViewUrlChanged(const QUrl &url);
void splitterMoved(int pos, int index);
private Q_SLOTS:
/**
* Deletes all zombie viewContainers that were used for the animation
* and resets the minimum size of the others to a sane value.
*/
void slotAnimationFinished();
/**
* This method is called for every frame of the m_expandViewAnimation.
*/
void slotAnimationValueChanged(const QVariant &value);
/**
* Handles the view activated event.
*
* It sets the previous active view to inactive, updates the current
* active view type and triggers the activeViewChanged event.
*/
void slotViewActivated();
/**
* Handles the view url redirection event.
*
* It emits the activeViewUrlChanged signal with the url \a newUrl.
*/
void slotViewUrlRedirection(const QUrl &oldUrl, const QUrl &newUrl);
private:
/**
* Creates a new view container and does the default initialization.
*/
DolphinViewContainer *createViewContainer(const QUrl &url) const;
/**
* Starts an animation that transitions between split view mode states.
*
* One of the viewContainers is always being expanded when toggling so
* this method can animate both opening and closing of viewContainers.
* @param expandingContainer The container that will increase in size
* over the course of the animation.
*/
void startExpandViewAnimation(DolphinViewContainer *expandingContainer);
private:
DolphinTabPageSplitter *m_splitter;
QPointer<DolphinNavigatorsWidgetAction> m_navigatorsWidget;
QPointer<DolphinViewContainer> m_primaryViewContainer;
QPointer<DolphinViewContainer> m_secondaryViewContainer;
DolphinViewContainer *m_expandingContainer;
QPointer<QVariantAnimation> m_expandViewAnimation;
std::unique_ptr<QFrame> m_navigatorSeparator;
bool m_primaryViewActive;
bool m_splitViewEnabled;
bool m_active;
/** @see setCustomLabel(). */
QString m_customLabel;
};
class DolphinTabPageSplitterHandle : public QSplitterHandle
{
Q_OBJECT
public:
explicit DolphinTabPageSplitterHandle(Qt::Orientation orientation, QSplitter *parent);
protected:
bool event(QEvent *event) override;
private:
void resetSplitterSizes();
// Sometimes QSplitterHandle doesn't receive MouseButtonDblClick event.
// We can detect that MouseButtonDblClick event should have been
// received if we receive two MouseButtonRelease events in a row.
bool m_mouseReleaseWasReceived;
};
class DolphinTabPageSplitter : public QSplitter
{
Q_OBJECT
public:
explicit DolphinTabPageSplitter(Qt::Orientation orientation, QWidget *parent);
protected:
QSplitterHandle *createHandle() override;
};
#endif // DOLPHIN_TAB_PAGE_H
|