Revision: 76952
          http://sourceforge.net/p/brlcad/code/76952
Author:   starseeker
Date:     2020-08-26 01:18:07 +0000 (Wed, 26 Aug 2020)
Log Message:
-----------
Update qtads with latest upstream changes.

Modified Paths:
--------------
    brlcad/trunk/src/libdm/qt/dm-qt.h
    brlcad/trunk/src/qged/qtads/CMakeLists.txt
    brlcad/trunk/src/qged/qtads/DockAreaTabBar.cpp
    brlcad/trunk/src/qged/qtads/DockAreaTitleBar.cpp
    brlcad/trunk/src/qged/qtads/DockAreaWidget.cpp
    brlcad/trunk/src/qged/qtads/DockAreaWidget.h
    brlcad/trunk/src/qged/qtads/DockContainerWidget.cpp
    brlcad/trunk/src/qged/qtads/DockContainerWidget.h
    brlcad/trunk/src/qged/qtads/DockFocusController.cpp
    brlcad/trunk/src/qged/qtads/DockFocusController.h
    brlcad/trunk/src/qged/qtads/DockManager.cpp
    brlcad/trunk/src/qged/qtads/DockManager.h
    brlcad/trunk/src/qged/qtads/DockOverlay.cpp
    brlcad/trunk/src/qged/qtads/DockSplitter.cpp
    brlcad/trunk/src/qged/qtads/DockSplitter.h
    brlcad/trunk/src/qged/qtads/DockWidget.cpp
    brlcad/trunk/src/qged/qtads/DockWidget.h
    brlcad/trunk/src/qged/qtads/DockWidgetTab.cpp
    brlcad/trunk/src/qged/qtads/FloatingDragPreview.cpp

Added Paths:
-----------
    brlcad/trunk/src/qged/qtads/images/maximize-button-focused.svg
    brlcad/trunk/src/qged/qtads/images/maximize-button.svg
    brlcad/trunk/src/qged/qtads/images/restore-button-focused.svg
    brlcad/trunk/src/qged/qtads/images/restore-button.svg

Modified: brlcad/trunk/src/libdm/qt/dm-qt.h
===================================================================
--- brlcad/trunk/src/libdm/qt/dm-qt.h   2020-08-25 22:37:45 UTC (rev 76951)
+++ brlcad/trunk/src/libdm/qt/dm-qt.h   2020-08-26 01:18:07 UTC (rev 76952)
@@ -85,7 +85,7 @@
     int devbuttonrelease;
 };
 
-extern struct dm dm_qt;
+extern "C" struct dm dm_qt;
 
 #endif /* DM_QT_H */
 

Modified: brlcad/trunk/src/qged/qtads/CMakeLists.txt
===================================================================
--- brlcad/trunk/src/qged/qtads/CMakeLists.txt  2020-08-25 22:37:45 UTC (rev 
76951)
+++ brlcad/trunk/src/qged/qtads/CMakeLists.txt  2020-08-26 01:18:07 UTC (rev 
76952)
@@ -78,6 +78,10 @@
   images/close-button.svg
   images/detach-button-disabled.svg
   images/detach-button.svg
+  images/maximize-button-focused.svg
+  images/maximize-button.svg
+  images/restore-button-focused.svg
+  images/restore-button.svg
   images/tabs-menu-button.svg
   linux/FloatingWidgetTitleBar.cpp
   linux/FloatingWidgetTitleBar.h

Modified: brlcad/trunk/src/qged/qtads/DockAreaTabBar.cpp
===================================================================
--- brlcad/trunk/src/qged/qtads/DockAreaTabBar.cpp      2020-08-25 22:37:45 UTC 
(rev 76951)
+++ brlcad/trunk/src/qged/qtads/DockAreaTabBar.cpp      2020-08-26 01:18:07 UTC 
(rev 76952)
@@ -138,6 +138,8 @@
        d->TabsLayout->addStretch(1);
        d->TabsContainerWidget->setLayout(d->TabsLayout);
        setWidget(d->TabsContainerWidget);
+
+    setFocusPolicy(Qt::NoFocus);
 }
 
 
@@ -456,6 +458,11 @@
                 updateGeometry();
                 break;
 
+    // Setting the text of a tab will cause a LayoutRequest event
+    case QEvent::LayoutRequest:
+         updateGeometry();
+         break;
+
        default:
                break;
        }

Modified: brlcad/trunk/src/qged/qtads/DockAreaTitleBar.cpp
===================================================================
--- brlcad/trunk/src/qged/qtads/DockAreaTitleBar.cpp    2020-08-25 22:37:45 UTC 
(rev 76951)
+++ brlcad/trunk/src/qged/qtads/DockAreaTitleBar.cpp    2020-08-26 01:18:07 UTC 
(rev 76952)
@@ -54,6 +54,19 @@
 
 #include <iostream>
 
+#if defined(__GNUC__) && !defined(__clang__)
+#  pragma GCC diagnostic push
+#endif
+#if defined(__clang__)
+#  pragma clang diagnostic push
+#endif
+#if defined(__GNUC__) && !defined(__clang__)
+#  pragma GCC diagnostic ignored "-Wshadow"
+#endif
+#if defined(__clang__)
+#  pragma clang diagnostic ignored "-Wshadow"
+#endif
+
 namespace ads
 {
 
@@ -149,12 +162,12 @@
        TabsMenuButton->setAutoRaise(true);
        TabsMenuButton->setPopupMode(QToolButton::InstantPopup);
        internal::setButtonIcon(TabsMenuButton, 
QStyle::SP_TitleBarUnshadeButton, ads::DockAreaMenuIcon);
-       QMenu* LTabsMenu = new QMenu(TabsMenuButton);
+       QMenu* TabsMenu = new QMenu(TabsMenuButton);
 #ifndef QT_NO_TOOLTIP
-       LTabsMenu->setToolTipsVisible(true);
+       TabsMenu->setToolTipsVisible(true);
 #endif
-       _this->connect(LTabsMenu, SIGNAL(aboutToShow()), 
SLOT(onTabsMenuAboutToShow()));
-       TabsMenuButton->setMenu(LTabsMenu);
+       _this->connect(TabsMenu, SIGNAL(aboutToShow()), 
SLOT(onTabsMenuAboutToShow()));
+       TabsMenuButton->setMenu(TabsMenu);
        internal::setToolTip(TabsMenuButton, QObject::tr("List All Tabs"));
        TabsMenuButton->setSizePolicy(ButtonSizePolicy);
        Layout->addWidget(TabsMenuButton, 0);
@@ -209,17 +222,17 @@
 
 
 //============================================================================
-IFloatingWidget* DockAreaTitleBarPrivate::makeAreaFloating(const QPoint& 
Offset, eDragState LDragState)
+IFloatingWidget* DockAreaTitleBarPrivate::makeAreaFloating(const QPoint& 
Offset, eDragState DragState)
 {
        QSize Size = DockArea->size();
-       this->DragState = LDragState;
+       this->DragState = DragState;
        bool OpaqueUndocking = 
CDockManager::testConfigFlag(CDockManager::OpaqueUndocking) ||
-               (DraggingFloatingWidget != LDragState);
+               (DraggingFloatingWidget != DragState);
        CFloatingDockContainer* FloatingDockContainer = nullptr;
-       IFloatingWidget* LFloatingWidget;
+       IFloatingWidget* FloatingWidget;
        if (OpaqueUndocking)
        {
-               LFloatingWidget = FloatingDockContainer = new 
CFloatingDockContainer(DockArea);
+               FloatingWidget = FloatingDockContainer = new 
CFloatingDockContainer(DockArea);
        }
        else
        {
@@ -228,10 +241,10 @@
                {
                        this->DragState = DraggingInactive;
                });
-               LFloatingWidget = w;
+               FloatingWidget = w;
        }
 
-    LFloatingWidget->startFloating(Offset, Size, LDragState, nullptr);
+    FloatingWidget->startFloating(Offset, Size, DragState, nullptr);
     if (FloatingDockContainer)
     {
                auto TopLevelDockWidget = 
FloatingDockContainer->topLevelDockWidget();
@@ -241,7 +254,7 @@
                }
     }
 
-       return LFloatingWidget;
+       return FloatingWidget;
 }
 
 
