blob: 9f84ee95dbdb61cac719900274548d9c52b04023 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the QtWidgets module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** 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 http://www.qt.io/terms-conditions. For further
** information use the contact form at http://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 version 3 as published by the Free
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
** following information to ensure the GNU Lesser General Public License
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** As a special exception, The Qt Company gives you certain additional
** rights. These rights are described in The Qt Company LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QDYNAMICMAINWINDOWLAYOUT_P_H
#define QDYNAMICMAINWINDOWLAYOUT_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include "qmainwindow.h"
#ifndef QT_NO_MAINWINDOW
#include "QtWidgets/qlayout.h"
#include "QtWidgets/qtabbar.h"
#include "QtCore/qvector.h"
#include "QtCore/qset.h"
#include "QtCore/qbasictimer.h"
#include "private/qlayoutengine_p.h"
#include "private/qwidgetanimator_p.h"
#include "qdockarealayout_p.h"
#include "qtoolbararealayout_p.h"
#ifdef Q_DEAD_CODE_FROM_QT4_MAC
// Forward defs to make avoid including Carbon.h (faster compile you know ;).
struct OpaqueHIObjectRef;
typedef struct OpaqueHIObjectRef* HIObjectRef;
typedef HIObjectRef HIToolbarItemRef;
typedef const void * CFTypeRef;
typedef const struct __CFString * CFStringRef;
#include <private/qunifiedtoolbarsurface_mac_p.h>
#endif // Q_DEAD_CODE_FROM_QT4_MAC
QT_BEGIN_NAMESPACE
class QToolBar;
class QRubberBand;
/* This data structure represents the state of all the tool-bars and dock-widgets. It's value based
so it can be easilly copied into a temporary variable. All operations are performed without moving
any widgets. Only when we are sure we have the desired state, we call apply(), which moves the
widgets.
*/
class QMainWindowLayoutState
{
public:
QRect rect;
QMainWindow *mainWindow;
QMainWindowLayoutState(QMainWindow *win);
#ifndef QT_NO_TOOLBAR
QToolBarAreaLayout toolBarAreaLayout;
#endif
#ifndef QT_NO_DOCKWIDGET
QDockAreaLayout dockAreaLayout;
#else
QLayoutItem *centralWidgetItem;
QRect centralWidgetRect;
#endif
void apply(bool animated);
void deleteAllLayoutItems();
void deleteCentralWidgetItem();
QSize sizeHint() const;
QSize minimumSize() const;
void fitLayout();
QLayoutItem *itemAt(int index, int *x) const;
QLayoutItem *takeAt(int index, int *x);
QList<int> indexOf(QWidget *widget) const;
QLayoutItem *item(const QList<int> &path);
QRect itemRect(const QList<int> &path) const;
QRect gapRect(const QList<int> &path) const; // ### get rid of this, use itemRect() instead
bool contains(QWidget *widget) const;
void setCentralWidget(QWidget *widget);
QWidget *centralWidget() const;
QList<int> gapIndex(QWidget *widget, const QPoint &pos) const;
bool insertGap(const QList<int> &path, QLayoutItem *item);
void remove(const QList<int> &path);
void remove(QLayoutItem *item);
void clear();
bool isValid() const;
QLayoutItem *plug(const QList<int> &path);
QLayoutItem *unplug(const QList<int> &path, QMainWindowLayoutState *savedState = 0);
void saveState(QDataStream &stream) const;
bool checkFormat(QDataStream &stream);
bool restoreState(QDataStream &stream, const QMainWindowLayoutState &oldState);
};
class Q_AUTOTEST_EXPORT QMainWindowLayout : public QLayout
{
Q_OBJECT
public:
QMainWindowLayoutState layoutState, savedState;
QMainWindowLayout(QMainWindow *mainwindow, QLayout *parentLayout);
~QMainWindowLayout();
QMainWindow::DockOptions dockOptions;
void setDockOptions(QMainWindow::DockOptions opts);
bool usesHIToolBar(QToolBar *toolbar) const;
void timerEvent(QTimerEvent *e) Q_DECL_OVERRIDE;
// status bar
QLayoutItem *statusbar;
#ifndef QT_NO_STATUSBAR
QStatusBar *statusBar() const;
void setStatusBar(QStatusBar *sb);
#endif
// central widget
QWidget *centralWidget() const;
void setCentralWidget(QWidget *cw);
// toolbars
#ifndef QT_NO_TOOLBAR
void addToolBarBreak(Qt::ToolBarArea area);
void insertToolBarBreak(QToolBar *before);
void removeToolBarBreak(QToolBar *before);
void addToolBar(Qt::ToolBarArea area, QToolBar *toolbar, bool needAddChildWidget = true);
void insertToolBar(QToolBar *before, QToolBar *toolbar);
Qt::ToolBarArea toolBarArea(QToolBar *toolbar) const;
bool toolBarBreak(QToolBar *toolBar) const;
void getStyleOptionInfo(QStyleOptionToolBar *option, QToolBar *toolBar) const;
void removeToolBar(QToolBar *toolbar);
void toggleToolBarsVisible();
void moveToolBar(QToolBar *toolbar, int pos);
#endif
// dock widgets
#ifndef QT_NO_DOCKWIDGET
void setCorner(Qt::Corner corner, Qt::DockWidgetArea area);
Qt::DockWidgetArea corner(Qt::Corner corner) const;
void addDockWidget(Qt::DockWidgetArea area,
QDockWidget *dockwidget,
Qt::Orientation orientation);
void splitDockWidget(QDockWidget *after,
QDockWidget *dockwidget,
Qt::Orientation orientation);
void tabifyDockWidget(QDockWidget *first, QDockWidget *second);
Qt::DockWidgetArea dockWidgetArea(QDockWidget *dockwidget) const;
void raise(QDockWidget *widget);
void setVerticalTabsEnabled(bool enabled);
bool restoreDockWidget(QDockWidget *dockwidget);
#ifndef QT_NO_TABBAR
bool _documentMode;
bool documentMode() const;
void setDocumentMode(bool enabled);
QTabBar *getTabBar();
QSet<QTabBar*> usedTabBars;
QList<QTabBar*> unusedTabBars;
bool verticalTabsEnabled;
QWidget *getSeparatorWidget();
QSet<QWidget*> usedSeparatorWidgets;
QList<QWidget*> unusedSeparatorWidgets;
int sep; // separator extent
#ifndef QT_NO_TABWIDGET
QTabWidget::TabPosition tabPositions[4];
QTabWidget::TabShape _tabShape;
QTabWidget::TabShape tabShape() const;
void setTabShape(QTabWidget::TabShape tabShape);
QTabWidget::TabPosition tabPosition(Qt::DockWidgetArea area) const;
void setTabPosition(Qt::DockWidgetAreas areas, QTabWidget::TabPosition tabPosition);
#endif // QT_NO_TABWIDGET
#endif // QT_NO_TABBAR
// separators
QList<int> movingSeparator;
QPoint movingSeparatorOrigin, movingSeparatorPos;
QBasicTimer separatorMoveTimer;
bool startSeparatorMove(const QPoint &pos);
bool separatorMove(const QPoint &pos);
bool endSeparatorMove(const QPoint &pos);
void keepSize(QDockWidget *w);
#endif // QT_NO_DOCKWIDGET
// save/restore
enum { // sentinel values used to validate state data
VersionMarker = 0xff
};
void saveState(QDataStream &stream) const;
bool restoreState(QDataStream &stream);
// QLayout interface
void addItem(QLayoutItem *item) Q_DECL_OVERRIDE;
void setGeometry(const QRect &r) Q_DECL_OVERRIDE;
QLayoutItem *itemAt(int index) const Q_DECL_OVERRIDE;
QLayoutItem *takeAt(int index) Q_DECL_OVERRIDE;
int count() const Q_DECL_OVERRIDE;
QSize sizeHint() const Q_DECL_OVERRIDE;
QSize minimumSize() const Q_DECL_OVERRIDE;
mutable QSize szHint;
mutable QSize minSize;
void invalidate() Q_DECL_OVERRIDE;
// animations
QWidgetAnimator widgetAnimator;
QList<int> currentGapPos;
QRect currentGapRect;
QWidget *pluggingWidget;
#ifndef QT_NO_RUBBERBAND
QRubberBand *gapIndicator;
#endif
QList<int> hover(QLayoutItem *widgetItem, const QPoint &mousePos);
bool plug(QLayoutItem *widgetItem);
QLayoutItem *unplug(QWidget *widget);
void revert(QLayoutItem *widgetItem);
void updateGapIndicator();
void paintDropIndicator(QPainter *p, QWidget *widget, const QRegion &clip);
void applyState(QMainWindowLayoutState &newState, bool animate = true);
void restore(bool keepSavedState = false);
void updateHIToolBarStatus();
void animationFinished(QWidget *widget);
private Q_SLOTS:
#ifndef QT_NO_DOCKWIDGET
#ifndef QT_NO_TABBAR
void tabChanged();
#endif
#endif
private:
#ifndef QT_NO_TABBAR
void updateTabBarShapes();
#endif
#ifdef Q_DEAD_CODE_FROM_QT4_MAC
static OSStatus qtmacToolbarDelegate(EventHandlerCallRef, EventRef , void *);
static OSStatus qtoolbarInHIToolbarHandler(EventHandlerCallRef inCallRef, EventRef event,
void *data);
static void qtMacHIToolbarRegisterQToolBarInHIToolborItemClass();
static HIToolbarItemRef CreateToolbarItemForIdentifier(CFStringRef identifier, CFTypeRef data);
static HIToolbarItemRef createQToolBarInHIToolbarItem(QToolBar *toolbar,
QMainWindowLayout *layout);
public:
struct ToolBarSaveState {
ToolBarSaveState() : movable(false) { }
ToolBarSaveState(bool newMovable, const QSize &newMax)
: movable(newMovable), maximumSize(newMax) { }
bool movable;
QSize maximumSize;
};
QList<QToolBar *> qtoolbarsInUnifiedToolbarList;
QList<void *> toolbarItemsCopy;
QHash<void *, QToolBar *> unifiedToolbarHash;
QHash<QToolBar *, ToolBarSaveState> toolbarSaveState;
QHash<QString, QToolBar *> cocoaItemIDToToolbarHash;
void insertIntoMacToolbar(QToolBar *before, QToolBar *after);
void removeFromMacToolbar(QToolBar *toolbar);
void cleanUpMacToolbarItems();
void fixSizeInUnifiedToolbar(QToolBar *tb) const;
bool useHIToolBar;
bool activateUnifiedToolbarAfterFullScreen;
void syncUnifiedToolbarVisibility();
bool blockVisiblityCheck;
QUnifiedToolbarSurface *unifiedSurface;
void updateUnifiedToolbarOffset();
#endif // Q_DEAD_CODE_FROM_QT4_MAC
};
#if !defined(QT_NO_DOCKWIDGET) && !defined(QT_NO_DEBUG_STREAM)
class QDebug;
QDebug operator<<(QDebug debug, const QDockAreaLayout &layout);
QDebug operator<<(QDebug debug, const QMainWindowLayout *layout);
#endif
QT_END_NAMESPACE
#endif // QT_NO_MAINWINDOW
#endif // QDYNAMICMAINWINDOWLAYOUT_P_H