#include "panels/folders/folderspanel.h"
#include "panels/places/placespanel.h"
#include "panels/terminal/terminalpanel.h"
+#include "search/dolphinquery.h"
#include "selectionmode/actiontexthelper.h"
#include "settings/dolphinsettingsdialog.h"
+#include "statusbar/diskspaceusagemenu.h"
#include "statusbar/dolphinstatusbar.h"
#include "views/dolphinnewfilemenuobserver.h"
#include "views/dolphinremoteencoding.h"
#include <KColorSchemeManager>
#include <KConfig>
#include <KConfigGui>
+#include <KDesktopFile>
#include <KDialogJobUiDelegate>
#include <KDualAction>
#include <KFileItemListProperties>
, m_forwardAction(nullptr)
, m_splitViewAction(nullptr)
, m_splitViewMenuAction(nullptr)
+ , m_diskSpaceUsageMenu(nullptr)
, m_sessionSaveTimer(nullptr)
, m_sessionSaveWatcher(nullptr)
, m_sessionSaveScheduled(false)
}
updateAllowedToolbarAreas();
+ updateNavigatorsBackground();
// enable middle-click on back/forward/up to open in a new tab
auto *middleClickEventFilter = new MiddleClickActionEventFilter(this);
updatePasteAction();
updateViewActions();
updateGoActions();
+ m_diskSpaceUsageMenu->setUrl(url);
// will signal used urls to activities manager, too
m_recentFiles->addUrl(url, QString(), "inode/directory");
m_tearDownFromPlacesRequested = false;
}
- m_activeViewContainer->setAutoGrabFocus(false);
+ m_activeViewContainer->setGrabFocusOnUrlChange(false);
changeUrl(url);
- m_activeViewContainer->setAutoGrabFocus(true);
+ m_activeViewContainer->setGrabFocusOnUrlChange(true);
}
void DolphinMainWindow::slotEditableStateChanged(bool editable)
}
if (url.isValid()) {
QString icon;
- if (m_activeViewContainer->isSearchModeEnabled()) {
+ if (isSearchUrl(url)) {
icon = QStringLiteral("folder-saved-search-symbolic");
} else {
icon = KIO::iconNameForUrl(url);
KConfig *config = KConfigGui::sessionConfig();
saveGlobalProperties(config);
savePropertiesInternal(config, 1);
+ KConfigGroup group = config->group(QStringLiteral("Number"));
+ group.writeEntry("NumberOfWindows", 1); // Makes session restore aware that there is a window to restore.
auto future = QtConcurrent::run([config]() {
config->sync();
void DolphinMainWindow::find()
{
- m_activeViewContainer->setSearchModeEnabled(true);
+ m_activeViewContainer->setSearchBarVisible(true);
+ m_activeViewContainer->setFocusToSearchBar();
}
void DolphinMainWindow::updateSearchAction()
{
QAction *toggleSearchAction = actionCollection()->action(QStringLiteral("toggle_search"));
- toggleSearchAction->setChecked(m_activeViewContainer->isSearchModeEnabled());
+ toggleSearchAction->setChecked(m_activeViewContainer->isSearchBarVisible());
}
void DolphinMainWindow::updatePasteAction()
{
const QUrl url = urlNavigator->locationUrl(historyIndex);
- QString text = url.toDisplayString(QUrl::PreferLocalFile);
+ QString text;
- if (!urlNavigator->showFullPath()) {
+ if (isSearchUrl(url)) {
+ text = Search::DolphinQuery(url, QUrl{}).title();
+ } else if (urlNavigator->showFullPath()) {
+ text = url.toDisplayString(QUrl::PreferLocalFile);
+ } else {
const KFilePlacesModel *placesModel = DolphinPlacesModelSingleton::instance().placesModel();
const QModelIndex closestIdx = placesModel->closestItem(url);
menu = new QMenu(this);
hamburgerMenu->setMenu(menu);
hamburgerMenu->hideActionsOf(ac->action(QStringLiteral("basic_actions"))->menu());
- hamburgerMenu->hideActionsOf(ac->action(QStringLiteral("zoom"))->menu());
+ hamburgerMenu->hideActionsOf(qobject_cast<KToolBarPopupAction *>(ac->action(QStringLiteral("zoom")))->popupMenu());
} else {
menu->clear();
}
// The third group contains actions to change what one sees in the view
// and to change the more general UI.
if (!toolBar()->isVisible()
- || (!toolbarActions.contains(ac->action(QStringLiteral("icons"))) && !toolbarActions.contains(ac->action(QStringLiteral("compact")))
- && !toolbarActions.contains(ac->action(QStringLiteral("details"))) && !toolbarActions.contains(ac->action(QStringLiteral("view_mode"))))) {
+ || ((!toolbarActions.contains(ac->action(QStringLiteral("icons"))) && !toolbarActions.contains(ac->action(QStringLiteral("compact")))
+ && !toolbarActions.contains(ac->action(QStringLiteral("details"))) && !toolbarActions.contains(ac->action(QStringLiteral("view_mode"))))
+ && !toolbarActions.contains(ac->action(QStringLiteral("view_settings"))))) {
menu->addAction(ac->action(QStringLiteral("view_mode")));
}
- menu->addAction(ac->action(QStringLiteral("show_hidden_files")));
- menu->addAction(ac->action(QStringLiteral("sort")));
- menu->addAction(ac->action(QStringLiteral("additional_info")));
- if (!GeneralSettings::showStatusBar() || !GeneralSettings::showZoomSlider()) {
- menu->addAction(ac->action(QStringLiteral("zoom")));
+ if (!toolBar()->isVisible() || !toolbarActions.contains(ac->action(QStringLiteral("view_settings")))) {
+ menu->addAction(ac->action(QStringLiteral("show_hidden_files")));
+ menu->addAction(ac->action(QStringLiteral("sort")));
+ menu->addAction(ac->action(QStringLiteral("additional_info")));
+ if (!GeneralSettings::showStatusBar() || !GeneralSettings::showZoomSlider()) {
+ menu->addAction(ac->action(QStringLiteral("zoom")));
+ }
}
menu->addAction(ac->action(QStringLiteral("panels")));
m_activeViewContainer = viewContainer;
if (oldViewContainer) {
- const QAction *toggleSearchAction = actionCollection()->action(QStringLiteral("toggle_search"));
- toggleSearchAction->disconnect(oldViewContainer);
-
// Disconnect all signals between the old view container (container,
// view and url navigator) and main window.
oldViewContainer->disconnect(this);
if (auto secondaryUrlNavigator = navigators->secondaryUrlNavigator()) {
secondaryUrlNavigator->disconnect(this);
}
+ oldViewContainer->disconnect(m_diskSpaceUsageMenu);
// except the requestItemInfo so that on hover the information panel can still be updated
connect(oldViewContainer->view(), &DolphinView::requestItemInfo, this, &DolphinMainWindow::requestItemInfo);
updateViewActions();
updateGoActions();
updateSearchAction();
+ connect(m_diskSpaceUsageMenu,
+ &DiskSpaceUsageMenu::showMessage,
+ viewContainer,
+ [viewContainer](const QString &message, KMessageWidget::MessageType messageType) {
+ viewContainer->showMessage(message, messageType);
+ });
+ connect(m_diskSpaceUsageMenu, &DiskSpaceUsageMenu::showInstallationProgress, viewContainer, &DolphinViewContainer::showProgress);
const QUrl url = viewContainer->url();
Q_EMIT urlChanged(url);
+ Q_EMIT selectionChanged(m_activeViewContainer->view()->selectedItems());
}
void DolphinMainWindow::tabCountChanged(int count)
{
const QVector<DolphinViewContainer *> theViewContainers = viewContainers();
for (DolphinViewContainer *viewContainer : theViewContainers) {
- if (viewContainer && viewContainer->url().toLocalFile().startsWith(mountPath)) {
+ if (!viewContainer) {
+ continue;
+ }
+ const auto viewPath = viewContainer->url().toLocalFile();
+ if (viewPath.startsWith(mountPath + QLatin1String("/")) || viewPath == mountPath) {
viewContainer->setUrl(QUrl::fromLocalFile(QDir::homePath()));
}
}
"<para>This helps you "
"find files and folders by opening a <emphasis>search bar</emphasis>. "
"There you can enter search terms and specify settings to find the "
- "items you are looking for.</para><para>Use this help again on "
- "the search bar so we can have a look at it while the settings are "
- "explained.</para>"));
+ "items you are looking for.</para>"));
// toggle_search acts as a copy of the main searchAction to be used mainly
// in the toolbar, with no default shortcut attached, to avoid messing with
toggleSearchAction->setToolTip(searchAction->toolTip());
toggleSearchAction->setWhatsThis(searchAction->whatsThis());
toggleSearchAction->setCheckable(true);
+ connect(toggleSearchAction, &QAction::triggered, this, [this](bool checked) {
+ if (checked) {
+ find();
+ } else {
+ m_activeViewContainer->setSearchBarVisible(false);
+ }
+ });
QAction *toggleSelectionModeAction = actionCollection()->addAction(QStringLiteral("toggle_selection_mode"));
// i18n: This action toggles a selection mode.
compareFiles->setEnabled(false);
connect(compareFiles, &QAction::triggered, this, &DolphinMainWindow::compareFiles);
+ QAction *manageDiskSpaceUsage = actionCollection()->addAction(QStringLiteral("manage_disk_space"));
+ manageDiskSpaceUsage->setText(i18nc("@action:inmenu Tools", "Manage Disk Space Usage"));
+ manageDiskSpaceUsage->setIcon(QIcon::fromTheme(QStringLiteral("filelight")));
+ m_diskSpaceUsageMenu = new DiskSpaceUsageMenu{this};
+ manageDiskSpaceUsage->setMenu(m_diskSpaceUsageMenu);
+
QAction *openPreferredSearchTool = actionCollection()->addAction(QStringLiteral("open_preferred_search_tool"));
openPreferredSearchTool->setText(i18nc("@action:inmenu Tools", "Open Preferred Search Tool"));
openPreferredSearchTool->setWhatsThis(xi18nc("@info:whatsthis",
connect(openPreferredSearchTool, &QAction::triggered, this, &DolphinMainWindow::openPreferredSearchTool);
if (KAuthorized::authorize(QStringLiteral("shell_access"))) {
+ // Get icon of user default terminal emulator application
+ const KConfigGroup group(KSharedConfig::openConfig(QStringLiteral("kdeglobals"), KConfig::SimpleConfig), QStringLiteral("General"));
+ const QString terminalDesktopFilename = group.readEntry("TerminalService");
+ // Use utilities-terminal icon from theme if readEntry() has failed
+ const QString terminalIcon = terminalDesktopFilename.isEmpty() ? "utilities-terminal" : KDesktopFile(terminalDesktopFilename).readIcon();
+
QAction *openTerminal = actionCollection()->addAction(QStringLiteral("open_terminal"));
openTerminal->setText(i18nc("@action:inmenu Tools", "Open Terminal"));
openTerminal->setWhatsThis(xi18nc("@info:whatsthis",
"<para>This opens a <emphasis>terminal</emphasis> application for the viewed location.</para>"
"<para>To learn more about terminals use the help features in the terminal application.</para>"));
- openTerminal->setIcon(QIcon::fromTheme(QStringLiteral("utilities-terminal")));
+ openTerminal->setIcon(QIcon::fromTheme(terminalIcon));
actionCollection()->setDefaultShortcut(openTerminal, Qt::SHIFT | Qt::Key_F4);
connect(openTerminal, &QAction::triggered, this, &DolphinMainWindow::openTerminal);
openTerminalHere->setWhatsThis(xi18nc("@info:whatsthis",
"<para>This opens <emphasis>terminal</emphasis> applications for the selected items' locations.</para>"
"<para>To learn more about terminals use the help features in the terminal application.</para>"));
- openTerminalHere->setIcon(QIcon::fromTheme(QStringLiteral("utilities-terminal")));
+ openTerminalHere->setIcon(QIcon::fromTheme(terminalIcon));
actionCollection()->setDefaultShortcut(openTerminalHere, Qt::SHIFT | Qt::ALT | Qt::Key_F4);
connect(openTerminalHere, &QAction::triggered, this, &DolphinMainWindow::openTerminalHere);
}
&DolphinMainWindow::toggleShowMenuBar,
Qt::QueuedConnection);
- KToggleAction *showStatusBar = KStandardAction::showStatusbar(nullptr, nullptr, actionCollection());
- showStatusBar->setChecked(GeneralSettings::showStatusBar());
- connect(GeneralSettings::self(), &GeneralSettings::showStatusBarChanged, showStatusBar, &KToggleAction::setChecked);
- connect(showStatusBar, &KToggleAction::triggered, this, [this](bool checked) {
- GeneralSettings::setShowStatusBar(checked);
- refreshViews();
- });
-
KStandardAction::keyBindings(this, &DolphinMainWindow::slotKeyBindings, actionCollection());
KStandardAction::preferences(this, &DolphinMainWindow::editSettings, actionCollection());
QAction *openInSplitViewAction = actionCollection()->addAction(QStringLiteral("open_in_split_view"));
openInSplitViewAction->setText(i18nc("@action:inmenu", "Open in Split View"));
- openInSplitViewAction->setIcon(QIcon::fromTheme(QStringLiteral("view-right-new")));
+ openInSplitViewAction->setIcon(QIcon::fromTheme(QStringLiteral("view-split-left-right")));
connect(openInSplitViewAction, &QAction::triggered, this, [this]() {
openInSplitView(QUrl());
});
connect(container, &DolphinViewContainer::showFilterBarChanged, this, &DolphinMainWindow::updateFilterBarAction);
connect(container, &DolphinViewContainer::writeStateChanged, this, &DolphinMainWindow::slotWriteStateChanged);
slotWriteStateChanged(container->view()->isFolderWritable());
- connect(container, &DolphinViewContainer::searchModeEnabledChanged, this, &DolphinMainWindow::updateSearchAction);
+ connect(container, &DolphinViewContainer::searchBarVisibilityChanged, this, &DolphinMainWindow::updateSearchAction);
connect(container, &DolphinViewContainer::captionChanged, this, &DolphinMainWindow::updateWindowTitle);
connect(container, &DolphinViewContainer::tabRequested, this, &DolphinMainWindow::openNewTab);
connect(container, &DolphinViewContainer::activeTabRequested, this, &DolphinMainWindow::openNewTabAndActivate);
- const QAction *toggleSearchAction = actionCollection()->action(QStringLiteral("toggle_search"));
- connect(toggleSearchAction, &QAction::triggered, container, &DolphinViewContainer::setSearchModeEnabled);
-
// Make the toggled state of the selection mode actions visually follow the selection mode state of the view.
auto toggleSelectionModeAction = actionCollection()->action(QStringLiteral("toggle_selection_mode"));
toggleSelectionModeAction->setChecked(m_activeViewContainer->isSelectionModeEnabled());
m_splitViewAction->setText(i18nc("@action:intoolbar Split view", "Split"));
m_splitViewMenuAction->setText(m_splitViewAction->text());
m_splitViewAction->setToolTip(i18nc("@info", "Split view"));
- m_splitViewAction->setIcon(QIcon::fromTheme(QStringLiteral("view-right-new")));
+ m_splitViewAction->setIcon(QIcon::fromTheme(QStringLiteral("view-split-left-right")));
popoutSplitAction->setText(i18nc("@action:intoolbar Move view in focus to a new window", "Pop out"));
popoutSplitAction->setEnabled(false);
if (m_splitViewAction->menu()) {
}
}
+void DolphinMainWindow::updateNavigatorsBackground()
+{
+ auto navigators = static_cast<DolphinNavigatorsWidgetAction *>(actionCollection()->action(QStringLiteral("url_navigators")));
+ navigators->setBackgroundEnabled(navigators->isInToolbar());
+}
+
bool DolphinMainWindow::isKompareInstalled() const
{
static bool initialized = false;
m_tabWidget->currentTabPage()->insertNavigatorsWidget(navigators);
}
updateAllowedToolbarAreas();
+ updateNavigatorsBackground();
(static_cast<KHamburgerMenu *>(actionCollection()->action(KStandardAction::name(KStandardAction::HamburgerMenu))))->hideActionsOf(toolBar());
}