@@ -269,6 +282,8 @@
        d->createTabBar();
        d->Layout->addWidget(new CSpacerWidget(this));
        d->createButtons();
+
+    setFocusPolicy(Qt::NoFocus);
 }
 
 
@@ -577,12 +592,12 @@
        }
 
        QMenu Menu(this);
-       auto Action = Menu.addAction(tr("Detach Area"), this, 
SLOT(onUndockButtonClicked()));
+       auto Action = Menu.addAction(tr("Detach Group"), this, 
SLOT(onUndockButtonClicked()));
        
Action->setEnabled(d->DockArea->features().testFlag(CDockWidget::DockWidgetFloatable));
        Menu.addSeparator();
-       Action = Menu.addAction(tr("Close Area"), this, 
SLOT(onCloseButtonClicked()));
+       Action = Menu.addAction(tr("Close Group"), this, 
SLOT(onCloseButtonClicked()));
        
Action->setEnabled(d->DockArea->features().testFlag(CDockWidget::DockWidgetClosable));
-       Menu.addAction(tr("Close Other Areas"), d->DockArea, 
SLOT(closeOtherAreas()));
+       Menu.addAction(tr("Close Other Groups"), d->DockArea, 
SLOT(closeOtherAreas()));
        Menu.exec(ev->globalPos());
 }
 
@@ -606,7 +621,7 @@
          Visible(visible),
          
HideWhenDisabled(CDockManager::testConfigFlag(CDockManager::DockAreaHideDisabledButtons))
 {
-
+    setFocusPolicy(Qt::NoFocus);
 }
 
 //============================================================================
@@ -646,5 +661,12 @@
 
 } // namespace ads
 
+#if defined(__GNUC__) && !defined(__clang__)
+#  pragma GCC diagnostic pop
+#endif
+#if defined(__clang__)
+#  pragma clang diagnostic pop
+#endif
+
 //---------------------------------------------------------------------------
 // EOF DockAreaTitleBar.cpp

Modified: brlcad/trunk/src/qged/qtads/DockAreaWidget.cpp
===================================================================
--- brlcad/trunk/src/qged/qtads/DockAreaWidget.cpp      2020-08-25 22:37:45 UTC 
(rev 76951)
+++ brlcad/trunk/src/qged/qtads/DockAreaWidget.cpp      2020-08-26 01:18:07 UTC 
(rev 76952)
@@ -30,8 +30,6 @@
 //============================================================================
 #include "DockAreaWidget.h"
 
-#include <iostream>
-
 #include <QStackedLayout>
 #include <QScrollBar>
 #include <QScrollArea>
@@ -177,6 +175,7 @@
                {
                        LayoutItem->widget()->setParent(nullptr);
                }
+               delete LayoutItem;
 
                m_ParentLayout->addWidget(next);
                if (prev)
@@ -237,6 +236,7 @@
 
 
 using DockAreaLayout = CDockAreaLayout;
+static const DockWidgetAreas DefaultAllowedAreas = AllDockAreas;
 
 
 /**
@@ -250,8 +250,9 @@
        CDockAreaTitleBar*      TitleBar                = nullptr;
        CDockManager*           DockManager             = nullptr;
        bool UpdateTitleBarButtons = false;
-       DockWidgetAreas         AllowedAreas    = AllDockAreas;
+       DockWidgetAreas         AllowedAreas    = DefaultAllowedAreas;
        QSize MinSizeHint;
+       CDockAreaWidget::DockAreaFlags Flags{CDockAreaWidget::DefaultFlags};
 
        /**
         * Private data constructor
@@ -440,6 +441,7 @@
                DockWidget->toggleViewInternal(true);
        }
        d->updateTitleBarButtonStates();
+    updateTitleBarVisibility();
 }
 
 
@@ -447,12 +449,15 @@
 void CDockAreaWidget::removeDockWidget(CDockWidget* DockWidget)
 {
     ADS_PRINT("CDockAreaWidget::removeDockWidget");
-       auto NextOpenDockWidget = nextOpenDockWidget(DockWidget);
+    auto CurrentDockWidget = currentDockWidget();
+       auto NextOpenDockWidget = (DockWidget == CurrentDockWidget) ? 
nextOpenDockWidget(DockWidget) : nullptr;
 
        d->ContentsLayout->removeWidget(DockWidget);
        auto TabWidget = DockWidget->tabWidget();
        TabWidget->hide();
        d->tabBar()->removeTab(TabWidget);
+       TabWidget->setParent(DockWidget);
+       DockWidget->setDockArea(nullptr);
        CDockContainerWidget* DockContainer = dockContainer();
        if (NextOpenDockWidget)
        {
@@ -463,8 +468,16 @@
         ADS_PRINT("Dock Area empty");
                DockContainer->removeDockArea(this);
                this->deleteLater();
+               if(DockContainer->dockAreaCount() == 0)
+               {
+                       if(CFloatingDockContainer*  FloatingDockContainer = 
DockContainer->floatingWidget())
+                       {
+                               FloatingDockContainer->hide();
+                               FloatingDockContainer->deleteLater();
+                       }
+               }
        }
-       else
+       else if (DockWidget == CurrentDockWidget)
        {
                // if contents layout is not empty but there are no more open 
dock
                // widgets, then we need to hide the dock area because it does 
not
@@ -744,6 +757,7 @@
        {
                bool Hidden = Container->hasTopLevelDockWidget() && 
(Container->isFloating()
                        || 
CDockManager::testConfigFlag(CDockManager::HideSingleCentralWidgetTitleBar));
+               Hidden |= (d->Flags.testFlag(HideSingleWidgetTitleBar) && 
openDockWidgetsCount() == 1);
                d->TitleBar->setVisible(!Hidden);
        }
 }
@@ -768,6 +782,17 @@
        auto CurrentDockWidget = currentDockWidget();
        QString Name = CurrentDockWidget ? CurrentDockWidget->objectName() : "";
        s.writeAttribute("Current", Name);
+       // To keep the saved XML data small, we only save the allowed areas and 
the
+       // dock area flags if the values are different from the default values
+       if (d->AllowedAreas != DefaultAllowedAreas)
+       {
+               s.writeAttribute("AllowedAreas", 
QString::number(d->AllowedAreas, 16));
+       }
+
+       if (d->Flags != DefaultFlags)
+       {
+               s.writeAttribute("Flags", QString::number(d->Flags, 16));
+       }
     ADS_PRINT("CDockAreaWidget::saveState TabCount: " << 
d->ContentsLayout->count()
             << " Current: " << Name);
        for (int i = 0; i < d->ContentsLayout->count(); ++i)
@@ -847,17 +872,50 @@
        }
 }
 
+
+//============================================================================
 void CDockAreaWidget::setAllowedAreas(DockWidgetAreas areas)
 {
        d->AllowedAreas = areas;
 }
 
+
+//============================================================================
 DockWidgetAreas CDockAreaWidget::allowedAreas() const
 {
        return d->AllowedAreas;
 }
 
+
 //============================================================================
+CDockAreaWidget::DockAreaFlags CDockAreaWidget::dockAreaFlags() const
+{
+       return d->Flags;
+}
+
+
+//============================================================================
+void CDockAreaWidget::setDockAreaFlags(DockAreaFlags Flags)
+{
+       auto ChangedFlags = d->Flags ^ Flags;
+       d->Flags = Flags;
+       if (ChangedFlags.testFlag(HideSingleWidgetTitleBar))
+       {
+               updateTitleBarVisibility();
+       }
+}
+
+
+//============================================================================
+void CDockAreaWidget::setDockAreaFlag(eDockAreaFlag Flag, bool On)
+{
+       auto flags = dockAreaFlags();
+       internal::setFlag(flags, Flag, On);
+       setDockAreaFlags(flags);
+}
+
+
+//============================================================================
 QAbstractButton* CDockAreaWidget::titleBarButton(TitleBarButton which) const
 {
        return d->TitleBar->button(which);
@@ -899,10 +957,34 @@
 
 
 //============================================================================
+bool CDockAreaWidget::isCentralWidgetArea() const
+{
+    if (dockWidgetsCount()!= 1)
+    {
+        return false;
+    }
+
+    return dockManager()->centralWidget() == dockWidgets()[0];
+}
+
+
+//============================================================================
 QSize CDockAreaWidget::minimumSizeHint() const
 {
        return d->MinSizeHint.isValid() ? d->MinSizeHint : 
Super::minimumSizeHint();
 }
+
+
+//============================================================================
+void CDockAreaWidget::onDockWidgetFeaturesChanged()
+{
+       if (d->TitleBar)
+       {
+               d->updateTitleBarButtonStates();
+       }
+}
+
+
 } // namespace ads
 
 //---------------------------------------------------------------------------

Modified: brlcad/trunk/src/qged/qtads/DockAreaWidget.h
===================================================================
--- brlcad/trunk/src/qged/qtads/DockAreaWidget.h        2020-08-25 22:37:45 UTC 
(rev 76951)
+++ brlcad/trunk/src/qged/qtads/DockAreaWidget.h        2020-08-26 01:18:07 UTC 
(rev 76952)
@@ -65,6 +65,7 @@
        friend class CDockWidget;
        friend struct DockManagerPrivate;
        friend class CDockManager;
+       void onDockWidgetFeaturesChanged();
 
 private slots:
        void onTabCloseRequested(int Index);
@@ -144,6 +145,16 @@
        using Super = QFrame;
 
        /**
+        * Dock area related flags
+        */
+       enum eDockAreaFlag
+       {
+               HideSingleWidgetTitleBar = 0x0001,
+               DefaultFlags = 0x0000
+       };
+       Q_DECLARE_FLAGS(DockAreaFlags, eDockAreaFlag)
+
+    /**
         * Default Constructor
         */
        CDockAreaWidget(CDockManager* DockManager, CDockContainerWidget* 
parent);
@@ -277,6 +288,30 @@
         */
        CDockAreaTitleBar* titleBar() const;
 
