┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/dolphinnavigatorswidgetaction.cpp
diff options
context:
space:
mode:
authorFelix Ernst <[email protected]>2021-01-06 01:38:45 +0000
committerFelix Ernst <[email protected]>2021-01-06 01:38:45 +0000
commit0cee94ce82ccb82afd0c4e22d77e251276e7a447 (patch)
treeecff9e2193de4ca82f0f99d455abd7735e850d57 /src/dolphinnavigatorswidgetaction.cpp
parenta993a5979dcfde63004b2ef00c98f1fa50e07b2c (diff)
Fix location bar being wrongly aligned on first startup
When starting Dolphin the very first time, the spacing in front of the location bar is wrong. This commit fixes this by completely updating all cached geometry every time adjustSpacing() is called. Because this happens once on a timer 100 ms after every url change, it will happen once shortly after the window is shown. At that point all geometry is where it should be and spacing calculation works as expected. The ViewContainer geometry retrieval is refactored into a small nested helper class in DolphinNavigatorsWidgetAction by the name ViewGeometriesHelper. Previously the logic of that class was divided between DolphinTabPage and DolphinNavigatorsWidgetAction. BUG: 429447 FIXED-IN: 21.04.0
Diffstat (limited to 'src/dolphinnavigatorswidgetaction.cpp')
-rw-r--r--src/dolphinnavigatorswidgetaction.cpp216
1 files changed, 128 insertions, 88 deletions
diff --git a/src/dolphinnavigatorswidgetaction.cpp b/src/dolphinnavigatorswidgetaction.cpp
index 6b76aad08..ace004f0f 100644
--- a/src/dolphinnavigatorswidgetaction.cpp
+++ b/src/dolphinnavigatorswidgetaction.cpp
@@ -26,11 +26,7 @@ DolphinNavigatorsWidgetAction::DolphinNavigatorsWidgetAction(QWidget *parent) :
QWidgetAction{parent},
m_splitter{new QSplitter(Qt::Horizontal)},
m_adjustSpacingTimer{new QTimer(this)},
- m_globalXOfSplitter{INT_MIN},
- m_globalXOfPrimary{INT_MIN},
- m_widthOfPrimary{INT_MIN},
- m_globalXOfSecondary{INT_MIN},
- m_widthOfSecondary{INT_MIN}
+ m_viewGeometriesHelper{m_splitter.get(), this}
{
updateText();
setIcon(QIcon::fromTheme(QStringLiteral("dialog-scripts")));
@@ -45,6 +41,63 @@ DolphinNavigatorsWidgetAction::DolphinNavigatorsWidgetAction(QWidget *parent) :
this, &DolphinNavigatorsWidgetAction::adjustSpacing);
}
+void DolphinNavigatorsWidgetAction::adjustSpacing()
+{
+ auto viewGeometries = m_viewGeometriesHelper.viewGeometries();
+ const int widthOfSplitterPrimary = viewGeometries.globalXOfPrimary + viewGeometries.widthOfPrimary - viewGeometries.globalXOfNavigatorsWidget;
+ const QList<int> splitterSizes = {widthOfSplitterPrimary,
+ m_splitter->width() - widthOfSplitterPrimary};
+ m_splitter->setSizes(splitterSizes);
+
+ // primary side of m_splitter
+ int leadingSpacing = viewGeometries.globalXOfPrimary - viewGeometries.globalXOfNavigatorsWidget;
+ if (leadingSpacing < 0) {
+ leadingSpacing = 0;
+ }
+ int trailingSpacing = (viewGeometries.globalXOfNavigatorsWidget + m_splitter->width())
+ - (viewGeometries.globalXOfPrimary + viewGeometries.widthOfPrimary);
+ if (trailingSpacing < 0 || emptyTrashButton(Primary)->isVisible()) {
+ trailingSpacing = 0;
+ }
+ const int widthLeftForUrlNavigator = m_splitter->widget(0)->width() - leadingSpacing - trailingSpacing;
+ const int widthNeededForUrlNavigator = primaryUrlNavigator()->sizeHint().width() - widthLeftForUrlNavigator;
+ if (widthNeededForUrlNavigator > 0) {
+ trailingSpacing -= widthNeededForUrlNavigator;
+ if (trailingSpacing < 0) {
+ leadingSpacing += trailingSpacing;
+ trailingSpacing = 0;
+ }
+ if (leadingSpacing < 0) {
+ leadingSpacing = 0;
+ }
+ }
+ spacing(Primary, Leading)->setMinimumWidth(leadingSpacing);
+ spacing(Primary, Trailing)->setFixedWidth(trailingSpacing);
+
+ // secondary side of m_splitter
+ if (viewGeometries.globalXOfSecondary == INT_MIN) {
+ Q_ASSERT(viewGeometries.widthOfSecondary == INT_MIN);
+ return;
+ }
+ spacing(Primary, Trailing)->setFixedWidth(0);
+
+ trailingSpacing = (viewGeometries.globalXOfNavigatorsWidget + m_splitter->width())
+ - (viewGeometries.globalXOfSecondary + viewGeometries.widthOfSecondary);
+ if (trailingSpacing < 0 || emptyTrashButton(Secondary)->isVisible()) {
+ trailingSpacing = 0;
+ } else {
+ const int widthLeftForUrlNavigator2 = m_splitter->widget(1)->width() - trailingSpacing;
+ const int widthNeededForUrlNavigator2 = secondaryUrlNavigator()->sizeHint().width() - widthLeftForUrlNavigator2;
+ if (widthNeededForUrlNavigator2 > 0) {
+ trailingSpacing -= widthNeededForUrlNavigator2;
+ if (trailingSpacing < 0) {
+ trailingSpacing = 0;
+ }
+ }
+ }
+ spacing(Secondary, Trailing)->setMinimumWidth(trailingSpacing);
+}
+
void DolphinNavigatorsWidgetAction::createSecondaryUrlNavigator()
{
Q_ASSERT(m_splitter->count() == 1);
@@ -53,31 +106,10 @@ void DolphinNavigatorsWidgetAction::createSecondaryUrlNavigator()
updateText();
}
-void DolphinNavigatorsWidgetAction::followViewContainerGeometry(
- int globalXOfPrimary, int widthOfPrimary)
-{
- followViewContainersGeometry(globalXOfPrimary, widthOfPrimary, INT_MIN, INT_MIN);
-}
-
-void DolphinNavigatorsWidgetAction::followViewContainersGeometry(
- int globalXOfPrimary, int widthOfPrimary,
- int globalXOfSecondary, int widthOfSecondary)
+void DolphinNavigatorsWidgetAction::followViewContainersGeometry(QWidget *primaryViewContainer,
+ QWidget *secondaryViewContainer)
{
- if (QApplication::layoutDirection() == Qt::LeftToRight) {
- m_globalXOfSplitter = m_splitter->mapToGlobal(QPoint(0,0)).x();
- m_globalXOfPrimary = globalXOfPrimary;
- m_globalXOfSecondary = globalXOfSecondary;
- } 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.
- m_globalXOfSplitter = (-1) * (m_splitter->mapToGlobal(QPoint(0,0)).x() + m_splitter->width());
- m_globalXOfPrimary = (-1) * (globalXOfPrimary + widthOfPrimary);
- m_globalXOfSecondary = (globalXOfSecondary == INT_MIN) ? INT_MIN :
- (-1) * (globalXOfSecondary + widthOfSecondary);
- }
- m_widthOfPrimary = widthOfPrimary;
- m_widthOfSecondary = widthOfSecondary;
+ m_viewGeometriesHelper.setViewContainers(primaryViewContainer, secondaryViewContainer);
adjustSpacing();
}
@@ -137,65 +169,6 @@ void DolphinNavigatorsWidgetAction::deleteWidget(QWidget *widget)
m_splitter->setParent(nullptr);
}
-void DolphinNavigatorsWidgetAction::adjustSpacing()
-{
- Q_ASSERT(m_globalXOfSplitter != INT_MIN);
- Q_ASSERT(m_globalXOfPrimary != INT_MIN);
- Q_ASSERT(m_widthOfPrimary != INT_MIN);
- const int widthOfSplitterPrimary = m_globalXOfPrimary + m_widthOfPrimary - m_globalXOfSplitter;
- const QList<int> splitterSizes = {widthOfSplitterPrimary,
- m_splitter->width() - widthOfSplitterPrimary};
- m_splitter->setSizes(splitterSizes);
-
- // primary side of m_splitter
- int leadingSpacing = m_globalXOfPrimary - m_globalXOfSplitter;
- if (leadingSpacing < 0) {
- leadingSpacing = 0;
- }
- int trailingSpacing = (m_globalXOfSplitter + m_splitter->width())
- - (m_globalXOfPrimary + m_widthOfPrimary);
- if (trailingSpacing < 0 || emptyTrashButton(Primary)->isVisible()) {
- trailingSpacing = 0;
- }
- const int widthLeftForUrlNavigator = m_splitter->widget(0)->width() - leadingSpacing - trailingSpacing;
- const int widthNeededForUrlNavigator = primaryUrlNavigator()->sizeHint().width() - widthLeftForUrlNavigator;
- if (widthNeededForUrlNavigator > 0) {
- trailingSpacing -= widthNeededForUrlNavigator;
- if (trailingSpacing < 0) {
- leadingSpacing += trailingSpacing;
- trailingSpacing = 0;
- }
- if (leadingSpacing < 0) {
- leadingSpacing = 0;
- }
- }
- spacing(Primary, Leading)->setMinimumWidth(leadingSpacing);
- spacing(Primary, Trailing)->setFixedWidth(trailingSpacing);
-
- // secondary side of m_splitter
- if (m_globalXOfSecondary == INT_MIN) {
- Q_ASSERT(m_widthOfSecondary == INT_MIN);
- return;
- }
- spacing(Primary, Trailing)->setFixedWidth(0);
-
- trailingSpacing = (m_globalXOfSplitter + m_splitter->width())
- - (m_globalXOfSecondary + m_widthOfSecondary);
- if (trailingSpacing < 0 || emptyTrashButton(Secondary)->isVisible()) {
- trailingSpacing = 0;
- } else {
- const int widthLeftForUrlNavigator2 = m_splitter->widget(1)->width() - trailingSpacing;
- const int widthNeededForUrlNavigator2 = secondaryUrlNavigator()->sizeHint().width() - widthLeftForUrlNavigator2;
- if (widthNeededForUrlNavigator2 > 0) {
- trailingSpacing -= widthNeededForUrlNavigator2;
- if (trailingSpacing < 0) {
- trailingSpacing = 0;
- }
- }
- }
- spacing(Secondary, Trailing)->setMinimumWidth(trailingSpacing);
-}
-
QWidget *DolphinNavigatorsWidgetAction::createNavigatorWidget(Side side) const
{
auto navigatorWidget = new QWidget(m_splitter.get());
@@ -281,3 +254,70 @@ void DolphinNavigatorsWidgetAction::updateText()
2 : 1;
setText(i18ncp("@action:inmenu", "Location Bar", "Location Bars", urlNavigatorsAmount));
}
+
+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;
+}