#include "trash/dolphintrash.h"
#include <KLocalizedString>
+#include <KNotificationJobUiDelegate>
+#include <KService>
#include <KXMLGUIFactory>
#include <KXmlGuiWindow>
+#include <KIO/ApplicationLauncherJob>
+
#include <QApplication>
#include <QDomDocument>
#include <QHBoxLayout>
#include <QPushButton>
-#include <QSplitter>
#include <QToolBar>
#include <limits>
void DolphinNavigatorsWidgetAction::adjustSpacing()
{
+ m_previousWindowWidth = parentWidget()->window()->width();
auto viewGeometries = m_viewGeometriesHelper.viewGeometries();
const int widthOfSplitterPrimary = viewGeometries.globalXOfPrimary + viewGeometries.widthOfPrimary - viewGeometries.globalXOfNavigatorsWidget;
const QList<int> splitterSizes = {widthOfSplitterPrimary,
}
int trailingSpacing = (viewGeometries.globalXOfNavigatorsWidget + m_splitter->width())
- (viewGeometries.globalXOfPrimary + viewGeometries.widthOfPrimary);
- if (trailingSpacing < 0 || emptyTrashButton(Primary)->isVisible()) {
+ if (trailingSpacing < 0 || emptyTrashButton(Primary)->isVisible()
+ || networkFolderButton(Primary)->isVisible()
+ ) {
trailingSpacing = 0;
}
const int widthLeftForUrlNavigator = m_splitter->widget(0)->width() - leadingSpacing - trailingSpacing;
trailingSpacing = (viewGeometries.globalXOfNavigatorsWidget + m_splitter->width())
- (viewGeometries.globalXOfSecondary + viewGeometries.widthOfSecondary);
- if (trailingSpacing < 0 || emptyTrashButton(Secondary)->isVisible()) {
+ if (trailingSpacing < 0 || emptyTrashButton(Secondary)->isVisible()
+ || networkFolderButton(Secondary)->isVisible()
+ ) {
trailingSpacing = 0;
} else {
const int widthLeftForUrlNavigator2 = m_splitter->widget(1)->width() - trailingSpacing;
auto emptyTrashButton = newEmptyTrashButton(urlNavigator, navigatorWidget);
layout->addWidget(emptyTrashButton);
+ auto networkFolderButton = newNetworkFolderButton(urlNavigator, navigatorWidget);
+ layout->addWidget(networkFolderButton);
+
connect(urlNavigator, &KUrlNavigator::urlChanged, this, [urlNavigator, this]() {
// Update URL navigator to show a server URL entry placeholder text if we
// just loaded the remote:/ page, to make it easier for users to figure out
{
auto emptyTrashButton = new QPushButton(QIcon::fromTheme(QStringLiteral("user-trash")),
i18nc("@action:button", "Empty Trash"), parent);
+ emptyTrashButton->setToolTip(i18n("Empties Trash to create free space"));
+
emptyTrashButton->setFlat(true);
connect(emptyTrashButton, &QPushButton::clicked,
this, [parent]() { Trash::empty(parent); });
return emptyTrashButton;
}
+QPushButton *DolphinNavigatorsWidgetAction::networkFolderButton(DolphinNavigatorsWidgetAction::Side side)
+{
+ int sideIndex = (side == Primary ? 0 : 1);
+ if (side == Primary) {
+ return static_cast<QPushButton *>(m_splitter->widget(sideIndex)->layout()->itemAt(3)->widget());
+ }
+ return static_cast<QPushButton *>(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);
+ KService::Ptr service = KService::serviceByDesktopName(QStringLiteral("org.kde.knetattach"));
+ connect(networkFolderButton, &QPushButton::clicked,
+ this, [networkFolderButton, service]() {
+ 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, service]() {
+ networkFolderButton->setVisible(service && urlNavigator->locationUrl().scheme() == QLatin1String("remote"));
+ });
+ return networkFolderButton;
+}
+
QWidget *DolphinNavigatorsWidgetAction::spacing(Side side, Position position) const
{
int sideIndex = (side == Primary ? 0 : 1);
return m_splitter->widget(sideIndex)->layout()->itemAt(0)->widget();
}
if (side == Primary) {
- return m_splitter->widget(sideIndex)->layout()->itemAt(3)->widget();
+ return m_splitter->widget(sideIndex)->layout()->itemAt(4)->widget();
}
- return m_splitter->widget(sideIndex)->layout()->itemAt(2)->widget();
+ return m_splitter->widget(sideIndex)->layout()->itemAt(3)->widget();
}
void DolphinNavigatorsWidgetAction::updateText()
bool DolphinNavigatorsWidgetAction::ViewGeometriesHelper::eventFilter(QObject *watched, QEvent *event)
{
if (event->type() == QEvent::Resize) {
- m_navigatorsWidgetAction->adjustSpacing();
+ if (m_navigatorsWidgetAction->parentWidget()->window()->width() != m_navigatorsWidgetAction->m_previousWindowWidth) {
+ // The window is being resized which means not all widgets have gotten their new sizes yet.
+ // Let's wait a bit so the sizes of the navigatorsWidget and the viewContainers have all
+ // had a chance to be updated.
+ m_navigatorsWidgetAction->m_adjustSpacingTimer->start();
+ } else {
+ m_navigatorsWidgetAction->adjustSpacing();
+ // We could always use the m_adjustSpacingTimer instead of calling adjustSpacing() directly
+ // here but then the navigatorsWidget doesn't fluently align with the viewContainers when
+ // the DolphinTabPage::m_expandViewAnimation is animating.
+ }
return false;
}
return QObject::eventFilter(watched, event);