+       /**
+        * Returns the dock area flags - a combination of flags that configure 
the
+        * appearance and features of the dock area.
+        * \see setDockAreaFlasg()
+        */
+       DockAreaFlags dockAreaFlags() const;
+
+       /**
+        * Sets the dock area flags - a combination of flags that configure the
+        * appearance and features of the dock area
+        */
+       void setDockAreaFlags(DockAreaFlags Flags);
+
+       /**
+        * Sets the dock area flag Flag on this widget if on is true; otherwise
+        * clears the flag.
+        */
+       void setDockAreaFlag(eDockAreaFlag Flag, bool On);
+
+    /**
+     * Returns true if the area contains the central widget of it's manager.
+     */
+    bool isCentralWidgetArea() const;
+
 public slots:
        /**
         * This activates the tab for the given tab index.

Modified: brlcad/trunk/src/qged/qtads/DockContainerWidget.cpp
===================================================================
--- brlcad/trunk/src/qged/qtads/DockContainerWidget.cpp 2020-08-25 22:37:45 UTC 
(rev 76951)
+++ brlcad/trunk/src/qged/qtads/DockContainerWidget.cpp 2020-08-26 01:18:07 UTC 
(rev 76952)
@@ -51,6 +51,19 @@
 #include <functional>
 #include <iostream>
 
+#if defined(__GNUC__) && !defined(__clang__)
+#  pragma GCC diagnostic push
+#endif
+#if defined(__clang__)
+#  pragma clang diagnostic push
+#endif
+#if defined(__GNUC__) && !defined(__clang__)
+#  pragma GCC diagnostic ignored "-Wshadow"
+#endif
+#if defined(__clang__)
+#  pragma clang diagnostic ignored "-Wshadow"
+#endif
+
 #if QT_VERSION < 0x050900
 
 inline char toHexLower(uint value)
@@ -322,7 +335,19 @@
                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: ------------------------------------------------------------
        void onDockAreaViewToggled(bool Visible)
        {
@@ -385,13 +410,13 @@
 //============================================================================
 void DockContainerWidgetPrivate::onVisibleDockAreaCountChanged()
 {
-       auto LTopLevelDockArea = _this->topLevelDockArea();
+       auto TopLevelDockArea = _this->topLevelDockArea();
 
-       if (LTopLevelDockArea)
+       if (TopLevelDockArea)
        {
-               this->TopLevelDockArea = LTopLevelDockArea;
-               
LTopLevelDockArea->titleBarButton(TitleBarButtonUndock)->setVisible(false || 
!_this->isFloating());
-               
LTopLevelDockArea->titleBarButton(TitleBarButtonClose)->setVisible(false || 
!_this->isFloating());
+               this->TopLevelDockArea = TopLevelDockArea;
+               
TopLevelDockArea->titleBarButton(TitleBarButtonUndock)->setVisible(false || 
!_this->isFloating());
+               
TopLevelDockArea->titleBarButton(TitleBarButtonClose)->setVisible(false || 
!_this->isFloating());
        }
        else if (this->TopLevelDockArea)
        {
@@ -421,7 +446,8 @@
                QSplitter* NewSplitter = newSplitter(InsertParam.orientation());
                QLayoutItem* li = Layout->replaceWidget(Splitter, NewSplitter);
                NewSplitter->addWidget(Splitter);
-               Splitter = NewSplitter;
+        updateSplitterHandles(NewSplitter);
+        Splitter = NewSplitter;
                delete li;
        }
 
@@ -430,7 +456,8 @@
        if (FloatingSplitter->count() == 1)
        {
                insertWidgetIntoSplitter(Splitter, FloatingSplitter->widget(0), 
InsertParam.append());
-       }
+        updateSplitterHandles(Splitter);
+    }
        else if (FloatingSplitter->orientation() == InsertParam.orientation())
        {
         int InsertIndex = InsertParam.append() ? Splitter->count() : 0;
@@ -437,12 +464,13 @@
                while (FloatingSplitter->count())
                {
             Splitter->insertWidget(InsertIndex++, FloatingSplitter->widget(0));
-               }
-       }
+            updateSplitterHandles(Splitter);
+        }
+    }
        else
        {
                insertWidgetIntoSplitter(Splitter, FloatingSplitter, 
InsertParam.append());
-       }
+    }
 
        RootSplitter = Splitter;
        addDockAreasToList(NewDockAreas);
@@ -453,7 +481,7 @@
        if (!Splitter->isVisible())
        {
                Splitter->show();
-       }
+    }
        _this->dumpLayout();
 }
 
@@ -464,15 +492,15 @@
 {
        CDockContainerWidget* FloatingContainer = 
FloatingWidget->dockContainer();
        auto NewDockWidgets = FloatingContainer->dockWidgets();
-       auto LTopLevelDockArea = FloatingContainer->topLevelDockArea();
+       auto TopLevelDockArea = FloatingContainer->topLevelDockArea();
        int NewCurrentIndex = -1;
 
        // If the floating widget contains only one single dock are, then the
        // current dock widget of the dock area will also be the future current
        // dock widget in the drop area.
-       if (LTopLevelDockArea)
+       if (TopLevelDockArea)
        {
-               NewCurrentIndex = LTopLevelDockArea->currentIndex();
+               NewCurrentIndex = TopLevelDockArea->currentIndex();
        }
 
        for (int i = 0; i < NewDockWidgets.count(); ++i)
@@ -515,7 +543,8 @@
                QSplitter* Splitter = newSplitter(InsertParam.orientation());
                Layout->replaceWidget(TargetArea, Splitter);
                Splitter->addWidget(TargetArea);
-               TargetAreaSplitter = Splitter;
+        updateSplitterHandles(Splitter);
+        TargetAreaSplitter = Splitter;
        }
        int AreaIndex = TargetAreaSplitter->indexOf(TargetArea);
        auto Widget = 
FloatingWidget->dockContainer()->findChild<QWidget*>(QString(), 
Qt::FindDirectChildrenOnly);
@@ -529,7 +558,8 @@
                if ((FloatingSplitter->orientation() != 
InsertParam.orientation()) && FloatingSplitter->count() > 1)
                {
                        TargetAreaSplitter->insertWidget(AreaIndex + 
InsertParam.insertOffset(), Widget);
-               }
+            updateSplitterHandles(TargetAreaSplitter);
+        }
                else
                {
                        AdjustSplitterSizes = (FloatingSplitter->count() == 1);
@@ -537,8 +567,9 @@
                        while (FloatingSplitter->count())
                        {
                                TargetAreaSplitter->insertWidget(InsertIndex++, 
FloatingSplitter->widget(0));
-                       }
-               }
+                updateSplitterHandles(TargetAreaSplitter);
+            }
+        }
 
                if (AdjustSplitterSizes)
                {
@@ -557,7 +588,8 @@
                if ((FloatingSplitter->orientation() != 
InsertParam.orientation()) && FloatingSplitter->count() > 1)
                {
                        NewSplitter->addWidget(Widget);
-               }
+            updateSplitterHandles(NewSplitter);
+        }
                else
                {
                        AdjustSplitterSizes = (FloatingSplitter->count() == 1);
@@ -564,14 +596,16 @@
                        while (FloatingSplitter->count())
                        {
                                
NewSplitter->addWidget(FloatingSplitter->widget(0));
-                       }
-               }
+                updateSplitterHandles(NewSplitter);
+            }
+        }
 
                // Save the sizes before insertion and restore it later to 
prevent
                // shrinking of existing area
                auto Sizes = TargetAreaSplitter->sizes();
                insertWidgetIntoSplitter(NewSplitter, TargetArea, 
!InsertParam.append());
-               if (AdjustSplitterSizes)
+        updateSplitterHandles(NewSplitter);
+        if (AdjustSplitterSizes)
                {
                        int Size = TargetAreaSize / 2;
                        NewSplitter->setSizes({Size, Size});
@@ -578,7 +612,8 @@
                }
                TargetAreaSplitter->insertWidget(AreaIndex, NewSplitter);
                TargetAreaSplitter->setSizes(Sizes);
-       }
+        updateSplitterHandles(TargetAreaSplitter);
+    }
 
        addDockAreasToList(NewDockAreas);
        _this->dumpLayout();
@@ -663,21 +698,24 @@
        {
                int TargetAreaSize = (InsertParam.orientation() == 
Qt::Horizontal) ? TargetArea->width() : TargetArea->height();
                TargetAreaSplitter->insertWidget(AreaIndex + 
InsertParam.insertOffset(), NewDockArea);
-               int Size = (TargetAreaSize - TargetAreaSplitter->handleWidth()) 
/ 2;
+        updateSplitterHandles(TargetAreaSplitter);
+        int Size = (TargetAreaSize - TargetAreaSplitter->handleWidth()) / 2;
                Sizes[AreaIndex] = Size;
                Sizes.insert(AreaIndex, Size);
        }
        else
        {
-               //auto LSizes = TargetAreaSplitter->sizes();
+               auto Sizes = TargetAreaSplitter->sizes();
                int TargetAreaSize = (InsertParam.orientation() == 
Qt::Horizontal) ? TargetArea->width() : TargetArea->height();
                QSplitter* NewSplitter = newSplitter(InsertParam.orientation());
                NewSplitter->addWidget(TargetArea);
                insertWidgetIntoSplitter(NewSplitter, NewDockArea, 
InsertParam.append());
-               int Size = TargetAreaSize / 2;
+        updateSplitterHandles(NewSplitter);
+        int Size = TargetAreaSize / 2;
                NewSplitter->setSizes({Size, Size});
                TargetAreaSplitter->insertWidget(AreaIndex, NewSplitter);
-       }
+        updateSplitterHandles(TargetAreaSplitter);
+    }
        TargetAreaSplitter->setSizes(Sizes);
 
        addDockAreasToList({NewDockArea});
@@ -685,6 +723,46 @@
 
 
 //============================================================================
+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)
 {
        CDockWidget* DroppedDockWidget = qobject_cast<CDockWidget*>(Widget);
@@ -892,6 +970,10 @@
                Splitter->addWidget(ChildNode);
                Visible |= ChildNode->isVisibleTo(Splitter);
        }
+    if(!Testing)
+    {
+       updateSplitterHandles(Splitter);
+    }
 
        if (Sizes.count() != WidgetCount)
        {
@@ -942,6 +1024,17 @@
        if (!Testing)
        {
                DockArea = new CDockAreaWidget(DockManager, _this);
+               const auto AllowedAreasAttribute = 
s.attributes().value("AllowedAreas");
+               if (!AllowedAreasAttribute.isEmpty())
+               {
+                       
DockArea->setAllowedAreas((DockWidgetArea)AllowedAreasAttribute.toInt(nullptr, 
16));
+               }
+
+               const auto FlagsAttribute = s.attributes().value("Flags");
+               if (!FlagsAttribute.isEmpty())
+               {
+                       
DockArea->setDockAreaFlags((CDockAreaWidget::DockAreaFlags)FlagsAttribute.toInt(nullptr,
 16));
+               }
        }
 
        while (s.readNextStartElement())
@@ -1058,7 +1151,8 @@
        if (Splitter->orientation() == InsertParam.orientation())
        {
                insertWidgetIntoSplitter(Splitter, NewDockArea, 
InsertParam.append());
-               if (Splitter->isHidden())
+        updateSplitterHandles(Splitter);
+        if (Splitter->isHidden())
                {
                        Splitter->show();
                }
@@ -1071,7 +1165,8 @@
                        QLayoutItem* li = Layout->replaceWidget(Splitter, 
NewSplitter);
                        NewSplitter->addWidget(Splitter);
                        NewSplitter->addWidget(NewDockArea);
-                       delete li;
+            updateSplitterHandles(NewSplitter);
+            delete li;
                }
                else
                {
@@ -1078,7 +1173,8 @@
                        NewSplitter->addWidget(NewDockArea);
                        QLayoutItem* li = Layout->replaceWidget(Splitter, 
NewSplitter);
                        NewSplitter->addWidget(Splitter);
-                       delete li;
+            updateSplitterHandles(NewSplitter);
+            delete li;
                }
                RootSplitter = NewSplitter;
        }
@@ -1164,7 +1260,8 @@
        {
                ADS_PRINT("TargetAreaSplitter->orientation() == 
InsertParam.orientation()");
                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))
                {
                        adjustSplitterSizesOnInsertion(TargetAreaSplitter);
@@ -1179,9 +1276,11 @@
                NewSplitter->addWidget(TargetDockArea);
 
                insertWidgetIntoSplitter(NewSplitter, NewDockArea, 
InsertParam.append());
-               TargetAreaSplitter->insertWidget(index, NewSplitter);
-               if 
(CDockManager::testConfigFlag(CDockManager::EqualSplitOnInsertion))
-               {
+        updateSplitterHandles(NewSplitter);
+        TargetAreaSplitter->insertWidget(index, NewSplitter);
+        updateSplitterHandles(TargetAreaSplitter);
+        if (CDockManager::testConfigFlag(CDockManager::EqualSplitOnInsertion))
+        {
                        TargetAreaSplitter->setSizes(TargetAreaSizes);
                        adjustSplitterSizesOnInsertion(NewSplitter);
                }
@@ -1319,9 +1418,9 @@
        internal::hideEmptyParentSplitters(Splitter);
 
        // Remove this area from cached areas
-       const auto& cache = d->LastAddedAreaCache;
-       if (auto p = std::find(cache, cache+sizeof(cache)/sizeof(cache[0]), 
area)) {
-               d->LastAddedAreaCache[std::distance(cache, p)] = nullptr;
+       auto p = std::find(std::begin(d->LastAddedAreaCache), 
std::end(d->LastAddedAreaCache), area);
+       if (p != std::end(d->LastAddedAreaCache)) {
+               *p = nullptr;
        }
 
        // If splitter has more than 1 widgets, we are finished and can leave
@@ -1370,9 +1469,11 @@
        }
 
        delete Splitter;
+    Splitter = nullptr;
 
 emitAndExit:
-       CDockWidget* TopLevelWidget = topLevelDockWidget();
+    updateSplitterHandles(Splitter);
+    CDockWidget* TopLevelWidget = topLevelDockWidget();
 
        // Updated the title bar visibility of the dock widget if there is only
     // one single visible dock widget
@@ -1516,16 +1617,6 @@
        // If there was a top level widget before the drop, then it is not top
        // level widget anymore
        CDockWidget::emitTopLevelEventForWidget(SingleDockWidget, false);
-       CDockWidget* DockWidget = qobject_cast<CDockWidget*>(Widget);
-       if (!DockWidget)
-       {
-               CDockAreaWidget* DockArea = 
qobject_cast<CDockAreaWidget*>(Widget);
-               auto OpenDockWidgets = DockArea->openedDockWidgets();
-               if (OpenDockWidgets.count() == 1)
-               {
-                       DockWidget = OpenDockWidgets[0];
-               }
-       }
 
        window()->activateWindow();
        d->DockManager->notifyWidgetOrAreaRelocation(Widget);
@@ -1732,6 +1823,13 @@
 
 
 //============================================================================
+void CDockContainerWidget::updateSplitterHandles(QSplitter* splitter)
+{
+    d->updateSplitterHandles(splitter);
+}
+
+
+//============================================================================
 CDockWidget::DockWidgetFeatures CDockContainerWidget::features() const
 {
        CDockWidget::DockWidgetFeatures 
Features(CDockWidget::AllDockWidgetFeatures);
@@ -1779,5 +1877,12 @@
 
 } // namespace ads
 
+#if defined(__GNUC__) && !defined(__clang__)
+#  pragma GCC diagnostic pop
+#endif
+#if defined(__clang__)
+#  pragma clang diagnostic pop
+#endif
+
 //---------------------------------------------------------------------------
 // EOF DockContainerWidget.cpp

Modified: brlcad/trunk/src/qged/qtads/DockContainerWidget.h
===================================================================
--- brlcad/trunk/src/qged/qtads/DockContainerWidget.h   2020-08-25 22:37:45 UTC 
(rev 76951)
+++ brlcad/trunk/src/qged/qtads/DockContainerWidget.h   2020-08-26 01:18:07 UTC 
(rev 76952)
@@ -155,6 +155,12 @@
      */
     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:
        /**
         * Default Constructor
@@ -276,7 +282,7 @@
         * This signal is emitted if a dock area is opened or closed via
         * toggleView() function
         */
