#include "dolphinviewcontainer.h"
+#include "admin/bar.h"
#include "dolphin_compactmodesettings.h"
#include "dolphin_contentdisplaysettings.h"
#include "dolphin_detailsmodesettings.h"
#include "statusbar/dolphinstatusbar.h"
#include <KActionCollection>
-#if HAVE_KACTIVITIES
-#include <KActivities/ResourceInstance>
+#if HAVE_PLASMA_ACTIVITIES
+#include <PlasmaActivities/ResourceInstance>
#endif
#include <KApplicationTrader>
#include <KFileItemActions>
#include <KMessageWidget>
#include <KProtocolManager>
#include <KShell>
+#include <kio_version.h>
#include <QApplication>
#include <QDesktopServices>
// An overview of the widgets contained by this ViewContainer
struct LayoutStructure {
int searchBox = 0;
- int messageWidget = 1;
- int selectionModeTopBar = 2;
- int view = 3;
- int selectionModeBottomBar = 4;
- int filterBar = 5;
- int statusBar = 6;
+ int adminBar = 1;
+ int messageWidget = 2;
+ int selectionModeTopBar = 3;
+ int view = 4;
+ int selectionModeBottomBar = 5;
+ int filterBar = 6;
+ int statusBar = 7;
};
constexpr LayoutStructure positionFor;
, m_urlNavigatorConnected{nullptr}
, m_searchBox(nullptr)
, m_searchModeEnabled(false)
+ , m_adminBar{nullptr}
, m_messageWidget(nullptr)
, m_selectionModeTopBar{nullptr}
, m_view(nullptr)
, m_statusBarTimer(nullptr)
, m_statusBarTimestamp()
, m_autoGrabFocus(true)
-#if HAVE_KACTIVITIES
- , m_activityResourceInstance(nullptr)
-#endif
{
hide();
m_topLayout->setContentsMargins(0, 0, 0, 0);
m_searchBox = new DolphinSearchBox(this);
- m_searchBox->hide();
+ m_searchBox->setVisible(false, WithoutAnimation);
connect(m_searchBox, &DolphinSearchBox::activated, this, &DolphinViewContainer::activate);
+ connect(m_searchBox, &DolphinSearchBox::openRequest, this, &DolphinViewContainer::openSearchBox);
connect(m_searchBox, &DolphinSearchBox::closeRequest, this, &DolphinViewContainer::closeSearchBox);
connect(m_searchBox, &DolphinSearchBox::searchRequest, this, &DolphinViewContainer::startSearching);
connect(m_searchBox, &DolphinSearchBox::focusViewRequest, this, &DolphinViewContainer::requestFocus);
m_messageWidget = new KMessageWidget(this);
m_messageWidget->setCloseButtonVisible(true);
+ m_messageWidget->setPosition(KMessageWidget::Header);
m_messageWidget->hide();
#ifndef Q_OS_WIN
// Initialize filter bar
m_filterBar = new FilterBar(this);
- m_filterBar->setVisible(GeneralSettings::filterBar());
+ m_filterBar->setVisible(GeneralSettings::filterBar(), WithoutAnimation);
connect(m_filterBar, &FilterBar::filterChanged, this, &DolphinViewContainer::setNameFilter);
connect(m_filterBar, &FilterBar::closeRequest, this, &DolphinViewContainer::closeFilterBar);
connect(m_view, &DolphinView::hiddenFilesShownChanged, this, &DolphinViewContainer::slotHiddenFilesShownChanged);
connect(m_view, &DolphinView::sortHiddenLastChanged, this, &DolphinViewContainer::slotSortHiddenLastChanged);
connect(m_view, &DolphinView::currentDirectoryRemoved, this, &DolphinViewContainer::slotCurrentDirectoryRemoved);
+ connect(m_view, &DolphinView::urlChanged, this, &DolphinViewContainer::updateAdminBarVisibility);
// Initialize status bar
m_statusBar = new DolphinStatusBar(this);
m_topLayout->addWidget(m_statusBar, positionFor.statusBar, 0);
setSearchModeEnabled(isSearchUrl(url));
+ updateAdminBarVisibility(url);
// Update view as the ContentDisplaySettings change
// this happens here and not in DolphinView as DolphinviewContainer and DolphinView are not in the same build target ATM
connect(placesModel, &KFilePlacesModel::rowsRemoved, this, &DolphinViewContainer::slotPlacesModelChanged);
connect(this, &DolphinViewContainer::searchModeEnabledChanged, this, &DolphinViewContainer::captionChanged);
-
- // Initialize kactivities resource instance
-
-#if HAVE_KACTIVITIES
- m_activityResourceInstance = new KActivities::ResourceInstance(window()->winId(), url);
- m_activityResourceInstance->setParent(this);
-#endif
}
DolphinViewContainer::~DolphinViewContainer()
m_urlNavigatorConnected->setActive(active);
}
m_view->setActive(active);
-
-#if HAVE_KACTIVITIES
- if (active) {
- m_activityResourceInstance->notifyFocusedIn();
- } else {
- m_activityResourceInstance->notifyFocusedOut();
- }
-#endif
}
bool DolphinViewContainer::isActive() const
}
Q_CHECK_PTR(m_selectionModeTopBar); // there is no point in disabling selectionMode when it wasn't even enabled once.
Q_CHECK_PTR(m_selectionModeBottomBar);
- if (m_selectionModeTopBar->isAncestorOf(QApplication::focusWidget()) || m_selectionModeBottomBar->isAncestorOf(QApplication::focusWidget())) {
- m_view->setFocus();
- }
m_selectionModeTopBar->setVisible(false, WithAnimation);
m_selectionModeBottomBar->setVisible(false, WithAnimation);
Q_EMIT selectionModeChanged(false);
+
+ if (!QApplication::focusWidget() || m_selectionModeTopBar->isAncestorOf(QApplication::focusWidget())
+ || m_selectionModeBottomBar->isAncestorOf(QApplication::focusWidget())) {
+ m_view->setFocus();
+ }
return;
}
bool DolphinViewContainer::isFilterBarVisible() const
{
- return m_filterBar->isVisible();
+ return m_filterBar->isEnabled(); // Gets disabled in AnimatedHeightWidget while animating towards a hidden state.
}
void DolphinViewContainer::setSearchModeEnabled(bool enabled)
{
- m_searchBox->setVisible(enabled);
+ m_searchBox->setVisible(enabled, WithAnimation);
if (enabled) {
const QUrl &locationUrl = m_urlNavigator->locationUrl();
m_urlNavigator->setLocationUrl(newUrl);
}
-#if HAVE_KACTIVITIES
- m_activityResourceInstance->setUri(newUrl);
+#if HAVE_PLASMA_ACTIVITIES
+ KActivities::ResourceInstance::notifyAccessed(newUrl);
#endif
}
Q_ASSERT(m_filterBar);
if (visible) {
m_view->hideToolTip(ToolTipManager::HideBehavior::Instantly);
- m_filterBar->show();
+ m_filterBar->setVisible(true, WithAnimation);
m_filterBar->setFocus();
m_filterBar->selectAll();
} else {
}
KIO::OpenUrlJob *job = new KIO::OpenUrlJob(item.targetUrl(), item.mimetype());
- job->setUiDelegate(KIO::createDefaultJobUiDelegate(KJobUiDelegate::AutoHandlingEnabled, this));
+ // Auto*Warning*Handling, errors are put in a KMessageWidget by us in slotOpenUrlFinished.
+ job->setUiDelegate(KIO::createDefaultJobUiDelegate(KJobUiDelegate::AutoWarningHandlingEnabled, this));
job->setShowOpenOrExecuteDialog(true);
connect(job, &KIO::OpenUrlJob::finished, this, &DolphinViewContainer::slotOpenUrlFinished);
job->start();
{
KService::List services = KApplicationTrader::queryByMimeType(item.mimetype());
- if (services.length() >= 2) {
- auto service = services.at(1);
+ int indexOfAppToOpenFileWith = 1;
+
+ // executable scripts
+ auto mimeType = item.currentMimeType();
+ if (item.isLocalFile() && mimeType.inherits(QStringLiteral("application/x-executable")) && mimeType.inherits(QStringLiteral("text/plain"))
+ && QFileInfo(item.localPath()).isExecutable()) {
+ KConfigGroup cfgGroup(KSharedConfig::openConfig(QStringLiteral("kiorc")), QStringLiteral("Executable scripts"));
+ const QString value = cfgGroup.readEntry("behaviourOnLaunch", "alwaysAsk");
+
+ // in case KIO::WidgetsOpenOrExecuteFileHandler::promptUserOpenOrExecute would not open the file
+ if (value != QLatin1String("open")) {
+ indexOfAppToOpenFileWith = 0;
+ }
+ }
+
+ if (services.length() >= indexOfAppToOpenFileWith + 1) {
+ auto service = services.at(indexOfAppToOpenFileWith);
KIO::ApplicationLauncherJob *job = new KIO::ApplicationLauncherJob(service, this);
job->setUrls({item.url()});
-#if KIO_VERSION >= QT_VERSION_CHECK(5, 98, 0)
job->setUiDelegate(KIO::createDefaultJobUiDelegate(KJobUiDelegate::AutoHandlingEnabled, this));
-#else
- job->setUiDelegate(new KIO::JobUiDelegate(KJobUiDelegate::AutoHandlingEnabled, this));
-#endif
connect(job, &KIO::OpenUrlJob::finished, this, &DolphinViewContainer::slotOpenUrlFinished);
job->start();
}
}
}
+void DolphinViewContainer::updateAdminBarVisibility(const QUrl &url)
+{
+ if (url.scheme() == QStringLiteral("admin")) {
+ if (!m_adminBar) {
+ m_adminBar = new Admin::Bar(this);
+ m_topLayout->addWidget(m_adminBar, positionFor.adminBar, 0);
+ connect(m_adminBar, &Admin::Bar::activated, this, &DolphinViewContainer::activate);
+ }
+ m_adminBar->setVisible(true, WithAnimation);
+ } else if (m_adminBar) {
+ m_adminBar->setVisible(false, WithAnimation);
+ }
+}
+
void DolphinViewContainer::closeFilterBar()
{
m_filterBar->closeFilterBar();
}
if (KProtocolManager::supportsListing(url)) {
- setSearchModeEnabled(isSearchUrl(url));
+ const bool searchBoxInitialized = isSearchModeEnabled() && m_searchBox->text().isEmpty();
+ setSearchModeEnabled(isSearchUrl(url) || searchBoxInitialized);
+
m_view->setUrl(url);
tryRestoreViewState();
- if (m_autoGrabFocus && isActive() && !isSearchUrl(url)) {
+ if (m_autoGrabFocus && isActive() && !isSearchModeEnabled()) {
// When an URL has been entered, the view should get the focus.
// The focus must be requested asynchronously, as changing the URL might create
// a new view widget.
QDesktopServices::openUrl(url);
redirect(QUrl(), m_urlNavigator->locationUrl(1));
} else {
- showMessage(i18nc("@info:status", "Invalid protocol"), Error);
+ if (!url.scheme().isEmpty()) {
+ showMessage(i18nc("@info:status", "Invalid protocol '%1'", url.scheme()), Error);
+ } else {
+ showMessage(i18nc("@info:status", "Invalid protocol"), Error);
+ }
m_urlNavigator->goBack();
}
}
}
}
+void DolphinViewContainer::openSearchBox()
+{
+ setSearchModeEnabled(true);
+}
+
void DolphinViewContainer::closeSearchBox()
{
setSearchModeEnabled(false);