1// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
2//
3// SPDX-License-Identifier: GPL-3.0-or-later
4
5#include "menumanager.h"
6#include "debugmanager.h"
7#include "debuggersignals.h"
8#include "debuggerglobals.h"
9#include "base/abstractmenu.h"
10#include "common/common.h"
11#include "services/window/windowservice.h"
12
13#include <QMenu>
14
15using namespace dpfservice;
16MenuManager::MenuManager(QObject *parent) : QObject(parent)
17{
18}
19
20void MenuManager::initialize(WindowService *windowService)
21{
22 if (!windowService)
23 return;
24
25 startDebugging.reset(new QAction(MWMDA_START_DEBUG));
26 ActionManager::getInstance()->registerAction(startDebugging.get(), "Debug.Start.Debugging",
27 MWMDA_START_DEBUG, QKeySequence(Qt::Key::Key_F5),
28 ":/resource/images/debugger_start.png");
29 connect(startDebugging.get(), &QAction::triggered, debugManager, &DebugManager::run);
30 AbstractAction *actionImpl = new AbstractAction(startDebugging.get());
31 windowService->addAction(MWM_DEBUG, actionImpl);
32 windowService->addToolBarActionItem("Start Debugging", startDebugging.get(), "Debug");
33 windowService->addToolBarActionItem("Debugger.Start", startDebugging.get(), "Debug");
34
35#if 0 // not used yet.
36 detachDebugger.reset(new QAction("Detach Debugger"));
37 connect(detachDebugger.get(), &QAction::triggered, debugManager, &DebugManager::detachDebug);
38 actionImpl = new AbstractAction(detachDebugger.get());
39 windowService->addAction(QString::fromStdString(MENU_DEBUG), actionImpl);
40#endif
41
42 interrupt.reset(new QAction(MWMDA_INTERRUPT));
43 ActionManager::getInstance()->registerAction(interrupt.get(), "Debug.Interrupt",
44 MWMDA_INTERRUPT, QKeySequence(Qt::Key::Key_F5),
45 ":/resource/images/debugger_interrupt.png");
46 interrupt->setEnabled(false);
47 connect(interrupt.get(), &QAction::triggered, debugManager, &DebugManager::interruptDebug);
48 actionImpl = new AbstractAction(interrupt.get());
49 interrupt->setEnabled(false);
50 windowService->addAction(MWM_DEBUG, actionImpl);
51
52 continueDebugging.reset(new QAction(MWMDA_CONTINUE));
53 ActionManager::getInstance()->registerAction(continueDebugging.get(), "Debug.Continue",
54 MWMDA_CONTINUE, QKeySequence(Qt::Key::Key_F5),
55 ":/resource/images/debugger_continue.png");
56 continueDebugging->setEnabled(false);
57 connect(continueDebugging.get(), &QAction::triggered, debugManager, &DebugManager::continueDebug);
58 actionImpl = new AbstractAction(continueDebugging.get());
59 windowService->addAction(MWM_DEBUG, actionImpl);
60 windowService->addToolBarActionItem("Debugger.Continue", continueDebugging.get(), "Debug");
61
62 abortDebugging.reset(new QAction(MWMDA_ABORT_DEBUGGING));
63 ActionManager::getInstance()->registerAction(abortDebugging.get(), "Debug.Abort.Debugging",
64 MWMDA_ABORT_DEBUGGING, QKeySequence(Qt::Modifier::ALT | Qt::Key::Key_Backspace),
65 ":/resource/images/debugger_stop.png");
66 abortDebugging->setEnabled(false);
67 connect(abortDebugging.get(), &QAction::triggered, debugManager, &DebugManager::abortDebug);
68 actionImpl = new AbstractAction(abortDebugging.get());
69 windowService->addAction(MWM_DEBUG, actionImpl);
70 windowService->addToolBarActionItem("abort_debug", abortDebugging.get(), "Debug");
71 windowService->addToolBarActionItem("Debugger.Stop", abortDebugging.get(), "Debug");
72
73 restartDebugging.reset(new QAction(MWMDA_RESTART_DEBUGGING));
74 ActionManager::getInstance()->registerAction(restartDebugging.get(), "Debug.Restart.Debugging",
75 MWMDA_RESTART_DEBUGGING, QKeySequence(Qt::Modifier::CTRL | Qt::Key::Key_B),
76 ":/resource/images/restart_debug.png");
77 restartDebugging->setEnabled(false);
78 connect(restartDebugging.get(), &QAction::triggered, debugManager, &DebugManager::restartDebug);
79 actionImpl = new AbstractAction(restartDebugging.get());
80 windowService->addAction(MWM_DEBUG, actionImpl);
81
82 stepOver.reset(new QAction(MWMDA_STEP_OVER));
83 ActionManager::getInstance()->registerAction(stepOver.get(), "Debug.Step.Over",
84 MWMDA_STEP_OVER, QKeySequence(Qt::Key::Key_F10),
85 ":/resource/images/debugger_stepover.png");
86 stepOver->setEnabled(false);
87 connect(stepOver.get(), &QAction::triggered, debugManager, &DebugManager::stepOver);
88 actionImpl = new AbstractAction(stepOver.get());
89 windowService->addAction(MWM_DEBUG, actionImpl);
90 windowService->addToolBarActionItem("Step.Over", stepOver.get(), "Debug");
91
92 stepIn.reset(new QAction(MWMDA_STEP_IN));
93 ActionManager::getInstance()->registerAction(stepIn.get(), "Debug.Step.In",
94 MWMDA_STEP_IN, QKeySequence(Qt::Key::Key_F11),
95 ":/resource/images/debugger_stepinto.png");
96 stepIn->setEnabled(false);
97 connect(stepIn.get(), &QAction::triggered, debugManager, &DebugManager::stepIn);
98 actionImpl = new AbstractAction(stepIn.get());
99 windowService->addAction(MWM_DEBUG, actionImpl);
100 windowService->addToolBarActionItem("Step.In", stepIn.get(), "Debug");
101
102 stepOut.reset(new QAction(MWMDA_STEP_OUT));
103 ActionManager::getInstance()->registerAction(stepOut.get(), "Debug.Step.Out",
104 MWMDA_STEP_OUT, QKeySequence(Qt::Modifier::SHIFT | Qt::Key::Key_F11),
105 ":/resource/images/debugger_stepout.png");
106 stepOut->setEnabled(false);
107 connect(stepOut.get(), &QAction::triggered, debugManager, &DebugManager::stepOut);
108 actionImpl = new AbstractAction(stepOut.get());
109 windowService->addAction(MWM_DEBUG, actionImpl);
110 windowService->addToolBarActionItem("Step.Out", stepOut.get(), "Debug.End");
111}
112
113void MenuManager::handleRunStateChanged(AbstractDebugger::RunState state)
114{
115 switch (state) {
116 case AbstractDebugger::kNoRun:
117 case AbstractDebugger::kPreparing:
118 case AbstractDebugger::kStart:
119 startDebugging->setEnabled(true);
120#if 0 // not used yet.
121 detachDebugger->setEnabled(true);
122#endif
123 interrupt->setEnabled(false);
124 continueDebugging->setEnabled(false);
125 abortDebugging->setEnabled(false);
126 restartDebugging->setEnabled(false);
127 stepOver->setEnabled(false);
128 stepIn->setEnabled(false);
129 stepOut->setEnabled(false);
130 break;
131
132 case AbstractDebugger::kRunning:
133 startDebugging->setEnabled(false);
134#if 0 // not used yet.
135 detachDebugger->setEnabled(false);
136#endif
137 interrupt->setEnabled(true);
138 continueDebugging->setEnabled(false);
139 abortDebugging->setEnabled(true);
140 restartDebugging->setEnabled(true);
141 stepOver->setEnabled(false);
142 stepIn->setEnabled(false);
143 stepOut->setEnabled(false);
144 break;
145 case AbstractDebugger::kStopped:
146 startDebugging->setEnabled(false);
147#if 0 // not used yet.
148 detachDebugger->setEnabled(false);
149#endif
150 interrupt->setEnabled(false);
151 continueDebugging->setEnabled(true);
152 abortDebugging->setEnabled(true);
153 restartDebugging->setEnabled(true);
154 stepOver->setEnabled(true);
155 stepIn->setEnabled(true);
156 stepOut->setEnabled(true);
157 break;
158 case AbstractDebugger::kCustomRunning:
159 startDebugging->setEnabled(false);
160 interrupt->setEnabled(false);
161 continueDebugging->setEnabled(false);
162 abortDebugging->setEnabled(true);
163 restartDebugging->setEnabled(false);
164 stepOver->setEnabled(false);
165 stepIn->setEnabled(false);
166 stepOut->setEnabled(false);
167 break;
168
169 default:
170 // do nothing.
171 break;
172 }
173}
174