-       void dockAreaViewToggled(CDockAreaWidget* DockArea, bool Open);
+       void dockAreaViewToggled(ads::CDockAreaWidget* DockArea, bool Open);
 }; // class DockContainerWidget
 } // namespace ads
 //-----------------------------------------------------------------------------

Modified: brlcad/trunk/src/qged/qtads/DockFocusController.cpp
===================================================================
--- brlcad/trunk/src/qged/qtads/DockFocusController.cpp 2020-08-25 22:37:45 UTC 
(rev 76951)
+++ brlcad/trunk/src/qged/qtads/DockFocusController.cpp 2020-08-26 01:18:07 UTC 
(rev 76952)
@@ -33,6 +33,7 @@
 
 #include <QPointer>
 #include <QApplication>
+#include <QAbstractButton>
 
 #include "DockWidget.h"
 #include "DockAreaWidget.h"
@@ -56,10 +57,12 @@
        CDockFocusController *_this;
        QPointer<CDockWidget> FocusedDockWidget = nullptr;
        QPointer<CDockAreaWidget> FocusedArea = nullptr;
+       CDockWidget* OldFocusedDockWidget = nullptr;
 #ifdef Q_OS_LINUX
-        QPointer<CFloatingDockContainer> FloatingWidget = nullptr;
+     QPointer<CFloatingDockContainer> FloatingWidget = nullptr;
 #endif
        CDockManager* DockManager;
