]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphintabwidget.h
Add helper methods to tab widget for view containers
[dolphin.git] / src / dolphintabwidget.h
index 4351a40a837ded13f4e41347dd611f54be93d81f..24d9e228b4ff9dafcf172af60cc3f4f616c5ed4f 100644 (file)
@@ -1,30 +1,21 @@
-/***************************************************************************
- * Copyright (C) 2014 by Emmanuel Pescosta <emmanuelpescosta099@gmail.com> *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program 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 General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
- ***************************************************************************/
+/*
+ * SPDX-FileCopyrightText: 2014 Emmanuel Pescosta <emmanuelpescosta099@gmail.com>
+ *
+ * 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 DolphinTabPage;
 class KConfigGroup;
 
 class DolphinTabWidget : public QTabWidget
@@ -32,20 +23,21 @@ class DolphinTabWidget : public QTabWidget
     Q_OBJECT
 
 public:
+
     /**
-     * @brief Controls where tabs are placed
-     */
-    enum TabPlacement {
-        /**
-          * The new tab is placed after the current tab
-          */
-        AfterCurrentTab,
-        /**
-          * The new tab is placed after the last tab
-          */
-        AfterLastTab
+     * @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
     };
-    explicit DolphinTabWidget(QWidget* parent);
 
     /**
      * @return Tab page at the current index (can be 0 if tabs count is smaller than 1)
@@ -79,12 +71,18 @@ public:
     void refreshViews();
 
     /**
-     * @return Whether any of the tab pages contains @p url in their primary
-     * or secondary view.
+     * @return Whether any of the tab pages has @p url opened
+     * in their primary or secondary view.
      */
     bool isUrlOpen(const QUrl& url) const;
 
-signals:
+    /**
+     * @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
@@ -109,7 +107,7 @@ signals:
      */
     void currentUrlChanged(const QUrl& url);
 
-public slots:
+public Q_SLOTS:
     /**
      * Opens a new view with the current URL that is part of a tab and activates
      * the tab.
@@ -124,15 +122,13 @@ public slots:
 
     /**
      * Opens a new tab in the background showing the URL \a primaryUrl and the
-     * optional URL \a secondaryUrl. \a tabPlacement controls where the new tab
-     * is placed.
+     * optional URL \a secondaryUrl.
      */
-    void openNewTab(const QUrl &primaryUrl, const QUrl &secondaryUrl = QUrl(),
-                    DolphinTabWidget::TabPlacement tabPlacement = AfterLastTab);
+    void openNewTab(const QUrl &primaryUrl, const QUrl &secondaryUrl = QUrl(), NewTabPosition position = NewTabPosition::FollowSetting);
 
     /**
-     * Opens each directory in \p dirs in a separate tab. If \a splitView is set,
-     * 2 directories are collected within one tab.
+     * 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);
@@ -154,6 +150,16 @@ public slots:
      */
     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.
@@ -166,20 +172,19 @@ public slots:
      */
     void activatePrevTab();
 
-    /**
-     * Is invoked if the Places panel got visible/invisible and takes care
-     * that the places-selector of all views is only shown if the Places panel
-     * is invisible.
-     */
-    void slotPlacesPanelVisibilityChanged(bool visible);
-
     /**
      * Is called when the user wants to reopen a previously closed tab from
      * the recent tabs menu.
      */
     void restoreClosedTab(const QByteArray& state);
 
-private slots:
+    /** 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.
@@ -217,21 +222,46 @@ private:
      */
     QString tabName(DolphinTabPage* tabPage) const;
 
+    struct ViewIndex {
+        const int tabIndex;
+        const bool isInPrimaryView;
+    };
+
     /**
-     * @param url The URL that we would like
-     * @return a QPair with first containing the index of the tab with the
-     * desired URL or -1 if not found. Second says true if URL is in primary
-     * view container, false otherwise. False means the URL is in the secondary
-     * view container, unless first == -1. In that case the value of second
-     * is meaningless.
+     * 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.
      */
-    QPair<int, bool> indexByUrl(const QUrl& url) const;
+    DolphinViewContainer *viewContainerAt(ViewIndex viewIndex) const;
 
-private:
-    /** Caches the (negated) places panel visibility */
-    bool m_placesSelectorVisible;
+    /**
+     * 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;
 
-    int m_lastViewedTab;
+    /**
+     * 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