/*
* SPDX-FileCopyrightText: 2014 Emmanuel Pescosta <emmanuelpescosta099@gmail.com>
- * SPDX-FileCopyrightText: 2020 Felix Ernst <fe.a.ernst@gmail.com>
+ * SPDX-FileCopyrightText: 2020 Felix Ernst <felixernst@kde.org>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "dolphin_generalsettings.h"
#include "dolphinviewcontainer.h"
-#include <QVariantAnimation>
#include <QGridLayout>
-#include <QWidgetAction>
#include <QStyle>
+#include <QVariantAnimation>
-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);
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();
// 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();
}
{
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) {
if (enabled) {
QList<int> 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();
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);
} 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;
}
}
}
}
-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
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()
}
}
-void DolphinTabPage::insertNavigatorsWidget(DolphinNavigatorsWidgetAction* navigatorsWidget)
+void DolphinTabPage::insertNavigatorsWidget(DolphinNavigatorsWidgetAction *navigatorsWidget)
{
QGridLayout *gridLayout = static_cast<QGridLayout *>(layout());
if (navigatorsWidget->isInToolbar()) {
}
}
-void DolphinTabPage::markUrlsAsSelected(const QList<QUrl>& urls)
+void DolphinTabPage::markUrlsAsSelected(const QList<QUrl> &urls)
{
m_primaryViewContainer->view()->markUrlsAsSelected(urls);
if (m_splitViewEnabled) {
}
}
-void DolphinTabPage::markUrlAsCurrent(const QUrl& url)
+void DolphinTabPage::markUrlAsCurrent(const QUrl &url)
{
m_primaryViewContainer->view()->markUrlAsCurrent(url);
if (m_splitViewEnabled) {
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;
QByteArray splitterState;
stream >> splitterState;
m_splitter->restoreState(splitterState);
+
+ if (!stream.atEnd()) {
+ QString tabTitle;
+ stream >> tabTitle;
+ setCustomLabel(tabTitle);
+ }
}
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();
}
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);
// 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;
}
}
-
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
}
}
- 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);
}
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;
}
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.
DolphinTabPageSplitterHandle::DolphinTabPageSplitterHandle(Qt::Orientation orientation, QSplitter *parent)
: QSplitterHandle(orientation, parent)
, m_mouseReleaseWasReceived(false)
-{}
+{
+}
bool DolphinTabPageSplitterHandle::event(QEvent *event)
{
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"