diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 37a2cdc..29e6237 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -94,7 +94,8 @@ struct DockManagerPrivate CDockManager::eViewMenuInsertionOrder MenuInsertionOrder = CDockManager::MenuAlphabeticallySorted; bool RestoringState = false; QVector UninitializedFloatingWidgets; - QPointer FocusedDockWidget; + QPointer FocusedDockWidget = nullptr; + QPointer FocusedArea = nullptr; /** * Private data constructor @@ -881,6 +882,12 @@ CIconProvider& CDockManager::iconProvider() //=========================================================================== void CDockManager::onFocusObjectChanged(QObject *focusObject) { + if (!focusObject) + { + return; + } + std::cout << "\n\nCDockManager::onFocusObjectChanged " << focusObject->metaObject()->className() << std::endl; + auto FocusWidget = qobject_cast(focusObject); if (!FocusWidget) { @@ -889,46 +896,39 @@ void CDockManager::onFocusObjectChanged(QObject *focusObject) CDockWidget* DockWidget = nullptr; - std::cout << "CDockManager::onFocusObjectChanged " << focusObject->objectName().toStdString() - << " meta: " << focusObject->metaObject()->className() << std::endl; - auto DockWidgetTab = qobject_cast(focusObject); if (DockWidgetTab) { DockWidget = DockWidgetTab->dockWidget(); + std::cout << "TabText: " << DockWidgetTab->text().toStdString() << std::endl; } else { DockWidget = internal::findParent(FocusWidget); } + std::cout << "Focus Object " << focusObject->objectName().toStdString() + << " meta: " << focusObject->metaObject()->className() << std::endl; if (!DockWidget) { - return; - } - - if (d->FocusedDockWidget.data() == DockWidget) - { + std::cout << "!DockWidget" << std::endl; return; } QList DockWidgets; - CDockAreaWidget* OldFocusedDockArea = nullptr; CDockAreaWidget* NewFocusedDockArea = nullptr; if (d->FocusedDockWidget) { + std::cout << "focuse = false: " << d->FocusedDockWidget->objectName().toStdString() << std::endl; d->FocusedDockWidget->setProperty("focused", false); d->FocusedDockWidget->tabWidget()->setProperty("focused", false); - OldFocusedDockArea = d->FocusedDockWidget->dockAreaWidget(); - if (OldFocusedDockArea) - { - OldFocusedDockArea->setProperty("focused", false); - } DockWidgets.append(d->FocusedDockWidget); } d->FocusedDockWidget = DockWidget; + std::cout << "d->FocusedDockWidget " << d->FocusedDockWidget->objectName().toStdString() << std::endl; d->FocusedDockWidget->setProperty("focused", true); d->FocusedDockWidget->tabWidget()->setProperty("focused", true); + connect(d->FocusedDockWidget, SIGNAL(closed()), this, SLOT(onFocusedDockWidgetClosed())); NewFocusedDockArea = d->FocusedDockWidget->dockAreaWidget(); if (NewFocusedDockArea) { @@ -942,22 +942,31 @@ void CDockManager::onFocusObjectChanged(QObject *focusObject) internal::repolishStyle(DockWidget); } - if (OldFocusedDockArea == NewFocusedDockArea) + if (!NewFocusedDockArea || (d->FocusedArea == NewFocusedDockArea)) { + std::cout << "d->FocusedArea == NewFocusedDockArea" << std::endl; return; } - if (OldFocusedDockArea) + if (d->FocusedArea) { - internal::repolishStyle(OldFocusedDockArea); - internal::repolishStyle(OldFocusedDockArea->titleBar()); + std::cout << "Repolish OldFocusedDockArea" << std::endl; + d->FocusedArea->setProperty("focused", false); + internal::repolishStyle(d->FocusedArea); + internal::repolishStyle(d->FocusedArea->titleBar()); } - if (NewFocusedDockArea) - { - internal::repolishStyle(NewFocusedDockArea); - internal::repolishStyle(NewFocusedDockArea->titleBar()); - } + std::cout << "Repolish NewFocusedDockArea" << std::endl; + NewFocusedDockArea->setProperty("focused", true); + internal::repolishStyle(NewFocusedDockArea); + internal::repolishStyle(NewFocusedDockArea->titleBar()); + d->FocusedArea = NewFocusedDockArea; +} + +//=========================================================================== +void CDockManager::onFocusedDockWidgetClosed() +{ + std::cout << "CDockManager::onFocusedDockWidgetClosed()" << std::endl; } diff --git a/src/DockManager.h b/src/DockManager.h index 5de5fd6..14932a7 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -86,6 +86,7 @@ private: private slots: void onFocusObjectChanged(QObject *focusObject); + void onFocusedDockWidgetClosed(); protected: /** diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index 7597d05..167b2d7 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -468,6 +468,11 @@ void CDockWidgetTab::setActiveTab(bool active) return; } + if (active && !hasFocus()) + { + std::cout << "setFocus(Qt::OtherFocusReason);" << std::endl; + setFocus(Qt::OtherFocusReason); + } d->IsActiveTab = active; updateStyle(); update();