+    bool ForceFocusChangedSignal = false;
 
        /**
         * Private data constructor
@@ -121,6 +124,11 @@
 //============================================================================
 void DockFocusControllerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget)
 {
+       if (!DockWidget->features().testFlag(CDockWidget::DockWidgetFocusable))
+       {
+               return;
+       }
+
        CDockAreaWidget* NewFocusedDockArea = nullptr;
        if (FocusedDockWidget)
        {
@@ -172,15 +180,39 @@
     }
 #endif
 
-    if (old != DockWidget)
+    if (old == DockWidget && !ForceFocusChangedSignal)
     {
+       return;
+    }
+
+    ForceFocusChangedSignal = false;
+    if (DockWidget->isVisible())
+    {
        emit DockManager->focusedDockWidgetChanged(old, DockWidget);
     }
+    else
+    {
+       OldFocusedDockWidget = old;
+       QObject::connect(DockWidget, SIGNAL(visibilityChanged(bool)), _this, 
SLOT(onDockWidgetVisibilityChanged(bool)));
+    }
 }
 
 
 
 //============================================================================
+void CDockFocusController::onDockWidgetVisibilityChanged(bool Visible)
+{
+    auto Sender = sender();
+    auto DockWidget = qobject_cast<ads::CDockWidget*>(Sender);
+    disconnect(Sender, SIGNAL(visibilityChanged(bool)), this, 
SLOT(onDockWidgetVisibilityChanged(bool)));
+    if (DockWidget && Visible)
+       {
+        emit d->DockManager->focusedDockWidgetChanged(d->OldFocusedDockWidget, 
DockWidget);
+       }
+}
+
+
+//============================================================================
 CDockFocusController::CDockFocusController(CDockManager* DockManager) :
        Super(DockManager),
        d(new DockFocusControllerPrivate(this))
@@ -206,17 +238,43 @@
                return;
        }
 
-       Q_UNUSED(focusedOld)
+    ADS_PRINT("CDockFocusController::onApplicationFocusChanged "
+       << " old: " << focusedOld << " new: " << focusedNow);
        if (!focusedNow)
        {
                return;
        }
 
-       CDockWidget* DockWidget = nullptr;
+       // If the close button in another tab steals the focus from the current
+       // active dock widget content, i.e. if the user clicks its close button,
+       // then we immediately give the focus back to the previous focused 
widget
+       // focusedOld
+       if (CDockManager::testConfigFlag(CDockManager::AllTabsHaveCloseButton))
+       {
+               auto OtherDockWidgetTab = 
internal::findParent<CDockWidgetTab*>(focusedNow);
+               if (OtherDockWidgetTab && focusedOld)
+               {
+                       focusedOld->setFocus();
+                       return;
+               }
+       }
+
+    CDockWidget* DockWidget = nullptr;
        auto DockWidgetTab = qobject_cast<CDockWidgetTab*>(focusedNow);
        if (DockWidgetTab)
        {
-               DockWidget = DockWidgetTab->dockWidget();
+               DockWidget = DockWidgetTab->dockWidget();      
+        // If the DockWidgetTab "steals" the focus from a widget in the same
+        // DockWidget, then we immediately give the focus back to the previous
+        // focused widget focusedOld
+        if (focusedOld)
+        {
+            auto OldFocusedDockWidget = 
internal::findParent<CDockWidget*>(focusedOld);
+            if (OldFocusedDockWidget && OldFocusedDockWidget == DockWidget)
+            {
+                focusedOld->setFocus();
+            }
+        }
        }
 
        if (!DockWidget)
@@ -285,20 +343,22 @@
        }
 
        CDockWidget* DockWidget = qobject_cast<CDockWidget*>(DroppedWidget);
-       if (DockWidget)
-       {
-               CDockManager::setWidgetFocus(DockWidget->tabWidget());
-               return;
-       }
+    if (!DockWidget)
+    {
+        CDockAreaWidget* DockArea = 
qobject_cast<CDockAreaWidget*>(DroppedWidget);
+        if (DockArea)
+        {
+            DockWidget = DockArea->currentDockWidget();
+        }
+    }
 
-       CDockAreaWidget* DockArea = 
qobject_cast<CDockAreaWidget*>(DroppedWidget);
-       if (!DockArea)
-       {
-               return;
-       }
+    if (!DockWidget)
+    {
+        return;
+    }
 
-       DockWidget = DockArea->currentDockWidget();
-       CDockManager::setWidgetFocus(DockWidget->tabWidget());
+    d->ForceFocusChangedSignal = true;
+    CDockManager::setWidgetFocus(DockWidget->tabWidget());
 }
 
 
@@ -319,6 +379,7 @@
        auto DockWidget = vDockWidget.value<CDockWidget*>();
        if (DockWidget)
        {
+               d->FocusedDockWidget = nullptr;
                DockWidget->dockAreaWidget()->setCurrentDockWidget(DockWidget);
                CDockManager::setWidgetFocus(DockWidget->tabWidget());
        }

Modified: brlcad/trunk/src/qged/qtads/DockFocusController.h
===================================================================
--- brlcad/trunk/src/qged/qtads/DockFocusController.h   2020-08-25 22:37:45 UTC 
(rev 76951)
+++ brlcad/trunk/src/qged/qtads/DockFocusController.h   2020-08-26 01:18:07 UTC 
(rev 76952)
@@ -52,6 +52,7 @@
        void onApplicationFocusChanged(QWidget *old, QWidget *now);
        void onFocusedDockAreaViewToggled(bool Open);
        void onStateRestored();
+       void onDockWidgetVisibilityChanged(bool Visible);
 
 public:
        using Super = QObject;

Modified: brlcad/trunk/src/qged/qtads/DockManager.cpp
===================================================================
--- brlcad/trunk/src/qged/qtads/DockManager.cpp 2020-08-25 22:37:45 UTC (rev 
76951)
+++ brlcad/trunk/src/qged/qtads/DockManager.cpp 2020-08-26 01:18:07 UTC (rev 
76952)
@@ -60,6 +60,18 @@
 #include "linux/FloatingWidgetTitleBar.h"
 #endif
 
+#if defined(__GNUC__) && !defined(__clang__)
+#  pragma GCC diagnostic push
+#endif
+#if defined(__clang__)
+#  pragma clang diagnostic push
+#endif
+#if defined(__GNUC__) && !defined(__clang__)
+#  pragma GCC diagnostic ignored "-Wshadow"
+#endif
+#if defined(__clang__)
+#  pragma clang diagnostic ignored "-Wshadow"
+#endif
 
 /**
  * Initializes the resources specified by the .qrc file with the specified base
@@ -108,6 +120,7 @@
        bool RestoringState = false;
        QVector<CFloatingDockContainer*> UninitializedFloatingWidgets;
        CDockFocusController* FocusController = nullptr;
+    CDockWidget* CentralWidget = nullptr;
 
        /**
         * Private data constructor
@@ -296,11 +309,11 @@
     {
                // Delete remaining empty floating widgets
                int FloatingWidgetIndex = DockContainerCount - 1;
-               int DeleteCount = FloatingWidgets.count() - FloatingWidgetIndex;
-               for (int i = 0; i < DeleteCount; ++i)
+               for (int i = FloatingWidgetIndex; i < FloatingWidgets.count(); 
++i)
                {
-                       FloatingWidgets[FloatingWidgetIndex + i]->deleteLater();
-                       
_this->removeDockContainer(FloatingWidgets[FloatingWidgetIndex + 
i]->dockContainer());
+                       auto* floatingWidget = FloatingWidgets[i];
+                       
_this->removeDockContainer(floatingWidget->dockContainer());
+                       floatingWidget->deleteLater();
                }
     }
 
@@ -406,6 +419,7 @@
        return false;
     }
 
+    CentralWidget = nullptr;
     // Hide updates of floating widgets from use
     hideFloatingWidgets();
     markDockWidgetsDirty();
@@ -561,8 +575,8 @@
 {
     QByteArray xmldata;
     QXmlStreamWriter s(&xmldata);
-    auto LConfigFlags = CDockManager::configFlags();
-       s.setAutoFormatting(LConfigFlags.testFlag(XmlAutoFormattingEnabled));
+    auto ConfigFlags = CDockManager::configFlags();
+       s.setAutoFormatting(ConfigFlags.testFlag(XmlAutoFormattingEnabled));
     s.writeStartDocument();
                s.writeStartElement("QtAdvancedDockingSystem");
                s.writeAttribute("Version", QString::number(CurrentVersion));
@@ -576,7 +590,7 @@
                s.writeEndElement();
     s.writeEndDocument();
 
-    return LConfigFlags.testFlag(XmlCompressionEnabled)
+    return ConfigFlags.testFlag(XmlCompressionEnabled)
        ? qCompress(xmldata, 9) : xmldata;
 }
 
@@ -708,6 +722,7 @@
        emit dockWidgetAboutToBeRemoved(Dockwidget);
        d->DockWidgetsMap.remove(Dockwidget->objectName());
        CDockContainerWidget::removeDockWidget(Dockwidget);
+       Dockwidget->setDockManager(nullptr);
        emit dockWidgetRemoved(Dockwidget);
 }
 
@@ -815,7 +830,41 @@
        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,
        const QString& Group, const QIcon& GroupIcon)
 {
@@ -941,5 +990,12 @@
 
 } // namespace ads
 
+#if defined(__GNUC__) && !defined(__clang__)
+#  pragma GCC diagnostic pop
+#endif
+#if defined(__clang__)
+#  pragma clang diagnostic pop
+#endif
+
 //---------------------------------------------------------------------------
 // EOF DockManager.cpp

Modified: brlcad/trunk/src/qged/qtads/DockManager.h
===================================================================
--- brlcad/trunk/src/qged/qtads/DockManager.h   2020-08-25 22:37:45 UTC (rev 
76951)
+++ brlcad/trunk/src/qged/qtads/DockManager.h   2020-08-26 01:18:07 UTC (rev 
76952)
@@ -378,7 +378,28 @@
         */
        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.
         * 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
