]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Merge branch 'release/21.04'
authorFelix Ernst <fe.a.ernst@gmail.com>
Tue, 22 Jun 2021 09:55:53 +0000 (11:55 +0200)
committerFelix Ernst <fe.a.ernst@gmail.com>
Tue, 22 Jun 2021 09:55:53 +0000 (11:55 +0200)
1  2 
src/dolphincontextmenu.cpp
src/dolphinmainwindow.cpp

index e2a41e907bf27a53526cdb41c6bc10d516c568f7,2b216ce030b566687d9a20f1138656bbf530090a..47f0cdd407f7991e2a4bf33f065efac2db334a84
@@@ -22,7 -22,6 +22,7 @@@
  #include <KActionCollection>
  #include <KFileItemActions>
  #include <KFileItemListProperties>
 +#include <KHamburgerMenu>
  #include <KIO/EmptyTrashJob>
  #include <KIO/JobUiDelegate>
  #include <KIO/Paste>
@@@ -64,10 -63,7 +64,10 @@@ DolphinContextMenu::DolphinContextMenu(
      const DolphinView* view = m_mainWindow->activeViewContainer()->view();
      m_selectedItems = view->selectedItems();
  
 -    QApplication::instance()->installEventFilter(this);
 +    installEventFilter(this);
 +
 +    static_cast<KHamburgerMenu *>(m_mainWindow->actionCollection()->
 +                action(QStringLiteral("hamburger_menu")))->addToMenu(this);
  }
  
  DolphinContextMenu::~DolphinContextMenu()
@@@ -116,28 -112,23 +116,23 @@@ DolphinContextMenu::Command DolphinCont
      return m_command;
  }
  
void DolphinContextMenu::childEvent(QChildEvent* event)
bool DolphinContextMenu::eventFilter(QObject* object, QEvent* event)
  {
-     if(event->added()) {
-         event->child()->installEventFilter(this);
-     }
-     QMenu::childEvent(event);
- }
+     Q_UNUSED(object)
  
