+
+DolphinNavigatorsWidgetAction::ViewGeometriesHelper::ViewGeometriesHelper
+ (QWidget *navigatorsWidget, DolphinNavigatorsWidgetAction *navigatorsWidgetAction) :
+ m_navigatorsWidget{navigatorsWidget},
+ m_navigatorsWidgetAction{navigatorsWidgetAction}
+{
+ Q_CHECK_PTR(navigatorsWidget);
+ Q_CHECK_PTR(navigatorsWidgetAction);
+}
+
+bool DolphinNavigatorsWidgetAction::ViewGeometriesHelper::eventFilter(QObject *watched, QEvent *event)
+{
+ if (event->type() == QEvent::Resize) {
+ m_navigatorsWidgetAction->adjustSpacing();
+ return false;
+ }
+ return QObject::eventFilter(watched, event);
+}
+
+void DolphinNavigatorsWidgetAction::ViewGeometriesHelper::setViewContainers(QWidget *primaryViewContainer,
+ QWidget *secondaryViewContainer)
+{
+ Q_CHECK_PTR(primaryViewContainer);
+ if (m_primaryViewContainer) {
+ m_primaryViewContainer->removeEventFilter(this);
+ }
+ primaryViewContainer->installEventFilter(this);
+ m_primaryViewContainer = primaryViewContainer;
+
+ // It is not possible to resize the secondaryViewContainer without simultaneously
+ // resizing the primaryViewContainer so we don't have to installEventFilter() here.
+ m_secondaryViewContainer = secondaryViewContainer;
+}
+
+DolphinNavigatorsWidgetAction::ViewGeometriesHelper::Geometries
+ DolphinNavigatorsWidgetAction::ViewGeometriesHelper::viewGeometries()
+{
+ Q_ASSERT(m_primaryViewContainer);
+ Geometries geometries;
+
+ // width
+ geometries.widthOfPrimary = m_primaryViewContainer->width();
+ if (m_secondaryViewContainer) {
+ geometries.widthOfSecondary = m_secondaryViewContainer->width();
+ } else {
+ geometries.widthOfSecondary = INT_MIN;
+ }
+
+ // globalX
+ if (QApplication::layoutDirection() == Qt::LeftToRight) {
+ geometries.globalXOfNavigatorsWidget = m_navigatorsWidget->mapToGlobal(QPoint(0,0)).x();
+ geometries.globalXOfPrimary = m_primaryViewContainer->mapToGlobal(QPoint(0,0)).x();
+ geometries.globalXOfSecondary = !m_secondaryViewContainer ? INT_MIN :
+ m_secondaryViewContainer->mapToGlobal(QPoint(0,0)).x();
+ } else {
+ // When the direction is reversed, globalX does not change.
+ // For the adjustSpacing() code to work we need globalX to measure from right to left
+ // and to measure up to the rightmost point of a widget instead of the leftmost.
+ geometries.globalXOfNavigatorsWidget =
+ (-1) * (m_navigatorsWidget->mapToGlobal(QPoint(0,0)).x() + m_navigatorsWidget->width());
+ geometries.globalXOfPrimary =
+ (-1) * (m_primaryViewContainer->mapToGlobal(QPoint(0,0)).x() + geometries.widthOfPrimary);
+ geometries.globalXOfSecondary = !m_secondaryViewContainer ? INT_MIN :
+ (-1) * (m_secondaryViewContainer->mapToGlobal(QPoint(0,0)).x() + geometries.widthOfSecondary);
+ }
+ return geometries;
+}