diff options
Diffstat (limited to 'src/dolphintabpage.cpp')
| -rw-r--r-- | src/dolphintabpage.cpp | 50 |
1 files changed, 46 insertions, 4 deletions
diff --git a/src/dolphintabpage.cpp b/src/dolphintabpage.cpp index ca47130c0..7187162a4 100644 --- a/src/dolphintabpage.cpp +++ b/src/dolphintabpage.cpp @@ -38,8 +38,8 @@ DolphinTabPage::DolphinTabPage(const QUrl &primaryUrl, const QUrl &secondaryUrl, m_splitter = new DolphinTabPageSplitter(Qt::Horizontal, this); m_splitter->setChildrenCollapsible(false); connect(m_splitter, &QSplitter::splitterMoved, this, &DolphinTabPage::splitterMoved); - layout->addWidget(m_splitter, 1, 0); - layout->setRowStretch(1, 1); + layout->addWidget(m_splitter, 2, 0, 1, 2); + layout->setRowStretch(2, 1); // Create a new primary view m_primaryViewContainer = createViewContainer(primaryUrl); @@ -60,7 +60,13 @@ DolphinTabPage::DolphinTabPage(const QUrl &primaryUrl, const QUrl &secondaryUrl, m_secondaryViewContainer->show(); } + // DolphinView::setActive(true) calls setFocus() then emits activated(). + // activated() is connected to slotViewActivated() which toggles + // m_primaryViewActive — correct for user-initiated pane switches, but + // wrong here during construction. Disconnect to prevent the spurious toggle. + disconnectViewActivatedSignals(); m_primaryViewContainer->setActive(true); + connectViewActivatedSignals(); } bool DolphinTabPage::primaryViewActive() const @@ -259,6 +265,8 @@ void DolphinTabPage::insertNavigatorsWidget(DolphinNavigatorsWidgetAction *navig // We set a row minimum height, so the height does not visibly change whenever // navigatorsWidget is inserted which happens every time the current tab is changed. gridLayout->setRowMinimumHeight(0, navigatorsWidget->primaryUrlNavigator()->height()); + gridLayout->setRowMinimumHeight(1, 1); + gridLayout->addWidget(navigatorsWidget->requestWidget(this), 0, 0); if (!m_navigatorSeparator) { m_navigatorSeparator = std::make_unique<QFrame>(this); @@ -266,7 +274,7 @@ void DolphinTabPage::insertNavigatorsWidget(DolphinNavigatorsWidgetAction *navig m_navigatorSeparator->setFrameStyle(QFrame::HLine); m_navigatorSeparator->setFixedHeight(1); m_navigatorSeparator->setContentsMargins(0, 0, 0, 0); - gridLayout->addWidget(m_navigatorSeparator.get(), 1, 0, 0, -1); + gridLayout->addWidget(m_navigatorSeparator.get(), 1, 0); } } @@ -364,12 +372,22 @@ void DolphinTabPage::restoreState(const QByteArray &state) } stream >> m_primaryViewActive; + // DolphinView::setActive(true) calls setFocus() then emits activated(). + // activated() is connected to slotViewActivated() which toggles + // m_primaryViewActive — correct for user-initiated pane switches, but + // wrong here during session restore. Disconnect to prevent the spurious toggle. + disconnectViewActivatedSignals(); if (m_primaryViewActive) { + if (m_splitViewEnabled) { + m_secondaryViewContainer->setActive(false); + } m_primaryViewContainer->setActive(true); } else { Q_ASSERT(m_splitViewEnabled); + m_primaryViewContainer->setActive(false); m_secondaryViewContainer->setActive(true); } + connectViewActivatedSignals(); QByteArray splitterState; stream >> splitterState; @@ -393,8 +411,16 @@ void DolphinTabPage::setActive(bool active) // we should bypass changing active view in split mode m_active = !m_splitViewEnabled; } - // we want view to fire activated when goes from false to true + // DolphinView::setActive(true) calls setFocus() then emits activated(). + // activated() is connected to slotViewActivated() which toggles + // m_primaryViewActive — correct for user-initiated pane switches, but + // wrong here during tab switch. Disconnect to prevent the spurious toggle. + disconnectViewActivatedSignals(); + if (active && m_splitViewEnabled) { + inactiveViewContainer()->setActive(false); + } activeViewContainer()->setActive(active); + connectViewActivatedSignals(); } void DolphinTabPage::setCustomLabel(const QString &label) @@ -518,6 +544,22 @@ void DolphinTabPage::switchActiveView() } } +void DolphinTabPage::connectViewActivatedSignals() +{ + connect(m_primaryViewContainer->view(), &DolphinView::activated, this, &DolphinTabPage::slotViewActivated); + if (m_secondaryViewContainer) { + connect(m_secondaryViewContainer->view(), &DolphinView::activated, this, &DolphinTabPage::slotViewActivated); + } +} + +void DolphinTabPage::disconnectViewActivatedSignals() +{ + disconnect(m_primaryViewContainer->view(), &DolphinView::activated, this, &DolphinTabPage::slotViewActivated); + if (m_secondaryViewContainer) { + disconnect(m_secondaryViewContainer->view(), &DolphinView::activated, this, &DolphinTabPage::slotViewActivated); + } +} + DolphinViewContainer *DolphinTabPage::createViewContainer(const QUrl &url) const { DolphinViewContainer *container = new DolphinViewContainer(url, m_splitter); |
