fixup! Adopt KHamburgerMenu

This commit is contained in:
Andrey Butirsky
2022-11-08 23:30:36 +04:00
parent b04265e9fa
commit b8325d2f18
12 changed files with 111 additions and 76 deletions

View File

@@ -4,3 +4,4 @@ add_subdirectory( keyboard-layouts )
add_subdirectory( layouts )
install( FILES konsole.knsrc DESTINATION ${KDE_INSTALL_KNSRCDIR})
install(FILES konsolerc DESTINATION ${KDE_INSTALL_CONFDIR})

2
data/konsolerc Normal file
View File

@@ -0,0 +1,2 @@
[MainWindow]
MenuBar=Disabled

View File

@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<!DOCTYPE gui SYSTEM "kpartgui.dtd">
<gui name="konsole" version="20">
<gui name="konsole" version="19">
<MenuBar>
<Menu name="file"><text>File</text>
<Action name="new-window"/>
@@ -56,14 +56,9 @@
</Menu>
</MenuBar>
<ToolBar name="mainToolBar">
<!-- FIXME: setting session toolbar to index 0 and main toolbar to index 1
doesn't seem to put them in the right order; the main toolbar is still first! -->
<text>Main Toolbar</text>
<index>1</index>
<!-- FIXME: doesn't seem to appear -->
<Spacer/>
<index>0</index>
<Action name="new-tab"/>
<Action name="split-view"/>
<Action name="hamburger_menu"/>
</ToolBar>
</gui>

View File

@@ -68,9 +68,11 @@
</Menu>
<ToolBar name="sessionToolbar">
<text>Session Toolbar</text>
<index>0</index>
<index>1</index>
<Spacer/>
<Action name="edit_copy" />
<Action name="edit_paste" />
<Action name="edit_find" />
<Action name="hamburger_menu"/>
</ToolBar>
</gui>

View File

@@ -8,5 +8,17 @@ target_link_libraries(konsole_globalaccel PRIVATE
KF5::Service
)
install(TARGETS konsole_globalaccel DESTINATION ${KDE_INSTALL_LIBDIR}/kconf_update_bin)
install(FILES konsole_globalaccel.upd DESTINATION ${KDE_INSTALL_KCONFUPDATEDIR})
set(konsole_show_menubar_SRCS konsole_show_menubar.cpp)
qt_add_resources(konsole_show_menubar_SRCS ../desktop/konsole.qrc)
add_executable(konsole_show_menubar ${konsole_show_menubar_SRCS})
target_link_libraries(konsole_show_menubar
KF5::XmlGui
)
install(FILES konsole.upd DESTINATION ${KDE_INSTALL_KCONFUPDATEDIR})
install(PROGRAMS konsole_add_hamburgermenu_to_toolbar.sh DESTINATION ${KDE_INSTALL_KCONFUPDATEDIR})
install(TARGETS konsole_globalaccel konsole_show_menubar DESTINATION ${KDE_INSTALL_LIBDIR}/kconf_update_bin)

9
kconf_update/konsole.upd Normal file
View File

@@ -0,0 +1,9 @@
Version=5
Id=konsole_globalaccel
File=khotkeysrc
Script=konsole_globalaccel
Id=add-hamburgermenu-to-toolbar
Script=konsole_add_hamburgermenu_to_toolbar.sh
Script=konsole_show_menubar

View File

@@ -0,0 +1,6 @@
#!/bin/sh
sed --regexp-extended --null-data --in-place '
s/(<ToolBar.*)(<\/ToolBar>)/\1<Action name="hamburger_menu"\/>\n\2/
' \
`qtpaths --locate-file GenericDataLocation kxmlgui5/konsole/sessionui.rc`

View File

@@ -1,4 +0,0 @@
Version=5
Id=konsole_globalaccel
File=khotkeysrc
Script=konsole_globalaccel

View File

