Merge remote-tracking branch 'upstream/master' into forceclose

This commit is contained in:
Nicolas ELIE
2020-10-02 11:04:18 +02:00
33 changed files with 517 additions and 72 deletions
+7 -1
View File
@@ -1,6 +1,9 @@
cmake_minimum_required(VERSION 3.5)
project(QtAdvancedDockingSystem LANGUAGES CXX VERSION ${VERSION_SHORT})
find_package(Qt5 5.5 COMPONENTS Core Gui Widgets X11Extras REQUIRED)
find_package(Qt5 5.5 COMPONENTS Core Gui Widgets REQUIRED)
if (UNIX)
find_package(Qt5 5.5 COMPONENTS X11Extras REQUIRED)
endif()
set(CMAKE_INCLUDE_CURRENT_DIR ON)
if(BUILD_STATIC)
set(CMAKE_STATIC_LIBRARY_SUFFIX "_static${CMAKE_STATIC_LIBRARY_SUFFIX}")
@@ -57,6 +60,9 @@ else()
target_compile_definitions(qtadvanceddocking PRIVATE ADS_SHARED_EXPORT)
endif()
target_link_libraries(qtadvanceddocking PUBLIC Qt5::Core Qt5::Gui Qt5::Widgets)
if (UNIX)
target_link_libraries(qtadvanceddocking PUBLIC Qt5::X11Extras)
endif()
set_target_properties(qtadvanceddocking PROPERTIES
AUTOMOC ON
AUTORCC ON
+1 -1
View File
@@ -1207,7 +1207,7 @@ void DockContainerWidgetPrivate::dumpRecursive(int level, QWidget* widget)
std::cout << (const char*)buf
<< (DockArea->isHidden() ? " " : "v")
<< (DockArea->openDockWidgetsCount() > 0 ? " " : "c")
<< " DockArea" << std::endl;
<< " DockArea " << "[hs: " << DockArea->sizePolicy().horizontalStretch() << ", vs: " << DockArea->sizePolicy().verticalStretch() << "]" << std::endl;
buf.fill(' ', (level + 1) * 4);
for (int i = 0; i < DockArea->dockWidgetsCount(); ++i)
{
+7
View File
@@ -381,6 +381,13 @@ void CDockFocusController::onStateRestored()
}
}
//==========================================================================
CDockWidget* CDockFocusController::focusedDockWidget() const
{
return d->FocusedDockWidget.data();
}
} // namespace ads
//---------------------------------------------------------------------------
+6
View File
@@ -77,6 +77,12 @@ public:
*/
void notifyFloatingWidgetDrop(CFloatingDockContainer* FloatingWidget);
/**
* Returns the dock widget that has focus style in the ui or a nullptr if
* not dock widget is painted focused.
*/
CDockWidget* focusedDockWidget() const;
public slots:
/**
* Request a focus change to the given dock widget
+56 -4
View File
@@ -279,6 +279,27 @@ bool DockManagerPrivate::restoreStateFromXml(const QByteArray &state, int versi
int DockContainers = s.attributes().value("Containers").toInt();
#endif
ADS_PRINT(DockContainers);
if (CentralWidget)
{
const auto CentralWidgetAttribute = s.attributes().value("CentralWidget");
// If we have a central widget but a state without central widget, then
// something is wrong.
if (CentralWidgetAttribute.isEmpty())
{
qWarning() << "Dock manager has central widget but saved state does not have central widget.";
return false;
}
// If the object name of the central widget does not match the name of the
// saved central widget, the something is wrong
if (CentralWidget->objectName() != CentralWidgetAttribute.toString())
{
qWarning() << "Object name of central widget does not match name of central widget in saved state.";
return false;
}
}
int DockContainerCount = 0;
while (s.readNextStartElement())
{
@@ -405,7 +426,6 @@ bool DockManagerPrivate::restoreState(const QByteArray& State, int version)
return false;
}
CentralWidget = nullptr;
// Hide updates of floating widgets from use
hideFloatingWidgets();
markDockWidgetsDirty();
@@ -419,6 +439,7 @@ bool DockManagerPrivate::restoreState(const QByteArray& State, int version)
restoreDockWidgetsOpenState();
restoreDockAreasIndices();
emitTopLevelEvents();
_this->dumpLayout();
return true;
}
@@ -636,6 +657,10 @@ QByteArray CDockManager::saveState(int version) const
s.writeAttribute("Version", QString::number(CurrentVersion));
s.writeAttribute("UserVersion", QString::number(version));
s.writeAttribute("Containers", QString::number(d->Containers.count()));
if (d->CentralWidget)
{
s.writeAttribute("CentralWidget", d->CentralWidget->objectName());
}
for (auto Container : d->Containers)
{
Container->saveState(s);
@@ -706,6 +731,7 @@ CFloatingDockContainer* CDockManager::addDockWidgetFloating(CDockWidget* Dockwid
{
d->UninitializedFloatingWidgets.append(FloatingWidget);
}
emit dockWidgetAdded(Dockwidget);
return FloatingWidget;
}
@@ -732,7 +758,9 @@ CDockAreaWidget* CDockManager::addDockWidget(DockWidgetArea area,
CDockWidget* Dockwidget, CDockAreaWidget* DockAreaWidget)
{
d->DockWidgetsMap.insert(Dockwidget->objectName(), Dockwidget);
return CDockContainerWidget::addDockWidget(area, Dockwidget, DockAreaWidget);
auto AreaOfAddedDockWidget = CDockContainerWidget::addDockWidget(area, Dockwidget, DockAreaWidget);
emit dockWidgetAdded(Dockwidget);
return AreaOfAddedDockWidget;
}
@@ -901,10 +929,20 @@ CDockAreaWidget* CDockManager::setCentralWidget(CDockWidget* widget)
return nullptr;
}
// Setting a new central widget is now allowed if there is alread a central
// widget
// Setting a new central widget is now allowed if there is already a central
// widget or if there are already other dock widgets
if (d->CentralWidget)
{
qWarning("Setting a central widget not possible because there is already a central widget.");
return nullptr;
}
// Setting a central widget is now allowed if there are already other
// dock widgets.
if (!d->DockWidgetsMap.isEmpty())
{
qWarning("Setting a central widget not possible - the central widget need to be the first "
"dock widget that is added to the dock manager.");
return nullptr;
}
@@ -1042,6 +1080,20 @@ void CDockManager::setDockWidgetFocused(CDockWidget* DockWidget)
}
//===========================================================================
CDockWidget* CDockManager::focusedDockWidget() const
{
if (!d->FocusController)
{
return nullptr;
}
else
{
return d->FocusController->focusedDockWidget();
}
}
} // namespace ads
//---------------------------------------------------------------------------
+18 -1
View File
@@ -398,9 +398,12 @@ public:
* 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
* the created dock 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.
* \note Setting a central widget is only possible if no other dock widgets
* have been registered before. That means, this function should be the
* first function that you call before you add other dock widgets.
* \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.
@@ -476,6 +479,14 @@ public:
bool eventFilter(QObject *obj, QEvent *e) override;
#endif
/**
* Returns the dock widget that has focus style in the ui or a nullptr if
* not dock widget is painted focused.
* If the flag FocusHighlighting is disabled, this function always returns
* nullptr.
*/
CDockWidget* focusedDockWidget() const;
public slots:
/**
* Opens the perspective with the given name.
@@ -544,6 +555,12 @@ signals:
*/
void dockAreaCreated(ads::CDockAreaWidget* DockArea);
/**
* This signal is emitted if a dock widget has been added to this
* dock manager instance.
*/
void dockWidgetAdded(ads::CDockWidget* DockWidget);
/**
* This signal is emitted just before the given dock widget is removed
* from the dock manager
+17 -8
View File
@@ -146,6 +146,19 @@ struct DockWidgetTabPrivate
CloseButton->setVisible(DockWidgetClosable && TabHasCloseButton);
}
/**
* Update the size policy of the close button depending on the
* RetainTabSizeWhenCloseButtonHidden feature
*/
void updateCloseButtonSizePolicy()
{
auto Features = DockWidget->features();
auto SizePolicy = CloseButton->sizePolicy();
SizePolicy.setRetainSizeWhenHidden(Features.testFlag(CDockWidget::DockWidgetClosable)
&& testConfigFlag(CDockManager::RetainTabSizeWhenCloseButtonHidden));
CloseButton->setSizePolicy(SizePolicy);
}
template <typename T>
IFloatingWidget* createFloatingWidget(T* Widget, bool OpaqueUndocking)
{
@@ -200,7 +213,7 @@ void DockWidgetTabPrivate::createLayout()
CloseButton->setObjectName("tabCloseButton");
internal::setButtonIcon(CloseButton, QStyle::SP_TitleBarCloseButton, TabCloseIcon);
CloseButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
_this->onDockWidgetFeaturesChanged();
updateCloseButtonSizePolicy();
internal::setToolTip(CloseButton, QObject::tr("Close Tab"));
_this->connect(CloseButton, SIGNAL(clicked()), SIGNAL(closeRequested()));
@@ -473,7 +486,7 @@ bool CDockWidgetTab::isActiveTab() const
//============================================================================
void CDockWidgetTab::setActiveTab(bool active)
{
d->updateCloseButtonVisibility(active);
d->updateCloseButtonVisibility(active);
// Focus related stuff
if (CDockManager::testConfigFlag(CDockManager::FocusHighlighting) && !d->DockWidget->dockManager()->isRestoringState())
@@ -656,12 +669,8 @@ bool CDockWidgetTab::event(QEvent *e)
//============================================================================
void CDockWidgetTab::onDockWidgetFeaturesChanged()
{
auto Features = d->DockWidget->features();
auto SizePolicy = d->CloseButton->sizePolicy();
SizePolicy.setRetainSizeWhenHidden(Features.testFlag(CDockWidget::DockWidgetClosable)
&& d->testConfigFlag(CDockManager::RetainTabSizeWhenCloseButtonHidden));
d->CloseButton->setSizePolicy(SizePolicy);
d->updateCloseButtonVisibility(isActiveTab());
d->updateCloseButtonSizePolicy();
d->updateCloseButtonVisibility(isActiveTab());
}
+3 -3
View File
@@ -752,7 +752,7 @@ bool CFloatingDockContainer::nativeEvent(const QByteArray &eventType, void *mess
case WM_NCLBUTTONDOWN:
if (msg->wParam == HTCAPTION && d->isState(DraggingInactive))
{
ADS_PRINT("CFloatingDockContainer::nativeEvent WM_NCLBUTTONDOWN" << e->type());
ADS_PRINT("CFloatingDockContainer::nativeEvent WM_NCLBUTTONDOWN");
d->DragStartPos = pos();
d->setState(DraggingMousePressed);
}
@@ -765,7 +765,7 @@ bool CFloatingDockContainer::nativeEvent(const QByteArray &eventType, void *mess
case WM_ENTERSIZEMOVE:
if (d->isState(DraggingMousePressed))
{
ADS_PRINT("CFloatingDockContainer::nativeEvent WM_ENTERSIZEMOVE" << e->type());
ADS_PRINT("CFloatingDockContainer::nativeEvent WM_ENTERSIZEMOVE");
d->setState(DraggingFloatingWidget);
d->updateDropOverlays(QCursor::pos());
}
@@ -774,7 +774,7 @@ bool CFloatingDockContainer::nativeEvent(const QByteArray &eventType, void *mess
case WM_EXITSIZEMOVE:
if (d->isState(DraggingFloatingWidget))
{
ADS_PRINT("CFloatingDockContainer::nativeEvent WM_EXITSIZEMOVE" << e->type());
ADS_PRINT("CFloatingDockContainer::nativeEvent WM_EXITSIZEMOVE");
if (GetAsyncKeyState(VK_ESCAPE) & 0x8000)
{
d->handleEscapeKey();
+1 -1
View File
@@ -69,7 +69,7 @@ SOURCES += \
DockFocusController.cpp
unix {
unix:!macx {
HEADERS += linux/FloatingWidgetTitleBar.h
SOURCES += linux/FloatingWidgetTitleBar.cpp
QT += x11extras