X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/41253c0c81bafb54a0b6c82e5282e3add85e8a50..3bfdf0d2:/src/dolphinmainwindow.cpp?ds=sidebyside diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 5bca8d06f..ff834700b 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -29,6 +29,7 @@ #include "dolphintabwidget.h" #include "dolphinviewcontainer.h" #include "dolphintabpage.h" +#include "middleclickactioneventfilter.h" #include "panels/folders/folderspanel.h" #include "panels/places/placespanel.h" #include "panels/information/informationpanel.h" @@ -51,12 +52,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -97,6 +100,8 @@ DolphinMainWindow::DolphinMainWindow() : m_updateToolBarTimer(0), m_lastHandleUrlStatJob(0) { + Q_INIT_RESOURCE(dolphin); + setObjectName(QStringLiteral("Dolphin#")); connect(&DolphinNewFileMenuObserver::instance(), &DolphinNewFileMenuObserver::errorMessage, @@ -123,6 +128,7 @@ DolphinMainWindow::DolphinMainWindow() : setAcceptDrops(true); m_tabWidget = new DolphinTabWidget(this); + m_tabWidget->setObjectName("tabWidget"); connect(m_tabWidget, &DolphinTabWidget::activeViewChanged, this, &DolphinMainWindow::activeViewChanged); connect(m_tabWidget, &DolphinTabWidget::tabCountChanged, @@ -165,6 +171,11 @@ DolphinMainWindow::DolphinMainWindow() : if (!showMenu) { createControlButton(); } + + // enable middle-click on back/forward/up to open in a new tab + auto *middleClickEventFilter = new MiddleClickActionEventFilter(this); + connect(middleClickEventFilter, &MiddleClickActionEventFilter::actionMiddleClicked, this, &DolphinMainWindow::slotToolBarActionMiddleClicked); + toolBar()->installEventFilter(middleClickEventFilter); } DolphinMainWindow::~DolphinMainWindow() @@ -289,7 +300,7 @@ void DolphinMainWindow::updateFilterBarAction(bool show) void DolphinMainWindow::openNewMainWindow() { - KRun::run(QStringLiteral("dolphin %u"), QList(), this); + Dolphin::openNewWindow({m_activeViewContainer->url()}, this); } void DolphinMainWindow::openNewActivatedTab() @@ -305,16 +316,21 @@ void DolphinMainWindow::openNewTab(const QUrl& url) void DolphinMainWindow::openInNewTab() { const KFileItemList& list = m_activeViewContainer->view()->selectedItems(); - if (list.isEmpty()) { - openNewTab(m_activeViewContainer->url()); - } else { - foreach (const KFileItem& item, list) { - const QUrl& url = DolphinView::openItemAsFolderUrl(item); - if (!url.isEmpty()) { - openNewTab(url); - } + bool tabCreated = false; + + foreach (const KFileItem& item, list) { + const QUrl& url = DolphinView::openItemAsFolderUrl(item); + if (!url.isEmpty()) { + openNewTab(url); + tabCreated = true; } } + + // if no new tab has been created from the selection + // open the current directory in a new tab + if (!tabCreated) { + openNewTab(m_activeViewContainer->url()); + } } void DolphinMainWindow::openInNewWindow() @@ -330,7 +346,7 @@ void DolphinMainWindow::openInNewWindow() } if (!newWindowUrl.isEmpty()) { - KRun::run(QStringLiteral("dolphin %u"), {newWindowUrl}, this); + Dolphin::openNewWindow({newWindowUrl}, this); } } @@ -491,6 +507,19 @@ void DolphinMainWindow::slotDirectoryLoadingCompleted() updatePasteAction(); } +void DolphinMainWindow::slotToolBarActionMiddleClicked(QAction *action) +{ + if (action == actionCollection()->action(QStringLiteral("go_back"))) { + goBackInNewTab(); + } else if (action == actionCollection()->action(QStringLiteral("go_forward"))) { + goForwardInNewTab(); + } else if (action == actionCollection()->action(QStringLiteral("go_up"))) { + goUpInNewTab(); + } else if (action == actionCollection()->action(QStringLiteral("go_home"))) { + goHomeInNewTab(); + } +} + void DolphinMainWindow::selectAll() { clearStatusBar(); @@ -523,6 +552,13 @@ void DolphinMainWindow::toggleSplitView() updateViewActions(); } +void DolphinMainWindow::toggleSplitStash() +{ + DolphinTabPage* tabPage = m_tabWidget->currentTabPage(); + tabPage->setSplitViewEnabled(false); + tabPage->setSplitViewEnabled(true, QUrl("stash:/")); +} + void DolphinMainWindow::reloadView() { clearStatusBar(); @@ -609,40 +645,29 @@ void DolphinMainWindow::goHome() m_activeViewContainer->urlNavigator()->goHome(); } -void DolphinMainWindow::goBack(Qt::MouseButtons buttons) +void DolphinMainWindow::goBackInNewTab() { - // The default case (left button pressed) is handled in goBack(). - if (buttons == Qt::MiddleButton) { - KUrlNavigator* urlNavigator = activeViewContainer()->urlNavigator(); - const int index = urlNavigator->historyIndex() + 1; - openNewTab(urlNavigator->locationUrl(index)); - } + KUrlNavigator* urlNavigator = activeViewContainer()->urlNavigator(); + const int index = urlNavigator->historyIndex() + 1; + openNewTab(urlNavigator->locationUrl(index)); } -void DolphinMainWindow::goForward(Qt::MouseButtons buttons) +void DolphinMainWindow::goForwardInNewTab() { - // The default case (left button pressed) is handled in goForward(). - if (buttons == Qt::MiddleButton) { - KUrlNavigator* urlNavigator = activeViewContainer()->urlNavigator(); - const int index = urlNavigator->historyIndex() - 1; - openNewTab(urlNavigator->locationUrl(index)); - } + KUrlNavigator* urlNavigator = activeViewContainer()->urlNavigator(); + const int index = urlNavigator->historyIndex() - 1; + openNewTab(urlNavigator->locationUrl(index)); } -void DolphinMainWindow::goUp(Qt::MouseButtons buttons) +void DolphinMainWindow::goUpInNewTab() { - // The default case (left button pressed) is handled in goUp(). - if (buttons == Qt::MiddleButton) { - openNewTab(KIO::upUrl(activeViewContainer()->url())); - } + const QUrl currentUrl = activeViewContainer()->urlNavigator()->locationUrl(); + openNewTab(KIO::upUrl(currentUrl)); } -void DolphinMainWindow::goHome(Qt::MouseButtons buttons) +void DolphinMainWindow::goHomeInNewTab() { - // The default case (left button pressed) is handled in goHome(). - if (buttons == Qt::MiddleButton) { - openNewTab(Dolphin::homeUrl()); - } + openNewTab(Dolphin::homeUrl()); } void DolphinMainWindow::compareFiles() @@ -764,11 +789,9 @@ void DolphinMainWindow::openContextMenu(const QPoint& pos, changeUrl(KIO::upUrl(item.url())); break; - case DolphinContextMenu::OpenParentFolderInNewWindow: { - - KRun::run(QStringLiteral("dolphin %u"), {KIO::upUrl(item.url())}, this); + case DolphinContextMenu::OpenParentFolderInNewWindow: + Dolphin::openNewWindow({KIO::upUrl(item.url())}, this); break; - } case DolphinContextMenu::OpenParentFolderInNewTab: openNewTab(KIO::upUrl(item.url())); @@ -862,19 +885,8 @@ void DolphinMainWindow::updateControlMenu() addActionToMenu(ac->action(KStandardAction::name(KStandardAction::Preferences)), menu); // Add "Help" menu - QMenu* helpMenu = new QMenu(i18nc("@action:inmenu", "Help"), menu); - helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::HelpContents))); - helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::WhatsThis))); - helpMenu->addSeparator(); - helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::ReportBug))); - helpMenu->addSeparator(); - helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::Donate))); - helpMenu->addSeparator(); - helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::SwitchApplicationLanguage))); - helpMenu->addSeparator(); - helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::AboutApp))); - helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::AboutKDE))); - menu->addMenu(helpMenu); + auto helpMenu = new KHelpMenu(menu); + menu->addMenu(helpMenu->menu()); menu->addSeparator(); addActionToMenu(ac->action(KStandardAction::name(KStandardAction::ShowMenubar)), menu); @@ -1002,27 +1014,23 @@ void DolphinMainWindow::setupActions() closeTab->setEnabled(false); connect(closeTab, &QAction::triggered, m_tabWidget, static_cast(&DolphinTabWidget::closeTab)); - KStandardAction::quit(this, SLOT(quit()), actionCollection()); + KStandardAction::quit(this, &DolphinMainWindow::quit, actionCollection()); // setup 'Edit' menu KStandardAction::undo(this, - SLOT(undo()), + &DolphinMainWindow::undo, actionCollection()); - // need to remove shift+del from cut action, else the shortcut for deletejob - // doesn't work - QAction* cut = KStandardAction::cut(this, SLOT(cut()), actionCollection()); - auto cutShortcuts = cut->shortcuts(); - cutShortcuts.removeAll(QKeySequence(Qt::SHIFT | Qt::Key_Delete)); - actionCollection()->setDefaultShortcuts(cut, cutShortcuts); - KStandardAction::copy(this, SLOT(copy()), actionCollection()); - QAction* paste = KStandardAction::paste(this, SLOT(paste()), actionCollection()); + + KStandardAction::cut(this, &DolphinMainWindow::cut, actionCollection()); + KStandardAction::copy(this, &DolphinMainWindow::copy, actionCollection()); + QAction* paste = KStandardAction::paste(this, &DolphinMainWindow::paste, actionCollection()); // The text of the paste-action is modified dynamically by Dolphin // (e. g. to "Paste One Folder"). To prevent that the size of the toolbar changes // due to the long text, the text "Paste" is used: paste->setIconText(i18nc("@action:inmenu Edit", "Paste")); - KStandardAction::find(this, SLOT(find()), actionCollection()); + KStandardAction::find(this, &DolphinMainWindow::find, actionCollection()); QAction* selectAll = actionCollection()->addAction(QStringLiteral("select_all")); selectAll->setText(i18nc("@action:inmenu Edit", "Select All")); @@ -1041,6 +1049,15 @@ void DolphinMainWindow::setupActions() actionCollection()->setDefaultShortcut(split, Qt::Key_F3); connect(split, &QAction::triggered, this, &DolphinMainWindow::toggleSplitView); + QAction* stashSplit = actionCollection()->addAction(QStringLiteral("split_stash")); + actionCollection()->setDefaultShortcut(stashSplit, Qt::CTRL | Qt::Key_S); + stashSplit->setText(i18nc("@action:intoolbar Stash", "Stash")); + stashSplit->setToolTip(i18nc("@info", "Opens the stash virtual directory in a split window")); + stashSplit->setIcon(QIcon::fromTheme(QStringLiteral("folder-visiting"))); + stashSplit->setCheckable(false); + stashSplit->setVisible(KProtocolInfo::isKnownProtocol("stash")); + connect(stashSplit, &QAction::triggered, this, &DolphinMainWindow::toggleSplitStash); + QAction* reload = actionCollection()->addAction(QStringLiteral("reload")); reload->setText(i18nc("@action:inmenu View", "Reload")); actionCollection()->setDefaultShortcut(reload, Qt::Key_F5); @@ -1064,7 +1081,7 @@ void DolphinMainWindow::setupActions() connect(replaceLocation, &QAction::triggered, this, &DolphinMainWindow::replaceLocation); // setup 'Go' menu - QAction* backAction = KStandardAction::back(this, SLOT(goBack()), actionCollection()); + QAction* backAction = KStandardAction::back(this, &DolphinMainWindow::goBack, actionCollection()); auto backShortcuts = backAction->shortcuts(); backShortcuts.append(QKeySequence(Qt::Key_Backspace)); actionCollection()->setDefaultShortcuts(backAction, backShortcuts); @@ -1088,9 +1105,9 @@ void DolphinMainWindow::setupActions() auto undoAction = actionCollection()->action(KStandardAction::name(KStandardAction::Undo)); undoAction->setEnabled(false); // undo should be disabled by default - KStandardAction::forward(this, SLOT(goForward()), actionCollection()); - KStandardAction::up(this, SLOT(goUp()), actionCollection()); - KStandardAction::home(this, SLOT(goHome()), actionCollection()); + KStandardAction::forward(this, &DolphinMainWindow::goForward, actionCollection()); + KStandardAction::up(this, &DolphinMainWindow::goUp, actionCollection()); + KStandardAction::home(this, &DolphinMainWindow::goHome, actionCollection()); // setup 'Tools' menu QAction* showFilterBar = actionCollection()->addAction(QStringLiteral("show_filter_bar")); @@ -1299,9 +1316,9 @@ void DolphinMainWindow::updateEditActions() stateChanged(QStringLiteral("has_selection")); KActionCollection* col = actionCollection(); - QAction* renameAction = col->action(QStringLiteral("rename")); - QAction* moveToTrashAction = col->action(QStringLiteral("move_to_trash")); - QAction* deleteAction = col->action(QStringLiteral("delete")); + QAction* renameAction = col->action(KStandardAction::name(KStandardAction::RenameFile)); + QAction* moveToTrashAction = col->action(KStandardAction::name(KStandardAction::MoveToTrash)); + QAction* deleteAction = col->action(KStandardAction::name(KStandardAction::DeleteFile)); QAction* cutAction = col->action(KStandardAction::name(KStandardAction::Cut)); QAction* deleteWithTrashShortcut = col->action(QStringLiteral("delete_shortcut")); // see DolphinViewActionHandler @@ -1442,6 +1459,8 @@ void DolphinMainWindow::connectViewSignals(DolphinViewContainer* container) this, static_cast(&DolphinMainWindow::goBack)); connect(view, &DolphinView::goForwardRequested, this, static_cast(&DolphinMainWindow::goForward)); + connect(view, &DolphinView::urlActivated, + this, &DolphinMainWindow::handleUrl); const KUrlNavigator* navigator = container->urlNavigator(); connect(navigator, &KUrlNavigator::urlChanged,