X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/480b3067d25e4b49ea55285313a7c10e93f98ffd..8e3addb7e73122a4c89ef347b03f714ff75a253a:/src/dolphintabpage.cpp diff --git a/src/dolphintabpage.cpp b/src/dolphintabpage.cpp index 33c77c42a..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,38 +9,32 @@ #include "dolphin_generalsettings.h" #include "dolphinviewcontainer.h" -#include "global.h" -#include -#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); layout->setContentsMargins(0, 0, 0, 0); - m_splitter = new QSplitter(Qt::Horizontal, this); + 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(); @@ -49,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(); } @@ -72,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) { @@ -86,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(); @@ -95,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); @@ -112,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; } } @@ -153,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 @@ -201,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() @@ -214,7 +216,7 @@ void DolphinTabPage::disconnectNavigators() } } -void DolphinTabPage::insertNavigatorsWidget(DolphinNavigatorsWidgetAction* navigatorsWidget) +void DolphinTabPage::insertNavigatorsWidget(DolphinNavigatorsWidgetAction *navigatorsWidget) { QGridLayout *gridLayout = static_cast(layout()); if (navigatorsWidget->isInToolbar()) { @@ -227,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) { @@ -235,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) { @@ -273,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; @@ -326,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) @@ -340,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(); } @@ -357,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); @@ -374,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; @@ -405,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 @@ -424,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); } @@ -455,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; } @@ -479,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. @@ -505,3 +520,51 @@ void DolphinTabPage::startExpandViewAnimation(DolphinViewContainer *expandingCon } m_expandViewAnimation->start(QAbstractAnimation::DeleteWhenStopped); } + +DolphinTabPageSplitterHandle::DolphinTabPageSplitterHandle(Qt::Orientation orientation, QSplitter *parent) + : QSplitterHandle(orientation, parent) + , m_mouseReleaseWasReceived(false) +{ +} + +bool DolphinTabPageSplitterHandle::event(QEvent *event) +{ + switch (event->type()) { + case QEvent::MouseButtonPress: + m_mouseReleaseWasReceived = false; + break; + case QEvent::MouseButtonRelease: + if (m_mouseReleaseWasReceived) { + resetSplitterSizes(); + } + m_mouseReleaseWasReceived = !m_mouseReleaseWasReceived; + break; + case QEvent::MouseButtonDblClick: + m_mouseReleaseWasReceived = false; + resetSplitterSizes(); + break; + default: + break; + } + + 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) +{ +} + +QSplitterHandle *DolphinTabPageSplitter::createHandle() +{ + return new DolphinTabPageSplitterHandle(orientation(), this); +} + +#include "moc_dolphintabpage.cpp"