- bool DolphinContextMenu::eventFilter(QObject* dest, QEvent* event)
- {
      if(event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) {
          QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
-         if(m_removeAction && keyEvent->key() == Qt::Key_Shift) {
-             if(event->type() == QEvent::KeyPress) {
+         if (m_removeAction && keyEvent->key() == Qt::Key_Shift) {
+             if (event->type() == QEvent::KeyPress) {
                  m_removeAction->update(DolphinRemoveAction::ShiftState::Pressed);
              } else {
                  m_removeAction->update(DolphinRemoveAction::ShiftState::Released);
              }
-             return true;
          }
      }
-     return QMenu::eventFilter(dest, event);
+     return false;
  }
  
  void DolphinContextMenu::openTrashContextMenu()
      QAction* propertiesAction = m_mainWindow->actionCollection()->action(QStringLiteral("properties"));
      addAction(propertiesAction);
  
 -    addShowMenuBarAction();
 -
      if (exec(m_pos) == emptyTrashAction) {
          Trash::empty(m_mainWindow);
      }
@@@ -211,7 -204,7 +206,7 @@@ void DolphinContextMenu::addDirectoryIt
  
      QMenu* menu = newFileMenu->menu();
      menu->setTitle(i18nc("@title:menu Create new folder, file, link, etc.", "Create New"));
 -    menu->setIcon(QIcon::fromTheme(QStringLiteral("document-new")));
 +    menu->setIcon(QIcon::fromTheme(QStringLiteral("list-add")));
      addMenu(menu);
  
      addSeparator();
@@@ -363,6 -356,8 +358,6 @@@ void DolphinContextMenu::openViewportCo
      QAction* propertiesAction = m_mainWindow->actionCollection()->action(QStringLiteral("properties"));
      addAction(propertiesAction);
  
 -    addShowMenuBarAction();
 -
      exec(m_pos);
  }
  
@@@ -423,6 -418,16 +418,6 @@@ void DolphinContextMenu::insertDefaultI
      }
  }
  
 -void DolphinContextMenu::addShowMenuBarAction()
 -{
 -    const KActionCollection* ac = m_mainWindow->actionCollection();
 -    QAction* showMenuBar = ac->action(KStandardAction::name(KStandardAction::ShowMenubar));
 -    if (!m_mainWindow->menuBar()->isVisible() && !m_mainWindow->toolBar()->isVisible()) {
 -        addSeparator();
 -        addAction(showMenuBar);
 -    }
 -}
 -
  bool DolphinContextMenu::placeExists(const QUrl& url) const
  {
      const KFilePlacesModel* placesModel = DolphinPlacesModelSingleton::instance().placesModel();
@@@ -498,7 -503,7 +493,7 @@@ void DolphinContextMenu::addAdditionalA
      addSeparator();
  
      QList<QAction *> additionalActions;
 -    if (props.isDirectory() && props.isLocal()) {
 +    if (props.isDirectory() && props.isLocal() && ContextMenuSettings::showOpenTerminal()) {
          additionalActions << m_mainWindow->actionCollection()->action(QStringLiteral("open_terminal"));
      }
      fileItemActions.addActionsTo(this, KFileItemActions::MenuActionSource::All, additionalActions);
index 5595d0f5ba2e74c6c4e4e9ce2b12c8dfaeff953f,4297321fc1e70b6236bd3a5c8f873cd05d5f4b8a..737856b23dd00e115ec82b6b71ea2e66397d5569
@@@ -24,6 -24,7 +24,6 @@@
  #include "panels/folders/folderspanel.h"
  #include "panels/places/placesitemmodel.h"
  #include "panels/places/placespanel.h"
 -#include "panels/information/informationpanel.h"
  #include "panels/terminal/terminalpanel.h"
  #include "settings/dolphinsettingsdialog.h"
  #include "statusbar/dolphinstatusbar.h"
  #include <KUrlComboBox>
  #include <KUrlNavigator>
  #include <KWindowSystem>
 +#include <KXMLGUIFactory>
  
  #include <QApplication>
  #include <QClipboard>
  #include <QCloseEvent>
  #include <QDesktopServices>
  #include <QDialog>
 +#include <QDomDocument>
  #include <QFileInfo>
  #include <QLineEdit>
  #include <QMenuBar>
@@@ -84,7 -83,7 +84,7 @@@
  namespace {
      // Used for GeneralSettings::version() to determine whether
      // an updated version of Dolphin is running.
 -    const int CurrentDolphinVersion = 200;
 +    const int CurrentDolphinVersion = 201;
      // The maximum number of entries in the back/forward popup menu
      const int MaxNumberOfNavigationentries = 12;
      // The maximum number of "Activate Tab" shortcuts
@@@ -178,21 -177,15 +178,21 @@@ DolphinMainWindow::DolphinMainWindow() 
  
      if (firstRun) {
          menuBar()->setVisible(false);
 -        // Assure a proper default size if Dolphin runs the first time
 -        resize(750, 500);
      }
  
      const bool showMenu = !menuBar()->isHidden();
      QAction* showMenuBarAction = actionCollection()->action(KStandardAction::name(KStandardAction::ShowMenubar));
      showMenuBarAction->setChecked(showMenu);  // workaround for bug #171080
 -    if (!showMenu) {
 -        createControlButton();
 +
 +    auto hamburgerMenu = static_cast<KHamburgerMenu *>(actionCollection()->action(
 +                                    KStandardAction::name(KStandardAction::HamburgerMenu)));
 +    hamburgerMenu->setMenuBar(menuBar());
 +    hamburgerMenu->setShowMenuBarAction(showMenuBarAction);
 +    connect(hamburgerMenu, &KHamburgerMenu::aboutToShowMenu,
 +            this, &DolphinMainWindow::updateHamburgerMenu);
 +    hamburgerMenu->hideActionsOf(toolBar());
 +    if (GeneralSettings::version() < 201 && !toolBar()->actions().contains(hamburgerMenu)) {
 +        addHamburgerMenuToToolbar();
      }
  
      updateAllowedToolbarAreas();
  
  DolphinMainWindow::~DolphinMainWindow()
  {
+     // This fixes a crash on Wayland when closing the mainwindow while another dialog is open.
+     disconnect(QGuiApplication::clipboard(), &QClipboard::dataChanged, this, &DolphinMainWindow::updatePasteAction);
  }
  
  QVector<DolphinViewContainer*> DolphinMainWindow::viewContainers() const
@@@ -987,6 -982,11 +989,6 @@@ void DolphinMainWindow::toggleShowMenuB
  {
      const bool visible = menuBar()->isVisible();
      menuBar()->setVisible(!visible);
 -    if (visible) {
 -        createControlButton();
 -    } else {
 -        deleteControlButton();
 -    }
  }
  
  QPointer<QAction> DolphinMainWindow::preferredSearchTool()
@@@ -1153,91 -1153,87 +1155,91 @@@ void DolphinMainWindow::openContextMenu
      }
  }
  
 -void DolphinMainWindow::updateControlMenu()
 +void DolphinMainWindow::updateHamburgerMenu()
  {
 -    QMenu* menu = qobject_cast<QMenu*>(sender());
 -    Q_ASSERT(menu);
 -
 -    // All actions get cleared by QMenu::clear(). This includes the sub-menus
 -    // because 'menu' is their parent.
 -    menu->clear();
 -
      KActionCollection* ac = actionCollection();
 -
 -    menu->addMenu(m_newFileMenu->menu());
 -    addActionToMenu(ac->action(QStringLiteral("file_new")), menu);
 -    addActionToMenu(ac->action(QStringLiteral("new_tab")), menu);
 -    addActionToMenu(ac->action(QStringLiteral("closed_tabs")), menu);
 -
 -    menu->addSeparator();
 -
 -    // Add "Edit" actions
 -    bool added = addActionToMenu(ac->action(KStandardAction::name(KStandardAction::Undo)), menu) |
 -                 addActionToMenu(ac->action(QString("copy_location")), menu) |
 -                 addActionToMenu(ac->action(QStringLiteral("copy_to_inactive_split_view")), menu) |
 -                 addActionToMenu(ac->action(QStringLiteral("move_to_inactive_split_view")), menu) |
 -                 addActionToMenu(ac->action(KStandardAction::name(KStandardAction::SelectAll)), menu) |
 -                 addActionToMenu(ac->action(QStringLiteral("invert_selection")), menu);
 -
 -    if (added) {
 -        menu->addSeparator();
 +    auto hamburgerMenu = static_cast<KHamburgerMenu *>(
 +                    ac->action(KStandardAction::name(KStandardAction::HamburgerMenu)));
 +    auto menu = hamburgerMenu->menu();
 +    if (!menu) {
 +        menu = new QMenu(this);
 +        hamburgerMenu->setMenu(menu);
 +        hamburgerMenu->hideActionsOf(ac->action(QStringLiteral("basic_actions"))->menu());
 +        hamburgerMenu->hideActionsOf(ac->action(QStringLiteral("zoom"))->menu());
 +    } else {
 +        menu->clear();
      }
 +    const QList<QAction *> toolbarActions = toolBar()->actions();
  
 -    // Add "View" actions
 -    if (!GeneralSettings::showZoomSlider()) {
 -        addActionToMenu(ac->action(KStandardAction::name(KStandardAction::ZoomIn)), menu);
 -        addActionToMenu(ac->action(QStringLiteral("view_zoom_reset")), menu);
 -        addActionToMenu(ac->action(KStandardAction::name(KStandardAction::ZoomOut)), menu);
 +    if (!toolBar()->isVisible()) {
 +        // If neither the menu bar nor the toolbar are visible, these actions should be available.
 +        menu->addAction(ac->action(KStandardAction::name(KStandardAction::ShowMenubar)));
 +        menu->addAction(toolBarMenuAction());
          menu->addSeparator();
      }
  
 -    added = addActionToMenu(ac->action(QStringLiteral("show_preview")), menu) |
 -            addActionToMenu(ac->action(QStringLiteral("show_in_groups")), menu) |
 -            addActionToMenu(ac->action(QStringLiteral("show_hidden_files")), menu) |
 -            addActionToMenu(ac->action(QStringLiteral("additional_info")), menu) |
 -            addActionToMenu(ac->action(QStringLiteral("view_properties")), menu);
 +    // This group of actions (until the next separator) contains all the most basic actions
 +    // necessary to use Dolphin effectively.
 +    menu->addAction(ac->action(QStringLiteral("go_back")));
 +    menu->addAction(ac->action(QStringLiteral("go_forward")));
  
 -    if (added) {
 -        menu->addSeparator();
 +    menu->addMenu(m_newFileMenu->menu());
 +    menu->addAction(ac->action(QStringLiteral("basic_actions")));
 +    menu->addAction(ac->action(KStandardAction::name(KStandardAction::Undo)));
 +    if (!toolBar()->isVisible()
 +        || (!toolbarActions.contains(ac->action(QStringLiteral("toggle_search")))
 +            && !toolbarActions.contains(ac->action(QStringLiteral("open_preferred_search_tool"))))
 +    ) {
 +        menu->addAction(ac->action(KStandardAction::name(KStandardAction::Find)));
 +        // This way a search action will only be added if none of the three available
 +        // search actions is present on the toolbar.
 +    }
 +    if (!toolBar()->isVisible()
 +        || !toolbarActions.contains(ac->action(QStringLiteral("toggle_filter")))
 +    ) {
 +        menu->addAction(ac->action(QStringLiteral("show_filter_bar")));
 +        // This way a filter action will only be added if none of the two available
 +        // filter actions is present on the toolbar.
      }
 -
 -    // Add a curated assortment of items from the "Tools" menu
 -    addActionToMenu(ac->action(QStringLiteral("show_filter_bar")), menu);
 -    addActionToMenu(ac->action(QStringLiteral("open_preferred_search_tool")), menu);
 -    addActionToMenu(ac->action(QStringLiteral("open_terminal")), menu);
 -
      menu->addSeparator();
  
 -    // Add "Show Panels" menu
 -    addActionToMenu(ac->action(QStringLiteral("panels")), menu);
 -
 -    // Add "Settings" menu entries
 -    addActionToMenu(ac->action(KStandardAction::name(KStandardAction::KeyBindings)), menu);
 -    addActionToMenu(ac->action(KStandardAction::name(KStandardAction::ConfigureToolbars)), menu);
 -    addActionToMenu(ac->action(KStandardAction::name(KStandardAction::Preferences)), menu);
 -    addActionToMenu(ac->action(KStandardAction::name(KStandardAction::ShowMenubar)), menu);
 -
 -    // Add "Help" menu
 -    auto helpMenu = m_helpMenu->menu();
 -    helpMenu->setIcon(QIcon::fromTheme(QStringLiteral("system-help")));
 -    menu->addMenu(helpMenu);
 -}
 -
 -void DolphinMainWindow::updateToolBar()
 -{
 -    if (!menuBar()->isVisible()) {
 -        createControlButton();
 +    // The second group of actions (up until the next separator) contains actions for opening
 +    // additional views to interact with the file system.
 +    menu->addAction(ac->action(QStringLiteral("file_new")));
 +    menu->addAction(ac->action(QStringLiteral("new_tab")));
 +    if (ac->action(QStringLiteral("undo_close_tab"))->isEnabled()) {
 +        menu->addAction(ac->action(QStringLiteral("closed_tabs")));
      }
 -}
 +    menu->addAction(ac->action(QStringLiteral("open_terminal")));
 +    menu->addSeparator();
  
 -void DolphinMainWindow::slotControlButtonDeleted()
 -{
 -    m_controlButton = nullptr;
 -    m_updateToolBarTimer->start();
 +    // The third group contains actions to change what one sees in the view
 +    // and to change the more general UI.
 +    if (!toolBar()->isVisible()
 +        || (!toolbarActions.contains(ac->action(QStringLiteral("icons")))
 +            && !toolbarActions.contains(ac->action(QStringLiteral("compact")))
 +            && !toolbarActions.contains(ac->action(QStringLiteral("details")))
 +            && !toolbarActions.contains(ac->action(QStringLiteral("view_mode"))))
 +    ) {
 +        menu->addAction(ac->action(QStringLiteral("view_mode")));
 +    }
 +    menu->addAction(ac->action(QStringLiteral("show_hidden_files")));
 +    menu->addAction(ac->action(QStringLiteral("sort")));
 +    menu->addAction(ac->action(QStringLiteral("additional_info")));
 +    if (!GeneralSettings::showStatusBar() || !GeneralSettings::showZoomSlider()) {
 +        menu->addAction(ac->action(QStringLiteral("zoom")));
 +    }
 +    menu->addAction(ac->action(QStringLiteral("panels")));
 +
 +    // The "Configure" menu is not added to the actionCollection() because there is hardly
 +    // a good reason for users to put it on their toolbar.
 +    auto configureMenu = menu->addMenu(QIcon::fromTheme(QStringLiteral("configure")),
 +                            i18nc("@action:inmenu menu for configure actions", "Configure"));
 +    configureMenu->addAction(ac->action(KStandardAction::name(KStandardAction::SwitchApplicationLanguage)));
 +    configureMenu->addAction(ac->action(KStandardAction::name(KStandardAction::KeyBindings)));
 +    configureMenu->addAction(ac->action(KStandardAction::name(KStandardAction::ConfigureToolbars)));
 +    configureMenu->addAction(ac->action(KStandardAction::name(KStandardAction::Preferences)));
 +    hamburgerMenu->hideActionsOf(configureMenu);
  }
  
  void DolphinMainWindow::slotPlaceActivated(const QUrl& url)
          // which had been unmounted earlier, see https://bugs.kde.org/show_bug.cgi?id=161385.
          reloadView();
      } else {
 +        view->disableUrlNavigatorSelectionRequests();
          changeUrl(url);
 +        view->enableUrlNavigatorSelectionRequests();
      }
  }
  
@@@ -1275,7 -1269,6 +1277,7 @@@ void DolphinMainWindow::activeViewChang
          // view and url navigator) and main window.
          oldViewContainer->disconnect(this);
          oldViewContainer->view()->disconnect(this);
 +        oldViewContainer->urlNavigatorInternalWithHistory()->disconnect(this);
          auto navigators = static_cast<DolphinNavigatorsWidgetAction *>
                            (actionCollection()->action(QStringLiteral("url_navigators")));
          navigators->primaryUrlNavigator()->disconnect(this);
@@@ -1362,13 -1355,11 +1364,13 @@@ void DolphinMainWindow::setViewsToHomeI
  
  void DolphinMainWindow::setupActions()
  {
 +    KStandardAction::hamburgerMenu(nullptr, nullptr, actionCollection());
 +
      // setup 'File' menu
      m_newFileMenu = new DolphinNewFileMenu(actionCollection(), this);
      QMenu* menu = m_newFileMenu->menu();
      menu->setTitle(i18nc("@title:menu Create new folder, file, link, etc.", "Create New"));
 -    menu->setIcon(QIcon::fromTheme(QStringLiteral("document-new")));
 +    menu->setIcon(QIcon::fromTheme(QStringLiteral("list-add")));
      m_newFileMenu->setDelayed(false);
      connect(menu, &QMenu::aboutToShow,
              this, &DolphinMainWindow::updateNewMenu);
@@@ -1797,8 -1788,6 +1799,8 @@@ void DolphinMainWindow::setupDockWidget
              infoPanel, &InformationPanel::setSelection);
      connect(this, &DolphinMainWindow::requestItemInfo,
              infoPanel, &InformationPanel::requestDelayedItemInfo);
 +    connect(this, &DolphinMainWindow::fileItemsChanged,
 +            infoPanel, &InformationPanel::slotFilesItemChanged);
  #endif
  
      // i18n: This is the last paragraph for the "What's This"-texts of all four panels.
@@@ -2087,6 -2076,65 +2089,6 @@@ void DolphinMainWindow::updateGoActions
      goUpAction->setEnabled(KIO::upUrl(currentUrl) != currentUrl);
  }
  
 -void DolphinMainWindow::createControlButton()
 -{
 -    if (m_controlButton) {
 -        return;
 -    }
 -    Q_ASSERT(!m_controlButton);
 -
 -    m_controlButton = new QToolButton(this);
 -    m_controlButton->setAccessibleName(i18nc("@action:intoolbar", "Control"));
 -    m_controlButton->setIcon(QIcon::fromTheme(QStringLiteral("application-menu")));
 -    m_controlButton->setToolTip(i18nc("@action", "Show menu"));
 -    m_controlButton->setAttribute(Qt::WidgetAttribute::WA_CustomWhatsThis);
 -    m_controlButton->setPopupMode(QToolButton::InstantPopup);
 -
 -    QMenu* controlMenu = new QMenu(m_controlButton);
 -    connect(controlMenu, &QMenu::aboutToShow, this, &DolphinMainWindow::updateControlMenu);
 -    controlMenu->installEventFilter(this);
 -
 -    m_controlButton->setMenu(controlMenu);
 -
 -    toolBar()->addWidget(m_controlButton);
 -    connect(toolBar(), &KToolBar::iconSizeChanged,
 -            m_controlButton, &QToolButton::setIconSize);
 -
 -    // The added widgets are owned by the toolbar and may get deleted when e.g. the toolbar
 -    // gets edited. In this case we must add them again. The adding is done asynchronously by
 -    // m_updateToolBarTimer.
 -    connect(m_controlButton, &QToolButton::destroyed, this, &DolphinMainWindow::slotControlButtonDeleted);
 -    m_updateToolBarTimer = new QTimer(this);
 -    m_updateToolBarTimer->setInterval(500);
 -    connect(m_updateToolBarTimer, &QTimer::timeout, this, &DolphinMainWindow::updateToolBar);
 -}
 -
 -void DolphinMainWindow::deleteControlButton()
 -{
 -    delete m_controlButton;
 -    m_controlButton = nullptr;
 -
 -    delete m_updateToolBarTimer;
 -    m_updateToolBarTimer = nullptr;
 -}
 -
 -bool DolphinMainWindow::addActionToMenu(QAction* action, QMenu* menu)
 -{
 -    Q_ASSERT(action);
 -    Q_ASSERT(menu);
 -
 -    const KToolBar* toolBarWidget = toolBar();
 -    const auto associatedWidgets = action->associatedWidgets();
 -    for (const QWidget* widget : associatedWidgets) {
 -        if (widget == toolBarWidget) {
 -            return false;
 -        }
 -    }
 -
 -    menu->addAction(action);
 -    return true;
 -}
 -
  void DolphinMainWindow::refreshViews()
  {
      m_tabWidget->refreshViews();
@@@ -2125,8 -2173,6 +2127,8 @@@ void DolphinMainWindow::connectViewSign
              this, &DolphinMainWindow::slotSelectionChanged);
      connect(view, &DolphinView::requestItemInfo,
              this, &DolphinMainWindow::requestItemInfo);
 +    connect(view, &DolphinView::fileItemsChanged,
 +            this, &DolphinMainWindow::fileItemsChanged);
      connect(view, &DolphinView::tabRequested,
              this, &DolphinMainWindow::openNewTab);
      connect(view, &DolphinView::requestContextMenu,
      connect(view, &DolphinView::goUpRequested,
              this, &DolphinMainWindow::goUp);
  
 +    connect(container->urlNavigatorInternalWithHistory(), &KUrlNavigator::urlChanged,
 +            this, &DolphinMainWindow::changeUrl);
 +    connect(container->urlNavigatorInternalWithHistory(), &KUrlNavigator::historyChanged,
 +            this, &DolphinMainWindow::updateHistory);
 +
      auto navigators = static_cast<DolphinNavigatorsWidgetAction *>
          (actionCollection()->action(QStringLiteral("url_navigators")));
 -
      const KUrlNavigator *navigator = m_tabWidget->currentTabPage()->primaryViewActive() ?
                                       navigators->primaryUrlNavigator() :
                                       navigators->secondaryUrlNavigator();
  
 -    connect(navigator, &KUrlNavigator::urlChanged,
 -            this, &DolphinMainWindow::changeUrl);
      QAction *editableLocactionAction = actionCollection()->action(QStringLiteral("editable_location"));
      editableLocactionAction->setChecked(navigator->isUrlEditable());
      connect(navigator, &KUrlNavigator::editableStateChanged,
      connect(navigator, &KUrlNavigator::tabRequested,
              this, &DolphinMainWindow::openNewTab);
  
 -    disconnect(m_updateHistoryConnection);
 -    m_updateHistoryConnection = connect(
 -            container->urlNavigatorInternalWithHistory(), &KUrlNavigator::historyChanged,
 -            this, &DolphinMainWindow::updateHistory);
  }
  
  void DolphinMainWindow::updateSplitAction()
@@@ -2386,29 -2434,6 +2388,29 @@@ void DolphinMainWindow::setupWhatsThis(
      m_helpMenu->action(KHelpMenu::menuAboutKDE)->setWhatsThis(whatsThisAboutKDE);
  }
  
 +bool DolphinMainWindow::addHamburgerMenuToToolbar()
 +{
 +    QDomDocument domDocument = KXMLGUIClient::domDocument();
 +    if (domDocument.isNull()) {
 +        return false;
 +    }
 +    QDomNode toolbar = domDocument.elementsByTagName(QStringLiteral("ToolBar")).at(0);
 +    if (toolbar.isNull()) {
 +        return false;
 +    }
 +
 +    QDomElement hamburgerMenuElement = domDocument.createElement(QStringLiteral("Action"));
 +    hamburgerMenuElement.setAttribute(QStringLiteral("name"), QStringLiteral("hamburger_menu"));
 +    toolbar.appendChild(hamburgerMenuElement);
 +
 +    KXMLGUIFactory::saveConfigFile(domDocument, xmlFile());
 +    reloadXML();
 +    createGUI();
 +    return true;
 +    // Make sure to also remove the <KXMLGUIFactory> and <QDomDocument> include
 +    // whenever this method is removed (maybe in the year ~2026).
 +}
 +
  bool DolphinMainWindow::event(QEvent *event)
  {
      if (event->type() == QEvent::WhatsThisClicked) {
@@@ -2432,12 -2457,6 +2434,12 @@@ bool DolphinMainWindow::eventFilter(QOb
      return false;
  }
  
 +// Set a sane initial window size
 +QSize DolphinMainWindow::sizeHint() const
 +{
 +    return KXmlGuiWindow::sizeHint().expandedTo(QSize(760, 550));
 +}
 +
  void DolphinMainWindow::saveNewToolbarConfig()
  {
      KXmlGuiWindow::saveNewToolbarConfig(); // Applies the new config. This has to be called first
          m_tabWidget->currentTabPage()->insertNavigatorsWidget(navigators);
      }
      updateAllowedToolbarAreas();
 +    (static_cast<KHamburgerMenu *>(actionCollection()->action(KStandardAction::name(
 +                            KStandardAction::HamburgerMenu))))->hideActionsOf(toolBar());
  }
  
  void DolphinMainWindow::focusTerminalPanel()