@@ -502,7 +523,7 @@
         * An application can use this signal to e.g. subscribe to events of
         * the newly created window.
         */
-       void floatingWidgetCreated(CFloatingDockContainer* FloatingWidget);
+       void floatingWidgetCreated(ads::CFloatingDockContainer* FloatingWidget);
 
     /**
      * This signal is emitted, if a new DockArea has been created.
@@ -509,13 +530,13 @@
      * An application can use this signal to set custom icons or custom
      * tooltips for the DockArea buttons.
      */
-    void dockAreaCreated(CDockAreaWidget* DockArea);
+    void dockAreaCreated(ads::CDockAreaWidget* DockArea);
 
     /**
      * This signal is emitted just before the given dock widget is removed
-     * from the
+     * from the dock manager
      */
-    void dockWidgetAboutToBeRemoved(CDockWidget* DockWidget);
+    void dockWidgetAboutToBeRemoved(ads::CDockWidget* DockWidget);
 
     /**
      * This signal is emitted if a dock widget has been removed with the remove
@@ -523,7 +544,7 @@
      * If this signal is emitted, the dock widget has been removed from the
      * docking system but it is not deleted yet.
      */
-    void dockWidgetRemoved(CDockWidget* DockWidget);
+    void dockWidgetRemoved(ads::CDockWidget* DockWidget);
 
     /**
      * This signal is emitted if the focused dock widget changed.
@@ -530,7 +551,7 @@
      * Both old and now can be nullptr.
      * The focused dock widget is the one that is highlighted in the GUI
      */
-    void focusedDockWidgetChanged(CDockWidget* old, CDockWidget* now);
+    void focusedDockWidgetChanged(ads::CDockWidget* old, ads::CDockWidget* 
now);
 }; // class DockManager
 } // namespace ads
 //-----------------------------------------------------------------------------

Modified: brlcad/trunk/src/qged/qtads/DockOverlay.cpp
===================================================================
--- brlcad/trunk/src/qged/qtads/DockOverlay.cpp 2020-08-25 22:37:45 UTC (rev 
76951)
+++ brlcad/trunk/src/qged/qtads/DockOverlay.cpp 2020-08-26 01:18:07 UTC (rev 
76952)
@@ -41,9 +41,20 @@
 
 #include <iostream>
 