@@ -0,0 +1,31 @@
/*
SPDX-FileCopyrightText: 2022 Andrey Butirsky <butirsky@gmail.com>
SPDX-License-Identifier: GPL-2.0-or-later
Keeps Menu Bar enabled if user has hidden a Session Toolbar thus no Hamburger Menu button is shown
*/
#include <QApplication>
#include <KAboutData>
#include <KXmlGuiWindow>
#include <KSharedConfig>
#include <KConfigGroup>
#include <QMenuBar>
#include <KToolBar>
int main (int argc, char *argv[])
{
QApplication app(argc, argv);
KAboutData::setApplicationData(KAboutData(QStringLiteral("konsole")));
KXmlGuiWindow mainWindow;
mainWindow.setupGUI(KXmlGuiWindow::Default, QStringLiteral("sessionui.rc"));
static const char menuBarKey[] = "MenuBar";
// SimpleConfig so that system-wide default won't interfere and hasKey() indicates user defined setting
if (auto cg = KSharedConfig::openConfig(QStringLiteral("konsolerc"), KConfig::OpenFlag::SimpleConfig)->group("MainWindow"); !cg.hasKey(menuBarKey) &&
mainWindow.menuBar()->isHidden() && mainWindow.toolBar(QStringLiteral("sessionToolbar"))->isHidden()) {
cg.writeEntry(menuBarKey, "Enabled");
}
}

View File

