From fb12614f2e734b78fb416d8a0ccd99cb43855327 Mon Sep 17 00:00:00 2001 From: liuzhangjian Date: Fri, 19 Jan 2024 16:10:20 +0800 Subject: [PATCH] refactor: [editor] add menu add context menu and margin menu Log: add menu --- src/base/CMakeLists.txt | 2 - src/base/abstracteditormenu.cpp | 85 --------------- src/base/abstracteditormenu.h | 41 ------- src/common/util/eventdefinitions.h | 1 + .../codeeditor/gui/private/texteditor_p.cpp | 58 ++++++++-- .../codeeditor/gui/private/texteditor_p.h | 3 +- src/plugins/codeeditor/gui/texteditor.cpp | 32 +----- src/plugins/codeeditor/gui/texteditor.h | 1 - .../codeeditor/menu/texteditormarginmenu.cpp | 40 ------- .../codeeditor/menu/texteditormarginmenu.h | 24 ---- .../codeeditor/menu/texteditormenu.cpp | 103 ------------------ src/plugins/codeeditor/menu/texteditormenu.h | 32 ------ 12 files changed, 55 insertions(+), 367 deletions(-) delete mode 100644 src/base/abstracteditormenu.cpp delete mode 100644 src/base/abstracteditormenu.h delete mode 100644 src/plugins/codeeditor/menu/texteditormarginmenu.cpp delete mode 100644 src/plugins/codeeditor/menu/texteditormarginmenu.h delete mode 100644 src/plugins/codeeditor/menu/texteditormenu.cpp delete mode 100644 src/plugins/codeeditor/menu/texteditormenu.h diff --git a/src/base/CMakeLists.txt b/src/base/CMakeLists.txt index 058cf558e..782537a8f 100644 --- a/src/base/CMakeLists.txt +++ b/src/base/CMakeLists.txt @@ -2,7 +2,6 @@ project(base) set(CXX_H abstractmenu.h - abstracteditormenu.h abstractaction.h abstractwidget.h abstractdebugger.h @@ -10,7 +9,6 @@ set(CXX_H set(CXX_CPP abstractmenu.cpp - abstracteditormenu.cpp abstractaction.cpp abstractwidget.cpp abstractdebugger.cpp diff --git a/src/base/abstracteditormenu.cpp b/src/base/abstracteditormenu.cpp deleted file mode 100644 index 3af138e81..000000000 --- a/src/base/abstracteditormenu.cpp +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "abstracteditormenu.h" - -AbstractEditorMenu::AbstractEditorMenu(QObject *parent) - : QObject(parent) -{ -} - -AbstractEditorMenu::~AbstractEditorMenu() -{ -} - -bool AbstractEditorMenu::initialize(const QVariantHash ¶ms) -{ - auto current = subMenu; - for (AbstractEditorMenu *scene : current) { - if (!scene->initialize(params)) { - subMenu.removeOne(scene); - delete scene; - } - } - - return true; -} - -bool AbstractEditorMenu::create(QMenu *parent) -{ - for (AbstractEditorMenu *scene : subMenu) - scene->create(parent); - return true; -} - -void AbstractEditorMenu::updateState(QMenu *parent) -{ - for (AbstractEditorMenu *scene : subMenu) - scene->updateState(parent); -} - -bool AbstractEditorMenu::triggered(QAction *action) -{ - for (AbstractEditorMenu *scene : subMenu) - if (scene->triggered(action)) - return true; - - return false; -} - -AbstractEditorMenu *AbstractEditorMenu::menu(QAction *action) const -{ - for (AbstractEditorMenu *scene : subMenu) - if (auto from = scene->menu(action)) - return from; - - return nullptr; -} - -bool AbstractEditorMenu::addSubmenu(AbstractEditorMenu *menu) -{ - if (!menu) - return false; - - menu->setParent(this); - subMenu.append(menu); - return true; -} - -void AbstractEditorMenu::removeSubmenu(AbstractEditorMenu *menu) -{ - if (menu && menu->parent() == this) - menu->setParent(nullptr); - - subMenu.removeOne(menu); -} - -void AbstractEditorMenu::setSubmenu(const QList &menus) -{ - //! if these already were subscenes before setting, the caller is responsible for managing their lifecycle - - subMenu = menus; - for (auto scene : menus) - scene->setParent(this); -} diff --git a/src/base/abstracteditormenu.h b/src/base/abstracteditormenu.h deleted file mode 100644 index dbddcaa2e..000000000 --- a/src/base/abstracteditormenu.h +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef ABSTRACTEDITORMENU_H -#define ABSTRACTEDITORMENU_H - -#include - -QT_BEGIN_NAMESPACE -class QMenu; -class QAction; -QT_END_NAMESPACE - -class AbstractEditorMenu : public QObject -{ - Q_OBJECT -public: - explicit AbstractEditorMenu(QObject *parent = nullptr); - virtual ~AbstractEditorMenu(); - virtual QString name() const = 0; - virtual bool initialize(const QVariantHash ¶ms); - virtual bool create(QMenu *parent); - virtual void updateState(QMenu *parent); - virtual bool triggered(QAction *action); - virtual AbstractEditorMenu *menu(QAction *action) const; - virtual bool addSubmenu(AbstractEditorMenu *menu); - virtual void removeSubmenu(AbstractEditorMenu *scene); - inline QList submenu() const - { - return subMenu; - } - -protected: - virtual void setSubmenu(const QList &menus); - -protected: - QList subMenu; -}; - -#endif // ABSTRACTEDITORMENU_H diff --git a/src/common/util/eventdefinitions.h b/src/common/util/eventdefinitions.h index a5598eb20..99c4eb891 100644 --- a/src/common/util/eventdefinitions.h +++ b/src/common/util/eventdefinitions.h @@ -63,6 +63,7 @@ OPI_OBJECT(editor, OPI_INTERFACE(switchContext, "name") OPI_INTERFACE(switchWorkspace, "name") OPI_INTERFACE(contextMenu, "menu") + OPI_INTERFACE(marginMenu, "menu") OPI_INTERFACE(keyPressEvent, "event") ) diff --git a/src/plugins/codeeditor/gui/private/texteditor_p.cpp b/src/plugins/codeeditor/gui/private/texteditor_p.cpp index 79297b92e..9a7d58118 100644 --- a/src/plugins/codeeditor/gui/private/texteditor_p.cpp +++ b/src/plugins/codeeditor/gui/private/texteditor_p.cpp @@ -4,11 +4,13 @@ #include "texteditor_p.h" #include "utils/editorutils.h" +#include "common/common.h" #include #include +#include #include static constexpr char DEFAULT_FONT_NAME[] { "Courier New" }; @@ -170,19 +172,59 @@ void TextEditorPrivate::updateLineNumberMargin(bool visible) q->updateLineNumberWidth(false); } -QVariantHash TextEditorPrivate::getMenuParams(QContextMenuEvent *event) +void TextEditorPrivate::showContextMenu() { - QVariantHash params; - params.insert("id", q->id()); - params.insert("fileName", fileName); - params.insert("selectedText", q->selectedText()); + QMenu menu; + QAction *action { nullptr }; + if (!q->isReadOnly()) { + action = menu.addAction(tr("Undo"), q, &TextEditor::undo); + action->setEnabled(q->isUndoAvailable()); + action = menu.addAction(tr("Redo"), q, &TextEditor::redo); + action->setEnabled(q->isRedoAvailable()); + + menu.addSeparator(); + + action = menu.addAction(tr("Cut"), q, &TextEditor::cut); + action->setEnabled(q->hasSelectedText()); + } + + action = menu.addAction(tr("Copy"), q, &TextEditor::copy); + action->setEnabled(q->hasSelectedText()); + + if (!q->isReadOnly()) { + action = menu.addAction(tr("Paste"), q, &TextEditor::paste); + action->setEnabled(q->SendScintilla(TextEditor::SCI_CANPASTE)); + + action = menu.addAction(tr("Delete"), q, [this] { q->SendScintilla(TextEditor::SCI_CLEAR); }); + action->setEnabled(q->hasSelectedText()); + } + + menu.addSeparator(); + action = menu.addAction(tr("Select All"), q, [this] { q->selectAll(true); }); + action->setEnabled(q->length() != 0); + + // notify other plugin to add action. + editor.contextMenu(QVariant::fromValue(&menu)); + menu.exec(QCursor::pos()); +} + +void TextEditorPrivate::showMarginMenu() +{ + QMenu menu; int line = 0, index = 0; q->getCursorPosition(&line, &index); - params.insert("cursorLine", line); - params.insert("cursorIndex", index); - return params; + if (q->hasBreakpoint(line)) { + menu.addAction(tr("Remove Breakpoint"), q, [this, line] { q->removeBreakpoint(line); }); + } else { + static QString text("Add a breakpoint on line %1"); + menu.addAction(text.arg(line + 1), q, [this, line] { q->addBreakpoint(line); }); + } + + // notify other plugin to add action. + editor.marginMenu(QVariant::fromValue(&menu)); + menu.exec(QCursor::pos()); } void TextEditorPrivate::gotoNextMark(MarginMask mask) diff --git a/src/plugins/codeeditor/gui/private/texteditor_p.h b/src/plugins/codeeditor/gui/private/texteditor_p.h index 6f8dfd4cf..d39736905 100644 --- a/src/plugins/codeeditor/gui/private/texteditor_p.h +++ b/src/plugins/codeeditor/gui/private/texteditor_p.h @@ -51,7 +51,8 @@ class TextEditorPrivate : public QObject void setMarginVisible(MarginType type, bool visible); void updateLineNumberMargin(bool visible); - QVariantHash getMenuParams(QContextMenuEvent *event); + void showContextMenu(); + void showMarginMenu(); void gotoNextMark(MarginMask mask); void gotoPreviousMark(MarginMask mask); diff --git a/src/plugins/codeeditor/gui/texteditor.cpp b/src/plugins/codeeditor/gui/texteditor.cpp index e31f06f2d..8b9d9b517 100644 --- a/src/plugins/codeeditor/gui/texteditor.cpp +++ b/src/plugins/codeeditor/gui/texteditor.cpp @@ -4,16 +4,10 @@ #include "texteditor.h" #include "private/texteditor_p.h" -#include "menu/texteditormarginmenu.h" -#include "menu/texteditormenu.h" #include "utils/editorutils.h" #include -#include -#include -#include #include -#include #include #include #include @@ -59,12 +53,6 @@ QString TextEditor::getFile() const return d->fileName; } -QString TextEditor::id() const -{ - static auto id = QUuid::createUuid().toString(QUuid::Id128); - return id; -} - void TextEditor::save() { if (!isModified()) @@ -286,25 +274,9 @@ void TextEditor::contextMenuEvent(QContextMenuEvent *event) if (!contextMenuNeeded(event->pos().x(), event->pos().y())) return; - const auto ¶ms = d->getMenuParams(event); - AbstractEditorMenu *editorMenu { nullptr }; if (event->pos().x() <= d->marginsWidth()) { - editorMenu = new TextEditorMarginMenu; + d->showMarginMenu(); } else { - editorMenu = new TextEditorMenu; + d->showContextMenu(); } - - if (!editorMenu->initialize(params)) { - delete editorMenu; - return; - } - - QMenu menu(this); - editorMenu->create(&menu); - editorMenu->updateState(&menu); - - if (auto act = menu.exec(QCursor::pos())) - editorMenu->triggered(act); - - delete editorMenu; } diff --git a/src/plugins/codeeditor/gui/texteditor.h b/src/plugins/codeeditor/gui/texteditor.h index eb30f4211..29017b5cd 100644 --- a/src/plugins/codeeditor/gui/texteditor.h +++ b/src/plugins/codeeditor/gui/texteditor.h @@ -17,7 +17,6 @@ class TextEditor : public QsciScintilla virtual void setFile(const QString &fileName); QString getFile() const; - QString id() const; void save(); void saveAs(); diff --git a/src/plugins/codeeditor/menu/texteditormarginmenu.cpp b/src/plugins/codeeditor/menu/texteditormarginmenu.cpp deleted file mode 100644 index 7ee23c522..000000000 --- a/src/plugins/codeeditor/menu/texteditormarginmenu.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "texteditormarginmenu.h" - -TextEditorMarginMenu::TextEditorMarginMenu(QObject *parent) - : AbstractEditorMenu(parent) -{ -} - -QString TextEditorMarginMenu::name() const -{ - -} - -bool TextEditorMarginMenu::initialize(const QVariantHash ¶ms) -{ - return false; -} - -bool TextEditorMarginMenu::create(QMenu *parent) -{ - -} - -void TextEditorMarginMenu::updateState(QMenu *parent) -{ - -} - -bool TextEditorMarginMenu::triggered(QAction *action) -{ - -} - -AbstractEditorMenu *TextEditorMarginMenu::menu(QAction *action) const -{ - -} diff --git a/src/plugins/codeeditor/menu/texteditormarginmenu.h b/src/plugins/codeeditor/menu/texteditormarginmenu.h deleted file mode 100644 index 65bf07e79..000000000 --- a/src/plugins/codeeditor/menu/texteditormarginmenu.h +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef TEXTEDITORMARGINMENU_H -#define TEXTEDITORMARGINMENU_H - -#include "base/abstracteditormenu.h" - -class TextEditorMarginMenu : public AbstractEditorMenu -{ - Q_OBJECT -public: - explicit TextEditorMarginMenu(QObject *parent = nullptr); - - virtual QString name() const override; - virtual bool initialize(const QVariantHash ¶ms) override; - virtual bool create(QMenu *parent) override; - virtual void updateState(QMenu *parent) override; - virtual bool triggered(QAction *action) override; - virtual AbstractEditorMenu *menu(QAction *action) const override; -}; - -#endif // TEXTEDITORMARGINMENU_H diff --git a/src/plugins/codeeditor/menu/texteditormenu.cpp b/src/plugins/codeeditor/menu/texteditormenu.cpp deleted file mode 100644 index 7803c5b1d..000000000 --- a/src/plugins/codeeditor/menu/texteditormenu.cpp +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "texteditormenu.h" -#include "gui/texteditor.h" - -#include - -namespace ActionId { -static constexpr char Copy[] { "copy" }; -static constexpr char Cut[] { "cut" }; -static constexpr char Paste[] { "paste" }; -static constexpr char Delete[] { "delete" }; -static constexpr char SelectAll[] { "select-all" }; -static constexpr char Undo[] { "undo" }; -static constexpr char Redo[] { "redo" }; -} - -TextEditorMenu::TextEditorMenu(QObject *parent) - : AbstractEditorMenu(parent) -{ - predicateName[ActionId::Copy] = tr("Copy"); - predicateName[ActionId::Cut] = tr("Cut"); - predicateName[ActionId::Paste] = tr("Paste"); - predicateName[ActionId::Delete] = tr("Delete"); - predicateName[ActionId::SelectAll] = tr("Select All"); - predicateName[ActionId::Undo] = tr("Undo"); - predicateName[ActionId::Redo] = tr("Redo"); -} - -QString TextEditorMenu::name() const -{ - return "EditorMenu"; -} - -bool TextEditorMenu::initialize(const QVariantHash ¶ms) -{ - // TODO - return false; -} - -bool TextEditorMenu::create(QMenu *parent) -{ - QAction *action { nullptr }; - if (!editor->isReadOnly()) { - action = parent->addAction(predicateName[ActionId::Undo], this, [this] { editor->undo(); }); - action->setEnabled(editor->isUndoAvailable()); - predicateAction[ActionId::Undo] = action; - - action = parent->addAction(predicateName[ActionId::Redo], this, [this] { editor->redo(); }); - action->setEnabled(editor->isRedoAvailable()); - predicateAction[ActionId::Redo] = action; - - parent->addSeparator(); - - action = parent->addAction(predicateName[ActionId::Cut], this, [this] { editor->cut(); }); - action->setEnabled(editor->hasSelectedText()); - predicateAction[ActionId::Cut] = action; - } - - action = parent->addAction(predicateName[ActionId::Copy], this, [this] { editor->copy(); }); - action->setEnabled(editor->hasSelectedText()); - predicateAction[ActionId::Copy] = action; - - if (!editor->isReadOnly()) { - action = parent->addAction(predicateName[ActionId::Paste], this, [this] { editor->paste(); }); - action->setEnabled(editor->SendScintilla(TextEditor::SCI_CANPASTE)); - predicateAction[ActionId::Paste] = action; - - action = parent->addAction(predicateName[ActionId::Delete], this, [this] { editor->SendScintilla(TextEditor::SCI_CLEAR); }); - action->setEnabled(editor->hasSelectedText()); - predicateAction[ActionId::Delete] = action; - } - - parent->addSeparator(); - action = parent->addAction(predicateName[ActionId::SelectAll], this, [this] { editor->selectAll(); }); - action->setEnabled(editor->length() != 0); - predicateAction[ActionId::SelectAll] = action; - - return AbstractEditorMenu::create(parent); -} - -void TextEditorMenu::updateState(QMenu *parent) -{ - AbstractEditorMenu::updateState(parent); -} - -bool TextEditorMenu::triggered(QAction *action) -{ - return AbstractEditorMenu::triggered(action); -} - -AbstractEditorMenu *TextEditorMenu::menu(QAction *action) const -{ - if (!action) - return nullptr; - - if (predicateAction.values().contains(action)) - return const_cast(this); - - return AbstractEditorMenu::menu(action); -} diff --git a/src/plugins/codeeditor/menu/texteditormenu.h b/src/plugins/codeeditor/menu/texteditormenu.h deleted file mode 100644 index 20fa8f03f..000000000 --- a/src/plugins/codeeditor/menu/texteditormenu.h +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef TEXTEDITORMENU_H -#define TEXTEDITORMENU_H - -#include "base/abstracteditormenu.h" - -#include - -class TextEditor; -class TextEditorMenu : public AbstractEditorMenu -{ - Q_OBJECT -public: - explicit TextEditorMenu(QObject *parent = nullptr); - - virtual QString name() const override; - virtual bool initialize(const QVariantHash ¶ms) override; - virtual bool create(QMenu *parent) override; - virtual void updateState(QMenu *parent) override; - virtual bool triggered(QAction *action) override; - virtual AbstractEditorMenu *menu(QAction *action) const override; - -private: - QMap predicateAction; // id -- instance - QMap predicateName; // id -- text - TextEditor *editor { nullptr }; -}; - -#endif // TEXTEDITORMENU_H