Merge branch 'centralwidget'

This commit is contained in:
Uwe Kindler 2020-08-24 13:44:19 +02:00
commit 5443e5f998
19 changed files with 468 additions and 29 deletions

1
.gitignore vendored
View File

@ -382,3 +382,4 @@ MigrationBackup/
FodyWeavers.xsd FodyWeavers.xsd
/ build / build
/Settings.ini /Settings.ini
.vscode/settings.json

View File

@ -2,4 +2,5 @@ cmake_minimum_required(VERSION 3.5)
project(QtADSExamples LANGUAGES CXX VERSION ${VERSION_SHORT}) project(QtADSExamples LANGUAGES CXX VERSION ${VERSION_SHORT})
add_subdirectory(simple) add_subdirectory(simple)
add_subdirectory(sidebar) add_subdirectory(sidebar)
add_subdirectory(deleteonclose) add_subdirectory(deleteonclose)
add_subdirectory(centralwidget)

View File

@ -0,0 +1,25 @@
cmake_minimum_required(VERSION 3.5)
project(ads_example_centralwidget VERSION ${VERSION_SHORT})
find_package(Qt5 5.5 COMPONENTS Core Gui Widgets REQUIRED)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
add_executable(CentralWidgetExample WIN32
main.cpp
mainwindow.cpp
mainwindow.ui
)
target_include_directories(CentralWidgetExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src")
target_link_libraries(CentralWidgetExample PRIVATE qtadvanceddocking)
target_link_libraries(CentralWidgetExample PUBLIC Qt5::Core Qt5::Gui Qt5::Widgets)
set_target_properties(CentralWidgetExample PROPERTIES
AUTOMOC ON
AUTORCC ON
AUTOUIC ON
CXX_STANDARD 14
CXX_STANDARD_REQUIRED ON
CXX_EXTENSIONS OFF
VERSION ${VERSION_SHORT}
EXPORT_NAME "Qt Advanced Docking System Central Widget Example"
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib"
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib"
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/bin"
)

View File

@ -0,0 +1,54 @@
ADS_OUT_ROOT = $${OUT_PWD}/../..
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = CentralWidgetExample
DESTDIR = $${ADS_OUT_ROOT}/lib
TEMPLATE = app
CONFIG += c++14
CONFIG += debug_and_release
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
LIBS += -L$${ADS_OUT_ROOT}/lib
# Dependency: AdvancedDockingSystem (shared)
CONFIG(debug, debug|release){
win32 {
LIBS += -lqtadvanceddockingd
}
else:mac {
LIBS += -lqtadvanceddocking_debug
}
else {
LIBS += -lqtadvanceddocking
}
}
else{
LIBS += -lqtadvanceddocking
}
INCLUDEPATH += ../../src
DEPENDPATH += ../../src

View File

@ -0,0 +1,10 @@
#include <mainwindow.h>
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
CMainWindow w;
w.show();
return a.exec();
}

View File

