Advertisement
shortstheory

mainwindow with toggle

Mar 25th, 2016
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /***************************************************************************
  2.  *   Copyright (C) 2006 by Peter Penz <peter.penz19@gmail.com>             *
  3.  *   Copyright (C) 2006 by Stefan Monov <logixoul@gmail.com>               *
  4.  *   Copyright (C) 2006 by Cvetoslav Ludmiloff <ludmiloff@gmail.com>       *
  5.  *                                                                         *
  6.  *   This program is free software; you can redistribute it and/or modify  *
  7.  *   it under the terms of the GNU General Public License as published by  *
  8.  *   the Free Software Foundation; either version 2 of the License, or     *
  9.  *   (at your option) any later version.                                   *
  10.  *                                                                         *
  11.  *   This program is distributed in the hope that it will be useful,       *
  12.  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
  13.  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
  14.  *   GNU General Public License for more details.                          *
  15.  *                                                                         *
  16.  *   You should have received a copy of the GNU General Public License     *
  17.  *   along with this program; if not, write to the                         *
  18.  *   Free Software Foundation, Inc.,                                       *
  19.  *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
  20.  ***************************************************************************/
  21.  
  22. #include "dolphinmainwindow.h"
  23.  
  24. #include "dolphindockwidget.h"
  25. #include "dolphincontextmenu.h"
  26. #include "dolphinnewfilemenu.h"
  27. #include "dolphinrecenttabsmenu.h"
  28. #include "dolphintabwidget.h"
  29. #include "dolphinviewcontainer.h"
  30. #include "dolphintabpage.h"
  31. #include "panels/folders/folderspanel.h"
  32. #include "panels/places/placespanel.h"
  33. #include "panels/information/informationpanel.h"
  34. #include "settings/dolphinsettingsdialog.h"
  35. #include "statusbar/dolphinstatusbar.h"
  36. #include "views/dolphinviewactionhandler.h"
  37. #include "views/dolphinremoteencoding.h"
  38. #include "views/draganddrophelper.h"
  39. #include "views/viewproperties.h"
  40. #include "views/dolphinnewfilemenuobserver.h"
  41.  
  42. #ifndef Q_OS_WIN
  43. #include "panels/terminal/terminalpanel.h"
  44. #endif
  45.  
  46. #include "dolphin_generalsettings.h"
  47.  
  48. #include <KActionCollection>
  49. #include <KActionMenu>
  50. #include <KConfig>
  51. #include <kdualaction.h>
  52. #include <KJobWidgets>
  53. #include <QLineEdit>
  54. #include <KToolBar>
  55. #include <KIO/JobUiDelegate>
  56. #include <KLocalizedString>
  57. #include <KProtocolManager>
  58. #include <QMenu>
  59. #include <KMessageBox>
  60. #include <KFileItemListProperties>
  61. #include <KRun>
  62. #include <KShell>
  63. #include <KStandardAction>
  64. #include <KToggleAction>
  65. #include <KUrlNavigator>
  66. #include <KToolInvocation>
  67. #include <KUrlComboBox>
  68.  
  69. #include <QApplication>
  70. #include <QMenuBar>
  71. #include <QClipboard>
  72. #include <QToolButton>
  73. #include <QTimer>
  74. #include <QStandardPaths>
  75. #include <QPushButton>
  76. #include <QCloseEvent>
  77. #include <QShowEvent>
  78. #include <QDialog>
  79.  
  80. namespace {
  81.     // Used for GeneralSettings::version() to determine whether
  82.     // an updated version of Dolphin is running.
  83.     const int CurrentDolphinVersion = 200;
  84. };
  85.  
  86. DolphinMainWindow::DolphinMainWindow() :
  87.     KXmlGuiWindow(0),
  88.     m_newFileMenu(0),
  89.     m_tabWidget(0),
  90.     m_activeViewContainer(0),
  91.     m_actionHandler(0),
  92.     m_remoteEncoding(0),
  93.     m_settingsDialog(),
  94.     m_controlButton(0),
  95.     m_updateToolBarTimer(0),
  96.     m_lastHandleUrlStatJob(0)
  97. {
  98.     setObjectName("Dolphin#");
  99.  
  100.     connect(&DolphinNewFileMenuObserver::instance(), &DolphinNewFileMenuObserver::errorMessage,
  101.             this, &DolphinMainWindow::showErrorMessage);
  102.  
  103.     KIO::FileUndoManager* undoManager = KIO::FileUndoManager::self();
  104.     undoManager->setUiInterface(new UndoUiInterface());
  105.  
  106.     connect(undoManager, static_cast<void(KIO::FileUndoManager::*)(bool)>(&KIO::FileUndoManager::undoAvailable),
  107.             this, &DolphinMainWindow::slotUndoAvailable);
  108.     connect(undoManager, &KIO::FileUndoManager::undoTextChanged,
  109.             this, &DolphinMainWindow::slotUndoTextChanged);
  110.     connect(undoManager, &KIO::FileUndoManager::jobRecordingStarted,
  111.             this, &DolphinMainWindow::clearStatusBar);
  112.     connect(undoManager, &KIO::FileUndoManager::jobRecordingFinished,
  113.             this, &DolphinMainWindow::showCommand);
  114.  
  115.     GeneralSettings* generalSettings = GeneralSettings::self();
  116.     const bool firstRun = (generalSettings->version() < 200);
  117.     if (firstRun) {
  118.         generalSettings->setViewPropsTimestamp(QDateTime::currentDateTime());
  119.     }
  120.  
  121.     setAcceptDrops(true);
  122.  
  123.     m_tabWidget = new DolphinTabWidget(this);
  124.     connect(m_tabWidget, SIGNAL(activeViewChanged(DolphinViewContainer*)),
  125.             this, SLOT(activeViewChanged(DolphinViewContainer*)));
  126.     connect(m_tabWidget, SIGNAL(tabCountChanged(int)),
  127.             this, SLOT(tabCountChanged(int)));
  128.     connect(m_tabWidget, SIGNAL(currentUrlChanged(QUrl)),
  129.             this, SLOT(setUrlAsCaption(QUrl)));
  130.     setCentralWidget(m_tabWidget);
  131.  
  132.     setupActions();
  133.  
  134.     m_actionHandler = new DolphinViewActionHandler(actionCollection(), this);
  135.     connect(m_actionHandler, &DolphinViewActionHandler::actionBeingHandled, this, &DolphinMainWindow::clearStatusBar);
  136.     connect(m_actionHandler, &DolphinViewActionHandler::createDirectory, this, &DolphinMainWindow::createDirectory);
  137.  
  138.     m_remoteEncoding = new DolphinRemoteEncoding(this, m_actionHandler);
  139.     connect(this, &DolphinMainWindow::urlChanged,
  140.             m_remoteEncoding, &DolphinRemoteEncoding::slotAboutToOpenUrl);
  141.  
  142.     setupDockWidgets();
  143.  
  144.     setupGUI(Keys | Save | Create | ToolBar);
  145.     stateChanged("new_file");
  146.  
  147.     QClipboard* clipboard = QApplication::clipboard();
  148.     connect(clipboard, &QClipboard::dataChanged,
  149.             this, &DolphinMainWindow::updatePasteAction);
  150.  
  151.     QAction* showFilterBarAction = actionCollection()->action("show_filter_bar");
  152.     showFilterBarAction->setChecked(generalSettings->filterBar());
  153.  
  154.     if (firstRun) {
  155.         menuBar()->setVisible(false);
  156.         // Assure a proper default size if Dolphin runs the first time
  157.         resize(750, 500);
  158.     }
  159.  
  160.     const bool showMenu = !menuBar()->isHidden();
  161.     QAction* showMenuBarAction = actionCollection()->action(KStandardAction::name(KStandardAction::ShowMenubar));
  162.     showMenuBarAction->setChecked(showMenu);  // workaround for bug #171080
  163.     if (!showMenu) {
  164.         createControlButton();
  165.     }
  166. }
  167.  
  168. DolphinMainWindow::~DolphinMainWindow()
  169. {
  170. }
  171.  
  172. void DolphinMainWindow::openDirectories(const QList<QUrl>& dirs, bool splitView)
  173. {
  174.     m_tabWidget->openDirectories(dirs, splitView);
  175. }
  176.  
  177. void DolphinMainWindow::openFiles(const QList<QUrl>& files, bool splitView)
  178. {
  179.     m_tabWidget->openFiles(files, splitView);
  180. }
  181.  
  182. void DolphinMainWindow::showCommand(CommandType command)
  183. {
  184.     DolphinStatusBar* statusBar = m_activeViewContainer->statusBar();
  185.     switch (command) {
  186.     case KIO::FileUndoManager::Copy:
  187.         statusBar->setText(i18nc("@info:status", "Successfully copied."));
  188.         break;
  189.     case KIO::FileUndoManager::Move:
  190.         statusBar->setText(i18nc("@info:status", "Successfully moved."));
  191.         break;
  192.     case KIO::FileUndoManager::Link:
  193.         statusBar->setText(i18nc("@info:status", "Successfully linked."));
  194.         break;
  195.     case KIO::FileUndoManager::Trash:
  196.         statusBar->setText(i18nc("@info:status", "Successfully moved to trash."));
  197.         break;
  198.     case KIO::FileUndoManager::Rename:
  199.         statusBar->setText(i18nc("@info:status", "Successfully renamed."));
  200.         break;
  201.  
  202.     case KIO::FileUndoManager::Mkdir:
  203.         statusBar->setText(i18nc("@info:status", "Created folder."));
  204.         break;
  205.  
  206.     default:
  207.         break;
  208.     }
  209. }
  210.  
  211. void DolphinMainWindow::pasteIntoFolder()
  212. {
  213.     m_activeViewContainer->view()->pasteIntoFolder();
  214. }
  215.  
  216. void DolphinMainWindow::changeUrl(const QUrl &url)
  217. {
  218.     if (!KProtocolManager::supportsListing(url)) {
  219.         // The URL navigator only checks for validity, not
  220.         // if the URL can be listed. An error message is
  221.         // shown due to DolphinViewContainer::restoreView().
  222.         return;
  223.     }
  224.  
  225.     m_activeViewContainer->setUrl(url);
  226.     updateEditActions();
  227.     updatePasteAction();
  228.     updateViewActions();
  229.     updateGoActions();
  230.  
  231.     emit urlChanged(url);
  232. }
  233.  
  234. void DolphinMainWindow::slotTerminalDirectoryChanged(const QUrl& url)
  235. {
  236.     m_activeViewContainer->setAutoGrabFocus(false);
  237.     changeUrl(url);
  238.     m_activeViewContainer->setAutoGrabFocus(true);
  239. }
  240.  
  241. void DolphinMainWindow::slotEditableStateChanged(bool editable)
  242. {
  243.     KToggleAction* editableLocationAction =
  244.         static_cast<KToggleAction*>(actionCollection()->action("editable_location"));
  245.     editableLocationAction->setChecked(editable);
  246. }
  247.  
  248. void DolphinMainWindow::slotSelectionChanged(const KFileItemList& selection)
  249. {
  250.     updateEditActions();
  251.  
  252.     const int selectedUrlsCount = m_tabWidget->currentTabPage()->selectedItemsCount();
  253.  
  254.     QAction* compareFilesAction = actionCollection()->action("compare_files");
  255.     if (selectedUrlsCount == 2) {
  256.         compareFilesAction->setEnabled(isKompareInstalled());
  257.     } else {
  258.         compareFilesAction->setEnabled(false);
  259.     }
  260.  
  261.     emit selectionChanged(selection);
  262. }
  263.  
  264. void DolphinMainWindow::updateHistory()
  265. {
  266.     const KUrlNavigator* urlNavigator = m_activeViewContainer->urlNavigator();
  267.     const int index = urlNavigator->historyIndex();
  268.  
  269.     QAction* backAction = actionCollection()->action("go_back");
  270.     if (backAction) {
  271.         backAction->setToolTip(i18nc("@info", "Go back"));
  272.         backAction->setEnabled(index < urlNavigator->historySize() - 1);
  273.     }
  274.  
  275.     QAction* forwardAction = actionCollection()->action("go_forward");
  276.     if (forwardAction) {
  277.         forwardAction->setToolTip(i18nc("@info", "Go forward"));
  278.         forwardAction->setEnabled(index > 0);
  279.     }
  280. }
  281.  
  282. void DolphinMainWindow::openNewMainWindow()
  283. {
  284.     KRun::run("dolphin %u", QList<QUrl>(), this);
  285. }
  286.  
  287. void DolphinMainWindow::openNewActivatedTab()
  288. {
  289.     m_tabWidget->openNewActivatedTab();
  290. }
  291.  
  292. void DolphinMainWindow::openNewTab(const QUrl& url)
  293. {
  294.     m_tabWidget->openNewTab(url);
  295. }
  296.  
  297. void DolphinMainWindow::openInNewTab()
  298. {
  299.     const KFileItemList& list = m_activeViewContainer->view()->selectedItems();
  300.     if (list.isEmpty()) {
  301.         openNewTab(m_activeViewContainer->url());
  302.     } else {
  303.         foreach (const KFileItem& item, list) {
  304.             const QUrl& url = DolphinView::openItemAsFolderUrl(item);
  305.             if (!url.isEmpty()) {
  306.                 openNewTab(url);
  307.             }
  308.         }
  309.     }
  310. }
  311.  
  312. void DolphinMainWindow::openInNewWindow()
  313. {
  314.     QUrl newWindowUrl;
  315.  
  316.     const KFileItemList list = m_activeViewContainer->view()->selectedItems();
  317.     if (list.isEmpty()) {
  318.         newWindowUrl = m_activeViewContainer->url();
  319.     } else if (list.count() == 1) {
  320.         const KFileItem& item = list.first();
  321.         newWindowUrl = DolphinView::openItemAsFolderUrl(item);
  322.     }
  323.  
  324.     if (!newWindowUrl.isEmpty()) {
  325.         KRun::run("dolphin %u", {newWindowUrl}, this);
  326.     }
  327. }
  328.  
  329. void DolphinMainWindow::showEvent(QShowEvent* event)
  330. {
  331.     KXmlGuiWindow::showEvent(event);
  332.  
  333.     if (!event->spontaneous()) {
  334.         m_activeViewContainer->view()->setFocus();
  335.     }
  336. }
  337.  
  338. void DolphinMainWindow::closeEvent(QCloseEvent* event)
  339. {
  340.     // Find out if Dolphin is closed directly by the user or
  341.     // by the session manager because the session is closed
  342.     bool closedByUser = true;
  343.     if (qApp->isSessionRestored()) {
  344.         closedByUser = false;
  345.     }
  346.  
  347.     if (m_tabWidget->count() > 1 && GeneralSettings::confirmClosingMultipleTabs() && closedByUser) {
  348.         // Ask the user if he really wants to quit and close all tabs.
  349.         // Open a confirmation dialog with 3 buttons:
  350.         // QDialogButtonBox::Yes    -> Quit
  351.         // QDialogButtonBox::No     -> Close only the current tab
  352.         // QDialogButtonBox::Cancel -> do nothing
  353.         QDialog *dialog = new QDialog(this, Qt::Dialog);
  354.         dialog->setWindowTitle(i18nc("@title:window", "Confirmation"));
  355.         dialog->setModal(true);
  356.         QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Yes | QDialogButtonBox::No | QDialogButtonBox::Cancel);
  357.         KGuiItem::assign(buttons->button(QDialogButtonBox::Yes), KStandardGuiItem::quit());
  358.         KGuiItem::assign(buttons->button(QDialogButtonBox::No), KGuiItem(i18n("C&lose Current Tab"), QIcon::fromTheme("tab-close")));
  359.         KGuiItem::assign(buttons->button(QDialogButtonBox::Cancel), KStandardGuiItem::cancel());
  360.         buttons->button(QDialogButtonBox::Yes)->setDefault(true);
  361.  
  362.         bool doNotAskAgainCheckboxResult = false;
  363.  
  364.         const int result = KMessageBox::createKMessageBox(dialog,
  365.             buttons,
  366.             QMessageBox::Warning,
  367.             i18n("You have multiple tabs open in this window, are you sure you want to quit?"),
  368.             QStringList(),
  369.             i18n("Do not ask again"),
  370.             &doNotAskAgainCheckboxResult,
  371.             KMessageBox::Notify);
  372.  
  373.         if (doNotAskAgainCheckboxResult) {
  374.             GeneralSettings::setConfirmClosingMultipleTabs(false);
  375.         }
  376.  
  377.         switch (result) {
  378.             case QDialogButtonBox::Yes:
  379.                 // Quit
  380.                 break;
  381.             case QDialogButtonBox::No:
  382.                 // Close only the current tab
  383.                 m_tabWidget->closeTab();
  384.             default:
  385.                 event->ignore();
  386.                 return;
  387.         }
  388.     }
  389.  
  390.     GeneralSettings::setVersion(CurrentDolphinVersion);
  391.     GeneralSettings::self()->save();
  392.  
  393.     KXmlGuiWindow::closeEvent(event);
  394. }
  395.  
  396. void DolphinMainWindow::saveProperties(KConfigGroup& group)
  397. {
  398.     m_tabWidget->saveProperties(group);
  399. }
  400.  
  401. void DolphinMainWindow::readProperties(const KConfigGroup& group)
  402. {
  403.     m_tabWidget->readProperties(group);
  404. }
  405.  
  406. void DolphinMainWindow::updateNewMenu()
  407. {
  408.     m_newFileMenu->setViewShowsHiddenFiles(activeViewContainer()->view()->hiddenFilesShown());
  409.     m_newFileMenu->checkUpToDate();
  410.     m_newFileMenu->setPopupFiles(activeViewContainer()->url());
  411. }
  412.  
  413. void DolphinMainWindow::createDirectory()
  414. {
  415.     m_newFileMenu->setViewShowsHiddenFiles(activeViewContainer()->view()->hiddenFilesShown());
  416.     m_newFileMenu->setPopupFiles(activeViewContainer()->url());
  417.     m_newFileMenu->createDirectory();
  418. }
  419.  
  420. void DolphinMainWindow::quit()
  421. {
  422.     close();
  423. }
  424.  
  425. void DolphinMainWindow::showErrorMessage(const QString& message)
  426. {
  427.     m_activeViewContainer->showMessage(message, DolphinViewContainer::Error);
  428. }
  429.  
  430. void DolphinMainWindow::slotUndoAvailable(bool available)
  431. {
  432.     QAction* undoAction = actionCollection()->action(KStandardAction::name(KStandardAction::Undo));
  433.     if (undoAction) {
  434.         undoAction->setEnabled(available);
  435.     }
  436. }
  437.  
  438. void DolphinMainWindow::slotUndoTextChanged(const QString& text)
  439. {
  440.     QAction* undoAction = actionCollection()->action(KStandardAction::name(KStandardAction::Undo));
  441.     if (undoAction) {
  442.         undoAction->setText(text);
  443.     }
  444. }
  445.  
  446. void DolphinMainWindow::undo()
  447. {
  448.     clearStatusBar();
  449.     KIO::FileUndoManager::self()->uiInterface()->setParentWidget(this);
  450.     KIO::FileUndoManager::self()->undo();
  451. }
  452.  
  453. void DolphinMainWindow::cut()
  454. {
  455.     m_activeViewContainer->view()->cutSelectedItems();
  456. }
  457.  
  458. void DolphinMainWindow::copy()
  459. {
  460.     m_activeViewContainer->view()->copySelectedItems();
  461. }
  462.  
  463. void DolphinMainWindow::paste()
  464. {
  465.     m_activeViewContainer->view()->paste();
  466. }
  467.  
  468. void DolphinMainWindow::find()
  469. {
  470.     m_activeViewContainer->setSearchModeEnabled(true);
  471. }
  472.  
  473. void DolphinMainWindow::updatePasteAction()
  474. {
  475.     QAction* pasteAction = actionCollection()->action(KStandardAction::name(KStandardAction::Paste));
  476.     QPair<bool, QString> pasteInfo = m_activeViewContainer->view()->pasteInfo();
  477.     pasteAction->setEnabled(pasteInfo.first);
  478.     pasteAction->setText(pasteInfo.second);
  479. }
  480.  
  481. void DolphinMainWindow::slotDirectoryLoadingCompleted()
  482. {
  483.     updatePasteAction();
  484. }
  485.  
  486. void DolphinMainWindow::selectAll()
  487. {
  488.     clearStatusBar();
  489.  
  490.     // if the URL navigator is editable and focused, select the whole
  491.     // URL instead of all items of the view
  492.  
  493.     KUrlNavigator* urlNavigator = m_activeViewContainer->urlNavigator();
  494.     QLineEdit* lineEdit = urlNavigator->editor()->lineEdit(); // krazy:exclude=qclasses
  495.     const bool selectUrl = urlNavigator->isUrlEditable() &&
  496.                            lineEdit->hasFocus();
  497.     if (selectUrl) {
  498.         lineEdit->selectAll();
  499.     } else {
  500.         m_activeViewContainer->view()->selectAll();
  501.     }
  502. }
  503.  
  504. void DolphinMainWindow::invertSelection()
  505. {
  506.     clearStatusBar();
  507.     m_activeViewContainer->view()->invertSelection();
  508. }
  509.  
  510. void DolphinMainWindow::toggleSplitView()
  511. {
  512.     DolphinTabPage* tabPage = m_tabWidget->currentTabPage();
  513.     tabPage->setSplitViewEnabled(!tabPage->splitViewEnabled());
  514.  
  515.     updateViewActions();
  516. }
  517.  
  518. void DolphinMainWindow::reloadView()
  519. {
  520.     clearStatusBar();
  521.     m_activeViewContainer->view()->reload();
  522. }
  523.  
  524. void DolphinMainWindow::stopLoading()
  525. {
  526.     m_activeViewContainer->view()->stopLoading();
  527. }
  528.  
  529. void DolphinMainWindow::enableStopAction()
  530. {
  531.     actionCollection()->action("stop")->setEnabled(true);
  532. }
  533.  
  534. void DolphinMainWindow::disableStopAction()
  535. {
  536.     actionCollection()->action("stop")->setEnabled(false);
  537. }
  538.  
  539. void DolphinMainWindow::toggleFilterBar()
  540. {
  541.     m_activeViewContainer->setFilterBarVisible(!m_activeViewContainer->isFilterBarVisible());
  542.     qDebug()<<"toggletrigger";
  543. }
  544.  
  545. void DolphinMainWindow::toggleEditLocation()
  546. {
  547.     clearStatusBar();
  548.  
  549.     QAction* action = actionCollection()->action("editable_location");
  550.     KUrlNavigator* urlNavigator = m_activeViewContainer->urlNavigator();
  551.     urlNavigator->setUrlEditable(action->isChecked());
  552. }
  553.  
  554. void DolphinMainWindow::replaceLocation()
  555. {
  556.     KUrlNavigator* navigator = m_activeViewContainer->urlNavigator();
  557.     navigator->setUrlEditable(true);
  558.     navigator->setFocus();
  559.  
  560.     // select the whole text of the combo box editor
  561.     QLineEdit* lineEdit = navigator->editor()->lineEdit();  // krazy:exclude=qclasses
  562.     lineEdit->selectAll();
  563. }
  564.  
  565. void DolphinMainWindow::togglePanelLockState()
  566. {
  567.     const bool newLockState = !GeneralSettings::lockPanels();
  568.     foreach (QObject* child, children()) {
  569.         DolphinDockWidget* dock = qobject_cast<DolphinDockWidget*>(child);
  570.         if (dock) {
  571.             dock->setLocked(newLockState);
  572.         }
  573.     }
  574.  
  575.     GeneralSettings::setLockPanels(newLockState);
  576. }
  577.  
  578. void DolphinMainWindow::goBack()
  579. {
  580.     KUrlNavigator* urlNavigator = m_activeViewContainer->urlNavigator();
  581.     urlNavigator->goBack();
  582.  
  583.     if (urlNavigator->locationState().isEmpty()) {
  584.         // An empty location state indicates a redirection URL,
  585.         // which must be skipped too
  586.         urlNavigator->goBack();
  587.     }
  588. }
  589.  
  590. void DolphinMainWindow::goForward()
  591. {
  592.     m_activeViewContainer->urlNavigator()->goForward();
  593. }
  594.  
  595. void DolphinMainWindow::goUp()
  596. {
  597.     m_activeViewContainer->urlNavigator()->goUp();
  598. }
  599.  
  600. void DolphinMainWindow::goHome()
  601. {
  602.     m_activeViewContainer->urlNavigator()->goHome();
  603. }
  604.  
  605. void DolphinMainWindow::goBack(Qt::MouseButtons buttons)
  606. {
  607.     // The default case (left button pressed) is handled in goBack().
  608.     if (buttons == Qt::MiddleButton) {
  609.         KUrlNavigator* urlNavigator = activeViewContainer()->urlNavigator();
  610.         const int index = urlNavigator->historyIndex() + 1;
  611.         openNewTab(urlNavigator->locationUrl(index));
  612.     }
  613. }
  614.  
  615. void DolphinMainWindow::goForward(Qt::MouseButtons buttons)
  616. {
  617.     // The default case (left button pressed) is handled in goForward().
  618.     if (buttons == Qt::MiddleButton) {
  619.         KUrlNavigator* urlNavigator = activeViewContainer()->urlNavigator();
  620.         const int index = urlNavigator->historyIndex() - 1;
  621.         openNewTab(urlNavigator->locationUrl(index));
  622.     }
  623. }
  624.  
  625. void DolphinMainWindow::goUp(Qt::MouseButtons buttons)
  626. {
  627.     // The default case (left button pressed) is handled in goUp().
  628.     if (buttons == Qt::MiddleButton) {
  629.         openNewTab(KIO::upUrl(activeViewContainer()->url()));
  630.     }
  631. }
  632.  
  633. void DolphinMainWindow::goHome(Qt::MouseButtons buttons)
  634. {
  635.     // The default case (left button pressed) is handled in goHome().
  636.     if (buttons == Qt::MiddleButton) {
  637.         openNewTab(GeneralSettings::self()->homeUrl());
  638.     }
  639. }
  640.  
  641. void DolphinMainWindow::compareFiles()
  642. {
  643.     const KFileItemList items = m_tabWidget->currentTabPage()->selectedItems();
  644.     if (items.count() != 2) {
  645.         // The action is disabled in this case, but it could have been triggered
  646.         // via D-Bus, see https://bugs.kde.org/show_bug.cgi?id=325517
  647.         return;
  648.     }
  649.  
  650.     QUrl urlA = items.at(0).url();
  651.     QUrl urlB = items.at(1).url();
  652.  
  653.     QString command("kompare -c \"");
  654.     command.append(urlA.toDisplayString(QUrl::PreferLocalFile));
  655.     command.append("\" \"");
  656.     command.append(urlB.toDisplayString(QUrl::PreferLocalFile));
  657.     command.append('\"');
  658.     KRun::runCommand(command, "Kompare", "kompare", this);
  659. }
  660.  
  661. void DolphinMainWindow::toggleShowMenuBar()
  662. {
  663.     const bool visible = menuBar()->isVisible();
  664.     menuBar()->setVisible(!visible);
  665.     if (visible) {
  666.         createControlButton();
  667.     } else {
  668.         deleteControlButton();
  669.     }
  670. }
  671.  
  672. void DolphinMainWindow::openTerminal()
  673. {
  674.     QString dir(QDir::homePath());
  675.  
  676.     // If the given directory is not local, it can still be the URL of an
  677.     // ioslave using UDS_LOCAL_PATH which to be converted first.
  678.     KIO::StatJob* statJob = KIO::mostLocalUrl(m_activeViewContainer->url());
  679.     KJobWidgets::setWindow(statJob, this);
  680.     statJob->exec();
  681.     QUrl url = statJob->mostLocalUrl();
  682.  
  683.     //If the URL is local after the above conversion, set the directory.
  684.     if (url.isLocalFile()) {
  685.         dir = url.toLocalFile();
  686.     }
  687.  
  688.     KToolInvocation::invokeTerminal(QString(), dir);
  689. }
  690.  
  691. void DolphinMainWindow::editSettings()
  692. {
  693.     if (!m_settingsDialog) {
  694.         DolphinViewContainer* container = activeViewContainer();
  695.         container->view()->writeSettings();
  696.  
  697.         const QUrl url = container->url();
  698.         DolphinSettingsDialog* settingsDialog = new DolphinSettingsDialog(url, this);
  699.         connect(settingsDialog, &DolphinSettingsDialog::settingsChanged, this, &DolphinMainWindow::refreshViews);
  700.         settingsDialog->setAttribute(Qt::WA_DeleteOnClose);
  701.         settingsDialog->show();
  702.         m_settingsDialog = settingsDialog;
  703.     } else {
  704.         m_settingsDialog.data()->raise();
  705.     }
  706. }
  707.  
  708. void DolphinMainWindow::handleUrl(const QUrl& url)
  709. {
  710.     delete m_lastHandleUrlStatJob;
  711.     m_lastHandleUrlStatJob = 0;
  712.  
  713.     if (url.isLocalFile() && QFileInfo(url.toLocalFile()).isDir()) {
  714.         activeViewContainer()->setUrl(url);
  715.     } else if (KProtocolManager::supportsListing(url)) {
  716.         // stat the URL to see if it is a dir or not
  717.         m_lastHandleUrlStatJob = KIO::stat(url, KIO::HideProgressInfo);
  718.         if (m_lastHandleUrlStatJob->ui()) {
  719.             KJobWidgets::setWindow(m_lastHandleUrlStatJob, this);
  720.         }
  721.         connect(m_lastHandleUrlStatJob, &KIO::Job::result,
  722.                 this, &DolphinMainWindow::slotHandleUrlStatFinished);
  723.  
  724.     } else {
  725.         new KRun(url, this); // Automatically deletes itself after being finished
  726.     }
  727. }
  728.  
  729. void DolphinMainWindow::slotHandleUrlStatFinished(KJob* job)
  730. {
  731.     m_lastHandleUrlStatJob = 0;
  732.     const KIO::UDSEntry entry = static_cast<KIO::StatJob*>(job)->statResult();
  733.     const QUrl url = static_cast<KIO::StatJob*>(job)->url();
  734.     if (entry.isDir()) {
  735.         activeViewContainer()->setUrl(url);
  736.     } else {
  737.         new KRun(url, this);  // Automatically deletes itself after being finished
  738.     }
  739. }
  740.  
  741. void DolphinMainWindow::slotWriteStateChanged(bool isFolderWritable)
  742. {
  743.     newFileMenu()->setEnabled(isFolderWritable);
  744. }
  745.  
  746. void DolphinMainWindow::openContextMenu(const QPoint& pos,
  747.                                         const KFileItem& item,
  748.                                         const QUrl& url,
  749.                                         const QList<QAction*>& customActions)
  750. {
  751.     QPointer<DolphinContextMenu> contextMenu = new DolphinContextMenu(this, pos, item, url);
  752.     contextMenu.data()->setCustomActions(customActions);
  753.     const DolphinContextMenu::Command command = contextMenu.data()->open();
  754.  
  755.     switch (command) {
  756.     case DolphinContextMenu::OpenParentFolder:
  757.         changeUrl(KIO::upUrl(item.url()));
  758.         break;
  759.  
  760.     case DolphinContextMenu::OpenParentFolderInNewWindow: {
  761.  
  762.         KRun::run("dolphin %u", {KIO::upUrl(item.url())}, this);
  763.         break;
  764.     }
  765.  
  766.     case DolphinContextMenu::OpenParentFolderInNewTab:
  767.         openNewTab(KIO::upUrl(item.url()));
  768.         break;
  769.  
  770.     case DolphinContextMenu::None:
  771.     default:
  772.         break;
  773.     }
  774.  
  775.     // Delete the menu, unless it has been deleted in its own nested event loop already.
  776.     if (contextMenu) {
  777.         contextMenu->deleteLater();
  778.     }
  779. }
  780.  
  781. void DolphinMainWindow::updateControlMenu()
  782. {
  783.     QMenu* menu = qobject_cast<QMenu*>(sender());
  784.     Q_ASSERT(menu);
  785.  
  786.     // All actions get cleared by QMenu::clear(). The sub-menus are deleted
  787.     // by connecting to the aboutToHide() signal from the parent-menu.
  788.     menu->clear();
  789.  
  790.     KActionCollection* ac = actionCollection();
  791.  
  792.     // Add "Edit" actions
  793.     bool added = addActionToMenu(ac->action(KStandardAction::name(KStandardAction::Undo)), menu) |
  794.                  addActionToMenu(ac->action(KStandardAction::name(KStandardAction::Find)), menu) |
  795.                  addActionToMenu(ac->action("select_all"), menu) |
  796.                  addActionToMenu(ac->action("invert_selection"), menu);
  797.  
  798.     if (added) {
  799.         menu->addSeparator();
  800.     }
  801.  
  802.     // Add "View" actions
  803.     if (!GeneralSettings::showZoomSlider()) {
  804.         addActionToMenu(ac->action(KStandardAction::name(KStandardAction::ZoomIn)), menu);
  805.         addActionToMenu(ac->action(KStandardAction::name(KStandardAction::ZoomOut)), menu);
  806.         menu->addSeparator();
  807.     }
  808.  
  809.     added = addActionToMenu(ac->action("view_mode"), menu) |
  810.             addActionToMenu(ac->action("sort"), menu) |
  811.             addActionToMenu(ac->action("additional_info"), menu) |
  812.             addActionToMenu(ac->action("show_preview"), menu) |
  813.             addActionToMenu(ac->action("show_in_groups"), menu) |
  814.             addActionToMenu(ac->action("show_hidden_files"), menu);
  815.  
  816.     if (added) {
  817.         menu->addSeparator();
  818.     }
  819.  
  820.     added = addActionToMenu(ac->action("split_view"), menu) |
  821.             addActionToMenu(ac->action("reload"), menu) |
  822.             addActionToMenu(ac->action("view_properties"), menu);
  823.     if (added) {
  824.         menu->addSeparator();
  825.     }
  826.  
  827.     addActionToMenu(ac->action("panels"), menu);
  828.     QMenu* locationBarMenu = new QMenu(i18nc("@action:inmenu", "Location Bar"), menu);
  829.     locationBarMenu->addAction(ac->action("editable_location"));
  830.     locationBarMenu->addAction(ac->action("replace_location"));
  831.     menu->addMenu(locationBarMenu);
  832.  
  833.     menu->addSeparator();
  834.  
  835.     // Add "Go" menu
  836.     QMenu* goMenu = new QMenu(i18nc("@action:inmenu", "Go"), menu);
  837.     connect(menu, &QMenu::aboutToHide, goMenu, &QMenu::deleteLater);
  838.     goMenu->addAction(ac->action(KStandardAction::name(KStandardAction::Back)));
  839.     goMenu->addAction(ac->action(KStandardAction::name(KStandardAction::Forward)));
  840.     goMenu->addAction(ac->action(KStandardAction::name(KStandardAction::Up)));
  841.     goMenu->addAction(ac->action(KStandardAction::name(KStandardAction::Home)));
  842.     goMenu->addAction(ac->action("closed_tabs"));
  843.     menu->addMenu(goMenu);
  844.  
  845.     // Add "Tool" menu
  846.     QMenu* toolsMenu = new QMenu(i18nc("@action:inmenu", "Tools"), menu);
  847.     connect(menu, &QMenu::aboutToHide, toolsMenu, &QMenu::deleteLater);
  848.     toolsMenu->addAction(ac->action("show_filter_bar"));
  849.     toolsMenu->addAction(ac->action("compare_files"));
  850.     toolsMenu->addAction(ac->action("open_terminal"));
  851.     toolsMenu->addAction(ac->action("change_remote_encoding"));
  852.     menu->addMenu(toolsMenu);
  853.  
  854.     // Add "Settings" menu entries
  855.     addActionToMenu(ac->action(KStandardAction::name(KStandardAction::KeyBindings)), menu);
  856.     addActionToMenu(ac->action(KStandardAction::name(KStandardAction::ConfigureToolbars)), menu);
  857.     addActionToMenu(ac->action(KStandardAction::name(KStandardAction::Preferences)), menu);
  858.  
  859.     // Add "Help" menu
  860.     QMenu* helpMenu = new QMenu(i18nc("@action:inmenu", "Help"), menu);
  861.     connect(menu, &QMenu::aboutToHide, helpMenu, &QMenu::deleteLater);
  862.     helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::HelpContents)));
  863.     helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::WhatsThis)));
  864.     helpMenu->addSeparator();
  865.     helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::ReportBug)));
  866.     helpMenu->addSeparator();
  867.     helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::SwitchApplicationLanguage)));
  868.     helpMenu->addSeparator();
  869.     helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::AboutApp)));
  870.     helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::AboutKDE)));
  871.     menu->addMenu(helpMenu);
  872.  
  873.     menu->addSeparator();
  874.     addActionToMenu(ac->action(KStandardAction::name(KStandardAction::ShowMenubar)), menu);
  875. }
  876.  
  877. void DolphinMainWindow::updateToolBar()
  878. {
  879.     if (!menuBar()->isVisible()) {
  880.         createControlButton();
  881.     }
  882. }
  883.  
  884. void DolphinMainWindow::slotControlButtonDeleted()
  885. {
  886.     m_controlButton = 0;
  887.     m_updateToolBarTimer->start();
  888. }
  889.  
  890. void DolphinMainWindow::slotPlaceActivated(const QUrl& url)
  891. {
  892.     DolphinViewContainer* view = activeViewContainer();
  893.  
  894.     if (view->url() == url) {
  895.         // We can end up here if the user clicked a device in the Places Panel
  896.         // which had been unmounted earlier, see https://bugs.kde.org/show_bug.cgi?id=161385.
  897.         reloadView();
  898.     } else {
  899.         changeUrl(url);
  900.     }
  901. }
  902.  
  903. void DolphinMainWindow::closedTabsCountChanged(unsigned int count)
  904. {
  905.     actionCollection()->action("undo_close_tab")->setEnabled(count > 0);
  906. }
  907.  
  908. void DolphinMainWindow::activeViewChanged(DolphinViewContainer* viewContainer)
  909. {
  910.     DolphinViewContainer* oldViewContainer = m_activeViewContainer;
  911.     Q_ASSERT(viewContainer);
  912.  
  913.     m_activeViewContainer = viewContainer;
  914.  
  915.     if (oldViewContainer) {
  916.         // Disconnect all signals between the old view container (container,
  917.         // view and url navigator) and main window.
  918.         oldViewContainer->disconnect(this);
  919.         oldViewContainer->view()->disconnect(this);
  920.         oldViewContainer->urlNavigator()->disconnect(this);
  921.     }
  922.  
  923.     connectViewSignals(viewContainer);
  924.  
  925.     m_actionHandler->setCurrentView(viewContainer->view());
  926.  
  927.     updateHistory();
  928.     updateEditActions();
  929.     updatePasteAction();
  930.     updateViewActions();
  931.     updateGoActions();
  932.  
  933.     const QUrl url = viewContainer->url();
  934.     emit urlChanged(url);
  935. }
  936.  
  937. void DolphinMainWindow::tabCountChanged(int count)
  938. {
  939.     const bool enableTabActions = (count > 1);
  940.     actionCollection()->action("close_tab")->setEnabled(enableTabActions);
  941.     actionCollection()->action("activate_next_tab")->setEnabled(enableTabActions);
  942.     actionCollection()->action("activate_prev_tab")->setEnabled(enableTabActions);
  943. }
  944.  
  945. void DolphinMainWindow::setUrlAsCaption(const QUrl& url)
  946. {
  947.     QString caption;
  948.     if (!url.isLocalFile()) {
  949.         caption.append(url.scheme() + " - ");
  950.         if (!url.host().isEmpty()) {
  951.             caption.append(url.host() + " - ");
  952.         }
  953.     }
  954.  
  955.     QString fileName = url.adjusted(QUrl::StripTrailingSlash).fileName();
  956.     if (fileName.isEmpty()) {
  957.         fileName = '/';
  958.     }
  959.  
  960.     caption.append(fileName);
  961.  
  962.     setWindowTitle(caption);
  963. }
  964.  
  965. void DolphinMainWindow::setupActions()
  966. {
  967.     // setup 'File' menu
  968.     m_newFileMenu = new DolphinNewFileMenu(actionCollection(), this);
  969.     QMenu* menu = m_newFileMenu->menu();
  970.     menu->setTitle(i18nc("@title:menu Create new folder, file, link, etc.", "Create New"));
  971.     menu->setIcon(QIcon::fromTheme("document-new"));
  972.     m_newFileMenu->setDelayed(false);
  973.     connect(menu, &QMenu::aboutToShow,
  974.             this, &DolphinMainWindow::updateNewMenu);
  975.  
  976.     QAction* newWindow = actionCollection()->addAction("new_window");
  977.     newWindow->setIcon(QIcon::fromTheme("window-new"));
  978.     newWindow->setText(i18nc("@action:inmenu File", "New &Window"));
  979.     actionCollection()->setDefaultShortcut(newWindow, Qt::CTRL | Qt::Key_N);
  980.     connect(newWindow, &QAction::triggered, this, &DolphinMainWindow::openNewMainWindow);
  981.  
  982.     QAction* newTab = actionCollection()->addAction("new_tab");
  983.     newTab->setIcon(QIcon::fromTheme("tab-new"));
  984.     newTab->setText(i18nc("@action:inmenu File", "New Tab"));
  985.     actionCollection()->setDefaultShortcuts(newTab, {Qt::CTRL | Qt::Key_T, Qt::CTRL | Qt::SHIFT | Qt::Key_N});
  986.     connect(newTab, &QAction::triggered, this, static_cast<void(DolphinMainWindow::*)()>(&DolphinMainWindow::openNewActivatedTab));
  987.  
  988.     QAction* closeTab = actionCollection()->addAction("close_tab");
  989.     closeTab->setIcon(QIcon::fromTheme("tab-close"));
  990.     closeTab->setText(i18nc("@action:inmenu File", "Close Tab"));
  991.     actionCollection()->setDefaultShortcut(closeTab, Qt::CTRL | Qt::Key_W);
  992.     closeTab->setEnabled(false);
  993.     connect(closeTab, &QAction::triggered, m_tabWidget, static_cast<void(DolphinTabWidget::*)()>(&DolphinTabWidget::closeTab));
  994.  
  995.     KStandardAction::quit(this, SLOT(quit()), actionCollection());
  996.  
  997.     // setup 'Edit' menu
  998.     KStandardAction::undo(this,
  999.                           SLOT(undo()),
  1000.                           actionCollection());
  1001.  
  1002.     // need to remove shift+del from cut action, else the shortcut for deletejob
  1003.     // doesn't work
  1004.     QAction* cut = KStandardAction::cut(this, SLOT(cut()), actionCollection());
  1005.     auto cutShortcuts = cut->shortcuts();
  1006.     cutShortcuts.removeAll(QKeySequence(Qt::SHIFT | Qt::Key_Delete));
  1007.     actionCollection()->setDefaultShortcuts(cut, cutShortcuts);
  1008.     KStandardAction::copy(this, SLOT(copy()), actionCollection());
  1009.     QAction* paste = KStandardAction::paste(this, SLOT(paste()), actionCollection());
  1010.     // The text of the paste-action is modified dynamically by Dolphin
  1011.     // (e. g. to "Paste One Folder"). To prevent that the size of the toolbar changes
  1012.     // due to the long text, the text "Paste" is used:
  1013.     paste->setIconText(i18nc("@action:inmenu Edit", "Paste"));
  1014.  
  1015.     KStandardAction::find(this, SLOT(find()), actionCollection());
  1016.  
  1017.     QAction* selectAll = actionCollection()->addAction("select_all");
  1018.     selectAll->setText(i18nc("@action:inmenu Edit", "Select All"));
  1019.     actionCollection()->setDefaultShortcut(selectAll, Qt::CTRL | Qt::Key_A);
  1020.     connect(selectAll, &QAction::triggered, this, &DolphinMainWindow::selectAll);
  1021.  
  1022.     QAction* invertSelection = actionCollection()->addAction("invert_selection");
  1023.     invertSelection->setText(i18nc("@action:inmenu Edit", "Invert Selection"));
  1024.     actionCollection()->setDefaultShortcut(invertSelection, Qt::CTRL | Qt::SHIFT | Qt::Key_A);
  1025.     connect(invertSelection, &QAction::triggered, this, &DolphinMainWindow::invertSelection);
  1026.  
  1027.     // setup 'View' menu
  1028.     // (note that most of it is set up in DolphinViewActionHandler)
  1029.  
  1030.     QAction* split = actionCollection()->addAction("split_view");
  1031.     actionCollection()->setDefaultShortcut(split, Qt::Key_F3);
  1032.     connect(split, &QAction::triggered, this, &DolphinMainWindow::toggleSplitView);
  1033.  
  1034.     QAction* reload = actionCollection()->addAction("reload");
  1035.     reload->setText(i18nc("@action:inmenu View", "Reload"));
  1036.     actionCollection()->setDefaultShortcut(reload, Qt::Key_F5);
  1037.     reload->setIcon(QIcon::fromTheme("view-refresh"));
  1038.     connect(reload, &QAction::triggered, this, &DolphinMainWindow::reloadView);
  1039.  
  1040.     QAction* stop = actionCollection()->addAction("stop");
  1041.     stop->setText(i18nc("@action:inmenu View", "Stop"));
  1042.     stop->setToolTip(i18nc("@info", "Stop loading"));
  1043.     stop->setIcon(QIcon::fromTheme("process-stop"));
  1044.     connect(stop, &QAction::triggered, this, &DolphinMainWindow::stopLoading);
  1045.  
  1046.     KToggleAction* editableLocation = actionCollection()->add<KToggleAction>("editable_location");
  1047.     editableLocation->setText(i18nc("@action:inmenu Navigation Bar", "Editable Location"));
  1048.     actionCollection()->setDefaultShortcut(editableLocation, Qt::Key_F6);
  1049.     connect(editableLocation, &KToggleAction::triggered, this, &DolphinMainWindow::toggleEditLocation);
  1050.  
  1051.     QAction* replaceLocation = actionCollection()->addAction("replace_location");
  1052.     replaceLocation->setText(i18nc("@action:inmenu Navigation Bar", "Replace Location"));
  1053.     actionCollection()->setDefaultShortcut(replaceLocation, Qt::CTRL | Qt::Key_L);
  1054.     connect(replaceLocation, &QAction::triggered, this, &DolphinMainWindow::replaceLocation);
  1055.  
  1056.     // setup 'Go' menu
  1057.     QAction* backAction = KStandardAction::back(this, SLOT(goBack()), actionCollection());
  1058.     auto backShortcuts = backAction->shortcuts();
  1059.     backShortcuts.append(QKeySequence(Qt::Key_Backspace));
  1060.     actionCollection()->setDefaultShortcuts(backAction, backShortcuts);
  1061.  
  1062.     DolphinRecentTabsMenu* recentTabsMenu = new DolphinRecentTabsMenu(this);
  1063.     actionCollection()->addAction("closed_tabs", recentTabsMenu);
  1064.     connect(m_tabWidget, SIGNAL(rememberClosedTab(QUrl,QByteArray)),
  1065.             recentTabsMenu, SLOT(rememberClosedTab(QUrl,QByteArray)));
  1066.     connect(recentTabsMenu, SIGNAL(restoreClosedTab(QByteArray)),
  1067.             m_tabWidget, SLOT(restoreClosedTab(QByteArray)));
  1068.     connect(recentTabsMenu, SIGNAL(closedTabsCountChanged(uint)),
  1069.             this, SLOT(closedTabsCountChanged(uint)));
  1070.  
  1071.     QAction* undoCloseTab = actionCollection()->addAction("undo_close_tab");
  1072.     undoCloseTab->setText(i18nc("@action:inmenu File", "Undo close tab"));
  1073.     actionCollection()->setDefaultShortcut(undoCloseTab, Qt::CTRL | Qt::SHIFT | Qt::Key_T);
  1074.     undoCloseTab->setIcon(QIcon::fromTheme("edit-undo"));
  1075.     undoCloseTab->setEnabled(false);
  1076.     connect(undoCloseTab, SIGNAL(triggered()), recentTabsMenu, SLOT(undoCloseTab()));
  1077.  
  1078.     auto undoAction = actionCollection()->action(KStandardAction::name(KStandardAction::Undo));
  1079.     undoAction->setEnabled(false); // undo should be disabled by default
  1080.  
  1081.     KStandardAction::forward(this, SLOT(goForward()), actionCollection());
  1082.     KStandardAction::up(this, SLOT(goUp()), actionCollection());
  1083.     KStandardAction::home(this, SLOT(goHome()), actionCollection());
  1084.  
  1085.     // setup 'Tools' menu
  1086.     QAction* showFilterBar = actionCollection()->addAction("show_filter_bar");
  1087.     showFilterBar->installEventFilter(this);
  1088.     showFilterBar->setText(i18nc("@action:inmenu Tools", "Filter"));
  1089.     showFilterBar->setToolTip(i18nc("@info", "Toggle the Filter Bar"));
  1090.     showFilterBar->setIcon(QIcon::fromTheme("view-filter"));
  1091.     showFilterBar->setCheckable(true);
  1092.     actionCollection()->setDefaultShortcut(showFilterBar, Qt::CTRL | Qt::Key_I);
  1093.     connect(showFilterBar, &QAction::toggled, this, &DolphinMainWindow::toggleFilterBar);
  1094.  
  1095.     QAction* compareFiles = actionCollection()->addAction("compare_files");
  1096.     compareFiles->setText(i18nc("@action:inmenu Tools", "Compare Files"));
  1097.     compareFiles->setIcon(QIcon::fromTheme("kompare"));
  1098.     compareFiles->setEnabled(false);
  1099.     connect(compareFiles, &QAction::triggered, this, &DolphinMainWindow::compareFiles);
  1100.  
  1101.     QAction* openTerminal = actionCollection()->addAction("open_terminal");
  1102.     openTerminal->setText(i18nc("@action:inmenu Tools", "Open Terminal"));
  1103.     openTerminal->setIcon(QIcon::fromTheme("utilities-terminal"));
  1104.     actionCollection()->setDefaultShortcut(openTerminal, Qt::SHIFT | Qt::Key_F4);
  1105.     connect(openTerminal, &QAction::triggered, this, &DolphinMainWindow::openTerminal);
  1106.  
  1107.     // setup 'Settings' menu
  1108.     KToggleAction* showMenuBar = KStandardAction::showMenubar(0, 0, actionCollection());
  1109.     connect(showMenuBar, &KToggleAction::triggered,                   // Fixes #286822
  1110.             this, &DolphinMainWindow::toggleShowMenuBar, Qt::QueuedConnection);
  1111.     KStandardAction::preferences(this, SLOT(editSettings()), actionCollection());
  1112.  
  1113.     // not in menu actions
  1114.     QList<QKeySequence> nextTabKeys = KStandardShortcut::tabNext();
  1115.     nextTabKeys.append(QKeySequence(Qt::CTRL | Qt::Key_Tab));
  1116.  
  1117.     QList<QKeySequence> prevTabKeys = KStandardShortcut::tabPrev();
  1118.     prevTabKeys.append(QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_Tab));
  1119.  
  1120.     QAction* activateNextTab = actionCollection()->addAction("activate_next_tab");
  1121.     activateNextTab->setIconText(i18nc("@action:inmenu", "Next Tab"));
  1122.     activateNextTab->setText(i18nc("@action:inmenu", "Activate Next Tab"));
  1123.     activateNextTab->setEnabled(false);
  1124.     connect(activateNextTab, &QAction::triggered, m_tabWidget, &DolphinTabWidget::activateNextTab);
  1125.     actionCollection()->setDefaultShortcuts(activateNextTab, QApplication::isRightToLeft() ? prevTabKeys : nextTabKeys);
  1126.  
  1127.     QAction* activatePrevTab = actionCollection()->addAction("activate_prev_tab");
  1128.     activatePrevTab->setIconText(i18nc("@action:inmenu", "Previous Tab"));
  1129.     activatePrevTab->setText(i18nc("@action:inmenu", "Activate Previous Tab"));
  1130.     activatePrevTab->setEnabled(false);
  1131.     connect(activatePrevTab, &QAction::triggered, m_tabWidget, &DolphinTabWidget::activatePrevTab);
  1132.     actionCollection()->setDefaultShortcuts(activatePrevTab, QApplication::isRightToLeft() ? nextTabKeys : prevTabKeys);
  1133.  
  1134.     // for context menu
  1135.     QAction* openInNewTab = actionCollection()->addAction("open_in_new_tab");
  1136.     openInNewTab->setText(i18nc("@action:inmenu", "Open in New Tab"));
  1137.     openInNewTab->setIcon(QIcon::fromTheme("tab-new"));
  1138.     connect(openInNewTab, &QAction::triggered, this, &DolphinMainWindow::openInNewTab);
  1139.  
  1140.     QAction* openInNewTabs = actionCollection()->addAction("open_in_new_tabs");
  1141.     openInNewTabs->setText(i18nc("@action:inmenu", "Open in New Tabs"));
  1142.     openInNewTabs->setIcon(QIcon::fromTheme("tab-new"));
  1143.     connect(openInNewTabs, &QAction::triggered, this, &DolphinMainWindow::openInNewTab);
  1144.  
  1145.     QAction* openInNewWindow = actionCollection()->addAction("open_in_new_window");
  1146.     openInNewWindow->setText(i18nc("@action:inmenu", "Open in New Window"));
  1147.     openInNewWindow->setIcon(QIcon::fromTheme("window-new"));
  1148.     connect(openInNewWindow, &QAction::triggered, this, &DolphinMainWindow::openInNewWindow);
  1149. }
  1150.  
  1151. void DolphinMainWindow::setupDockWidgets()
  1152. {
  1153.     const bool lock = GeneralSettings::lockPanels();
  1154.  
  1155.     KDualAction* lockLayoutAction = actionCollection()->add<KDualAction>("lock_panels");
  1156.     lockLayoutAction->setActiveText(i18nc("@action:inmenu Panels", "Unlock Panels"));
  1157.     lockLayoutAction->setActiveIcon(QIcon::fromTheme("object-unlocked"));
  1158.     lockLayoutAction->setInactiveText(i18nc("@action:inmenu Panels", "Lock Panels"));
  1159.     lockLayoutAction->setInactiveIcon(QIcon::fromTheme("object-locked"));
  1160.     lockLayoutAction->setActive(lock);
  1161.     connect(lockLayoutAction, &KDualAction::triggered, this, &DolphinMainWindow::togglePanelLockState);
  1162.  
  1163.     // Setup "Information"
  1164.     DolphinDockWidget* infoDock = new DolphinDockWidget(i18nc("@title:window", "Information"));
  1165.     infoDock->setLocked(lock);
  1166.     infoDock->setObjectName("infoDock");
  1167.     infoDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
  1168.     InformationPanel* infoPanel = new InformationPanel(infoDock);
  1169.     infoPanel->setCustomContextMenuActions({lockLayoutAction});
  1170.     connect(infoPanel, &InformationPanel::urlActivated, this, &DolphinMainWindow::handleUrl);
  1171.     infoDock->setWidget(infoPanel);
  1172.  
  1173.     QAction* infoAction = infoDock->toggleViewAction();
  1174.     createPanelAction(QIcon::fromTheme("dialog-information"), Qt::Key_F11, infoAction, "show_information_panel");
  1175.  
  1176.     addDockWidget(Qt::RightDockWidgetArea, infoDock);
  1177.     connect(this, &DolphinMainWindow::urlChanged,
  1178.             infoPanel, &InformationPanel::setUrl);
  1179.     connect(this, &DolphinMainWindow::selectionChanged,
  1180.             infoPanel, &InformationPanel::setSelection);
  1181.     connect(this, &DolphinMainWindow::requestItemInfo,
  1182.             infoPanel, &InformationPanel::requestDelayedItemInfo);
  1183.  
  1184.     // Setup "Folders"
  1185.     DolphinDockWidget* foldersDock = new DolphinDockWidget(i18nc("@title:window", "Folders"));
  1186.     foldersDock->setLocked(lock);
  1187.     foldersDock->setObjectName("foldersDock");
  1188.     foldersDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
  1189.     FoldersPanel* foldersPanel = new FoldersPanel(foldersDock);
  1190.     foldersPanel->setCustomContextMenuActions({lockLayoutAction});
  1191.     foldersDock->setWidget(foldersPanel);
  1192.  
  1193.     QAction* foldersAction = foldersDock->toggleViewAction();
  1194.     createPanelAction(QIcon::fromTheme("folder"), Qt::Key_F7, foldersAction, "show_folders_panel");
  1195.  
  1196.     addDockWidget(Qt::LeftDockWidgetArea, foldersDock);
  1197.     connect(this, &DolphinMainWindow::urlChanged,
  1198.             foldersPanel, &FoldersPanel::setUrl);
  1199.     connect(foldersPanel, &FoldersPanel::folderActivated,
  1200.             this, &DolphinMainWindow::changeUrl);
  1201.     connect(foldersPanel, &FoldersPanel::folderMiddleClicked,
  1202.             this, &DolphinMainWindow::openNewTab);
  1203.     connect(foldersPanel, &FoldersPanel::errorMessage,
  1204.             this, &DolphinMainWindow::showErrorMessage);
  1205.  
  1206.     // Setup "Terminal"
  1207. #ifndef Q_OS_WIN
  1208.     DolphinDockWidget* terminalDock = new DolphinDockWidget(i18nc("@title:window Shell terminal", "Terminal"));
  1209.     terminalDock->setLocked(lock);
  1210.     terminalDock->setObjectName("terminalDock");
  1211.     terminalDock->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
  1212.     TerminalPanel* terminalPanel = new TerminalPanel(terminalDock);
  1213.     terminalPanel->setCustomContextMenuActions({lockLayoutAction});
  1214.     terminalDock->setWidget(terminalPanel);
  1215.  
  1216.     connect(terminalPanel, &TerminalPanel::hideTerminalPanel, terminalDock, &DolphinDockWidget::hide);
  1217.     connect(terminalPanel, &TerminalPanel::changeUrl, this, &DolphinMainWindow::slotTerminalDirectoryChanged);
  1218.     connect(terminalDock, &DolphinDockWidget::visibilityChanged,
  1219.             terminalPanel, &TerminalPanel::dockVisibilityChanged);
  1220.  
  1221.     QAction* terminalAction = terminalDock->toggleViewAction();
  1222.     createPanelAction(QIcon::fromTheme("utilities-terminal"), Qt::Key_F4, terminalAction, "show_terminal_panel");
  1223.  
  1224.     addDockWidget(Qt::BottomDockWidgetArea, terminalDock);
  1225.     connect(this, &DolphinMainWindow::urlChanged,
  1226.             terminalPanel, &TerminalPanel::setUrl);
  1227. #endif
  1228.  
  1229.     if (GeneralSettings::version() < 200) {
  1230.         infoDock->hide();
  1231.         foldersDock->hide();
  1232. #ifndef Q_OS_WIN
  1233.         terminalDock->hide();
  1234. #endif
  1235.     }
  1236.  
  1237.     // Setup "Places"
  1238.     DolphinDockWidget* placesDock = new DolphinDockWidget(i18nc("@title:window", "Places"));
  1239.     placesDock->setLocked(lock);
  1240.     placesDock->setObjectName("placesDock");
  1241.     placesDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
  1242.  
  1243.     PlacesPanel* placesPanel = new PlacesPanel(placesDock);
  1244.     placesPanel->setCustomContextMenuActions({lockLayoutAction});
  1245.     placesDock->setWidget(placesPanel);
  1246.  
  1247.     QAction* placesAction = placesDock->toggleViewAction();
  1248.     createPanelAction(QIcon::fromTheme("bookmarks"), Qt::Key_F9, placesAction, "show_places_panel");
  1249.  
  1250.     addDockWidget(Qt::LeftDockWidgetArea, placesDock);
  1251.     connect(placesPanel, &PlacesPanel::placeActivated,
  1252.             this, &DolphinMainWindow::slotPlaceActivated);
  1253.     connect(placesPanel, SIGNAL(placeMiddleClicked(QUrl)),
  1254.             this, SLOT(openNewTab(QUrl)));
  1255.     connect(placesPanel, &PlacesPanel::errorMessage,
  1256.             this, &DolphinMainWindow::showErrorMessage);
  1257.     connect(this, &DolphinMainWindow::urlChanged,
  1258.             placesPanel, &PlacesPanel::setUrl);
  1259.     connect(placesDock, &DolphinDockWidget::visibilityChanged,
  1260.             m_tabWidget, &DolphinTabWidget::slotPlacesPanelVisibilityChanged);
  1261.     connect(this, &DolphinMainWindow::settingsChanged,
  1262.         placesPanel, &PlacesPanel::readSettings);
  1263.  
  1264.     m_tabWidget->slotPlacesPanelVisibilityChanged(placesPanel->isVisible());
  1265.  
  1266.     // Add actions into the "Panels" menu
  1267.     KActionMenu* panelsMenu = new KActionMenu(i18nc("@action:inmenu View", "Panels"), this);
  1268.     actionCollection()->addAction("panels", panelsMenu);
  1269.     panelsMenu->setDelayed(false);
  1270.     const KActionCollection* ac = actionCollection();
  1271.     panelsMenu->addAction(ac->action("show_places_panel"));
  1272.     panelsMenu->addAction(ac->action("show_information_panel"));
  1273.     panelsMenu->addAction(ac->action("show_folders_panel"));
  1274. #ifndef Q_OS_WIN
  1275.     panelsMenu->addAction(ac->action("show_terminal_panel"));
  1276. #endif
  1277.     panelsMenu->addSeparator();
  1278.     panelsMenu->addAction(lockLayoutAction);
  1279. }
  1280.  
  1281. void DolphinMainWindow::updateEditActions()
  1282. {
  1283.     const KFileItemList list = m_activeViewContainer->view()->selectedItems();
  1284.     if (list.isEmpty()) {
  1285.         stateChanged("has_no_selection");
  1286.     } else {
  1287.         stateChanged("has_selection");
  1288.  
  1289.         KActionCollection* col = actionCollection();
  1290.         QAction* renameAction      = col->action("rename");
  1291.         QAction* moveToTrashAction = col->action("move_to_trash");
  1292.         QAction* deleteAction      = col->action("delete");
  1293.         QAction* cutAction         = col->action(KStandardAction::name(KStandardAction::Cut));
  1294.         QAction* deleteWithTrashShortcut = col->action("delete_shortcut"); // see DolphinViewActionHandler
  1295.  
  1296.         KFileItemListProperties capabilities(list);
  1297.         const bool enableMoveToTrash = capabilities.isLocal() && capabilities.supportsMoving();
  1298.  
  1299.         renameAction->setEnabled(capabilities.supportsMoving());
  1300.         moveToTrashAction->setEnabled(enableMoveToTrash);
  1301.         deleteAction->setEnabled(capabilities.supportsDeleting());
  1302.         deleteWithTrashShortcut->setEnabled(capabilities.supportsDeleting() && !enableMoveToTrash);
  1303.         cutAction->setEnabled(capabilities.supportsMoving());
  1304.     }
  1305. }
  1306.  
  1307. void DolphinMainWindow::updateViewActions()
  1308. {
  1309.     m_actionHandler->updateViewActions();
  1310.  
  1311.     QAction* showFilterBarAction = actionCollection()->action("show_filter_bar");
  1312.     showFilterBarAction->setChecked(m_activeViewContainer->isFilterBarVisible());
  1313.  
  1314.     updateSplitAction();
  1315.  
  1316.     QAction* editableLocactionAction = actionCollection()->action("editable_location");
  1317.     const KUrlNavigator* urlNavigator = m_activeViewContainer->urlNavigator();
  1318.     editableLocactionAction->setChecked(urlNavigator->isUrlEditable());
  1319. }
  1320.  
  1321. void DolphinMainWindow::updateGoActions()
  1322. {
  1323.     QAction* goUpAction = actionCollection()->action(KStandardAction::name(KStandardAction::Up));
  1324.     const QUrl currentUrl = m_activeViewContainer->url();
  1325.     goUpAction->setEnabled(KIO::upUrl(currentUrl) != currentUrl);
  1326. }
  1327.  
  1328. void DolphinMainWindow::createControlButton()
  1329. {
  1330.     if (m_controlButton) {
  1331.         return;
  1332.     }
  1333.     Q_ASSERT(!m_controlButton);
  1334.  
  1335.     m_controlButton = new QToolButton(this);
  1336.     m_controlButton->setIcon(QIcon::fromTheme("applications-system"));
  1337.     m_controlButton->setText(i18nc("@action", "Control"));
  1338.     m_controlButton->setPopupMode(QToolButton::InstantPopup);
  1339.     m_controlButton->setToolButtonStyle(toolBar()->toolButtonStyle());
  1340.  
  1341.     QMenu* controlMenu = new QMenu(m_controlButton);
  1342.     connect(controlMenu, &QMenu::aboutToShow, this, &DolphinMainWindow::updateControlMenu);
  1343.  
  1344.     m_controlButton->setMenu(controlMenu);
  1345.  
  1346.     toolBar()->addWidget(m_controlButton);
  1347.     connect(toolBar(), &KToolBar::iconSizeChanged,
  1348.             m_controlButton, &QToolButton::setIconSize);
  1349.     connect(toolBar(), &KToolBar::toolButtonStyleChanged,
  1350.             m_controlButton, &QToolButton::setToolButtonStyle);
  1351.  
  1352.     // The added widgets are owned by the toolbar and may get deleted when e.g. the toolbar
  1353.     // gets edited. In this case we must add them again. The adding is done asynchronously by
  1354.     // m_updateToolBarTimer.
  1355.     connect(m_controlButton, &QToolButton::destroyed, this, &DolphinMainWindow::slotControlButtonDeleted);
  1356.     m_updateToolBarTimer = new QTimer(this);
  1357.     m_updateToolBarTimer->setInterval(500);
  1358.     connect(m_updateToolBarTimer, &QTimer::timeout, this, &DolphinMainWindow::updateToolBar);
  1359. }
  1360.  
  1361. void DolphinMainWindow::deleteControlButton()
  1362. {
  1363.     delete m_controlButton;
  1364.     m_controlButton = 0;
  1365.  
  1366.     delete m_updateToolBarTimer;
  1367.     m_updateToolBarTimer = 0;
  1368. }
  1369.  
  1370. bool DolphinMainWindow::addActionToMenu(QAction* action, QMenu* menu)
  1371. {
  1372.     Q_ASSERT(action);
  1373.     Q_ASSERT(menu);
  1374.  
  1375.     const KToolBar* toolBarWidget = toolBar();
  1376.     foreach (const QWidget* widget, action->associatedWidgets()) {
  1377.         if (widget == toolBarWidget) {
  1378.             return false;
  1379.         }
  1380.     }
  1381.  
  1382.     menu->addAction(action);
  1383.     return true;
  1384. }
  1385.  
  1386. void DolphinMainWindow::refreshViews()
  1387. {
  1388.     m_tabWidget->refreshViews();
  1389.  
  1390.     if (GeneralSettings::modifiedStartupSettings()) {
  1391.         // The startup settings have been changed by the user (see bug #254947).
  1392.         // Synchronize the split-view setting with the active view:
  1393.         const bool splitView = GeneralSettings::splitView();
  1394.         m_tabWidget->currentTabPage()->setSplitViewEnabled(splitView);
  1395.         updateSplitAction();
  1396.     }
  1397.  
  1398.     emit settingsChanged();
  1399. }
  1400.  
  1401. void DolphinMainWindow::clearStatusBar()
  1402. {
  1403.     m_activeViewContainer->statusBar()->resetToDefaultText();
  1404. }
  1405.  
  1406. void DolphinMainWindow::connectViewSignals(DolphinViewContainer* container)
  1407. {
  1408.     connect(container, &DolphinViewContainer::showFilterBarChanged,
  1409.             this, &DolphinMainWindow::updateViewActions);
  1410.     connect(container, &DolphinViewContainer::writeStateChanged,
  1411.             this, &DolphinMainWindow::slotWriteStateChanged);
  1412.  
  1413.     const DolphinView* view = container->view();
  1414.     connect(view, &DolphinView::selectionChanged,
  1415.             this, &DolphinMainWindow::slotSelectionChanged);
  1416.     connect(view, &DolphinView::requestItemInfo,
  1417.             this, &DolphinMainWindow::requestItemInfo);
  1418.     connect(view, &DolphinView::tabRequested,
  1419.             this, &DolphinMainWindow::openNewTab);
  1420.     connect(view, &DolphinView::requestContextMenu,
  1421.             this, &DolphinMainWindow::openContextMenu);
  1422.     connect(view, &DolphinView::directoryLoadingStarted,
  1423.             this, &DolphinMainWindow::enableStopAction);
  1424.     connect(view, &DolphinView::directoryLoadingCompleted,
  1425.             this, &DolphinMainWindow::disableStopAction);
  1426.     connect(view, &DolphinView::directoryLoadingCompleted,
  1427.             this, &DolphinMainWindow::slotDirectoryLoadingCompleted);
  1428.     connect(view, &DolphinView::goBackRequested,
  1429.             this, static_cast<void(DolphinMainWindow::*)()>(&DolphinMainWindow::goBack));
  1430.     connect(view, &DolphinView::goForwardRequested,
  1431.             this, static_cast<void(DolphinMainWindow::*)()>(&DolphinMainWindow::goForward));
  1432.  
  1433.     const KUrlNavigator* navigator = container->urlNavigator();
  1434.     connect(navigator, &KUrlNavigator::urlChanged,
  1435.             this, &DolphinMainWindow::changeUrl);
  1436.     connect(navigator, &KUrlNavigator::historyChanged,
  1437.             this, &DolphinMainWindow::updateHistory);
  1438.     connect(navigator, &KUrlNavigator::editableStateChanged,
  1439.             this, &DolphinMainWindow::slotEditableStateChanged);
  1440.     connect(navigator, &KUrlNavigator::tabRequested,
  1441.             this, &DolphinMainWindow::openNewTab);
  1442. }
  1443.  
  1444. void DolphinMainWindow::updateSplitAction()
  1445. {
  1446.     QAction* splitAction = actionCollection()->action("split_view");
  1447.     const DolphinTabPage* tabPage = m_tabWidget->currentTabPage();
  1448.     if (tabPage->splitViewEnabled()) {
  1449.         if (tabPage->primaryViewActive()) {
  1450.             splitAction->setText(i18nc("@action:intoolbar Close left view", "Close"));
  1451.             splitAction->setToolTip(i18nc("@info", "Close left view"));
  1452.             splitAction->setIcon(QIcon::fromTheme("view-left-close"));
  1453.         } else {
  1454.             splitAction->setText(i18nc("@action:intoolbar Close right view", "Close"));
  1455.             splitAction->setToolTip(i18nc("@info", "Close right view"));
  1456.             splitAction->setIcon(QIcon::fromTheme("view-right-close"));
  1457.         }
  1458.     } else {
  1459.         splitAction->setText(i18nc("@action:intoolbar Split view", "Split"));
  1460.         splitAction->setToolTip(i18nc("@info", "Split view"));
  1461.         splitAction->setIcon(QIcon::fromTheme("view-right-new"));
  1462.     }
  1463. }
  1464.  
  1465. bool DolphinMainWindow::isKompareInstalled() const
  1466. {
  1467.     static bool initialized = false;
  1468.     static bool installed = false;
  1469.     if (!initialized) {
  1470.         // TODO: maybe replace this approach later by using a menu
  1471.         // plugin like kdiff3plugin.cpp
  1472.         installed = !QStandardPaths::findExecutable(QStringLiteral("kompare")).isEmpty();
  1473.         initialized = true;
  1474.     }
  1475.     return installed;
  1476. }
  1477.  
  1478. bool DolphinMainWindow::eventFilter(QObject *object, QEvent *event)
  1479. {
  1480.     if (object == actionCollection()->action("show_filter_bar")) {
  1481.         if (event->type() == QEvent::Shortcut) {
  1482.             setFilterBarFocus();
  1483.             updateViewActions();
  1484.         }
  1485.         return true;
  1486.     } else {
  1487.         return false;
  1488.     }
  1489. }
  1490.  
  1491. void DolphinMainWindow::setFilterBarFocus()
  1492. {
  1493.     m_activeViewContainer->setFilterBarVisible(!m_activeViewContainer->filterBarHasFocus());
  1494. }
  1495.  
  1496. void DolphinMainWindow::createPanelAction(const QIcon& icon,
  1497.                                           const QKeySequence& shortcut,
  1498.                                           QAction* dockAction,
  1499.                                           const QString& actionName)
  1500. {
  1501.     QAction* panelAction = actionCollection()->addAction(actionName);
  1502.     panelAction->setCheckable(true);
  1503.     panelAction->setChecked(dockAction->isChecked());
  1504.     panelAction->setText(dockAction->text());
  1505.     panelAction->setIcon(icon);
  1506.     actionCollection()->setDefaultShortcut(panelAction, shortcut);
  1507.  
  1508.     connect(panelAction, &QAction::triggered, dockAction, &QAction::trigger);
  1509.     connect(dockAction, &QAction::toggled, panelAction, &QAction::setChecked);
  1510. }
  1511.  
  1512. DolphinMainWindow::UndoUiInterface::UndoUiInterface() :
  1513.     KIO::FileUndoManager::UiInterface()
  1514. {
  1515. }
  1516.  
  1517. DolphinMainWindow::UndoUiInterface::~UndoUiInterface()
  1518. {
  1519. }
  1520.  
  1521. void DolphinMainWindow::UndoUiInterface::jobError(KIO::Job* job)
  1522. {
  1523.     DolphinMainWindow* mainWin= qobject_cast<DolphinMainWindow *>(parentWidget());
  1524.     if (mainWin) {
  1525.         DolphinViewContainer* container = mainWin->activeViewContainer();
  1526.         container->showMessage(job->errorString(), DolphinViewContainer::Error);
  1527.     } else {
  1528.         KIO::FileUndoManager::UiInterface::jobError(job);
  1529.     }
  1530. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement