From af809b3a528bb8c4d57a22484a72b8414b869bda Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 23 Mar 2023 12:28:44 +0100 Subject: [PATCH] Terminal: Add context menu & Settings button Fixes: QTCREATORBUG-28937 Change-Id: I9dab5da0adccb8cff4d4e824ead0eba3e27eef5c Reviewed-by: Cristian Adam --- src/plugins/terminal/terminalcommands.cpp | 5 +++++ src/plugins/terminal/terminalcommands.h | 3 +++ src/plugins/terminal/terminalpane.cpp | 12 ++++++++++-- src/plugins/terminal/terminalpane.h | 1 + src/plugins/terminal/terminalwidget.cpp | 14 +++++++++++++- 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/plugins/terminal/terminalcommands.cpp b/src/plugins/terminal/terminalcommands.cpp index 9f177720b3e..28b8583c93a 100644 --- a/src/plugins/terminal/terminalcommands.cpp +++ b/src/plugins/terminal/terminalcommands.cpp @@ -129,4 +129,9 @@ bool TerminalCommands::triggerAction(QKeyEvent *event) return false; } +QAction *TerminalCommands::openSettingsAction() +{ + return ActionManager::command("Preferences.Terminal.General")->action(); +} + } // namespace Terminal diff --git a/src/plugins/terminal/terminalcommands.h b/src/plugins/terminal/terminalcommands.h index 11392f2dcfc..795e5188acd 100644 --- a/src/plugins/terminal/terminalcommands.h +++ b/src/plugins/terminal/terminalcommands.h @@ -20,6 +20,7 @@ struct WidgetActions QAction copy{Tr::tr("Copy")}; QAction paste{Tr::tr("Paste")}; QAction clearSelection{Tr::tr("Clear Selection")}; + QAction clearTerminal{Tr::tr("Clear Terminal")}; }; struct PaneActions @@ -45,6 +46,8 @@ public: static bool triggerAction(QKeyEvent *event); + static QAction *openSettingsAction(); + protected: void initWidgetActions(const Core::Context &context); void initPaneActions(const Core::Context &context); diff --git a/src/plugins/terminal/terminalpane.cpp b/src/plugins/terminal/terminalpane.cpp index cdf14c55e37..c94fbc0b3bb 100644 --- a/src/plugins/terminal/terminalpane.cpp +++ b/src/plugins/terminal/terminalpane.cpp @@ -21,7 +21,7 @@ #include #include -#include +#include namespace Terminal { @@ -111,6 +111,14 @@ TerminalPane::TerminalPane(QObject *parent) if (minMaxCommand) emit minMaxCommand->action()->triggered(); }); + + m_openSettingsButton = new QToolButton(); + m_openSettingsButton->setToolTip(Tr::tr("Open Terminal Settings")); + m_openSettingsButton->setIcon(Icons::SETTINGS_TOOLBAR.icon()); + + connect(m_openSettingsButton, &QToolButton::clicked, m_openSettingsButton, []() { + TerminalCommands::openSettingsAction()->trigger(); + }); } TerminalPane::~TerminalPane() @@ -252,7 +260,7 @@ QList TerminalPane::toolBarWidgets() const widgets.prepend(m_newTerminalButton); widgets.prepend(m_closeTerminalButton); - return widgets; + return widgets << m_openSettingsButton; } QString TerminalPane::displayName() const diff --git a/src/plugins/terminal/terminalpane.h b/src/plugins/terminal/terminalpane.h index fd902f9176a..47cb3ac039e 100644 --- a/src/plugins/terminal/terminalpane.h +++ b/src/plugins/terminal/terminalpane.h @@ -53,6 +53,7 @@ private: QToolButton *m_newTerminalButton{nullptr}; QToolButton *m_closeTerminalButton{nullptr}; + QToolButton *m_openSettingsButton{nullptr}; bool m_widgetInitialized{false}; }; diff --git a/src/plugins/terminal/terminalwidget.cpp b/src/plugins/terminal/terminalwidget.cpp index 5c099d96f8c..50f4ac0c1c6 100644 --- a/src/plugins/terminal/terminalwidget.cpp +++ b/src/plugins/terminal/terminalwidget.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -232,6 +233,7 @@ void TerminalWidget::setupActions() connect(&a.copy, &QAction::triggered, this, ifHasFocus(&TerminalWidget::copyToClipboard)); connect(&a.paste, &QAction::triggered, this, ifHasFocus(&TerminalWidget::pasteFromClipboard)); connect(&a.clearSelection, &QAction::triggered, this, ifHasFocus(&TerminalWidget::clearSelection)); + connect(&a.clearTerminal, &QAction::triggered, this, ifHasFocus(&TerminalWidget::clearContents)); // clang-format on } @@ -1078,7 +1080,17 @@ void TerminalWidget::mousePressEvent(QMouseEvent *event) event->accept(); updateViewport(); } else if (event->button() == Qt::RightButton) { - if (m_selection) { + if (event->modifiers() == Qt::ShiftModifier) { + QMenu *contextMenu = new QMenu(this); + contextMenu->addAction(&TerminalCommands::widgetActions().copy); + contextMenu->addAction(&TerminalCommands::widgetActions().paste); + contextMenu->addSeparator(); + contextMenu->addAction(&TerminalCommands::widgetActions().clearTerminal); + contextMenu->addSeparator(); + contextMenu->addAction(TerminalCommands::openSettingsAction()); + + contextMenu->popup(event->globalPos()); + } else if (m_selection) { copyToClipboard(); setSelection(std::nullopt); } else {