X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/2d4d2ce9a14902ee5a2b236f8510596fc2f86b99..5ed12ed44a7169855d46486d17c3e18697c3c4ae:/src/dolphinnavigatorswidgetaction.cpp diff --git a/src/dolphinnavigatorswidgetaction.cpp b/src/dolphinnavigatorswidgetaction.cpp index 84f52279a..b25c60d0c 100644 --- a/src/dolphinnavigatorswidgetaction.cpp +++ b/src/dolphinnavigatorswidgetaction.cpp @@ -10,13 +10,19 @@ #include "trash/dolphintrash.h" #include +#include +#include #include #include +#include + +#include #include #include #include #include +#include #include @@ -34,7 +40,6 @@ DolphinNavigatorsWidgetAction::DolphinNavigatorsWidgetAction(QWidget *parent) : setIcon(QIcon::fromTheme(QStringLiteral("dialog-scripts"))); m_splitter->setChildrenCollapsible(false); - setDefaultWidget(m_splitter.get()); m_splitter->addWidget(createNavigatorWidget(Primary)); @@ -44,34 +49,6 @@ DolphinNavigatorsWidgetAction::DolphinNavigatorsWidgetAction(QWidget *parent) : this, &DolphinNavigatorsWidgetAction::adjustSpacing); } -bool DolphinNavigatorsWidgetAction::addToToolbarAndSave(KXmlGuiWindow *mainWindow) -{ - const QString rawXml = KXMLGUIFactory::readConfigFile(mainWindow->xmlFile()); - QDomDocument domDocument; - if (rawXml.isEmpty() || !domDocument.setContent(rawXml) || domDocument.isNull()) { - return false; - } - QDomNode toolbar = domDocument.elementsByTagName(QStringLiteral("ToolBar")).at(0); - if (toolbar.isNull()) { - return false; - } - - QDomElement urlNavigatorElement = domDocument.createElement(QStringLiteral("Action")); - urlNavigatorElement.setAttribute(QStringLiteral("name"), QStringLiteral("url_navigators")); - - QDomNode position = toolbar.firstChildElement(QStringLiteral("Spacer")); - if (position.isNull()) { - toolbar.appendChild(urlNavigatorElement); - } else { - toolbar.replaceChild(urlNavigatorElement, position); - } - - KXMLGUIFactory::saveConfigFile(domDocument, mainWindow->xmlFile()); - mainWindow->reloadXML(); - mainWindow->createGUI(); - return true; -} - void DolphinNavigatorsWidgetAction::createSecondaryUrlNavigator() { Q_ASSERT(m_splitter->count() == 1); @@ -90,14 +67,29 @@ void DolphinNavigatorsWidgetAction::followViewContainersGeometry( int globalXOfPrimary, int widthOfPrimary, int globalXOfSecondary, int widthOfSecondary) { - m_globalXOfSplitter = m_splitter->mapToGlobal(QPoint(0,0)).x(); - m_globalXOfPrimary = globalXOfPrimary; + if (QApplication::layoutDirection() == Qt::LeftToRight) { + m_globalXOfSplitter = m_splitter->mapToGlobal(QPoint(0,0)).x(); + m_globalXOfPrimary = globalXOfPrimary; + m_globalXOfSecondary = globalXOfSecondary; + } else { + // When the direction is reversed, globalX does not change. + // For the adjustSpacing() code to work we need globalX to measure from right to left + // and to measure up to the rightmost point of a widget instead of the leftmost. + m_globalXOfSplitter = (-1) * (m_splitter->mapToGlobal(QPoint(0,0)).x() + m_splitter->width()); + m_globalXOfPrimary = (-1) * (globalXOfPrimary + widthOfPrimary); + m_globalXOfSecondary = (globalXOfSecondary == INT_MIN) ? INT_MIN : + (-1) * (globalXOfSecondary + widthOfSecondary); + } m_widthOfPrimary = widthOfPrimary; - m_globalXOfSecondary = globalXOfSecondary; m_widthOfSecondary = widthOfSecondary; adjustSpacing(); } +bool DolphinNavigatorsWidgetAction::isInToolbar() const +{ + return qobject_cast(m_splitter->parentWidget()); +} + DolphinUrlNavigator* DolphinNavigatorsWidgetAction::primaryUrlNavigator() const { Q_ASSERT(m_splitter); @@ -126,6 +118,29 @@ void DolphinNavigatorsWidgetAction::setSecondaryNavigatorVisible(bool visible) updateText(); } +QWidget *DolphinNavigatorsWidgetAction::createWidget(QWidget *parent) +{ + QWidget *oldParent = m_splitter->parentWidget(); + if (oldParent && oldParent->layout()) { + oldParent->layout()->removeWidget(m_splitter.get()); + QGridLayout *layout = qobject_cast(oldParent->layout()); + if (qobject_cast(parent) && layout) { + // in DolphinTabPage::insertNavigatorsWidget the minimumHeight of this row was + // set to fit the m_splitter. Since we are now removing it again, the + // minimumHeight can be reset to 0. + layout->setRowMinimumHeight(0, 0); + } + } + m_splitter->setParent(parent); + return m_splitter.get(); +} + +void DolphinNavigatorsWidgetAction::deleteWidget(QWidget *widget) +{ + Q_UNUSED(widget) + m_splitter->setParent(nullptr); +} + void DolphinNavigatorsWidgetAction::adjustSpacing() { Q_ASSERT(m_globalXOfSplitter != INT_MIN); @@ -143,7 +158,13 @@ void DolphinNavigatorsWidgetAction::adjustSpacing() } int trailingSpacing = (m_globalXOfSplitter + m_splitter->width()) - (m_globalXOfPrimary + m_widthOfPrimary); +#if KIO_VERSION < QT_VERSION_CHECK(5, 78, 0) if (trailingSpacing < 0 || emptyTrashButton(Primary)->isVisible()) { +#else + if (trailingSpacing < 0 || emptyTrashButton(Primary)->isVisible() + || networkFolderButton(Primary)->isVisible() + ) { +#endif trailingSpacing = 0; } const int widthLeftForUrlNavigator = m_splitter->widget(0)->width() - leadingSpacing - trailingSpacing; @@ -170,7 +191,13 @@ void DolphinNavigatorsWidgetAction::adjustSpacing() trailingSpacing = (m_globalXOfSplitter + m_splitter->width()) - (m_globalXOfSecondary + m_widthOfSecondary); +#if KIO_VERSION < QT_VERSION_CHECK(5, 78, 0) if (trailingSpacing < 0 || emptyTrashButton(Secondary)->isVisible()) { +#else + if (trailingSpacing < 0 || emptyTrashButton(Secondary)->isVisible() + || networkFolderButton(Secondary)->isVisible() + ) { +#endif trailingSpacing = 0; } else { const int widthLeftForUrlNavigator2 = m_splitter->widget(1)->width() - trailingSpacing; @@ -201,7 +228,12 @@ QWidget *DolphinNavigatorsWidgetAction::createNavigatorWidget(Side side) const auto emptyTrashButton = newEmptyTrashButton(urlNavigator, navigatorWidget); layout->addWidget(emptyTrashButton); - connect(urlNavigator, &KUrlNavigator::urlChanged, [this]() { +#if !(KIO_VERSION < QT_VERSION_CHECK(5, 78, 0)) + auto networkFolderButton = newNetworkFolderButton(urlNavigator, navigatorWidget); + layout->addWidget(networkFolderButton); +#endif + + connect(urlNavigator, &KUrlNavigator::urlChanged, this, [this]() { // We have to wait for DolphinUrlNavigator::sizeHint() to update which // happens a little bit later than when urlChanged is emitted. this->m_adjustSpacingTimer->start(); @@ -231,13 +263,45 @@ QPushButton *DolphinNavigatorsWidgetAction::newEmptyTrashButton(const DolphinUrl connect(&Trash::instance(), &Trash::emptinessChanged, emptyTrashButton, &QPushButton::setDisabled); emptyTrashButton->hide(); - connect(urlNavigator, &KUrlNavigator::urlChanged, [emptyTrashButton, urlNavigator]() { + connect(urlNavigator, &KUrlNavigator::urlChanged, this, [emptyTrashButton, urlNavigator]() { emptyTrashButton->setVisible(urlNavigator->locationUrl().scheme() == QLatin1String("trash")); }); emptyTrashButton->setDisabled(Trash::isEmpty()); return emptyTrashButton; } +#if !(KIO_VERSION < QT_VERSION_CHECK(5, 78, 0)) +QPushButton *DolphinNavigatorsWidgetAction::networkFolderButton(DolphinNavigatorsWidgetAction::Side side) +{ + int sideIndex = (side == Primary ? 0 : 1); + if (side == Primary) { + return static_cast(m_splitter->widget(sideIndex)->layout()->itemAt(3)->widget()); + } + return static_cast(m_splitter->widget(sideIndex)->layout()->itemAt(2)->widget()); +} + +QPushButton *DolphinNavigatorsWidgetAction::newNetworkFolderButton(const DolphinUrlNavigator *urlNavigator, QWidget *parent) const +{ + auto networkFolderButton = new QPushButton(QIcon::fromTheme(QStringLiteral("folder-add")), + i18nc("@action:button", "Add Network Folder"), parent); + networkFolderButton->setFlat(true); + connect(networkFolderButton, &QPushButton::clicked, + this, [networkFolderButton]() { + KService::Ptr service = KService::serviceByDesktopName(QStringLiteral("org.kde.knetattach")); + auto *job = new KIO::ApplicationLauncherJob(service, networkFolderButton); + auto *delegate = new KNotificationJobUiDelegate; + delegate->setAutoErrorHandlingEnabled(true); + job->setUiDelegate(delegate); + job->start(); + }); + networkFolderButton->hide(); + connect(urlNavigator, &KUrlNavigator::urlChanged, this, [networkFolderButton, urlNavigator]() { + networkFolderButton->setVisible(urlNavigator->locationUrl().scheme() == QLatin1String("remote")); + }); + return networkFolderButton; +} +#endif + QWidget *DolphinNavigatorsWidgetAction::spacing(Side side, Position position) const { int sideIndex = (side == Primary ? 0 : 1); @@ -246,9 +310,17 @@ QWidget *DolphinNavigatorsWidgetAction::spacing(Side side, Position position) co return m_splitter->widget(sideIndex)->layout()->itemAt(0)->widget(); } if (side == Primary) { +#if KIO_VERSION < QT_VERSION_CHECK(5, 78, 0) return m_splitter->widget(sideIndex)->layout()->itemAt(3)->widget(); +#else + return m_splitter->widget(sideIndex)->layout()->itemAt(4)->widget(); +#endif } +#if KIO_VERSION < QT_VERSION_CHECK(5, 78, 0) return m_splitter->widget(sideIndex)->layout()->itemAt(2)->widget(); +#else + return m_splitter->widget(sideIndex)->layout()->itemAt(3)->widget(); +#endif } void DolphinNavigatorsWidgetAction::updateText()