From 71bdbb87dde6ea6255b687af255ead75691d95c5 Mon Sep 17 00:00:00 2001 From: Méven Car Date: Tue, 28 Oct 2025 09:45:26 +0000 Subject: dolphintabpage: when enabling split view without animation reset sizes of the splitter. So the previous size of a pontential leftover closed state does not apply initially. BUG: 510915 --- src/dolphintabpage.cpp | 171 +++++++++++++++++++++++++------------------------ src/dolphintabpage.h | 2 - 2 files changed, 87 insertions(+), 86 deletions(-) (limited to 'src') diff --git a/src/dolphintabpage.cpp b/src/dolphintabpage.cpp index 35c244c9e..9df1c77b3 100644 --- a/src/dolphintabpage.cpp +++ b/src/dolphintabpage.cpp @@ -15,6 +15,14 @@ #include #include +namespace +{ +void resetSplitterSizes(QSplitter *splitter) +{ + splitter->setSizes({0, 0}); +} +} + DolphinTabPage::DolphinTabPage(const QUrl &primaryUrl, const QUrl &secondaryUrl, QWidget *parent) : QWidget(parent) , m_expandingContainer{nullptr} @@ -66,90 +74,92 @@ bool DolphinTabPage::splitViewEnabled() const void DolphinTabPage::setSplitViewEnabled(bool enabled, Animated animated, const QUrl &secondaryUrl) { - if (m_splitViewEnabled != enabled) { - m_splitViewEnabled = enabled; - if (animated == WithAnimation - && (style()->styleHint(QStyle::SH_Widget_Animation_Duration, nullptr, this) < 1 || GlobalConfig::animationDurationFactor() <= 0.0)) { - animated = WithoutAnimation; + if (m_splitViewEnabled == enabled) { + return; + } + + m_splitViewEnabled = enabled; + if (animated == WithAnimation + && (style()->styleHint(QStyle::SH_Widget_Animation_Duration, nullptr, this) < 1 || GlobalConfig::animationDurationFactor() <= 0.0)) { + animated = WithoutAnimation; + } + if (m_expandViewAnimation) { + m_expandViewAnimation->stop(); // deletes because of QAbstractAnimation::DeleteWhenStopped. + if (animated == WithoutAnimation) { + slotAnimationFinished(); } - if (m_expandViewAnimation) { - m_expandViewAnimation->stop(); // deletes because of QAbstractAnimation::DeleteWhenStopped. - if (animated == WithoutAnimation) { - slotAnimationFinished(); - } + } + + if (enabled) { + QList splitterSizes = m_splitter->sizes(); + const QUrl &url = (secondaryUrl.isEmpty()) ? m_primaryViewContainer->url() : secondaryUrl; + m_secondaryViewContainer = createViewContainer(url); + + auto secondaryNavigator = m_navigatorsWidget->secondaryUrlNavigator(); + if (!secondaryNavigator) { + m_navigatorsWidget->createSecondaryUrlNavigator(); + secondaryNavigator = m_navigatorsWidget->secondaryUrlNavigator(); + } + m_secondaryViewContainer->connectUrlNavigator(secondaryNavigator); + connect(m_secondaryViewContainer->view(), &DolphinView::redirection, this, &DolphinTabPage::slotViewUrlRedirection); + m_navigatorsWidget->setSecondaryNavigatorVisible(true); + m_navigatorsWidget->followViewContainersGeometry(m_primaryViewContainer, m_secondaryViewContainer); + + m_splitter->addWidget(m_secondaryViewContainer); + m_secondaryViewContainer->setActive(true); + + if (animated == WithAnimation) { + m_secondaryViewContainer->setMinimumWidth(1); + splitterSizes.append(1); + m_splitter->setSizes(splitterSizes); + startExpandViewAnimation(m_secondaryViewContainer); + } else { + resetSplitterSizes(m_splitter); } + m_secondaryViewContainer->show(); + } else { + m_navigatorsWidget->setSecondaryNavigatorVisible(false); + m_secondaryViewContainer->disconnectUrlNavigator(); + disconnect(m_secondaryViewContainer->view(), &DolphinView::redirection, this, &DolphinTabPage::slotViewUrlRedirection); - if (enabled) { - QList splitterSizes = m_splitter->sizes(); - const QUrl &url = (secondaryUrl.isEmpty()) ? m_primaryViewContainer->url() : secondaryUrl; - m_secondaryViewContainer = createViewContainer(url); + DolphinViewContainer *view; - auto secondaryNavigator = m_navigatorsWidget->secondaryUrlNavigator(); - if (!secondaryNavigator) { - m_navigatorsWidget->createSecondaryUrlNavigator(); - secondaryNavigator = m_navigatorsWidget->secondaryUrlNavigator(); - } - m_secondaryViewContainer->connectUrlNavigator(secondaryNavigator); - connect(m_secondaryViewContainer->view(), &DolphinView::redirection, this, &DolphinTabPage::slotViewUrlRedirection); - m_navigatorsWidget->setSecondaryNavigatorVisible(true); - m_navigatorsWidget->followViewContainersGeometry(m_primaryViewContainer, m_secondaryViewContainer); - - m_splitter->addWidget(m_secondaryViewContainer); - m_secondaryViewContainer->setActive(true); - - if (animated == WithAnimation) { - m_secondaryViewContainer->setMinimumWidth(1); - splitterSizes.append(1); - m_splitter->setSizes(splitterSizes); - startExpandViewAnimation(m_secondaryViewContainer); + auto swapActiveView = [this]() { + m_primaryViewContainer->disconnectUrlNavigator(); + m_secondaryViewContainer->connectUrlNavigator(m_navigatorsWidget->primaryUrlNavigator()); + + // If the primary view is active, we have to swap the pointers + // because the secondary view will be the new primary view. + std::swap(m_primaryViewContainer, m_secondaryViewContainer); + m_primaryViewActive = !m_primaryViewActive; + }; + if (GeneralSettings::closeActiveSplitView()) { + view = activeViewContainer(); + if (m_primaryViewActive) { + swapActiveView(); } - m_secondaryViewContainer->show(); } else { - m_navigatorsWidget->setSecondaryNavigatorVisible(false); - m_secondaryViewContainer->disconnectUrlNavigator(); - disconnect(m_secondaryViewContainer->view(), &DolphinView::redirection, this, &DolphinTabPage::slotViewUrlRedirection); - - DolphinViewContainer *view; - if (GeneralSettings::closeActiveSplitView()) { - view = activeViewContainer(); - if (m_primaryViewActive) { - m_primaryViewContainer->disconnectUrlNavigator(); - m_secondaryViewContainer->connectUrlNavigator(m_navigatorsWidget->primaryUrlNavigator()); - - // If the primary view is active, we have to swap the pointers - // because the secondary view will be the new primary view. - std::swap(m_primaryViewContainer, m_secondaryViewContainer); - m_primaryViewActive = false; - } - } else { - view = m_primaryViewActive ? m_secondaryViewContainer : m_primaryViewContainer; - if (!m_primaryViewActive) { - m_primaryViewContainer->disconnectUrlNavigator(); - m_secondaryViewContainer->connectUrlNavigator(m_navigatorsWidget->primaryUrlNavigator()); - - // If the secondary view is active, we have to swap the pointers - // because the secondary view will be the new primary view. - std::swap(m_primaryViewContainer, m_secondaryViewContainer); - m_primaryViewActive = true; - } - } - m_primaryViewContainer->setActive(true); - m_navigatorsWidget->followViewContainersGeometry(m_primaryViewContainer, nullptr); - - if (animated == WithoutAnimation) { - view->close(); - view->deleteLater(); - } else { - // Kill it but keep it as a zombie for the closing animation. - m_secondaryViewContainer = nullptr; - view->blockSignals(true); - view->view()->blockSignals(true); - view->setDisabled(true); - startExpandViewAnimation(m_primaryViewContainer); + view = m_primaryViewActive ? m_secondaryViewContainer : m_primaryViewContainer; + if (!m_primaryViewActive) { + swapActiveView(); } + } + m_primaryViewContainer->setActive(true); + m_navigatorsWidget->followViewContainersGeometry(m_primaryViewContainer, nullptr); - m_primaryViewContainer->slotSplitTabDisabled(); + if (animated == WithoutAnimation) { + view->close(); + view->deleteLater(); + } else { + // Kill it but keep it as a zombie for the closing animation. + m_secondaryViewContainer = nullptr; + view->blockSignals(true); + view->view()->blockSignals(true); + view->setDisabled(true); + startExpandViewAnimation(m_primaryViewContainer); } + + m_primaryViewContainer->slotSplitTabDisabled(); } } @@ -538,13 +548,13 @@ bool DolphinTabPageSplitterHandle::event(QEvent *event) break; case QEvent::MouseButtonRelease: if (m_mouseReleaseWasReceived) { - resetSplitterSizes(); + resetSplitterSizes(splitter()); } m_mouseReleaseWasReceived = !m_mouseReleaseWasReceived; break; case QEvent::MouseButtonDblClick: m_mouseReleaseWasReceived = false; - resetSplitterSizes(); + resetSplitterSizes(splitter()); break; default: break; @@ -553,13 +563,6 @@ bool DolphinTabPageSplitterHandle::event(QEvent *event) return QSplitterHandle::event(event); } -void DolphinTabPageSplitterHandle::resetSplitterSizes() -{ - QList splitterSizes = splitter()->sizes(); - std::fill(splitterSizes.begin(), splitterSizes.end(), 0); - splitter()->setSizes(splitterSizes); -} - DolphinTabPageSplitter::DolphinTabPageSplitter(Qt::Orientation orientation, QWidget *parent) : QSplitter(orientation, parent) { diff --git a/src/dolphintabpage.h b/src/dolphintabpage.h index 0c788d115..1abc05670 100644 --- a/src/dolphintabpage.h +++ b/src/dolphintabpage.h @@ -230,8 +230,6 @@ protected: bool event(QEvent *event) override; private: - void resetSplitterSizes(); - // Sometimes QSplitterHandle doesn't receive MouseButtonDblClick event. // We can detect that MouseButtonDblClick event should have been // received if we receive two MouseButtonRelease events in a row. -- cgit v1.3