@@ -24,6 +24,7 @@
#include <KIconUtils>
#include <KLocalizedString>
#include <KShortcutsDialog>
#include <KToolBar>
#include <KWindowEffects>
#include <KMessageBox>
@@ -39,7 +40,6 @@
// Konsole
#include "BookmarkHandler.h"
#include "BookmarkMenu.h"
#include "KonsoleSettings.h"
#include "ViewManager.h"
#include "WindowSystemInfo.h"
@@ -63,8 +63,6 @@
#include <konsoledebug.h>
#include <functional>
using namespace Konsole;
MainWindow::MainWindow()
@@ -74,7 +72,6 @@ MainWindow::MainWindow()
, _toggleMenuBarAction(nullptr)
, _newTabMenuAction(nullptr)
, _pluggedController(nullptr)
, _hamburgerMenu(nullptr)
{
// Set the WA_NativeWindow attribute to force the creation of the QWindow.
// Without this QWidget::windowHandle() returns 0.
@@ -89,7 +86,8 @@ MainWindow::MainWindow()
// create view manager
_viewManager = new ViewManager(this, actionCollection());
connect(_viewManager, &Konsole::ViewManager::empty, this, &QWidget::close);
connect(_viewManager, &Konsole::ViewManager::activeViewChanged, this, &Konsole::MainWindow::activeViewChanged);
// QueuedConnection so that KHamburgerMenu showed up properly on the first tab
connect(_viewManager, &Konsole::ViewManager::activeViewChanged, this, &Konsole::MainWindow::activeViewChanged, Qt::QueuedConnection);
connect(_viewManager, &Konsole::ViewManager::unplugController, this, &Konsole::MainWindow::disconnectController);
connect(_viewManager, &Konsole::ViewManager::viewPropertiesChanged, bookmarkHandler(), &Konsole::BookmarkHandler::setViews);
connect(_viewManager, &Konsole::ViewManager::blurSettingChanged, this, &Konsole::MainWindow::setBlur);
@@ -284,6 +282,11 @@ void MainWindow::activeViewChanged(SessionController *controller)
connect(controller, &Konsole::SessionController::rawTitleChanged, this, &Konsole::MainWindow::updateWindowCaption);
connect(controller, &Konsole::SessionController::iconChanged, this, &Konsole::MainWindow::updateWindowIcon);
// to prevent shortcuts conflict
if (auto hamburgerMenu = _hamburgerMenu->menu()) {
hamburgerMenu->clear();
}
controller->setShowMenuAction(_toggleMenuBarAction);
guiFactory()->addClient(controller);
@@ -428,27 +431,14 @@ void MainWindow::setupActions()
_hamburgerMenu = KStandardAction::hamburgerMenu(nullptr, nullptr, collection);
_hamburgerMenu->setShowMenuBarAction(_toggleMenuBarAction);
_hamburgerMenu->setMenuBar(menuBar());
connect(_hamburgerMenu, &KHamburgerMenu::aboutToShowMenu, [this]() {
updateHamburgerMenu();
});
connect(_hamburgerMenu, &KHamburgerMenu::aboutToShowMenu, this, &MainWindow::updateHamburgerMenu);
}
void MainWindow::updateHamburgerMenu()
{
KActionCollection *collection = actionCollection();
QList<KActionCollection *> allCollections = actionCollection()->allCollections();
KActionCollection *controllerCollection = _pluggedController->actionCollection();
std::function<QAction *(const QString &)> actionByName = [allCollections](const QString &name) {
for (auto *ac : allCollections) {
auto actions = ac->actions();
for (auto *action : actions) {
if (action->objectName() == name) {
return action;
}
}
}
return static_cast<QAction *>(nullptr);
};
QMenu *menu = _hamburgerMenu->menu();
if (!menu) {
menu = new QMenu(widget());
@@ -459,58 +449,56 @@ void MainWindow::updateHamburgerMenu()
menu->addAction(collection->action(QStringLiteral("new-window")));
menu->addAction(collection->action(QStringLiteral("new-tab")));
menu->addAction(actionByName(QStringLiteral("file_save_as")));
menu->addAction(controllerCollection->action(QStringLiteral("file_save_as")));
menu->addSeparator();
menu->addAction(actionByName(QStringLiteral("edit-copy")));
menu->addAction(actionByName(QStringLiteral("edit-paste")));
menu->addAction(actionByName(QStringLiteral("edit-find")));
menu->addAction(controllerCollection->action(QStringLiteral("edit_copy")));
menu->addAction(controllerCollection->action(QStringLiteral("edit_paste")));
menu->addAction(controllerCollection->action(QStringLiteral("edit_find")));
menu->addSeparator();
// FIXME: missing
menu->addAction(actionByName(QStringLiteral("view-full-screen")));
menu->addAction(actionByName(QStringLiteral("view-split")));
// FIXME: this causes it to get duplicated and then there's a shortcut conflict
menu->addAction(actionByName(QStringLiteral("clear-history-and-reset")));
menu->addAction(actionByName(QStringLiteral("enlarge-font")));
menu->addAction(actionByName(QStringLiteral("reset-font-size")));
menu->addAction(actionByName(QStringLiteral("shrink-font")));
menu->addAction(collection->action(QLatin1String(KStandardAction::name(KStandardAction::FullScreen))));
menu->addAction(collection->action(QStringLiteral("split-view")));
menu->addAction(controllerCollection->action(QStringLiteral("clear-history-and-reset")));
menu->addAction(controllerCollection->action(QStringLiteral("enlarge-font")));
menu->addAction(controllerCollection->action(QStringLiteral("reset-font-size")));
menu->addAction(controllerCollection->action(QStringLiteral("shrink-font")));
menu->addSeparator();
menu->addAction(actionByName(QStringLiteral("edit-current-profile")));
menu->addAction(actionByName(QStringLiteral("switch-profile")));
menu->addAction(controllerCollection->action(QStringLiteral("edit-current-profile")));
menu->addAction(controllerCollection->action(QStringLiteral("switch-profile")));
menu->addSeparator();
auto monitorMenu = menu->addMenu(QIcon::fromTheme(QStringLiteral("visibility")), i18nc("@action:inmenu menu for 'monitor for action' actions", "Monitor"));
monitorMenu->addAction(actionByName(QStringLiteral("monitor-silence")));
monitorMenu->addAction(actionByName(QStringLiteral("monitor-activity")));
monitorMenu->addAction(actionByName(QStringLiteral("monitor-process-finish")));
auto monitorMenu = menu->addMenu(QIcon::fromTheme(QStringLiteral("visibility")), static_cast<QMenu *>(factory()->container(QStringLiteral("view"), nullptr))->title());
monitorMenu->addAction(controllerCollection->action(QStringLiteral("monitor-silence")));
monitorMenu->addAction(controllerCollection->action(QStringLiteral("monitor-activity")));
monitorMenu->addAction(controllerCollection->action(QStringLiteral("monitor-process-finish")));
menu->addMenu(monitorMenu);
_hamburgerMenu->hideActionsOf(monitorMenu);
auto bookmarkMenu = collection->action(QStringLiteral("bookmark"));
bookmarkMenu->setIcon(QIcon::fromTheme(QStringLiteral("bookmarks")));
bookmarkMenu->setIcon(QIcon::fromTheme(QStringLiteral("bookmarks"))); // Icon will be removed again when the menu bar is enabled.
menu->addAction(bookmarkMenu);
auto pluginsMenu = static_cast<QMenu *>(factory()->container(QStringLiteral("plugins"), this));
pluginsMenu->setIcon(QIcon::fromTheme(QStringLiteral("plugins")));
pluginsMenu->setIcon(QIcon::fromTheme(QStringLiteral("plugins"))); // Icon will be removed again when the menu bar is enabled.
menu->addMenu(pluginsMenu);
auto configureMenu = menu->addMenu(QIcon::fromTheme(QStringLiteral("configure")), i18nc("@action:inmenu menu for configure actions", "Configure"));
configureMenu->addAction(collection->action(QStringLiteral("edit-current-profile")));
configureMenu->addAction(collection->action(QString::fromUtf8(KStandardAction::name(KStandardAction::SwitchApplicationLanguage))));
configureMenu->addAction(collection->action(QString::fromUtf8(KStandardAction::name(KStandardAction::KeyBindings))));
configureMenu->addAction(collection->action(QString::fromUtf8(KStandardAction::name(KStandardAction::ConfigureToolbars))));
configureMenu->addAction(collection->action(QString::fromUtf8(KStandardAction::name(KStandardAction::Preferences))));
configureMenu->addAction(collection->action(QStringLiteral("configure-settings")));
configureMenu->addAction(collection->action(QStringLiteral("configure-language")));
configureMenu->addAction(collection->action(QStringLiteral("configure-shortcuts")));
configureMenu->addAction(collection->action(QStringLiteral("configure-notifications")));
auto configureMenu = menu->addMenu(QIcon::fromTheme(QStringLiteral("configure")), static_cast<QMenu *>(factory()->container(QStringLiteral("settings"), nullptr))->title());
configureMenu->addAction(toolBarMenuAction());
configureMenu->addSeparator();
configureMenu->addAction(collection->action(QLatin1String(KStandardAction::name(KStandardAction::SwitchApplicationLanguage))));
configureMenu->addAction(collection->action(QLatin1String(KStandardAction::name(KStandardAction::KeyBindings))));
configureMenu->addAction(collection->action(QLatin1String(KStandardAction::name(KStandardAction::ConfigureToolbars))));
configureMenu->addAction(collection->action(QLatin1String(KStandardAction::name(KStandardAction::ConfigureNotifications))));
configureMenu->addAction(collection->action(QLatin1String(KStandardAction::name(KStandardAction::Preferences))));
_hamburgerMenu->hideActionsOf(configureMenu);
_hamburgerMenu->hideActionsOf(toolBar());
}
void MainWindow::viewFullScreen(bool fullScreen)
@@ -529,10 +517,6 @@ void MainWindow::applyMainWindowSettings(const KConfigGroup &config)
// Override the menubar state from the config file
if (_windowArgsMenuBarVisible.enabled) {
menuBar()->setVisible(_windowArgsMenuBarVisible.showMenuBar);
} else {
// FIXME: only do this on first run; we don't want existing Konsole users
// to see any changes to their UI!
menuBar()->hide();
}
_toggleMenuBarAction->setChecked(menuBar()->isVisibleTo(this));
@@ -644,6 +628,9 @@ Session *MainWindow::createSession(Profile::Ptr profile, const QString &director
auto newView = _viewManager->createView(session);
_viewManager->activeContainer()->addView(newView);
_viewManager->activeViewController()->actionCollection()->addActions(
{_hamburgerMenu});
return session;
}

View File

@@ -27,8 +27,8 @@
class QAction;
class KActionMenu;
class KToggleAction;
class KHamburgerMenu;
class KToggleAction;
namespace Konsole
{

View File

@@ -1987,13 +1987,7 @@ void SessionController::showDisplayContextMenu(const QPoint &position)
_preventClose = true;
if (_showMenuAction != nullptr) {
if (_showMenuAction->isChecked()) {
popup->removeAction(_showMenuAction);
} else {
popup->insertAction(_switchProfileMenu, _showMenuAction);
}
}
static_cast<KHamburgerMenu *>(actionCollection()->action(QLatin1String(KStandardAction::name(KStandardAction::HamburgerMenu))))->addToMenu(popup);
// they are here.
// qDebug() << popup->actions().indexOf(contentActions[0]) << popup->actions().indexOf(contentActions[1]) << popup->actions()[3];