@ -0,0 +1,83 @@
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QWidgetAction>
#include <QLabel>
#include <QCalendarWidget>
#include <QTreeView>
#include <QFileSystemModel>
#include <QTableWidget>
#include <QHBoxLayout>
#include <QRadioButton>
#include <QPushButton>
#include <QInputDialog>
#include <QFileDialog>
#include <QSettings>
#include <QMessageBox>
#include "DockAreaWidget.h"
#include "DockAreaTitleBar.h"
#include "DockAreaTabBar.h"
#include "FloatingDockContainer.h"
#include "DockComponentsFactory.h"
using namespace ads;
CMainWindow::CMainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::CMainWindow)
{
ui->setupUi(this);
CDockManager::setConfigFlag(CDockManager::OpaqueSplitterResize, true);
CDockManager::setConfigFlag(CDockManager::XmlCompressionEnabled, false);
DockManager = new CDockManager(this);
// Set central widget
QCalendarWidget* calendar = new QCalendarWidget();
CDockWidget* CentralDockWidget = new CDockWidget("CentralWidget");
CentralDockWidget->setWidget(calendar);
auto* CentralDockArea = DockManager->setCentralWidget(CentralDockWidget);
CentralDockArea->setAllowedAreas(DockWidgetArea::OuterDockAreas);
// create other dock widgets
QTreeView* fileTree = new QTreeView();
fileTree->setFrameShape(QFrame::NoFrame);
QFileSystemModel* fileModel = new QFileSystemModel(fileTree);
fileModel->setRootPath(QDir::currentPath());
fileTree->setModel(fileModel);
CDockWidget* DataDockWidget = new CDockWidget("File system");
DataDockWidget->setWidget(fileTree);
DataDockWidget->resize(150, 250);
DataDockWidget->setMinimumSize(100, 250);
auto* fileArea = DockManager->addDockWidget(DockWidgetArea::LeftDockWidgetArea, DataDockWidget, CentralDockArea);
ui->menuView->addAction(DataDockWidget->toggleViewAction());
QTableWidget* table = new QTableWidget();
table->setColumnCount(3);
table->setRowCount(10);
CDockWidget* TableDockWidget = new CDockWidget("Table");
TableDockWidget->setWidget(table);
TableDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
TableDockWidget->resize(250, 150);
TableDockWidget->setMinimumSize(200,150);
DockManager->addDockWidget(DockWidgetArea::BottomDockWidgetArea, TableDockWidget, fileArea);
ui->menuView->addAction(TableDockWidget->toggleViewAction());
QTableWidget* propertiesTable = new QTableWidget();
table->setColumnCount(3);
table->setRowCount(10);
CDockWidget* PropertiesDockWidget = new CDockWidget("Properties");
PropertiesDockWidget->setWidget(propertiesTable);
PropertiesDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
PropertiesDockWidget->resize(250, 150);
PropertiesDockWidget->setMinimumSize(200,150);
DockManager->addDockWidget(DockWidgetArea::RightDockWidgetArea, PropertiesDockWidget, CentralDockArea);
ui->menuView->addAction(PropertiesDockWidget->toggleViewAction());
}
CMainWindow::~CMainWindow()
{
delete ui;
}

View File

@ -0,0 +1,32 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "DockManager.h"
#include "DockAreaWidget.h"
#include "DockWidget.h"
QT_BEGIN_NAMESPACE
namespace Ui { class CMainWindow; }
QT_END_NAMESPACE
class CMainWindow : public QMainWindow
{
Q_OBJECT
public:
CMainWindow(QWidget *parent = nullptr);
~CMainWindow();
private:
static const QString kTableTopLayout;
static const QString kTableBottomLayout;
Ui::CMainWindow *ui;
ads::CDockManager* DockManager;
ads::CDockAreaWidget* StatusDockArea;
ads::CDockWidget* TimelineDockWidget;
};
#endif // MAINWINDOW_H

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CMainWindow</class>
<widget class="QMainWindow" name="CMainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1284</width>
<height>757</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget"/>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1284</width>
<height>21</height>
</rect>
</property>
<widget class="QMenu" name="menuView">
<property name="title">
<string>View</string>
</property>
</widget>
<addaction name="menuView"/>
</widget>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -1,6 +1,7 @@
TEMPLATE = subdirs TEMPLATE = subdirs
SUBDIRS = \ SUBDIRS = \
centralwidget \
simple \ simple \
sidebar \ sidebar \
deleteonclose deleteonclose

View File

