X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/b712c9fc4631c85c469e3ff64d67f4abc9a8a542..f9569eb19d3dad9693312015436a5419322a3a1b:/src/dolphintabpage.cpp diff --git a/src/dolphintabpage.cpp b/src/dolphintabpage.cpp index 771bbe9cd..dbc55e7d6 100644 --- a/src/dolphintabpage.cpp +++ b/src/dolphintabpage.cpp @@ -1,6 +1,6 @@ /* * SPDX-FileCopyrightText: 2014 Emmanuel Pescosta - * SPDX-FileCopyrightText: 2020 Felix Ernst + * SPDX-FileCopyrightText: 2020 Felix Ernst * * SPDX-License-Identifier: GPL-2.0-or-later */ @@ -9,19 +9,17 @@ #include "dolphin_generalsettings.h" #include "dolphinviewcontainer.h" -#include "global.h" -#include #include -#include #include +#include -DolphinTabPage::DolphinTabPage(const QUrl &primaryUrl, const QUrl &secondaryUrl, QWidget* parent) : - QWidget(parent), - m_expandingContainer{nullptr}, - m_primaryViewActive(true), - m_splitViewEnabled(false), - m_active(true) +DolphinTabPage::DolphinTabPage(const QUrl &primaryUrl, const QUrl &secondaryUrl, QWidget *parent) + : QWidget(parent) + , m_expandingContainer{nullptr} + , m_primaryViewActive(true) + , m_splitViewEnabled(false) + , m_active(true) { QGridLayout *layout = new QGridLayout(this); layout->setSpacing(0); @@ -29,17 +27,14 @@ 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); + connect(m_splitter, &QSplitter::splitterMoved, this, &DolphinTabPage::splitterMoved); layout->addWidget(m_splitter, 1, 0); layout->setRowStretch(1, 1); // Create a new primary view m_primaryViewContainer = createViewContainer(primaryUrl); - connect(m_primaryViewContainer->view(), &DolphinView::urlChanged, - this, &DolphinTabPage::activeViewUrlChanged); - connect(m_primaryViewContainer->view(), &DolphinView::redirection, - this, &DolphinTabPage::slotViewUrlRedirection); + connect(m_primaryViewContainer->view(), &DolphinView::urlChanged, this, &DolphinTabPage::activeViewUrlChanged); + connect(m_primaryViewContainer->view(), &DolphinView::redirection, this, &DolphinTabPage::slotViewUrlRedirection); m_splitter->addWidget(m_primaryViewContainer); m_primaryViewContainer->show(); @@ -48,8 +43,9 @@ DolphinTabPage::DolphinTabPage(const QUrl &primaryUrl, const QUrl &secondaryUrl, // Provide a secondary view, if the given secondary url is valid or if the // startup settings are set this way (use the url of the primary view). m_splitViewEnabled = true; - const QUrl& url = secondaryUrl.isValid() ? secondaryUrl : primaryUrl; + const QUrl &url = secondaryUrl.isValid() ? secondaryUrl : primaryUrl; m_secondaryViewContainer = createViewContainer(url); + connect(m_secondaryViewContainer->view(), &DolphinView::redirection, this, &DolphinTabPage::slotViewUrlRedirection); m_splitter->addWidget(m_secondaryViewContainer); m_secondaryViewContainer->show(); } @@ -71,9 +67,8 @@ void DolphinTabPage::setSplitViewEnabled(bool enabled, Animated animated, const { if (m_splitViewEnabled != enabled) { m_splitViewEnabled = enabled; - if (animated == WithAnimation && ( - style()->styleHint(QStyle::SH_Widget_Animation_Duration, nullptr, this) < 1 || - GlobalConfig::animationDurationFactor() <= 0.0)) { + if (animated == WithAnimation + && (style()->styleHint(QStyle::SH_Widget_Animation_Duration, nullptr, this) < 1 || GlobalConfig::animationDurationFactor() <= 0.0)) { animated = WithoutAnimation; } if (m_expandViewAnimation) { @@ -85,7 +80,7 @@ void DolphinTabPage::setSplitViewEnabled(bool enabled, Animated animated, const if (enabled) { QList splitterSizes = m_splitter->sizes(); - const QUrl& url = (secondaryUrl.isEmpty()) ? m_primaryViewContainer->url() : secondaryUrl; + const QUrl &url = (secondaryUrl.isEmpty()) ? m_primaryViewContainer->url() : secondaryUrl; m_secondaryViewContainer = createViewContainer(url); auto secondaryNavigator = m_navigatorsWidget->secondaryUrlNavigator(); @@ -94,9 +89,9 @@ void DolphinTabPage::setSplitViewEnabled(bool enabled, Animated animated, const 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_navigatorsWidget->followViewContainersGeometry(m_primaryViewContainer, m_secondaryViewContainer); m_splitter->addWidget(m_secondaryViewContainer); m_secondaryViewContainer->setActive(true); @@ -111,30 +106,29 @@ void DolphinTabPage::setSplitViewEnabled(bool enabled, Animated animated, const } else { m_navigatorsWidget->setSecondaryNavigatorVisible(false); m_secondaryViewContainer->disconnectUrlNavigator(); + disconnect(m_secondaryViewContainer->view(), &DolphinView::redirection, this, &DolphinTabPage::slotViewUrlRedirection); - DolphinViewContainer* view; + DolphinViewContainer *view; if (GeneralSettings::closeActiveSplitView()) { view = activeViewContainer(); if (m_primaryViewActive) { m_primaryViewContainer->disconnectUrlNavigator(); - m_secondaryViewContainer->connectUrlNavigator( - m_navigatorsWidget->primaryUrlNavigator()); + 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. - qSwap(m_primaryViewContainer, m_secondaryViewContainer); + 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()); + 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. - qSwap(m_primaryViewContainer, m_secondaryViewContainer); + std::swap(m_primaryViewContainer, m_secondaryViewContainer); m_primaryViewActive = true; } } @@ -152,24 +146,34 @@ void DolphinTabPage::setSplitViewEnabled(bool enabled, Animated animated, const view->setDisabled(true); startExpandViewAnimation(m_primaryViewContainer); } + + m_primaryViewContainer->slotSplitTabDisabled(); } } } -DolphinViewContainer* DolphinTabPage::primaryViewContainer() const +DolphinViewContainer *DolphinTabPage::primaryViewContainer() const { return m_primaryViewContainer; } -DolphinViewContainer* DolphinTabPage::secondaryViewContainer() const +DolphinViewContainer *DolphinTabPage::secondaryViewContainer() const { return m_secondaryViewContainer; } -DolphinViewContainer* DolphinTabPage::activeViewContainer() const +DolphinViewContainer *DolphinTabPage::activeViewContainer() const +{ + return m_primaryViewActive ? m_primaryViewContainer : m_secondaryViewContainer; +} + +DolphinViewContainer *DolphinTabPage::inactiveViewContainer() const { - return m_primaryViewActive ? m_primaryViewContainer : - m_secondaryViewContainer; + if (!splitViewEnabled()) { + return nullptr; + } + + return primaryViewActive() ? secondaryViewContainer() : primaryViewContainer(); } KFileItemList DolphinTabPage::selectedItems() const @@ -200,8 +204,7 @@ void DolphinTabPage::connectNavigators(DolphinNavigatorsWidgetAction *navigators auto secondaryNavigator = navigatorsWidget->secondaryUrlNavigator(); m_secondaryViewContainer->connectUrlNavigator(secondaryNavigator); } - m_navigatorsWidget->followViewContainersGeometry(m_primaryViewContainer, - m_secondaryViewContainer); + m_navigatorsWidget->followViewContainersGeometry(m_primaryViewContainer, m_secondaryViewContainer); } void DolphinTabPage::disconnectNavigators() @@ -213,7 +216,7 @@ void DolphinTabPage::disconnectNavigators() } } -void DolphinTabPage::insertNavigatorsWidget(DolphinNavigatorsWidgetAction* navigatorsWidget) +void DolphinTabPage::insertNavigatorsWidget(DolphinNavigatorsWidgetAction *navigatorsWidget) { QGridLayout *gridLayout = static_cast(layout()); if (navigatorsWidget->isInToolbar()) { @@ -226,7 +229,7 @@ void DolphinTabPage::insertNavigatorsWidget(DolphinNavigatorsWidgetAction* navig } } -void DolphinTabPage::markUrlsAsSelected(const QList& urls) +void DolphinTabPage::markUrlsAsSelected(const QList &urls) { m_primaryViewContainer->view()->markUrlsAsSelected(urls); if (m_splitViewEnabled) { @@ -234,7 +237,7 @@ void DolphinTabPage::markUrlsAsSelected(const QList& urls) } } -void DolphinTabPage::markUrlAsCurrent(const QUrl& url) +void DolphinTabPage::markUrlAsCurrent(const QUrl &url) { m_primaryViewContainer->view()->markUrlAsCurrent(url); if (m_splitViewEnabled) { @@ -272,10 +275,14 @@ QByteArray DolphinTabPage::saveState() const stream << m_primaryViewActive; stream << m_splitter->saveState(); + if (!m_customLabel.isEmpty()) { + stream << m_customLabel; + } + return state; } -void DolphinTabPage::restoreState(const QByteArray& state) +void DolphinTabPage::restoreState(const QByteArray &state) { if (state.isEmpty()) { return; @@ -325,6 +332,12 @@ void DolphinTabPage::restoreState(const QByteArray& state) QByteArray splitterState; stream >> splitterState; m_splitter->restoreState(splitterState); + + if (!stream.atEnd()) { + QString tabTitle; + stream >> tabTitle; + setCustomLabel(tabTitle); + } } void DolphinTabPage::setActive(bool active) @@ -339,12 +352,21 @@ void DolphinTabPage::setActive(bool active) activeViewContainer()->setActive(active); } +void DolphinTabPage::setCustomLabel(const QString &label) +{ + m_customLabel = label; +} + +QString DolphinTabPage::customLabel() const +{ + return m_customLabel; +} + void DolphinTabPage::slotAnimationFinished() { for (int i = 0; i < m_splitter->count(); ++i) { QWidget *viewContainer = m_splitter->widget(i); - if (viewContainer != m_primaryViewContainer && - viewContainer != m_secondaryViewContainer) { + if (viewContainer != m_primaryViewContainer && viewContainer != m_secondaryViewContainer) { viewContainer->close(); viewContainer->deleteLater(); } @@ -356,7 +378,7 @@ void DolphinTabPage::slotAnimationFinished() m_expandingContainer = nullptr; } -void DolphinTabPage::slotAnimationValueChanged(const QVariant& value) +void DolphinTabPage::slotAnimationValueChanged(const QVariant &value) { Q_CHECK_PTR(m_expandingContainer); const int indexOfExpandingContainer = m_splitter->indexOf(m_expandingContainer); @@ -373,8 +395,7 @@ void DolphinTabPage::slotAnimationValueChanged(const QVariant& value) // Reduce the size of the other widgets to make space for the expandingContainer. for (int i = m_splitter->count() - 1; i >= 0; --i) { - if (m_splitter->widget(i) == m_primaryViewContainer || - m_splitter->widget(i) == m_secondaryViewContainer) { + if (m_splitter->widget(i) == m_primaryViewContainer || m_splitter->widget(i) == m_secondaryViewContainer) { continue; } newSplitterSizes[i] = oldSplitterSizes.at(i) - expansionWidthNeeded; @@ -404,10 +425,9 @@ void DolphinTabPage::slotAnimationValueChanged(const QVariant& value) } } - void DolphinTabPage::slotViewActivated() { - const DolphinView* oldActiveView = activeViewContainer()->view(); + const DolphinView *oldActiveView = activeViewContainer()->view(); // Set the view, which was active before, to inactive // and update the active view type, if tab is active @@ -423,28 +443,31 @@ void DolphinTabPage::slotViewActivated() } } - const DolphinView* newActiveView = activeViewContainer()->view(); + const DolphinView *newActiveView = activeViewContainer()->view(); if (newActiveView == oldActiveView) { return; } - disconnect(oldActiveView, &DolphinView::urlChanged, - this, &DolphinTabPage::activeViewUrlChanged); - disconnect(oldActiveView, &DolphinView::redirection, - this, &DolphinTabPage::slotViewUrlRedirection); - connect(newActiveView, &DolphinView::urlChanged, - this, &DolphinTabPage::activeViewUrlChanged); - connect(newActiveView, &DolphinView::redirection, - this, &DolphinTabPage::slotViewUrlRedirection); + disconnect(oldActiveView, &DolphinView::urlChanged, this, &DolphinTabPage::activeViewUrlChanged); + connect(newActiveView, &DolphinView::urlChanged, this, &DolphinTabPage::activeViewUrlChanged); Q_EMIT activeViewChanged(activeViewContainer()); Q_EMIT activeViewUrlChanged(activeViewContainer()->url()); } -void DolphinTabPage::slotViewUrlRedirection(const QUrl& oldUrl, const QUrl& newUrl) +void DolphinTabPage::slotViewUrlRedirection(const QUrl &oldUrl, const QUrl &newUrl) { - Q_UNUSED(oldUrl) - + // Make sure the url of the view is updated. BUG:496414 + if (splitViewEnabled()) { + if (primaryViewContainer()->view()->url() == oldUrl) { + primaryViewContainer()->view()->setUrl(newUrl); + } + if (secondaryViewContainer()->view()->url() == oldUrl) { + secondaryViewContainer()->view()->setUrl(newUrl); + } + } else { + activeViewContainer()->view()->setUrl(newUrl); + } Q_EMIT activeViewUrlChanged(newUrl); } @@ -454,23 +477,21 @@ void DolphinTabPage::switchActiveView() return; } if (m_primaryViewActive) { - m_secondaryViewContainer->setActive(true); + m_secondaryViewContainer->setActive(true); } else { - m_primaryViewContainer->setActive(true); + m_primaryViewContainer->setActive(true); } } -DolphinViewContainer* DolphinTabPage::createViewContainer(const QUrl& url) const +DolphinViewContainer *DolphinTabPage::createViewContainer(const QUrl &url) const { - DolphinViewContainer* container = new DolphinViewContainer(url, m_splitter); + DolphinViewContainer *container = new DolphinViewContainer(url, m_splitter); container->setActive(false); - const DolphinView* view = container->view(); - connect(view, &DolphinView::activated, - this, &DolphinTabPage::slotViewActivated); + const DolphinView *view = container->view(); + connect(view, &DolphinView::activated, this, &DolphinTabPage::slotViewActivated); - connect(view, &DolphinView::toggleActiveViewRequested, - this, &DolphinTabPage::switchActiveView); + connect(view, &DolphinView::toggleActiveViewRequested, this, &DolphinTabPage::switchActiveView); return container; } @@ -478,21 +499,16 @@ DolphinViewContainer* DolphinTabPage::createViewContainer(const QUrl& url) const void DolphinTabPage::startExpandViewAnimation(DolphinViewContainer *expandingContainer) { Q_CHECK_PTR(expandingContainer); - Q_ASSERT(expandingContainer == m_primaryViewContainer || - expandingContainer == m_secondaryViewContainer); + Q_ASSERT(expandingContainer == m_primaryViewContainer || expandingContainer == m_secondaryViewContainer); m_expandingContainer = expandingContainer; m_expandViewAnimation = new QVariantAnimation(m_splitter); - m_expandViewAnimation->setDuration(2 * - style()->styleHint(QStyle::SH_Widget_Animation_Duration, nullptr, this) * - GlobalConfig::animationDurationFactor()); + m_expandViewAnimation->setDuration(2 * style()->styleHint(QStyle::SH_Widget_Animation_Duration, nullptr, this) * GlobalConfig::animationDurationFactor()); for (int i = 0; i < m_splitter->count(); ++i) { m_splitter->widget(i)->setMinimumWidth(1); } - connect(m_expandViewAnimation, &QAbstractAnimation::finished, - this, &DolphinTabPage::slotAnimationFinished); - connect(m_expandViewAnimation, &QVariantAnimation::valueChanged, - this, &DolphinTabPage::slotAnimationValueChanged); + connect(m_expandViewAnimation, &QAbstractAnimation::finished, this, &DolphinTabPage::slotAnimationFinished); + connect(m_expandViewAnimation, &QVariantAnimation::valueChanged, this, &DolphinTabPage::slotAnimationValueChanged); m_expandViewAnimation->setStartValue(expandingContainer->width()); if (m_splitViewEnabled) { // A new viewContainer is being opened. @@ -508,7 +524,8 @@ void DolphinTabPage::startExpandViewAnimation(DolphinViewContainer *expandingCon DolphinTabPageSplitterHandle::DolphinTabPageSplitterHandle(Qt::Orientation orientation, QSplitter *parent) : QSplitterHandle(orientation, parent) , m_mouseReleaseWasReceived(false) -{} +{ +} bool DolphinTabPageSplitterHandle::event(QEvent *event) { @@ -542,9 +559,12 @@ void DolphinTabPageSplitterHandle::resetSplitterSizes() DolphinTabPageSplitter::DolphinTabPageSplitter(Qt::Orientation orientation, QWidget *parent) : QSplitter(orientation, parent) -{} +{ +} -QSplitterHandle* DolphinTabPageSplitter::createHandle() +QSplitterHandle *DolphinTabPageSplitter::createHandle() { return new DolphinTabPageSplitterHandle(orientation(), this); } + +#include "moc_dolphintabpage.cpp"