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