@ -441,6 +441,7 @@ void CDockAreaWidget::insertDockWidget(int index, CDockWidget* DockWidget,
DockWidget->toggleViewInternal(true); DockWidget->toggleViewInternal(true);
} }
d->updateTitleBarButtonStates(); d->updateTitleBarButtonStates();
updateTitleBarVisibility();
} }
@ -955,6 +956,18 @@ CDockAreaTitleBar* CDockAreaWidget::titleBar() const
} }
//============================================================================
bool CDockAreaWidget::isCentralWidgetArea() const
{
if (dockWidgetsCount()!= 1)
{
return false;
}
return dockManager()->centralWidget() == dockWidgets()[0];
}
//============================================================================ //============================================================================
QSize CDockAreaWidget::minimumSizeHint() const QSize CDockAreaWidget::minimumSizeHint() const
{ {

View File

@ -154,7 +154,7 @@ public:
}; };
Q_DECLARE_FLAGS(DockAreaFlags, eDockAreaFlag) Q_DECLARE_FLAGS(DockAreaFlags, eDockAreaFlag)
/** /**
* Default Constructor * Default Constructor
*/ */
CDockAreaWidget(CDockManager* DockManager, CDockContainerWidget* parent); CDockAreaWidget(CDockManager* DockManager, CDockContainerWidget* parent);
@ -307,6 +307,11 @@ public:
*/ */
void setDockAreaFlag(eDockAreaFlag Flag, bool On); void setDockAreaFlag(eDockAreaFlag Flag, bool On);
/**
* Returns true if the area contains the central widget of it's manager.
*/
bool isCentralWidgetArea() const;
public slots: public slots:
/** /**
* This activates the tab for the given tab index. * This activates the tab for the given tab index.

View File

@ -322,6 +322,18 @@ public:
Splitter->setSizes(SplitterSizes); Splitter->setSizes(SplitterSizes);
} }
/**
* This function forces the dock container widget to update handles of splitters
* based if a central widget exists.
*/
void updateSplitterHandles(QSplitter* splitter);
/**
* If no central widget exists, the widgets resize with the container.
* If a central widget exists, the widgets surrounding the central widget
* do not resize its height or width.
*/
bool widgetResizesWithContainer(QWidget* widget);
// private slots: ------------------------------------------------------------ // private slots: ------------------------------------------------------------
void onDockAreaViewToggled(bool Visible) void onDockAreaViewToggled(bool Visible)
@ -421,7 +433,8 @@ void DockContainerWidgetPrivate::dropIntoContainer(CFloatingDockContainer* Float
QSplitter* NewSplitter = newSplitter(InsertParam.orientation()); QSplitter* NewSplitter = newSplitter(InsertParam.orientation());
QLayoutItem* li = Layout->replaceWidget(Splitter, NewSplitter); QLayoutItem* li = Layout->replaceWidget(Splitter, NewSplitter);
NewSplitter->addWidget(Splitter); NewSplitter->addWidget(Splitter);
Splitter = NewSplitter; updateSplitterHandles(NewSplitter);
Splitter = NewSplitter;
delete li; delete li;
} }
@ -430,19 +443,21 @@ void DockContainerWidgetPrivate::dropIntoContainer(CFloatingDockContainer* Float
if (FloatingSplitter->count() == 1) if (FloatingSplitter->count() == 1)
{ {
insertWidgetIntoSplitter(Splitter, FloatingSplitter->widget(0), InsertParam.append()); insertWidgetIntoSplitter(Splitter, FloatingSplitter->widget(0), InsertParam.append());
} updateSplitterHandles(Splitter);
}
else if (FloatingSplitter->orientation() == InsertParam.orientation()) else if (FloatingSplitter->orientation() == InsertParam.orientation())
{ {
int InsertIndex = InsertParam.append() ? Splitter->count() : 0; int InsertIndex = InsertParam.append() ? Splitter->count() : 0;
while (FloatingSplitter->count()) while (FloatingSplitter->count())
{ {
Splitter->insertWidget(InsertIndex++, FloatingSplitter->widget(0)); Splitter->insertWidget(InsertIndex++, FloatingSplitter->widget(0));
} updateSplitterHandles(Splitter);
} }
}
else else
{ {
insertWidgetIntoSplitter(Splitter, FloatingSplitter, InsertParam.append()); insertWidgetIntoSplitter(Splitter, FloatingSplitter, InsertParam.append());
} }
RootSplitter = Splitter; RootSplitter = Splitter;
addDockAreasToList(NewDockAreas); addDockAreasToList(NewDockAreas);
@ -453,7 +468,7 @@ void DockContainerWidgetPrivate::dropIntoContainer(CFloatingDockContainer* Float
if (!Splitter->isVisible()) if (!Splitter->isVisible())
{ {
Splitter->show(); Splitter->show();
} }
_this->dumpLayout(); _this->dumpLayout();
} }
@ -515,7 +530,8 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
QSplitter* Splitter = newSplitter(InsertParam.orientation()); QSplitter* Splitter = newSplitter(InsertParam.orientation());
Layout->replaceWidget(TargetArea, Splitter); Layout->replaceWidget(TargetArea, Splitter);
Splitter->addWidget(TargetArea); Splitter->addWidget(TargetArea);
TargetAreaSplitter = Splitter; updateSplitterHandles(Splitter);
TargetAreaSplitter = Splitter;
} }
int AreaIndex = TargetAreaSplitter->indexOf(TargetArea); int AreaIndex = TargetAreaSplitter->indexOf(TargetArea);
auto Widget = FloatingWidget->dockContainer()->findChild<QWidget*>(QString(), Qt::FindDirectChildrenOnly); auto Widget = FloatingWidget->dockContainer()->findChild<QWidget*>(QString(), Qt::FindDirectChildrenOnly);
@ -529,7 +545,8 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
if ((FloatingSplitter->orientation() != InsertParam.orientation()) && FloatingSplitter->count() > 1) if ((FloatingSplitter->orientation() != InsertParam.orientation()) && FloatingSplitter->count() > 1)
{ {
TargetAreaSplitter->insertWidget(AreaIndex + InsertParam.insertOffset(), Widget); TargetAreaSplitter->insertWidget(AreaIndex + InsertParam.insertOffset(), Widget);
} updateSplitterHandles(TargetAreaSplitter);
}
else else
{ {
AdjustSplitterSizes = (FloatingSplitter->count() == 1); AdjustSplitterSizes = (FloatingSplitter->count() == 1);
@ -537,8 +554,9 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
while (FloatingSplitter->count()) while (FloatingSplitter->count())
{ {
TargetAreaSplitter->insertWidget(InsertIndex++, FloatingSplitter->widget(0)); TargetAreaSplitter->insertWidget(InsertIndex++, FloatingSplitter->widget(0));
} updateSplitterHandles(TargetAreaSplitter);
} }
}
if (AdjustSplitterSizes) if (AdjustSplitterSizes)
{ {
@ -557,28 +575,32 @@ void DockContainerWidgetPrivate::dropIntoSection(CFloatingDockContainer* Floatin
if ((FloatingSplitter->orientation() != InsertParam.orientation()) && FloatingSplitter->count() > 1) if ((FloatingSplitter->orientation() != InsertParam.orientation()) && FloatingSplitter->count() > 1)
{ {
NewSplitter->addWidget(Widget); NewSplitter->addWidget(Widget);
} updateSplitterHandles(NewSplitter);
}
else else
{ {
AdjustSplitterSizes = (FloatingSplitter->count() == 1); AdjustSplitterSizes = (FloatingSplitter->count() == 1);
while (FloatingSplitter->count()) while (FloatingSplitter->count())
{ {
NewSplitter->addWidget(FloatingSplitter->widget(0)); NewSplitter->addWidget(FloatingSplitter->widget(0));
} updateSplitterHandles(NewSplitter);
} }
}
// Save the sizes before insertion and restore it later to prevent // Save the sizes before insertion and restore it later to prevent
// shrinking of existing area // shrinking of existing area
auto Sizes = TargetAreaSplitter->sizes(); auto Sizes = TargetAreaSplitter->sizes();
insertWidgetIntoSplitter(NewSplitter, TargetArea, !InsertParam.append()); insertWidgetIntoSplitter(NewSplitter, TargetArea, !InsertParam.append());
if (AdjustSplitterSizes) updateSplitterHandles(NewSplitter);
if (AdjustSplitterSizes)
{ {
int Size = TargetAreaSize / 2; int Size = TargetAreaSize / 2;
NewSplitter->setSizes({Size, Size}); NewSplitter->setSizes({Size, Size});
} }
TargetAreaSplitter->insertWidget(AreaIndex, NewSplitter); TargetAreaSplitter->insertWidget(AreaIndex, NewSplitter);
TargetAreaSplitter->setSizes(Sizes); TargetAreaSplitter->setSizes(Sizes);
} updateSplitterHandles(TargetAreaSplitter);
}
addDockAreasToList(NewDockAreas); addDockAreasToList(NewDockAreas);
_this->dumpLayout(); _this->dumpLayout();
@ -663,7 +685,8 @@ void DockContainerWidgetPrivate::moveToNewSection(QWidget* Widget, CDockAreaWidg
{ {
int TargetAreaSize = (InsertParam.orientation() == Qt::Horizontal) ? TargetArea->width() : TargetArea->height(); int TargetAreaSize = (InsertParam.orientation() == Qt::Horizontal) ? TargetArea->width() : TargetArea->height();
TargetAreaSplitter->insertWidget(AreaIndex + InsertParam.insertOffset(), NewDockArea); TargetAreaSplitter->insertWidget(AreaIndex + InsertParam.insertOffset(), NewDockArea);
int Size = (TargetAreaSize - TargetAreaSplitter->handleWidth()) / 2; updateSplitterHandles(TargetAreaSplitter);
int Size = (TargetAreaSize - TargetAreaSplitter->handleWidth()) / 2;
Sizes[AreaIndex] = Size; Sizes[AreaIndex] = Size;
Sizes.insert(AreaIndex, Size); Sizes.insert(AreaIndex, Size);
} }
@ -674,16 +697,58 @@ void DockContainerWidgetPrivate::moveToNewSection(QWidget* Widget, CDockAreaWidg
QSplitter* NewSplitter = newSplitter(InsertParam.orientation()); QSplitter* NewSplitter = newSplitter(InsertParam.orientation());
NewSplitter->addWidget(TargetArea); NewSplitter->addWidget(TargetArea);
insertWidgetIntoSplitter(NewSplitter, NewDockArea, InsertParam.append()); insertWidgetIntoSplitter(NewSplitter, NewDockArea, InsertParam.append());
int Size = TargetAreaSize / 2; updateSplitterHandles(NewSplitter);
int Size = TargetAreaSize / 2;
NewSplitter->setSizes({Size, Size}); NewSplitter->setSizes({Size, Size});
TargetAreaSplitter->insertWidget(AreaIndex, NewSplitter); TargetAreaSplitter->insertWidget(AreaIndex, NewSplitter);
} updateSplitterHandles(TargetAreaSplitter);
}
TargetAreaSplitter->setSizes(Sizes); TargetAreaSplitter->setSizes(Sizes);
addDockAreasToList({NewDockArea}); addDockAreasToList({NewDockArea});
} }
//============================================================================
void DockContainerWidgetPrivate::updateSplitterHandles( QSplitter* splitter )
{
if (!DockManager->centralWidget() || !splitter)
{
return;
}
for (int i = 0; i < splitter->count(); ++i)
{
splitter->setStretchFactor(i, widgetResizesWithContainer(splitter->widget(i)) ? 1 : 0);
}
}
//============================================================================
bool DockContainerWidgetPrivate::widgetResizesWithContainer(QWidget* widget)
{
if (!DockManager->centralWidget())
{
return true;
}
auto Area = qobject_cast<CDockAreaWidget*>(widget);
if(Area)
{
return Area->isCentralWidgetArea();
}
auto innerSplitter = qobject_cast<CDockSplitter*>(widget);
if (innerSplitter)
{
return innerSplitter->isResizingWithContainer();
}
return false;
}
//============================================================================ //============================================================================
void DockContainerWidgetPrivate::moveToContainer(QWidget* Widget, DockWidgetArea area) void DockContainerWidgetPrivate::moveToContainer(QWidget* Widget, DockWidgetArea area)
{ {
@ -892,6 +957,10 @@ bool DockContainerWidgetPrivate::restoreSplitter(CDockingStateReader& s,
Splitter->addWidget(ChildNode); Splitter->addWidget(ChildNode);
Visible |= ChildNode->isVisibleTo(Splitter); Visible |= ChildNode->isVisibleTo(Splitter);
} }
if(!Testing)
{
updateSplitterHandles(Splitter);
}
if (Sizes.count() != WidgetCount) if (Sizes.count() != WidgetCount)
{ {
@ -1069,7 +1138,8 @@ void DockContainerWidgetPrivate::addDockArea(CDockAreaWidget* NewDockArea, DockW
if (Splitter->orientation() == InsertParam.orientation()) if (Splitter->orientation() == InsertParam.orientation())
{ {
insertWidgetIntoSplitter(Splitter, NewDockArea, InsertParam.append()); insertWidgetIntoSplitter(Splitter, NewDockArea, InsertParam.append());
if (Splitter->isHidden()) updateSplitterHandles(Splitter);
if (Splitter->isHidden())
{ {
Splitter->show(); Splitter->show();
} }
@ -1082,14 +1152,16 @@ void DockContainerWidgetPrivate::addDockArea(CDockAreaWidget* NewDockArea, DockW
QLayoutItem* li = Layout->replaceWidget(Splitter, NewSplitter); QLayoutItem* li = Layout->replaceWidget(Splitter, NewSplitter);
NewSplitter->addWidget(Splitter); NewSplitter->addWidget(Splitter);
NewSplitter->addWidget(NewDockArea); NewSplitter->addWidget(NewDockArea);
delete li; updateSplitterHandles(NewSplitter);
delete li;
} }
else else
{ {
NewSplitter->addWidget(NewDockArea); NewSplitter->addWidget(NewDockArea);
QLayoutItem* li = Layout->replaceWidget(Splitter, NewSplitter); QLayoutItem* li = Layout->replaceWidget(Splitter, NewSplitter);
NewSplitter->addWidget(Splitter); NewSplitter->addWidget(Splitter);
delete li; updateSplitterHandles(NewSplitter);
delete li;
} }
RootSplitter = NewSplitter; RootSplitter = NewSplitter;
} }
@ -1175,7 +1247,8 @@ CDockAreaWidget* DockContainerWidgetPrivate::addDockWidgetToDockArea(DockWidgetA
{ {
ADS_PRINT("TargetAreaSplitter->orientation() == InsertParam.orientation()"); ADS_PRINT("TargetAreaSplitter->orientation() == InsertParam.orientation()");
TargetAreaSplitter->insertWidget(index + InsertParam.insertOffset(), NewDockArea); TargetAreaSplitter->insertWidget(index + InsertParam.insertOffset(), NewDockArea);
// do nothing, if flag is not enabled updateSplitterHandles(TargetAreaSplitter);
// do nothing, if flag is not enabled
if (CDockManager::testConfigFlag(CDockManager::EqualSplitOnInsertion)) if (CDockManager::testConfigFlag(CDockManager::EqualSplitOnInsertion))
{ {
adjustSplitterSizesOnInsertion(TargetAreaSplitter); adjustSplitterSizesOnInsertion(TargetAreaSplitter);
@ -1190,9 +1263,11 @@ CDockAreaWidget* DockContainerWidgetPrivate::addDockWidgetToDockArea(DockWidgetA
NewSplitter->addWidget(TargetDockArea); NewSplitter->addWidget(TargetDockArea);
insertWidgetIntoSplitter(NewSplitter, NewDockArea, InsertParam.append()); insertWidgetIntoSplitter(NewSplitter, NewDockArea, InsertParam.append());
TargetAreaSplitter->insertWidget(index, NewSplitter); updateSplitterHandles(NewSplitter);
if (CDockManager::testConfigFlag(CDockManager::EqualSplitOnInsertion)) TargetAreaSplitter->insertWidget(index, NewSplitter);
{ updateSplitterHandles(TargetAreaSplitter);
if (CDockManager::testConfigFlag(CDockManager::EqualSplitOnInsertion))
{
TargetAreaSplitter->setSizes(TargetAreaSizes); TargetAreaSplitter->setSizes(TargetAreaSizes);
adjustSplitterSizesOnInsertion(NewSplitter); adjustSplitterSizesOnInsertion(NewSplitter);
} }
@ -1381,9 +1456,11 @@ void CDockContainerWidget::removeDockArea(CDockAreaWidget* area)
} }
delete Splitter; delete Splitter;
Splitter = nullptr;
emitAndExit: emitAndExit:
CDockWidget* TopLevelWidget = topLevelDockWidget(); updateSplitterHandles(Splitter);
CDockWidget* TopLevelWidget = topLevelDockWidget();
// Updated the title bar visibility of the dock widget if there is only // Updated the title bar visibility of the dock widget if there is only
// one single visible dock widget // one single visible dock widget
@ -1732,6 +1809,13 @@ QList<CDockWidget*> CDockContainerWidget::dockWidgets() const
} }
//============================================================================
void CDockContainerWidget::updateSplitterHandles(QSplitter* splitter)
{
d->updateSplitterHandles(splitter);
}
//============================================================================ //============================================================================
CDockWidget::DockWidgetFeatures CDockContainerWidget::features() const CDockWidget::DockWidgetFeatures CDockContainerWidget::features() const
{ {

View File

@ -155,6 +155,12 @@ protected:
*/ */
QList<CDockWidget*> dockWidgets() const; QList<CDockWidget*> dockWidgets() const;
/**
* This function forces the dock container widget to update handles of splitters
* based on resize modes of dock widgets contained in the container.
*/
void updateSplitterHandles(QSplitter* splitter);
public: public:
/** /**
* Default Constructor * Default Constructor

View File

@ -108,6 +108,7 @@ struct DockManagerPrivate
bool RestoringState = false; bool RestoringState = false;
QVector<CFloatingDockContainer*> UninitializedFloatingWidgets; QVector<CFloatingDockContainer*> UninitializedFloatingWidgets;
CDockFocusController* FocusController = nullptr; CDockFocusController* FocusController = nullptr;
CDockWidget* CentralWidget = nullptr;
/** /**
* Private data constructor * Private data constructor
@ -406,6 +407,7 @@ bool DockManagerPrivate::restoreState(const QByteArray& State, int version)
return false; return false;
} }
CentralWidget = nullptr;
// Hide updates of floating widgets from use // Hide updates of floating widgets from use
hideFloatingWidgets(); hideFloatingWidgets();
markDockWidgetsDirty(); markDockWidgetsDirty();
@ -816,6 +818,40 @@ void CDockManager::loadPerspectives(QSettings& Settings)
Settings.endArray(); Settings.endArray();
} }
//============================================================================
CDockWidget* CDockManager::centralWidget() const
{
return d->CentralWidget;
}
//============================================================================
CDockAreaWidget* CDockManager::setCentralWidget(CDockWidget* widget)
{
if (!widget)
{
d->CentralWidget = nullptr;
return nullptr;
}
// Setting a new central widget is now allowed if there is alread a central
// widget
if (d->CentralWidget)
{
return nullptr;
}
widget->setFeature(CDockWidget::DockWidgetClosable, false);
widget->setFeature(CDockWidget::DockWidgetMovable, false);
widget->setFeature(CDockWidget::DockWidgetFloatable, false);
d->CentralWidget = widget;
CDockAreaWidget* CentralArea = addDockWidget(CenterDockWidgetArea, widget);
CentralArea->setDockAreaFlag(CDockAreaWidget::eDockAreaFlag::HideSingleWidgetTitleBar, true);
return CentralArea;
}
//============================================================================ //============================================================================
QAction* CDockManager::addToggleViewActionToMenu(QAction* ToggleViewAction, QAction* CDockManager::addToggleViewActionToMenu(QAction* ToggleViewAction,
const QString& Group, const QIcon& GroupIcon) const QString& Group, const QIcon& GroupIcon)

View File

@ -378,7 +378,28 @@ public:
*/ */
void loadPerspectives(QSettings& Settings); void loadPerspectives(QSettings& Settings);
/** /**
* This function returns managers central widget or nullptr if no central widget is set.
*/
CDockWidget* centralWidget() const;
/**
* Adds dockwidget widget into the central area and marks it as central widget.
* If central widget is set, it will be the only dock widget
* that will resize with the dock container. A central widget if not
* movable, floatable or closable and the titlebar of the central
* dock area is not visible.
* If the given widget could be set as central widget, the function returns
* the created cok area. If the widget could not be set, because there
* is already a central widget, this function returns a nullptr.
* To clear the central widget, pass a nullptr to the function.
* \retval != 0 The dock area that contains the central widget
* \retval nullptr Indicates that the given widget can not be set as central
* widget because there is already a central widget.
*/
CDockAreaWidget* setCentralWidget(CDockWidget* widget);
/**
* Adds a toggle view action to the the internal view menu. * Adds a toggle view action to the the internal view menu.
* You can either manage the insertion of the toggle view actions in your * You can either manage the insertion of the toggle view actions in your
* application or you can add the actions to the internal view menu and * application or you can add the actions to the internal view menu and

View File

@ -102,6 +102,20 @@ QWidget* CDockSplitter::lastWidget() const
return (count() > 0) ? widget(count() - 1) : nullptr; return (count() > 0) ? widget(count() - 1) : nullptr;
} }
//============================================================================
bool CDockSplitter::isResizingWithContainer() const
{
for (auto area : findChildren<CDockAreaWidget*>())
{
if(area->isCentralWidgetArea())
{
return true;
}
}
return false;
}
} // namespace ads } // namespace ads
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@ -71,6 +71,11 @@ public:
* Returns last widget of nullptr is splitter is empty * Returns last widget of nullptr is splitter is empty
*/ */
QWidget* lastWidget() const; QWidget* lastWidget() const;
/**
* Returns true if the splitter contains central widget of dock manager.
*/
bool isResizingWithContainer() const;
}; // class CDockSplitter }; // class CDockSplitter
} // namespace ads } // namespace ads

View File

@ -463,6 +463,13 @@ void CDockWidget::setMinimumSizeHintMode(eMinimumSizeHintMode Mode)
} }
//============================================================================
bool CDockWidget::isCentralWidget() const
{
return dockManager()->centralWidget() == this;
}
//============================================================================ //============================================================================
void CDockWidget::toggleView(bool Open) void CDockWidget::toggleView(bool Open)
{ {

View File

@ -360,6 +360,11 @@ public:
*/ */
void setMinimumSizeHintMode(eMinimumSizeHintMode Mode); void setMinimumSizeHintMode(eMinimumSizeHintMode Mode);
/**
* Returns true if the dock widget is set as central widget of it's dock manager
*/
bool isCentralWidget() const;
/** /**
* Sets the dock widget icon that is shown in tabs and in toggle view * Sets the dock widget icon that is shown in tabs and in toggle view
* actions * actions