X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/c035e95e1d74fecd8267b08009c616232e2c16b0..181c33a159e756eca65b60e36803af5614c6a7b4:/src/dolphinmainwindow.cpp diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index d73cc4866..406edd37c 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -96,7 +97,7 @@ namespace const int CurrentDolphinVersion = 202; // The maximum number of entries in the back/forward popup menu const int MaxNumberOfNavigationentries = 12; -// The maximum number of "Activate Tab" shortcuts +// The maximum number of "Go to Tab" shortcuts const int MaxActivateTabShortcuts = 9; } @@ -115,6 +116,8 @@ DolphinMainWindow::DolphinMainWindow() , m_tearDownFromPlacesRequested(false) , m_backAction(nullptr) , m_forwardAction(nullptr) + , m_splitViewAction(nullptr) + , m_splitViewMenuAction(nullptr) , m_sessionSaveTimer(nullptr) , m_sessionSaveWatcher(nullptr) , m_sessionSaveScheduled(false) @@ -131,6 +134,10 @@ DolphinMainWindow::DolphinMainWindow() setStateConfigGroup("State"); +#if defined(Q_OS_WIN) || defined(Q_OS_MACOS) + new KColorSchemeManager(this); // Sets a sensible color scheme which fixes unreadable icons and text on Windows. +#endif + connect(&DolphinNewFileMenuObserver::instance(), &DolphinNewFileMenuObserver::errorMessage, this, &DolphinMainWindow::showErrorMessage); KIO::FileUndoManager *undoManager = KIO::FileUndoManager::self(); @@ -469,7 +476,7 @@ void DolphinMainWindow::openNewWindow(const QUrl &url) void DolphinMainWindow::slotSplitViewChanged() { m_tabWidget->currentTabPage()->setSplitViewEnabled(GeneralSettings::splitView(), WithAnimation); - updateSplitAction(); + updateSplitActions(); } void DolphinMainWindow::openInNewTab() @@ -984,6 +991,16 @@ void DolphinMainWindow::toggleSplitView() updateViewActions(); } +void DolphinMainWindow::popoutSplitView() +{ + DolphinTabPage *tabPage = m_tabWidget->currentTabPage(); + if (!tabPage->splitViewEnabled()) + return; + openNewWindow((GeneralSettings::closeActiveSplitView() ? tabPage->activeViewContainer() : tabPage->inactiveViewContainer())->url()); + tabPage->setSplitViewEnabled(false, WithAnimation); + updateSplitActions(); +} + void DolphinMainWindow::toggleSplitStash() { DolphinTabPage *tabPage = m_tabWidget->currentTabPage(); @@ -1196,8 +1213,9 @@ QPointer DolphinMainWindow::preferredSearchTool() auto *action = new QAction(QIcon::fromTheme(kfind->icon()), kfind->name(), this); - connect(action, &QAction::triggered, this, [kfind] { + connect(action, &QAction::triggered, this, [this, kfind] { auto *job = new KIO::ApplicationLauncherJob(kfind); + job->setUrls({m_activeViewContainer->url()}); job->start(); }); @@ -1627,7 +1645,7 @@ void DolphinMainWindow::setupActions() newWindow->setToolTip(i18nc("@info", "Open a new Dolphin window")); newWindow->setWhatsThis(xi18nc("@info:whatsthis", "This opens a new " - "window just like this one with the current location and view." + "window just like this one with the current location." "You can drag and drop items between windows.")); newWindow->setIcon(QIcon::fromTheme(QStringLiteral("window-new"))); @@ -1636,8 +1654,8 @@ void DolphinMainWindow::setupActions() newTab->setText(i18nc("@action:inmenu File", "New Tab")); newTab->setWhatsThis(xi18nc("@info:whatsthis", "This opens a new " - "Tab with the current location and view." - "A tab is an additional view within this window. " + "Tab with the current location." + "Tabs allow you to quickly switch between multiple locations and views within this window. " "You can drag and drop items between tabs.")); actionCollection()->setDefaultShortcut(newTab, Qt::CTRL | Qt::Key_T); connect(newTab, &QAction::triggered, this, &DolphinMainWindow::openNewActivatedTab); @@ -1652,10 +1670,11 @@ void DolphinMainWindow::setupActions() QAction *closeTab = KStandardAction::close(m_tabWidget, QOverload<>::of(&DolphinTabWidget::closeTab), actionCollection()); closeTab->setText(i18nc("@action:inmenu File", "Close Tab")); + closeTab->setToolTip(i18nc("@info", "Close Tab")); closeTab->setWhatsThis(i18nc("@info:whatsthis", "This closes the " - "currently viewed tab. If no more tabs are left this window " - "will close instead.")); + "currently viewed tab. If no more tabs are left, this closes " + "the whole window instead.")); QAction *quitAction = KStandardAction::quit(this, &DolphinMainWindow::quit, actionCollection()); quitAction->setWhatsThis(i18nc("@info:whatsthis quit", "This closes this window.")); @@ -1706,9 +1725,10 @@ void DolphinMainWindow::setupActions() m_actionTextHelper->registerTextWhenNothingIsSelected(copyToOtherViewAction, i18nc("@action:inmenu", "Copy to Other View…")); copyToOtherViewAction->setWhatsThis(xi18nc("@info:whatsthis Copy", "This copies the selected items from " - "the active view to the inactive split view.")); + "the view in focus to the other view. " + "(Only available while in Split View mode.)")); copyToOtherViewAction->setIcon(QIcon::fromTheme(QStringLiteral("edit-copy"))); - copyToOtherViewAction->setIconText(i18nc("@action:inmenu Edit", "Copy to Inactive Split View")); + copyToOtherViewAction->setIconText(i18nc("@action:inmenu Edit", "Copy to Other View")); actionCollection()->setDefaultShortcut(copyToOtherViewAction, Qt::SHIFT | Qt::Key_F5); connect(copyToOtherViewAction, &QAction::triggered, this, &DolphinMainWindow::copyToInactiveSplitView); @@ -1717,9 +1737,10 @@ void DolphinMainWindow::setupActions() m_actionTextHelper->registerTextWhenNothingIsSelected(moveToOtherViewAction, i18nc("@action:inmenu", "Move to Other View…")); moveToOtherViewAction->setWhatsThis(xi18nc("@info:whatsthis Move", "This moves the selected items from " - "the active view to the inactive split view.")); + "the view in focus to the other view. " + "(Only available while in Split View mode.)")); moveToOtherViewAction->setIcon(QIcon::fromTheme(QStringLiteral("edit-cut"))); - moveToOtherViewAction->setIconText(i18nc("@action:inmenu Edit", "Move to Inactive Split View")); + moveToOtherViewAction->setIconText(i18nc("@action:inmenu Edit", "Move to Other View")); actionCollection()->setDefaultShortcut(moveToOtherViewAction, Qt::SHIFT | Qt::Key_F6); connect(moveToOtherViewAction, &QAction::triggered, this, &DolphinMainWindow::moveToInactiveSplitView); @@ -1729,7 +1750,7 @@ void DolphinMainWindow::setupActions() showFilterBar->setWhatsThis(xi18nc("@info:whatsthis", "This opens the " "Filter Bar at the bottom of the window. " - "There you can enter a text to filter the files and folders currently displayed. " + "There you can enter text to filter the files and folders currently displayed. " "Only those that contain the text in their name will be kept in view.")); showFilterBar->setIcon(QIcon::fromTheme(QStringLiteral("view-filter"))); actionCollection()->setDefaultShortcuts(showFilterBar, {Qt::CTRL | Qt::Key_I, Qt::Key_Slash}); @@ -1752,10 +1773,10 @@ void DolphinMainWindow::setupActions() searchAction->setToolTip(i18nc("@info:tooltip", "Search for files and folders")); searchAction->setWhatsThis(xi18nc("@info:whatsthis find", "This helps you " - "find files and folders by opening a find bar. " + "find files and folders by opening a search bar. " "There you can enter search terms and specify settings to find the " - "objects you are looking for.Use this help again on " - "the find bar so we can have a look at it while the settings are " + "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.")); // toggle_search acts as a copy of the main searchAction to be used mainly @@ -1807,7 +1828,7 @@ void DolphinMainWindow::setupActions() invertSelection->setText(i18nc("@action:inmenu Edit", "Invert Selection")); invertSelection->setWhatsThis(xi18nc("@info:whatsthis invert", "This selects all " - "objects that you have currently not selected instead.")); + "items that you have currently not selected instead.")); invertSelection->setIcon(QIcon::fromTheme(QStringLiteral("edit-select-invert"))); actionCollection()->setDefaultShortcut(invertSelection, Qt::CTRL | Qt::SHIFT | Qt::Key_A); connect(invertSelection, &QAction::triggered, this, &DolphinMainWindow::invertSelection); @@ -1820,14 +1841,30 @@ void DolphinMainWindow::setupActions() // setup 'View' menu // (note that most of it is set up in DolphinViewActionHandler) - QAction *split = actionCollection()->addAction(QStringLiteral("split_view")); - split->setWhatsThis(xi18nc("@info:whatsthis find", - "This splits " - "the folder view below into two autonomous views.This " - "way you can see two locations at once and move items between them " - "quickly.Click this again afterwards to recombine the views.")); - actionCollection()->setDefaultShortcut(split, Qt::Key_F3); - connect(split, &QAction::triggered, this, &DolphinMainWindow::toggleSplitView); + m_splitViewAction = actionCollection()->add(QStringLiteral("split_view")); + m_splitViewMenuAction = actionCollection()->addAction(QStringLiteral("split_view_menu")); + + m_splitViewAction->setWhatsThis(xi18nc("@info:whatsthis split", + "This presents " + "a second view side-by-side with the current view, so you can see " + "the contents of two folders at once and easily move items between " + "them.The view that is not \"in focus\" will be dimmed. " + "Click this button again to close one of the views.")); + m_splitViewMenuAction->setWhatsThis(m_splitViewAction->whatsThis()); + + // only set it for the menu version + actionCollection()->setDefaultShortcut(m_splitViewMenuAction, Qt::Key_F3); + + connect(m_splitViewAction, &QAction::triggered, this, &DolphinMainWindow::toggleSplitView); + connect(m_splitViewMenuAction, &QAction::triggered, this, &DolphinMainWindow::toggleSplitView); + + QAction *popoutSplit = actionCollection()->addAction(QStringLiteral("popout_split_view")); + popoutSplit->setWhatsThis(xi18nc("@info:whatsthis", + "If the view has been split, this will pop the view in focus " + "out into a new window.")); + popoutSplit->setIcon(QIcon::fromTheme(QStringLiteral("window-new"))); + actionCollection()->setDefaultShortcut(popoutSplit, Qt::SHIFT | Qt::Key_F3); + connect(popoutSplit, &QAction::triggered, this, &DolphinMainWindow::popoutSplitView); QAction *stashSplit = actionCollection()->addAction(QStringLiteral("split_stash")); actionCollection()->setDefaultShortcut(stashSplit, Qt::CTRL | Qt::Key_S); @@ -1912,10 +1949,10 @@ void DolphinMainWindow::setupActions() undoAction->setWhatsThis(xi18nc("@info:whatsthis", "This undoes " "the last change you made to files or folders." - "Such changes include creating, renaming " + "Such changes include creating, renaming " "and moving them to a different location " - "or to the Trash. Changes that can't " - "be undone will ask for your confirmation.")); + "or to the Trash. Any changes that cannot be undone " + "will ask for your confirmation beforehand.")); undoAction->setEnabled(false); // undo should be disabled by default { @@ -1941,8 +1978,8 @@ void DolphinMainWindow::setupActions() homeAction->setWhatsThis(xi18nc("@info:whatsthis", "Go to your " "Home folder.Every user account " - "has their own Home that contains their data " - "including folders that contain personal application data.")); + "has their own Home that contains their personal files, " + "as well as hidden folders for their applications' data and configuration files.")); // setup 'Tools' menu QAction *compareFiles = actionCollection()->addAction(QStringLiteral("compare_files")); @@ -1965,7 +2002,7 @@ void DolphinMainWindow::setupActions() 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 in the terminal application.")); + "To learn more about terminals use the help features in the terminal application.")); openTerminal->setIcon(QIcon::fromTheme(QStringLiteral("utilities-terminal"))); actionCollection()->setDefaultShortcut(openTerminal, Qt::SHIFT | Qt::Key_F4); connect(openTerminal, &QAction::triggered, this, &DolphinMainWindow::openTerminal); @@ -1975,7 +2012,7 @@ void DolphinMainWindow::setupActions() openTerminalHere->setText(i18nc("@action:inmenu Tools", "Open Terminal Here")); openTerminalHere->setWhatsThis(xi18nc("@info:whatsthis", "This opens terminal applications for the selected items' locations." - "To learn more about terminals use the help in the terminal application.")); + "To learn more about terminals use the help features in the terminal application.")); openTerminalHere->setIcon(QIcon::fromTheme(QStringLiteral("utilities-terminal"))); actionCollection()->setDefaultShortcut(openTerminalHere, Qt::SHIFT | Qt::ALT | Qt::Key_F4); connect(openTerminalHere, &QAction::triggered, this, &DolphinMainWindow::openTerminalHere); @@ -2001,10 +2038,10 @@ void DolphinMainWindow::setupActions() KToggleAction *showMenuBar = KStandardAction::showMenubar(nullptr, nullptr, actionCollection()); showMenuBar->setWhatsThis(xi18nc("@info:whatsthis", "This switches between having a Menubar " - "and having a %1 button. Both " + "and having an %1 button. Both " "contain mostly the same actions and configuration options." - "The Menubar takes up more space but allows for fast and organised access to all " - "actions an application has to offer.The %1 button " + "The Menubar takes up more space but allows for fast and organized access to all " + "actions an application has to offer.The %1 button " "is simpler and small which makes triggering advanced actions more time consuming.", hamburgerMenuAction->text().replace('&', ""))); connect(showMenuBar, @@ -2033,7 +2070,7 @@ void DolphinMainWindow::setupActions() for (int i = 0; i < MaxActivateTabShortcuts; ++i) { QAction *activateTab = actionCollection()->addAction(QStringLiteral("activate_tab_%1").arg(i)); - activateTab->setText(i18nc("@action:inmenu", "Activate Tab %1", i + 1)); + activateTab->setText(i18nc("@action:inmenu", "Go to Tab %1", i + 1)); activateTab->setEnabled(false); connect(activateTab, &QAction::triggered, this, [this, i]() { m_tabWidget->activateTab(i); @@ -2046,21 +2083,22 @@ void DolphinMainWindow::setupActions() } QAction *activateLastTab = actionCollection()->addAction(QStringLiteral("activate_last_tab")); - activateLastTab->setText(i18nc("@action:inmenu", "Activate Last Tab")); + activateLastTab->setIconText(i18nc("@action:inmenu", "Last Tab")); + activateLastTab->setText(i18nc("@action:inmenu", "Go to Last Tab")); activateLastTab->setEnabled(false); connect(activateLastTab, &QAction::triggered, m_tabWidget, &DolphinTabWidget::activateLastTab); actionCollection()->setDefaultShortcut(activateLastTab, Qt::ALT | Qt::Key_0); QAction *activateNextTab = actionCollection()->addAction(QStringLiteral("activate_next_tab")); activateNextTab->setIconText(i18nc("@action:inmenu", "Next Tab")); - activateNextTab->setText(i18nc("@action:inmenu", "Activate Next Tab")); + activateNextTab->setText(i18nc("@action:inmenu", "Go to Next Tab")); activateNextTab->setEnabled(false); connect(activateNextTab, &QAction::triggered, m_tabWidget, &DolphinTabWidget::activateNextTab); actionCollection()->setDefaultShortcuts(activateNextTab, nextTabKeys); QAction *activatePrevTab = actionCollection()->addAction(QStringLiteral("activate_prev_tab")); activatePrevTab->setIconText(i18nc("@action:inmenu", "Previous Tab")); - activatePrevTab->setText(i18nc("@action:inmenu", "Activate Previous Tab")); + activatePrevTab->setText(i18nc("@action:inmenu", "Go to Previous Tab")); activatePrevTab->setEnabled(false); connect(activatePrevTab, &QAction::triggered, m_tabWidget, &DolphinTabWidget::activatePrevTab); actionCollection()->setDefaultShortcuts(activatePrevTab, prevTabKeys); @@ -2134,6 +2172,7 @@ void DolphinMainWindow::setupDockWidgets() connect(this, &DolphinMainWindow::selectionChanged, infoPanel, &InformationPanel::setSelection); connect(this, &DolphinMainWindow::requestItemInfo, infoPanel, &InformationPanel::requestDelayedItemInfo); connect(this, &DolphinMainWindow::fileItemsChanged, infoPanel, &InformationPanel::slotFilesItemChanged); + connect(this, &DolphinMainWindow::settingsChanged, infoPanel, &InformationPanel::readSettings); #endif // i18n: This is the last paragraph for the "What's This"-texts of all four panels. @@ -2227,7 +2266,7 @@ void DolphinMainWindow::setupDockWidgets() "The location in the terminal will always match the folder " "view so you can navigate using either.The terminal " "panel is not needed for basic computer usage but can be useful " - "for advanced tasks. To learn more about terminals use the help " + "for advanced tasks. To learn more about terminals use the help features " "in a standalone terminal application like Konsole.")); terminalDock->setWhatsThis(xi18nc("@info:whatsthis", "This is " @@ -2235,7 +2274,7 @@ void DolphinMainWindow::setupDockWidgets() "normal terminal but will match the location of the folder view " "so you can navigate using either.The terminal panel " "is not needed for basic computer usage but can be useful for " - "advanced tasks. To learn more about terminals use the help in a " + "advanced tasks. To learn more about terminals use the help features in a " "standalone terminal application like Konsole.") + panelWhatsThis); } @@ -2280,7 +2319,7 @@ void DolphinMainWindow::setupDockWidgets() actionShowAllPlaces->setWhatsThis(i18nc("@info:whatsthis", "This displays " "all places in the places panel that have been hidden. They will " - "appear semi-transparent unless you uncheck their hide property.")); + "appear semi-transparent and allow you to uncheck their \"Hide\" property.")); connect(actionShowAllPlaces, &QAction::triggered, this, [this](bool checked) { m_placesPanel->setShowAll(checked); @@ -2417,7 +2456,7 @@ void DolphinMainWindow::updateViewActions() QAction *toggleFilterBarAction = actionCollection()->action(QStringLiteral("toggle_filter")); toggleFilterBarAction->setChecked(m_activeViewContainer->isFilterBarVisible()); - updateSplitAction(); + updateSplitActions(); } void DolphinMainWindow::updateGoActions() @@ -2446,7 +2485,7 @@ void DolphinMainWindow::refreshViews() updateWindowTitle(); } - updateSplitAction(); + updateSplitActions(); Q_EMIT settingsChanged(); } @@ -2505,25 +2544,56 @@ void DolphinMainWindow::connectViewSignals(DolphinViewContainer *container) connect(navigator, &KUrlNavigator::newWindowRequested, this, &DolphinMainWindow::openNewWindow); } -void DolphinMainWindow::updateSplitAction() +void DolphinMainWindow::updateSplitActions() { - QAction *splitAction = actionCollection()->action(QStringLiteral("split_view")); + QAction *popoutSplitAction = actionCollection()->action(QStringLiteral("popout_split_view")); + + auto setActionPopupMode = [this](KActionMenu *action, QToolButton::ToolButtonPopupMode popupMode) { + action->setPopupMode(popupMode); + if (auto *buttonForAction = qobject_cast(toolBar()->widgetForAction(action))) { + buttonForAction->setPopupMode(popupMode); + } + }; + const DolphinTabPage *tabPage = m_tabWidget->currentTabPage(); if (tabPage->splitViewEnabled()) { if (GeneralSettings::closeActiveSplitView() ? tabPage->primaryViewActive() : !tabPage->primaryViewActive()) { - splitAction->setText(i18nc("@action:intoolbar Close left view", "Close")); - splitAction->setToolTip(i18nc("@info", "Close left view")); - splitAction->setIcon(QIcon::fromTheme(QStringLiteral("view-left-close"))); + m_splitViewAction->setText(i18nc("@action:intoolbar Close left view", "Close")); + m_splitViewAction->setToolTip(i18nc("@info", "Close left view")); + m_splitViewAction->setIcon(QIcon::fromTheme(QStringLiteral("view-left-close"))); + popoutSplitAction->setText(i18nc("@action:intoolbar Move left view to a new window", "Pop out Left View")); + popoutSplitAction->setToolTip(i18nc("@info", "Move left view to a new window")); } else { - splitAction->setText(i18nc("@action:intoolbar Close right view", "Close")); - splitAction->setToolTip(i18nc("@info", "Close right view")); - splitAction->setIcon(QIcon::fromTheme(QStringLiteral("view-right-close"))); + m_splitViewAction->setText(i18nc("@action:intoolbar Close right view", "Close")); + m_splitViewAction->setToolTip(i18nc("@info", "Close right view")); + m_splitViewAction->setIcon(QIcon::fromTheme(QStringLiteral("view-right-close"))); + popoutSplitAction->setText(i18nc("@action:intoolbar Move right view to a new window", "Pop out Right View")); + popoutSplitAction->setToolTip(i18nc("@info", "Move right view to a new window")); + } + popoutSplitAction->setEnabled(true); + if (!m_splitViewAction->menu()) { + setActionPopupMode(m_splitViewAction, QToolButton::MenuButtonPopup); + m_splitViewAction->setMenu(new QMenu); + m_splitViewAction->addAction(popoutSplitAction); } } else { - splitAction->setText(i18nc("@action:intoolbar Split view", "Split")); - splitAction->setToolTip(i18nc("@info", "Split view")); - splitAction->setIcon(QIcon::fromTheme(QStringLiteral("view-right-new"))); + m_splitViewAction->setText(i18nc("@action:intoolbar Split view", "Split")); + m_splitViewAction->setToolTip(i18nc("@info", "Split view")); + m_splitViewAction->setIcon(QIcon::fromTheme(QStringLiteral("view-right-new"))); + popoutSplitAction->setText(i18nc("@action:intoolbar Move view in focus to a new window", "Pop out")); + popoutSplitAction->setEnabled(false); + if (m_splitViewAction->menu()) { + m_splitViewAction->removeAction(popoutSplitAction); + m_splitViewAction->menu()->deleteLater(); + m_splitViewAction->setMenu(nullptr); + setActionPopupMode(m_splitViewAction, QToolButton::DelayedPopup); + } } + + // Update state from toolbar action + m_splitViewMenuAction->setText(m_splitViewAction->text()); + m_splitViewMenuAction->setToolTip(m_splitViewAction->toolTip()); + m_splitViewMenuAction->setIcon(m_splitViewAction->icon()); } void DolphinMainWindow::updateAllowedToolbarAreas() @@ -2560,8 +2630,6 @@ void DolphinMainWindow::createPanelAction(const QIcon &icon, const QKeySequence QAction *panelAction = actionCollection()->addAction(actionName, dockAction); actionCollection()->setDefaultShortcut(panelAction, shortcut); - - connect(panelAction, &QAction::toggled, dockWidget, &QWidget::setVisible); } // clang-format off void DolphinMainWindow::setupWhatsThis()