-#define SMALL_FASTF 1.0e-77
-#define NEAR_ZERO(val, epsilon) (((val) > -epsilon) && ((val) < epsilon))
-#define NEAR_EQUAL(_a, _b, _tol) NEAR_ZERO((_a) - (_b), (_tol))
+#if defined(__GNUC__) && !defined(__clang__)
+#  pragma GCC diagnostic push
+#endif
+#if defined(__clang__)
+#  pragma clang diagnostic push
+#endif
+#if defined(__GNUC__) && !defined(__clang__)
+#  pragma GCC diagnostic ignored "-Wshadow"
+#  pragma GCC diagnostic ignored "-Wfloat-equal"
+#endif
+#if defined(__clang__)
+#  pragma clang diagnostic ignored "-Wshadow"
+#  pragma clang diagnostic ignored "-Wfloat-equal"
+#endif
 
 namespace ads
 {
@@ -154,7 +165,7 @@
 
        
//============================================================================
        QWidget* createDropIndicatorWidget(DockWidgetArea DockWidgetArea,
-               CDockOverlay::eMode LMode)
+               CDockOverlay::eMode Mode)
        {
                QLabel* l = new QLabel();
                l->setObjectName("DockWidgetAreaLabel");
@@ -162,7 +173,7 @@
         const qreal metric = dropIndicatiorWidth(l);
                const QSizeF size(metric, metric);
 
-               l->setPixmap(createHighDpiDropIndicatorPixmap(size, 
DockWidgetArea, LMode));
+               l->setPixmap(createHighDpiDropIndicatorPixmap(size, 
DockWidgetArea, Mode));
                l->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint);
                l->setAttribute(Qt::WA_TranslucentBackground);
                l->setProperty("dockWidgetArea", DockWidgetArea);
@@ -182,7 +193,7 @@
 
        
//============================================================================
        QPixmap createHighDpiDropIndicatorPixmap(const QSizeF& size, 
DockWidgetArea DockWidgetArea,
-               CDockOverlay::eMode LMode)
+               CDockOverlay::eMode Mode)
        {
                QColor borderColor = iconColor(CDockOverlayCross::FrameColor);
                QColor backgroundColor = 
iconColor(CDockOverlayCross::WindowBackgroundColor);
@@ -243,7 +254,7 @@
                }
 
                QSizeF baseSize = baseRect.size();
-               if (CDockOverlay::ModeContainerOverlay == LMode && 
DockWidgetArea != CenterDockWidgetArea)
+               if (CDockOverlay::ModeContainerOverlay == Mode && 
DockWidgetArea != CenterDockWidgetArea)
                {
                        baseRect = areaRect;
                }
@@ -287,7 +298,7 @@
                p.restore();
 
                // Draw arrow for outer container drop indicators
-               if (CDockOverlay::ModeContainerOverlay == LMode && 
DockWidgetArea != CenterDockWidgetArea)
+               if (CDockOverlay::ModeContainerOverlay == Mode && 
DockWidgetArea != CenterDockWidgetArea)
                {
                        QRectF ArrowRect;
                        ArrowRect.setSize(baseSize);
@@ -643,7 +654,7 @@
 //============================================================================
 void CDockOverlayCross::updateOverlayIcons()
 {
-       if (NEAR_EQUAL(windowHandle()->devicePixelRatio(), 
d->LastDevicePixelRatio, SMALL_FASTF))
+       if (windowHandle()->devicePixelRatio() == d->LastDevicePixelRatio)
        {
                return;
        }
@@ -834,5 +845,13 @@
 
 
 } // namespace ads
+
+#if defined(__GNUC__) && !defined(__clang__)
+#  pragma GCC diagnostic pop
+#endif
+#if defined(__clang__)
+#  pragma clang diagnostic pop
+#endif
+
 //----------------------------------------------------------------------------
 

Modified: brlcad/trunk/src/qged/qtads/DockSplitter.cpp
===================================================================
--- brlcad/trunk/src/qged/qtads/DockSplitter.cpp        2020-08-25 22:37:45 UTC 
(rev 76951)
+++ brlcad/trunk/src/qged/qtads/DockSplitter.cpp        2020-08-26 01:18:07 UTC 
(rev 76952)
@@ -102,6 +102,20 @@
        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
 
 //---------------------------------------------------------------------------

Modified: brlcad/trunk/src/qged/qtads/DockSplitter.h
===================================================================
--- brlcad/trunk/src/qged/qtads/DockSplitter.h  2020-08-25 22:37:45 UTC (rev 
76951)
+++ brlcad/trunk/src/qged/qtads/DockSplitter.h  2020-08-26 01:18:07 UTC (rev 
76952)
@@ -71,6 +71,11 @@
         * Returns last widget of nullptr is splitter is empty
         */
        QWidget* lastWidget() const;
+
+    /**
+     * Returns true if the splitter contains central widget of dock manager.
+     */
+    bool isResizingWithContainer() const;
 }; // class CDockSplitter
 
 } // namespace ads

Modified: brlcad/trunk/src/qged/qtads/DockWidget.cpp
===================================================================
--- brlcad/trunk/src/qged/qtads/DockWidget.cpp  2020-08-25 22:37:45 UTC (rev 
76951)
+++ brlcad/trunk/src/qged/qtads/DockWidget.cpp  2020-08-26 01:18:07 UTC (rev 
76952)
@@ -340,6 +340,8 @@
        d->Features = features;
        emit featuresChanged(d->Features);
        d->TabWidget->onDockWidgetFeaturesChanged();
+       if(CDockAreaWidget* DockArea = dockAreaWidget())
+               DockArea->onDockWidgetFeaturesChanged();
 }
 
 
@@ -462,6 +464,13 @@
 
 
 //============================================================================
+bool CDockWidget::isCentralWidget() const
+{
+    return dockManager()->centralWidget() == this;
+}
+
+
+//============================================================================
 void CDockWidget::toggleView(bool Open)
 {
        // If the toggle view action mode is ActionModeShow, then Open is always
@@ -540,6 +549,7 @@
 {
        d->DockArea = DockArea;
        d->ToggleViewAction->setChecked(DockArea != nullptr && 
!this->isClosed());
+       setParent(DockArea);
 }
 
 

Modified: brlcad/trunk/src/qged/qtads/DockWidget.h
===================================================================
--- brlcad/trunk/src/qged/qtads/DockWidget.h    2020-08-25 22:37:45 UTC (rev 
76951)
+++ brlcad/trunk/src/qged/qtads/DockWidget.h    2020-08-26 01:18:07 UTC (rev 
76952)
@@ -149,10 +149,11 @@
     {
         DockWidgetClosable = 0x01,///< dock widget has a close button
         DockWidgetMovable = 0x02,///< dock widget is movable and can be moved 
to a new position in the current dock container
-        DockWidgetFloatable = 0x04,
+        DockWidgetFloatable = 0x04,///< dock widget can be dragged into a 
floating window
         DockWidgetDeleteOnClose = 0x08, ///< deletes the dock widget when it 
is closed
-        CustomCloseHandling = 0x10,
-        DefaultDockWidgetFeatures = DockWidgetClosable | DockWidgetMovable | 
DockWidgetFloatable,
+        CustomCloseHandling = 0x10, ///< clicking the close button will not 
close the dock widget but emits the closeRequested() signal instead
+        DockWidgetFocusable = 0x20, ///< if this is enabled, a dock widget can 
get focus highlighting
+        DefaultDockWidgetFeatures = DockWidgetClosable | DockWidgetMovable | 
DockWidgetFloatable | DockWidgetFocusable,
         AllDockWidgetFeatures = DefaultDockWidgetFeatures | 
DockWidgetDeleteOnClose | CustomCloseHandling,
         NoDockWidgetFeatures = 0x00
     };
@@ -196,7 +197,7 @@
      * To ensure, that a dock widget does not block resizing, the dock widget
      * reimplements minimumSizeHint() function to return a very small minimum
      * size hint. If you would like to adhere the minimumSizeHint() from the
-     * content widget, the set the minimumSizeHintMode() to
+     * content widget, then set the minimumSizeHintMode() to
      * MinimumSizeHintFromContent.
      */
     enum eMinimumSizeHintMode
@@ -360,6 +361,11 @@
     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
      * actions
      */
@@ -576,7 +582,7 @@
      * This signal is emitted when the features property changes.
      * The features parameter gives the new value of the property.
      */
-    void featuresChanged(DockWidgetFeatures features);
+    void featuresChanged(ads::CDockWidget::DockWidgetFeatures features);
 }; // class DockWidget
 }
  // namespace ads

Modified: brlcad/trunk/src/qged/qtads/DockWidgetTab.cpp
===================================================================
--- brlcad/trunk/src/qged/qtads/DockWidgetTab.cpp       2020-08-25 22:37:45 UTC 
(rev 76951)
+++ brlcad/trunk/src/qged/qtads/DockWidgetTab.cpp       2020-08-26 01:18:07 UTC 
(rev 76952)
@@ -53,10 +53,23 @@
 
 #include <iostream>
 
