X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/c50aeb0f2e571e1945c427a1f8ffbfdcdba88b43..fc9e06426746b5b33d31db68904d4d205537a080:/src/dolphinmainwindow.cpp diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index c8538bce4..78560d820 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -26,8 +26,10 @@ #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" @@ -41,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -124,6 +127,7 @@ DolphinMainWindow::DolphinMainWindow() , m_forwardAction(nullptr) , m_splitViewAction(nullptr) , m_splitViewMenuAction(nullptr) + , m_diskSpaceUsageMenu(nullptr) , m_sessionSaveTimer(nullptr) , m_sessionSaveWatcher(nullptr) , m_sessionSaveScheduled(false) @@ -234,6 +238,7 @@ DolphinMainWindow::DolphinMainWindow() } updateAllowedToolbarAreas(); + updateNavigatorsBackground(); // enable middle-click on back/forward/up to open in a new tab auto *middleClickEventFilter = new MiddleClickActionEventFilter(this); @@ -389,6 +394,7 @@ void DolphinMainWindow::changeUrl(const QUrl &url) updatePasteAction(); updateViewActions(); updateGoActions(); + m_diskSpaceUsageMenu->setUrl(url); // will signal used urls to activities manager, too m_recentFiles->addUrl(url, QString(), "inode/directory"); @@ -403,9 +409,9 @@ void DolphinMainWindow::slotTerminalDirectoryChanged(const QUrl &url) 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) @@ -486,7 +492,7 @@ void DolphinMainWindow::addToPlaces() } if (url.isValid()) { QString icon; - if (m_activeViewContainer->isSearchModeEnabled()) { + if (isSearchUrl(url)) { icon = QStringLiteral("folder-saved-search-symbolic"); } else { icon = KIO::iconNameForUrl(url); @@ -757,6 +763,8 @@ void DolphinMainWindow::slotSaveSession() 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(); @@ -891,13 +899,14 @@ void DolphinMainWindow::paste() 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() @@ -934,9 +943,13 @@ QAction *DolphinMainWindow::urlNavigatorHistoryAction(const KUrlNavigator *urlNa { 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); @@ -1498,7 +1511,7 @@ void DolphinMainWindow::updateHamburgerMenu() 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(ac->action(QStringLiteral("zoom")))->popupMenu()); } else { menu->clear(); } @@ -1549,15 +1562,18 @@ void DolphinMainWindow::updateHamburgerMenu() // 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"))); @@ -1603,9 +1619,6 @@ void DolphinMainWindow::activeViewChanged(DolphinViewContainer *viewContainer) 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); @@ -1616,6 +1629,7 @@ void DolphinMainWindow::activeViewChanged(DolphinViewContainer *viewContainer) 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); @@ -1637,6 +1651,13 @@ void DolphinMainWindow::activeViewChanged(DolphinViewContainer *viewContainer) 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); @@ -1705,7 +1726,11 @@ void DolphinMainWindow::setViewsToHomeIfMountPathOpen(const QString &mountPath) { const QVector 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())); } } @@ -1860,9 +1885,7 @@ void DolphinMainWindow::setupActions() "This helps you " "find files and folders by opening a search bar. " "There you can enter search terms and specify settings to find the " - "items you are looking for.Use this help again on " - "the search bar so we can have a look at it while the settings are " - "explained.")); + "items you are looking for.")); // 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 @@ -1874,6 +1897,13 @@ void DolphinMainWindow::setupActions() 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. @@ -2075,6 +2105,12 @@ void DolphinMainWindow::setupActions() 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", @@ -2085,12 +2121,18 @@ void DolphinMainWindow::setupActions() 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", "This opens a terminal application for the viewed location." "To learn more about terminals use the help features in the terminal application.")); - 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); @@ -2100,7 +2142,7 @@ void DolphinMainWindow::setupActions() openTerminalHere->setWhatsThis(xi18nc("@info:whatsthis", "This opens terminal applications for the selected items' locations." "To learn more about terminals use the help features in the terminal application.")); - 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); } @@ -2129,14 +2171,6 @@ void DolphinMainWindow::setupActions() &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()); @@ -2206,7 +2240,7 @@ void DolphinMainWindow::setupActions() 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()); }); @@ -2642,14 +2676,11 @@ void DolphinMainWindow::connectViewSignals(DolphinViewContainer *container) 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()); @@ -2727,7 +2758,7 @@ void DolphinMainWindow::updateSplitActions() 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()) { @@ -2756,6 +2787,12 @@ void DolphinMainWindow::updateAllowedToolbarAreas() } } +void DolphinMainWindow::updateNavigatorsBackground() +{ + auto navigators = static_cast(actionCollection()->action(QStringLiteral("url_navigators"))); + navigators->setBackgroundEnabled(navigators->isInToolbar()); +} + bool DolphinMainWindow::isKompareInstalled() const { static bool initialized = false; @@ -2942,6 +2979,7 @@ void DolphinMainWindow::saveNewToolbarConfig() m_tabWidget->currentTabPage()->insertNavigatorsWidget(navigators); } updateAllowedToolbarAreas(); + updateNavigatorsBackground(); (static_cast(actionCollection()->action(KStandardAction::name(KStandardAction::HamburgerMenu))))->hideActionsOf(toolBar()); }