aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/advanceddockingsystem/dockmanager.h
diff options
context:
space:
mode:
authorHenning Gruendl <[email protected]>2020-01-24 17:13:32 +0100
committerHenning Gründl <[email protected]>2020-02-20 16:14:52 +0000
commit8f686e985c033466bdc49afd75f88296ef0576bd (patch)
tree1e78b6dce41a812004819c9ee820e6e80ff2f3fd /src/libs/advanceddockingsystem/dockmanager.h
parent61932b5d4b16eb2d6c4bf70d8b7138b1c21f0f40 (diff)
Add Advanced Docking System library
This library is a fork of the following repository https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System Development started from the following commit 1de42a9766134eecd2611c2b4e209d3e0ede74d2 Incorporate all commits until 3ffbbfb6d01ff211d8349027221a19b1419296b5 - Rename variables and files to follow the Qt style guide - General code cleanup (remove goto, fix typos, add overrides, remove explicit slots specifier, replace string-based with functor-based connections, replace dynamic_cast with qobject_cast) - Replace most preprocessor instructions Q_OS_LINUX/Q_OS_MACOS with Utils::HostOsInfo - Remove all QT_VERSION preprocessor instructions below 5.11 - Change loading and storage of workspaces. Store workspaces in separate file instead of a list in the Settings.ini - Add workspace dialog, model and view for managing workspaces - Rename XML tags and use enum/bool instead of ascii art/numbers as attribute values. Use base64 instead of hex for storing geometry info - Remove internal style sheets - Add more build systems (qmake, qbs) - Adapt copyright header - Remove unix specific build rules - Replace ADS_PRINT with QLoggingCategory - Replace Java-style with STL-style iterators Change-Id: Icf8c2fbaccec9680df83c6e2100e3446a090a437 Reviewed-by: Alessandro Portale <[email protected]>
Diffstat (limited to 'src/libs/advanceddockingsystem/dockmanager.h')
-rw-r--r--src/libs/advanceddockingsystem/dockmanager.h478
1 files changed, 478 insertions, 0 deletions
diff --git a/src/libs/advanceddockingsystem/dockmanager.h b/src/libs/advanceddockingsystem/dockmanager.h
new file mode 100644
index 00000000000..c5236911d75
--- /dev/null
+++ b/src/libs/advanceddockingsystem/dockmanager.h
@@ -0,0 +1,478 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 Uwe Kindler
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or (at your option) any later version.
+** The licenses are as published by the Free Software Foundation
+** and appearing in the file LICENSE.LGPLv21 included in the packaging
+** of this file. Please review the following information to ensure
+** the GNU Lesser General Public License version 2.1 requirements
+** will be met: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#pragma once
+
+#include "ads_globals.h"
+#include "dockcontainerwidget.h"
+#include "dockwidget.h"
+#include "floatingdockcontainer.h"
+
+#include <utils/persistentsettings.h>
+
+#include <QByteArray>
+#include <QDateTime>
+#include <QFlags>
+#include <QList>
+#include <QMap>
+#include <QString>
+#include <QStringList>
+#include <QtGui/QIcon>
+#include <qobjectdefs.h>
+
+class QSettings;
+class QMenu;
+
+namespace ADS {
+
+namespace Constants {
+const char FACTORY_DEFAULT_NAME[] = "factorydefault";
+const char DEFAULT_NAME[] = "default";
+const char STARTUP_WORKSPACE_SETTINGS_KEY[] = "QML/Designer/StartupWorkspace";
+const char AUTO_RESTORE_WORKSPACE_SETTINGS_KEY[] = "QML/Designer/AutoRestoreLastWorkspace";
+} // namespace Constants
+
+struct DockManagerPrivate;
+class FloatingDockContainer;
+struct FloatingDockContainerPrivate;
+class DockComponentsFactory;
+class DockContainerWidget;
+class DockContainerWidgetPrivate;
+class DockOverlay;
+class DockAreaTabBar;
+class DockWidgetTab;
+struct DockWidgetTabPrivate;
+struct DockAreaWidgetPrivate;
+class IconProvider;
+
+/**
+ * The central dock manager that maintains the complete docking system.
+ * With the configuration flags you can globally control the functionality
+ * of the docking system. The dock manager uses an internal stylesheet to
+ * style its components like splitters, tabs and buttons. If you want to
+ * disable this stylesheet because your application uses its own,
+ * just call the function for settings the stylesheet with an empty
+ * string.
+ * \code
+ * dockManager->setStyleSheet("");
+ * \endcode
+ **/
+class ADS_EXPORT DockManager : public DockContainerWidget
+{
+ Q_OBJECT
+private:
+ DockManagerPrivate *d; ///< private data (pimpl)
+ friend struct DockManagerPrivate;
+ friend class FloatingDockContainer;
+ friend struct FloatingDockContainerPrivate;
+ friend class DockContainerWidget;
+ friend class DockContainerWidgetPrivate;
+ friend class DockAreaTabBar;
+ friend class DockWidgetTab;
+ friend struct DockAreaWidgetPrivate;
+ friend struct DockWidgetTabPrivate;
+ friend class FloatingDragPreview;
+ friend struct FloatingDragPreviewPrivate;
+ friend class DockAreaTitleBar;
+
+protected:
+ /**
+ * Registers the given floating widget in the internal list of
+ * floating widgets
+ */
+ void registerFloatingWidget(FloatingDockContainer *floatingWidget);
+
+ /**
+ * Remove the given floating widget from the list of registered floating
+ * widgets
+ */
+ void removeFloatingWidget(FloatingDockContainer *floatingWidget);
+
+ /**
+ * Registers the given dock container widget
+ */
+ void registerDockContainer(DockContainerWidget *dockContainer);
+
+ /**
+ * Remove dock container from the internal list of registered dock
+ * containers
+ */
+ void removeDockContainer(DockContainerWidget *dockContainer);
+
+ /**
+ * Overlay for containers
+ */
+ DockOverlay *containerOverlay() const;
+
+ /**
+ * Overlay for dock areas
+ */
+ DockOverlay *dockAreaOverlay() const;
+
+ /**
+ * Show the floating widgets that has been created floating
+ */
+ virtual void showEvent(QShowEvent *event) override;
+
+public:
+ using Super = DockContainerWidget;
+
+ /**
+ * These global configuration flags configure some global dock manager
+ * settings.
+ */
+ enum eConfigFlag {
+ ActiveTabHasCloseButton
+ = 0x0001, //!< If this flag is set, the active tab in a tab area has a close button
+ DockAreaHasCloseButton
+ = 0x0002, //!< If the flag is set each dock area has a close button
+ DockAreaCloseButtonClosesTab
+ = 0x0004, //!< If the flag is set, the dock area close button closes the active tab, if not set, it closes the complete dock area
+ OpaqueSplitterResize
+ = 0x0008, //!< See QSplitter::setOpaqueResize() documentation
+ XmlAutoFormattingEnabled
+ = 0x0010, //!< If enabled, the XML writer automatically adds line-breaks and indentation to empty sections between elements (ignorable whitespace).
+ XmlCompressionEnabled
+ = 0x0020, //!< If enabled, the XML output will be compressed and is not human readable anymore
+ TabCloseButtonIsToolButton
+ = 0x0040, //! If enabled the tab close buttons will be QToolButtons instead of QPushButtons - disabled by default
+ AllTabsHaveCloseButton
+ = 0x0080, //!< if this flag is set, then all tabs that are closable show a close button
+ RetainTabSizeWhenCloseButtonHidden
+ = 0x0100, //!< if this flag is set, the space for the close button is reserved even if the close button is not visible
+ OpaqueUndocking
+ = 0x0200, ///< If enabled, the widgets are immediately undocked into floating widgets, if disabled, only a draw preview is undocked and the real undocking is deferred until the mouse is released
+ DragPreviewIsDynamic
+ = 0x0400, ///< If opaque undocking is disabled, this flag defines the behavior of the drag preview window, if this flag is enabled, the preview will be adjusted dynamically to the drop area
+ DragPreviewShowsContentPixmap
+ = 0x0800, ///< If opaque undocking is disabled, the created drag preview window shows a copy of the content of the dock widget / dock are that is dragged
+ DragPreviewHasWindowFrame
+ = 0x1000, ///< If opaque undocking is disabled, then this flag configures if the drag preview is frameless or looks like a real window
+ AlwaysShowTabs
+ = 0x2000, ///< If this option is enabled, the tab of a dock widget is always displayed - even if it is the only visible dock widget in a floating widget.
+ DockAreaHasUndockButton
+ = 0x4000, //!< If the flag is set each dock area has an undock button
+ DockAreaHasTabsMenuButton
+ = 0x8000, //!< If the flag is set each dock area has a tabs menu button
+ DockAreaHideDisabledButtons
+ = 0x10000, //!< If the flag is set disabled dock area buttons will not appear on the tollbar at all (enabling them will bring them back)
+ DockAreaDynamicTabsMenuButtonVisibility
+ = 0x20000, //!< If the flag is set dock area will disable a tabs menu button when there is only one tab in the area
+ FloatingContainerHasWidgetTitle
+ = 0x40000,
+ FloatingContainerHasWidgetIcon
+ = 0x80000,
+
+ DefaultDockAreaButtons = DockAreaHasCloseButton
+ | DockAreaHasUndockButton
+ | DockAreaHasTabsMenuButton,///< default configuration of dock area title bar buttons
+
+ DefaultBaseConfig = DefaultDockAreaButtons
+ | ActiveTabHasCloseButton
+ | XmlCompressionEnabled
+ | FloatingContainerHasWidgetTitle,///< default base configuration settings
+
+ DefaultOpaqueConfig = DefaultBaseConfig
+ | OpaqueSplitterResize
+ | OpaqueUndocking, ///< the default configuration with opaque operations - this may cause issues if ActiveX or Qt 3D windows are involved
+
+ DefaultNonOpaqueConfig = DefaultBaseConfig
+ | DragPreviewShowsContentPixmap, ///< the default configuration for non opaque operations
+
+ NonOpaqueWithWindowFrame = DefaultNonOpaqueConfig
+ | DragPreviewHasWindowFrame ///< the default configuration for non opaque operations that show a real window with frame
+ };
+ Q_DECLARE_FLAGS(ConfigFlags, eConfigFlag)
+
+ /**
+ * Default Constructor.
+ * If the given parent is a QMainWindow, the dock manager sets itself as the
+ * central widget.
+ * Before you create any dock widgets, you should properly setup the
+ * configuration flags via setConfigFlags().
+ */
+ DockManager(QWidget *parent = nullptr);
+
+ /**
+ * Virtual Destructor
+ */
+ virtual ~DockManager() override;
+
+ /**
+ * This function returns the global configuration flags
+ */
+ static ConfigFlags configFlags();
+
+ /**
+ * Sets the global configuration flags for the whole docking system.
+ * Call this function before you create your first dock widget.
+ */
+ static void setConfigFlags(const ConfigFlags flags);
+
+ /**
+ * Set a certain config flag
+ */
+ static void setConfigFlag(eConfigFlag flag, bool on = true);
+
+ /**
+ * Returns true if the given config flag is set
+ */
+ static bool testConfigFlag(eConfigFlag flag);
+
+ /**
+ * Returns the global icon provider.
+ * The icon provider enables the use of custom icons in case using
+ * styleheets for icons is not an option.
+ */
+ static IconProvider &iconProvider();
+
+ /**
+ * The distance the user needs to move the mouse with the left button
+ * hold down before a dock widget start floating
+ */
+ static int startDragDistance();
+
+ /**
+ * Set the QtCreator settings.
+ */
+ void setSettings(QSettings *settings);
+
+ /**
+ * Adds dockwidget into the given area.
+ * If DockAreaWidget is not null, then the area parameter indicates the area
+ * into the DockAreaWidget. If DockAreaWidget is null, the Dockwidget will
+ * be dropped into the container. If you would like to add a dock widget
+ * tabified, then you need to add it to an existing dock area object
+ * into the CenterDockWidgetArea. The following code shows this:
+ * \code
+ * DockManager->addDockWidget(ads::CenterDockWidgetArea, NewDockWidget,
+ * ExisitingDockArea);
+ * \endcode
+ * \return Returns the dock area widget that contains the new DockWidget
+ */
+ DockAreaWidget *addDockWidget(DockWidgetArea area,
+ DockWidget *dockWidget,
+ DockAreaWidget *dockAreaWidget = nullptr);
+
+ /**
+ * This function will add the given Dockwidget to the given dock area as
+ * a new tab.
+ * If no dock area widget exists for the given area identifier, a new
+ * dock area widget is created.
+ */
+ DockAreaWidget *addDockWidgetTab(DockWidgetArea area, DockWidget *dockWidget);
+
+ /**
+ * This function will add the given Dockwidget to the given DockAreaWidget
+ * as a new tab.
+ */
+ DockAreaWidget *addDockWidgetTabToArea(DockWidget *dockWidget, DockAreaWidget *dockAreaWidget);
+
+ /**
+ * Adds the given DockWidget floating and returns the created
+ * CFloatingDockContainer instance.
+ */
+ FloatingDockContainer *addDockWidgetFloating(DockWidget *dockWidget);
+
+ /**
+ * Searches for a registered doc widget with the given ObjectName
+ * \return Return the found dock widget or nullptr if a dock widget with the
+ * given name is not registered
+ */
+ DockWidget *findDockWidget(const QString &objectName) const;
+
+ /**
+ * Remove the given Dock from the dock manager
+ */
+ void removeDockWidget(DockWidget *dockWidget);
+
+ /**
+ * This function returns a readable reference to the internal dock
+ * widgets map so that it is possible to iterate over all dock widgets
+ */
+ QMap<QString, DockWidget *> dockWidgetsMap() const;
+
+ /**
+ * Returns the list of all active and visible dock containers
+ * Dock containers are the main dock manager and all floating widgets
+ */
+ const QList<DockContainerWidget *> dockContainers() const;
+
+ /**
+ * Returns the list of all floating widgets
+ */
+ const QList<FloatingDockContainer *> floatingWidgets() const;
+
+ /**
+ * This function always return 0 because the main window is always behind
+ * any floating widget
+ */
+ virtual unsigned int zOrderIndex() const override;
+
+ /**
+ * Saves the current state of the dockmanger and all its dock widgets
+ * into the returned QByteArray.
+ * The XmlMode enables / disables the auto formatting for the XmlStreamWriter.
+ * If auto formatting is enabled, the output is intended and line wrapped.
+ * The XmlMode XmlAutoFormattingDisabled is better if you would like to have
+ * a more compact XML output - i.e. for storage in ini files.
+ */
+ QByteArray saveState(int version = Version1) const;
+
+ /**
+ * Restores the state of this dockmanagers dockwidgets.
+ * The version number is compared with that stored in state. If they do
+ * not match, the dockmanager's state is left unchanged, and this function
+ * returns false; otherwise, the state is restored, and this function
+ * returns true.
+ */
+ bool restoreState(const QByteArray &state, int version = Version1);
+
+ /**
+ * This function returns true between the restoringState() and
+ * stateRestored() signals.
+ */
+ bool isRestoringState() const;
+
+signals:
+ /**
+ * This signal is emitted if the list of perspectives changed
+ */
+ void workspaceListChanged();
+
+ /**
+ * This signal is emitted if perspectives have been removed
+ */
+ void workspacesRemoved();
+
+ /**
+ * This signal is emitted, if the restore function is called, just before
+ * the dock manager starts restoring the state.
+ * If this function is called, nothing has changed yet
+ */
+ void restoringState();
+
+ /**
+ * This signal is emitted if the state changed in restoreState.
+ * The signal is emitted if the restoreState() function is called or
+ * if the openWorkspace() function is called
+ */
+ void stateRestored();
+
+ /**
+ * This signal is emitted, if the dock manager starts opening a
+ * perspective.
+ * Opening a perspective may take more than a second if there are
+ * many complex widgets. The application may use this signal
+ * to show some progress indicator or to change the mouse cursor
+ * into a busy cursor.
+ */
+ void openingWorkspace(const QString &workspaceName);
+
+ /**
+ * This signal is emitted if the dock manager finished opening a
+ * perspective
+ */
+ void workspaceOpened(const QString &workspaceName);
+
+ /**
+ * This signal is emitted, if a new floating widget has been created.
+ * An application can use this signal to e.g. subscribe to events of
+ * the newly created window.
+ */
+ void floatingWidgetCreated(FloatingDockContainer *floatingWidget);
+
+ /**
+ * This signal is emitted, if a new DockArea has been created.
+ * An application can use this signal to set custom icons or custom
+ * tooltips for the DockArea buttons.
+ */
+ void dockAreaCreated(DockAreaWidget *dockArea);
+
+ /**
+ * This signal is emitted just before the given dock widget is removed
+ * from the
+ */
+ void dockWidgetAboutToBeRemoved(DockWidget *dockWidget);
+
+ /**
+ * This signal is emitted if a dock widget has been removed with the remove
+ * removeDockWidget() function.
+ * If this signal is emitted, the dock widget has been removed from the
+ * docking system but it is not deleted yet.
+ */
+ void dockWidgetRemoved(DockWidget *dockWidget);
+
+public:
+ void showWorkspaceMananger();
+
+ // higher level workspace management
+ QString activeWorkspace() const;
+ QString lastWorkspace() const;
+ bool autoRestorLastWorkspace() const;
+ QStringList workspaces();
+ QDateTime workspaceDateTime(const QString &workspace) const;
+ Utils::FilePath workspaceNameToFileName(const QString &workspaceName) const;
+
+ bool createWorkspace(const QString &workspace);
+
+ bool openWorkspace(const QString &workspace);
+
+ bool confirmWorkspaceDelete(const QStringList &workspaces);
+ bool deleteWorkspace(const QString &workspace);
+ void deleteWorkspaces(const QStringList &workspaces);
+
+ bool cloneWorkspace(const QString &original, const QString &clone);
+ bool renameWorkspace(const QString &original, const QString &newName);
+
+ bool save();
+
+ bool isFactoryDefaultWorkspace(const QString &workspace) const;
+ bool isDefaultWorkspace(const QString &workspace) const;
+
+signals:
+ void aboutToUnloadWorkspace(QString workspaceName);
+ void aboutToLoadWorkspace(QString workspaceName);
+ void workspaceLoaded(QString workspaceName);
+ void aboutToSaveWorkspace();
+
+private:
+ bool write(const QByteArray &data, QString *errorString) const;
+#ifdef QT_GUI_LIB
+ bool write(const QByteArray &data, QWidget *parent) const;
+#endif
+}; // class DockManager
+
+} // namespace ADS