+#if defined(__GNUC__) && !defined(__clang__)
+#  pragma GCC diagnostic push
+#endif
+#if defined(__clang__)
+#  pragma clang diagnostic push
+#endif
+#if defined(__GNUC__) && !defined(__clang__)
+#  pragma GCC diagnostic ignored "-Wshadow"
+#endif
+#if defined(__clang__)
+#  pragma clang diagnostic ignored "-Wshadow"
+#endif
+
 namespace ads
 {
 
-using tTabLabel = CElidingLabel;
+       using tTabLabel = CElidingLabel;
 
 /**
  * Private data class of CDockWidgetTab class (pimpl)
@@ -134,6 +147,18 @@
                }
        }
 
+       /**
+        * Update the close button visibility from current feature/config
+        */
+       void updateCloseButtonVisibility(bool active)
+       {
+               bool DockWidgetClosable = 
DockWidget->features().testFlag(CDockWidget::DockWidgetClosable);
+               bool ActiveTabHasCloseButton = 
testConfigFlag(CDockManager::ActiveTabHasCloseButton);
+               bool AllTabsHaveCloseButton = 
testConfigFlag(CDockManager::AllTabsHaveCloseButton);
+               bool TabHasCloseButton = (ActiveTabHasCloseButton && active) | 
AllTabsHaveCloseButton;
+               CloseButton->setVisible(DockWidgetClosable && 
TabHasCloseButton);
+       }
+
        template <typename T>
        IFloatingWidget* createFloatingWidget(T* Widget, bool OpaqueUndocking)
        {
@@ -242,7 +267,7 @@
 
     ADS_PRINT("startFloating");
        DragState = DraggingState;
-       IFloatingWidget* LFloatingWidget = nullptr;
+       IFloatingWidget* FloatingWidget = nullptr;
        bool OpaqueUndocking = 
CDockManager::testConfigFlag(CDockManager::OpaqueUndocking) ||
                (DraggingFloatingWidget != DraggingState);
 
@@ -252,21 +277,21 @@
        QSize Size;
        if (DockArea->dockWidgetsCount() > 1)
        {
-               LFloatingWidget = createFloatingWidget(DockWidget, 
OpaqueUndocking);
+               FloatingWidget = createFloatingWidget(DockWidget, 
OpaqueUndocking);
                Size = DockWidget->size();
        }
        else
        {
-               LFloatingWidget = createFloatingWidget(DockArea, 
OpaqueUndocking);
+               FloatingWidget = createFloatingWidget(DockArea, 
OpaqueUndocking);
                Size = DockArea->size();
        }
 
     if (DraggingFloatingWidget == DraggingState)
     {
-        LFloatingWidget->startFloating(DragStartMousePosition, Size, 
DraggingFloatingWidget, _this);
+        FloatingWidget->startFloating(DragStartMousePosition, Size, 
DraggingFloatingWidget, _this);
        auto Overlay = DockWidget->dockManager()->containerOverlay();
        Overlay->setAllowedAreas(OuterDockAreas);
-       this->FloatingWidget = LFloatingWidget;
+       this->FloatingWidget = FloatingWidget;
     }
     else
     {
@@ -461,11 +486,7 @@
 //============================================================================
 void CDockWidgetTab::setActiveTab(bool active)
 {
-       bool DockWidgetClosable = 
d->DockWidget->features().testFlag(CDockWidget::DockWidgetClosable);
-       bool ActiveTabHasCloseButton = 
d->testConfigFlag(CDockManager::ActiveTabHasCloseButton);
-       bool AllTabsHaveCloseButton = 
d->testConfigFlag(CDockManager::AllTabsHaveCloseButton);
-       bool TabHasCloseButton = (ActiveTabHasCloseButton && active) | 
AllTabsHaveCloseButton;
-       d->CloseButton->setVisible(DockWidgetClosable && TabHasCloseButton);
+       d->updateCloseButtonVisibility(active);
 
        // Focus related stuff
        if (CDockManager::testConfigFlag(CDockManager::FocusHighlighting) && 
!d->DockWidget->dockManager()->isRestoringState())
@@ -653,6 +674,7 @@
        
SizePolicy.setRetainSizeWhenHidden(Features.testFlag(CDockWidget::DockWidgetClosable)
                && 
d->testConfigFlag(CDockManager::RetainTabSizeWhenCloseButtonHidden));
        d->CloseButton->setSizePolicy(SizePolicy);
+       d->updateCloseButtonVisibility(isActiveTab());
 }
 
 
@@ -673,5 +695,13 @@
 
 
 } // namespace ads
+
+#if defined(__GNUC__) && !defined(__clang__)
+#  pragma GCC diagnostic pop
+#endif
+#if defined(__clang__)
+#  pragma clang diagnostic pop
+#endif
+
 //---------------------------------------------------------------------------
 // EOF DockWidgetTab.cpp

Modified: brlcad/trunk/src/qged/qtads/FloatingDragPreview.cpp
===================================================================
--- brlcad/trunk/src/qged/qtads/FloatingDragPreview.cpp 2020-08-25 22:37:45 UTC 
(rev 76951)
+++ brlcad/trunk/src/qged/qtads/FloatingDragPreview.cpp 2020-08-26 01:18:07 UTC 
(rev 76952)
@@ -169,7 +169,7 @@
                // If there is only one single visible dock area in a 
container, then
                // it does not make sense to show a dock overlay because the 
dock area
                // would be removed and inserted at the same position
-               if (VisibleDockAreas <= 1)
+               if (VisibleDockAreas == 1)
                {
                        ContainerOverlay->hideOverlay();
                }

Added: brlcad/trunk/src/qged/qtads/images/maximize-button-focused.svg
===================================================================
(Binary files differ)

Index: brlcad/trunk/src/qged/qtads/images/maximize-button-focused.svg
===================================================================
--- brlcad/trunk/src/qged/qtads/images/maximize-button-focused.svg      
2020-08-25 22:37:45 UTC (rev 76951)
+++ brlcad/trunk/src/qged/qtads/images/maximize-button-focused.svg      
2020-08-26 01:18:07 UTC (rev 76952)

Property changes on: 
brlcad/trunk/src/qged/qtads/images/maximize-button-focused.svg
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/svg+xml
\ No newline at end of property
Added: brlcad/trunk/src/qged/qtads/images/maximize-button.svg
===================================================================
(Binary files differ)

Index: brlcad/trunk/src/qged/qtads/images/maximize-button.svg
===================================================================
--- brlcad/trunk/src/qged/qtads/images/maximize-button.svg      2020-08-25 
22:37:45 UTC (rev 76951)
+++ brlcad/trunk/src/qged/qtads/images/maximize-button.svg      2020-08-26 
01:18:07 UTC (rev 76952)

Property changes on: brlcad/trunk/src/qged/qtads/images/maximize-button.svg
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/svg+xml
\ No newline at end of property
Added: brlcad/trunk/src/qged/qtads/images/restore-button-focused.svg
===================================================================
(Binary files differ)

Index: brlcad/trunk/src/qged/qtads/images/restore-button-focused.svg
===================================================================
--- brlcad/trunk/src/qged/qtads/images/restore-button-focused.svg       
2020-08-25 22:37:45 UTC (rev 76951)
+++ brlcad/trunk/src/qged/qtads/images/restore-button-focused.svg       
2020-08-26 01:18:07 UTC (rev 76952)

Property changes on: 
brlcad/trunk/src/qged/qtads/images/restore-button-focused.svg
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/svg+xml
\ No newline at end of property
Added: brlcad/trunk/src/qged/qtads/images/restore-button.svg
===================================================================
(Binary files differ)

Index: brlcad/trunk/src/qged/qtads/images/restore-button.svg
===================================================================
--- brlcad/trunk/src/qged/qtads/images/restore-button.svg       2020-08-25 
22:37:45 UTC (rev 76951)
+++ brlcad/trunk/src/qged/qtads/images/restore-button.svg       2020-08-26 
01:18:07 UTC (rev 76952)

Property changes on: brlcad/trunk/src/qged/qtads/images/restore-button.svg
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/svg+xml
\ No newline at end of property
This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to