X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/cdebd199251bbdf2826bcc65fe0483420d4a6784..f9baca9288187cf9e9a58a3e8d4c2ad2155d6f46:/src/dolphintabpage.h diff --git a/src/dolphintabpage.h b/src/dolphintabpage.h index de5a58915..a8c1ba311 100644 --- a/src/dolphintabpage.h +++ b/src/dolphintabpage.h @@ -1,39 +1,35 @@ -/*************************************************************************** - * Copyright (C) 2014 by Emmanuel Pescosta * - * * - * 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 + * SPDX-FileCopyrightText: 2020 Felix Ernst + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ #ifndef DOLPHIN_TAB_PAGE_H #define DOLPHIN_TAB_PAGE_H -#include #include -#include +#include +#include +#include -class QSplitter; +class DolphinNavigatorsWidgetAction; class DolphinViewContainer; +class QVariantAnimation; class KFileItemList; +class DolphinTabPageSplitter; + +enum Animated { + WithAnimation, + WithoutAnimation +}; class DolphinTabPage : public QWidget { Q_OBJECT public: - explicit DolphinTabPage(const KUrl& primaryUrl, const KUrl& secondaryUrl = KUrl(), QWidget* parent = 0); + explicit DolphinTabPage(const QUrl& primaryUrl, const QUrl& secondaryUrl = QUrl(), QWidget* parent = nullptr); /** * @return True if primary view is the active view in this tab. @@ -48,17 +44,23 @@ public: /** * Enables or disables the split view mode. * - * If \a enabled is true, it creates a secondary view with the url of the primary view. + * @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); + void setSplitViewEnabled(bool enabled, Animated animated, const QUrl &secondaryUrl = QUrl()); /** - * @return The primary view containter. + * @return The primary view container. */ DolphinViewContainer* primaryViewContainer() const; /** - * @return The secondary view containter, can be 0 if split view is disabled. + * @return The secondary view container, can be 0 if split view is disabled. */ DolphinViewContainer* secondaryViewContainer() const; @@ -79,27 +81,34 @@ public: */ 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& urls); + void markUrlsAsSelected(const QList &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 KUrl& url); - - /** - * Sets the places selector visible, if \a visible is true. - * The places selector allows to select the places provided - * by the places model passed in the constructor. Per default - * the places selector is visible. - */ - void setPlacesSelectorVisible(bool visible); + void markUrlAsCurrent(const QUrl& url); /** * Refreshes the views of the main window by recreating them according to @@ -120,11 +129,29 @@ public: */ void restoreState(const QByteArray& state); -signals: + /** + * Set whether the tab page is active + * + */ + void setActive(bool active); + +Q_SIGNALS: void activeViewChanged(DolphinViewContainer* viewContainer); - void activeViewUrlChanged(const KUrl& url); + 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); -private slots: /** * Handles the view activated event. * @@ -138,22 +165,69 @@ private slots: * * It emits the activeViewUrlChanged signal with the url \a newUrl. */ - void slotViewUrlRedirection(const KUrl& oldUrl, const KUrl& newUrl); + void slotViewUrlRedirection(const QUrl& oldUrl, const QUrl& newUrl); + + void switchActiveView(); private: /** * Creates a new view container and does the default initialization. */ - DolphinViewContainer* createViewContainer(const KUrl& url) const; + 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: - QSplitter* m_splitter; + DolphinTabPageSplitter *m_splitter; + QPointer m_navigatorsWidget; QPointer m_primaryViewContainer; QPointer m_secondaryViewContainer; + DolphinViewContainer *m_expandingContainer; + QPointer m_expandViewAnimation; + bool m_primaryViewActive; bool m_splitViewEnabled; + bool m_active; +}; + +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