X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/f46e630ddaaf5716cd1a1ce0c389ff66dcd76f85..c6bccbf6de33ba907f1cddfa64dadb8cfeea4d2c:/src/dolphintabpage.h diff --git a/src/dolphintabpage.h b/src/dolphintabpage.h index 63a246328..a8c1ba311 100644 --- a/src/dolphintabpage.h +++ b/src/dolphintabpage.h @@ -1,5 +1,6 @@ /* * SPDX-FileCopyrightText: 2014 Emmanuel Pescosta + * SPDX-FileCopyrightText: 2020 Felix Ernst * * SPDX-License-Identifier: GPL-2.0-or-later */ @@ -10,11 +11,18 @@ #include #include #include +#include class DolphinNavigatorsWidgetAction; class DolphinViewContainer; -class QSplitter; +class QVariantAnimation; class KFileItemList; +class DolphinTabPageSplitter; + +enum Animated { + WithAnimation, + WithoutAnimation +}; class DolphinTabPage : public QWidget { @@ -36,9 +44,15 @@ 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, const QUrl &secondaryUrl = QUrl()); + void setSplitViewEnabled(bool enabled, Animated animated, const QUrl &secondaryUrl = QUrl()); /** * @return The primary view container. @@ -80,19 +94,8 @@ public: */ void disconnectNavigators(); - /** - * Calls resizeNavigators() when a watched object is resized. - */ - bool eventFilter(QObject *watched, QEvent *event) override; - void insertNavigatorsWidget(DolphinNavigatorsWidgetAction *navigatorsWidget); - /** - * Notify the connected DolphinNavigatorsWidgetAction of geometry changes which it - * needs for visual alignment. - */ - void resizeNavigators() const; - /** * Marks the items indicated by \p urls to get selected after the * directory DolphinView::url() has been loaded. Note that nothing @@ -126,27 +129,29 @@ public: */ void restoreState(const QByteArray& state); - /** - * Restores all tab related properties (urls, splitter layout, ...) from - * the given \a state. - * - * @deprecated The first tab state version has no version number, we keep - * this method to restore old states (<= Dolphin 4.14.x). - */ - Q_DECL_DEPRECATED void restoreStateV1(const QByteArray& state); - /** * Set whether the tab page is active * */ void setActive(bool active); -signals: +Q_SIGNALS: void activeViewChanged(DolphinViewContainer* viewContainer); void activeViewUrlChanged(const QUrl& url); void splitterMoved(int pos, int index); -private slots: +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. * @@ -170,16 +175,59 @@ private: */ 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