┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/dolphintabwidget.h
blob: a28a6bea1ff0941d78e265a28bec044c6febdede (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
/*
 * SPDX-FileCopyrightText: 2014 Emmanuel Pescosta <[email protected]>
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

#ifndef DOLPHIN_TAB_WIDGET_H
#define DOLPHIN_TAB_WIDGET_H

#include "dolphinnavigatorswidgetaction.h"
#include "dolphintabpage.h"

#include <QTabWidget>
#include <QUrl>

#include <optional>

class DolphinViewContainer;
class KConfigGroup;

class DolphinTabWidget : public QTabWidget
{
    Q_OBJECT

public:
    /**
     * @param navigatorsWidget The navigatorsWidget which is always going to be connected
     *                         to the active tabPage.
     */
    explicit DolphinTabWidget(DolphinNavigatorsWidgetAction *navigatorsWidget, QWidget *parent);

    /**
     * Where a newly opened tab should be placed.
     */
    enum class NewTabPosition {
        FollowSetting, ///< Honor openNewTabAfterLastTab setting
        AfterCurrent, ///< After the current tab
        AtEnd, ///< At the end of the tab bar
    };

    /**
     * @return Tab page at the current index (can be 0 if tabs count is smaller than 1)
     */
    DolphinTabPage *currentTabPage() const;

    /**
     * @return the next tab page. If the current active tab is the last tab,
     * it returns the first tab. If there is only one tab, returns nullptr
     */
    DolphinTabPage *nextTabPage() const;

    /**
     * @return the previous tab page. If the current active tab is the first tab,
     * it returns the last tab. If there is only one tab, returns nullptr
     */
    DolphinTabPage *prevTabPage() const;

    /**
     * @return Tab page at the given \a index (can be 0 if the index is out-of-range)
     */
    DolphinTabPage *tabPageAt(const int index) const;

    void saveProperties(KConfigGroup &group) const;
    void readProperties(const KConfigGroup &group);

    /**
     * Refreshes the views of the main window by recreating them according to
     * the given Dolphin settings.
     */
    void refreshViews();

    /**
     * Update the name of the tab with the index \a index.
     */
    void updateTabName(int index);

    /**
     * @return Whether any of the tab pages has @p url opened
     * in their primary or secondary view.
     */
    bool isUrlOpen(const QUrl &url) const;

    /**
     * @return Whether the item with @p url can be found in any view only by switching
     * between already open tabs and scrolling in their primary or secondary view.
     */
    bool isItemVisibleInAnyView(const QUrl &urlOfItem) const;

Q_SIGNALS:
    /**
     * Is emitted when the active view has been changed, by changing the current
     * tab or by activating another view when split view is enabled in the current
     * tab.
     */
    void activeViewChanged(DolphinViewContainer *viewContainer);

    /**
     * Is emitted when the number of open tabs has changed (e.g. by opening or
     * closing a tab)
     */
    void tabCountChanged(int count);

    /**
     * Is emitted when a tab has been closed.
     */
    void rememberClosedTab(const QUrl &url, const QByteArray &state);

    /**
     * Is emitted when the url of the current tab has been changed. This signal
     * is also emitted when the active view has been changed.
     */
    void currentUrlChanged(const QUrl &url);

    /**
     * Is emitted when the url of any tab has been changed (including the current tab).
     */
    void urlChanged(const QUrl &url);

public Q_SLOTS:
    /**
     * Opens a new view with the current URL that is part of a tab and activates
     * the tab.
     */
    void openNewActivatedTab();

    /**
     * Opens a new tab showing the  URL \a primaryUrl and the optional URL
     * \a secondaryUrl and activates the tab.
     */
    void openNewActivatedTab(const QUrl &primaryUrl, const QUrl &secondaryUrl = QUrl());

    /**
     * Opens a new tab in the background showing the URL \a primaryUrl and the
     * optional URL \a secondaryUrl.
     */
    void openNewTab(const QUrl &primaryUrl,
                    const QUrl &secondaryUrl = QUrl(),
                    DolphinTabWidget::NewTabPosition position = DolphinTabWidget::NewTabPosition::FollowSetting);

    /**
     * Opens each directory in \p dirs in a separate tab unless it is already open.
     * If \a splitView is set, 2 directories are collected within one tab.
     * \pre \a dirs must contain at least one url.
     */
    void openDirectories(const QList<QUrl> &dirs, bool splitView);

    /**
     * Opens the directories which contain the files \p files and selects all files.
     * If \a splitView is set, 2 directories are collected within one tab.
     * \pre \a files must contain at least one url.
     */
    void openFiles(const QList<QUrl> &files, bool splitView);

    /**
     * Closes the currently active tab.
     */
    void closeTab();

    /**
     * Closes the tab with the index \a index and activates the tab with index - 1.
     */
    void closeTab(const int index);

    /**
     * Activates the tab with the index \a index.
     */
    void activateTab(const int index);

    /**
     * Activates the last tab in the tab bar.
     */
    void activateLastTab();

    /**
     * Activates the next tab in the tab bar.
     * If the current active tab is the last tab, it activates the first tab.
     */
    void activateNextTab();

    /**
     * Activates the previous tab in the tab bar.
     * If the current active tab is the first tab, it activates the last tab.
     */
    void activatePrevTab();

    /**
     * Is called when the user wants to reopen a previously closed tab from
     * the recent tabs menu.
     */
    void restoreClosedTab(const QByteArray &state);

    /** Copies all selected items to the inactive view. */
    void copyToInactiveSplitView();

    /** Moves all selected items to the inactive view. */
    void moveToInactiveSplitView();

private Q_SLOTS:
    /**
     * Opens the tab with the index \a index in a new Dolphin instance and closes
     * this tab.
     */
    void detachTab(int index);

    /**
     * Opens a new tab showing the url from tab at the given \a index and
     * activates the tab.
     */
    void openNewActivatedTab(int index);

    /**
     * Is connected to the KTabBar signal receivedDragMoveEvent.
     * Allows dragging and dropping files onto tabs.
     */
    void tabDragMoveEvent(int tab, QDragMoveEvent *event);

    /**
     * Is connected to the KTabBar signal receivedDropEvent.
     * Allows dragging and dropping files onto tabs.
     */
    void tabDropEvent(int tab, QDropEvent *event);

    /**
     * The active view url of a tab has been changed so update the text and the
     * icon of the corresponding tab.
     */
    void tabUrlChanged(const QUrl &url);

    void currentTabChanged(int index);

protected:
    void tabInserted(int index) override;
    void tabRemoved(int index) override;

private:
    /**
     * @param tabPage The tab page to get the name of
     * @return The name of the tab page
     */
    QString tabName(DolphinTabPage *tabPage) const;

    struct ViewIndex {
        const int tabIndex;
        const bool isInPrimaryView;
    };

    /**
     * Getter for a view container.
     * @param viewIndex specifies the tab and the view within that tab.
     * @return the view container specified in @p viewIndex or nullptr if it doesn't exist.
     */
    DolphinViewContainer *viewContainerAt(ViewIndex viewIndex) const;

    /**
     * Makes the view container specified in @p viewIndex become the active view container within this tab widget.
     * @param viewIndex Specifies the tab to activate and the view container within the tab to activate.
     * @return the freshly activated view container or nullptr if there is no view container at @p viewIndex.
     */
    DolphinViewContainer *activateViewContainerAt(ViewIndex viewIndex);

    /**
     * Get the position of the view within this widget that is open at @p directory.
     * @param directory The URL of the directory we want to find.
     * @return a small struct containing the tab index of the view and whether it is
     * in the primary view. A std::nullopt is returned if there is no view open for @p directory.
     */
    const std::optional<const ViewIndex> viewOpenAtDirectory(const QUrl &directory) const;

    /**
     * Get the position of the view within this widget that has @p item in the view.
     * This means that the item can be seen by the user in that view when scrolled to the right position.
     * If the view has folders expanded and @p item is one of them, the view will also be returned.
     * @param item The URL of the item we want to find.
     * @return a small struct containing the tab index of the view and whether it is
     * in the primary view. A std::nullopt is returned if there is no view open that has @p item visible anywhere.
     */
    const std::optional<const ViewIndex> viewShowingItem(const QUrl &item) const;

private:
    QPointer<DolphinTabPage> m_lastViewedTab;
    QPointer<DolphinNavigatorsWidgetAction> m_navigatorsWidget;
};

#endif