diff --git a/src/plugins/debugger/debuggeractions.h b/src/plugins/debugger/debuggeractions.h index 545b346a2fbf4a0d1948a6180711bc66ce0bb659..e0040eb09c0dfbc9d23a9c5dd5372ced8a97f430 100644 --- a/src/plugins/debugger/debuggeractions.h +++ b/src/plugins/debugger/debuggeractions.h @@ -180,6 +180,8 @@ struct DebuggerManagerActions QAction *breakAction; QAction *sepAction; QAction *reverseDirectionAction; + QAction *frameUpAction; + QAction *frameDownAction; }; } // namespace Internal diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index 76f522580c83f60442f68adc7662e0c5ca708e81..357de3495b67a5ac97fa0e27bab24e000c3fde92 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -569,6 +569,12 @@ void DebuggerManager::init() d->m_actions.reverseDirectionAction->setIcon( QIcon(":/debugger/images/debugger_reversemode_16.png")); + d->m_actions.frameDownAction = + new QAction(tr("Move to Called Frame"), this); + d->m_actions.frameUpAction = + new QAction(tr("Move to Calling Frame"), this); + + d->m_actions.reverseDirectionAction->setCheckable(false); connect(d->m_actions.continueAction, SIGNAL(triggered()), this, SLOT(executeContinue())); connect(d->m_actions.stopAction, SIGNAL(triggered()), @@ -599,6 +605,10 @@ void DebuggerManager::init() this, SLOT(addToWatchWindow())); connect(d->m_actions.snapshotAction, SIGNAL(triggered()), this, SLOT(makeSnapshot())); + connect(d->m_actions.frameDownAction, SIGNAL(triggered()), + this, SLOT(frameDown())); + connect(d->m_actions.frameUpAction, SIGNAL(triggered()), + this, SLOT(frameUp())); connect(d->m_statusTimer, SIGNAL(timeout()), this, SLOT(clearStatusMessage())); @@ -877,6 +887,20 @@ void DebuggerManager::aboutToShutdown() d->m_engine = 0; } +void DebuggerManager::frameUp() +{ + QTC_ASSERT(d->m_engine, return); + int currentIndex = stackHandler()->currentIndex(); + activateFrame(qMin(currentIndex + 1, stackHandler()->stackSize() - 1)); +} + +void DebuggerManager::frameDown() +{ + QTC_ASSERT(d->m_engine, return); + int currentIndex = stackHandler()->currentIndex(); + activateFrame(qMax(currentIndex - 1, 0)); +} + void DebuggerManager::makeSnapshot() { QTC_ASSERT(d->m_engine, return); diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h index 2ce5c17c60e560bde9cfec66ed4e1150fefdcb72..0210b706c53237d050963f69628a7e70bfc5c69a 100644 --- a/src/plugins/debugger/debuggermanager.h +++ b/src/plugins/debugger/debuggermanager.h @@ -241,6 +241,8 @@ public slots: void executeReturn(); void detachDebugger(); void makeSnapshot(); + void frameUp(); + void frameDown(); void addToWatchWindow(); void updateWatchData(const Debugger::Internal::WatchData &data); diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 0ef2503bc3ad3de79edbd7a9bac16056932f9727..7a625b45bbaa14e0239a437aeee88603cc2e2695 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -139,6 +139,8 @@ const char * const BREAK_AT_MAIN = "Debugger.BreakAtMain"; const char * const ADD_TO_WATCH1 = "Debugger.AddToWatch1"; const char * const ADD_TO_WATCH2 = "Debugger.AddToWatch2"; const char * const OPERATE_BY_INSTRUCTION = "Debugger.OperateByInstruction"; +const char * const FRAME_UP = "Debugger.FrameUp"; +const char * const FRAME_DOWN = "Debugger.FrameDown"; #ifdef Q_WS_MAC const char * const INTERRUPT_KEY = "Shift+F5"; @@ -894,6 +896,11 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess cmd->setAttribute(Command::CA_Hide); m_uiSwitcher->addMenuAction(cmd, Constants::LANG_CPP); + cmd = am->registerAction(actions.frameDownAction, + Constants::FRAME_DOWN, cppDebuggercontext); + cmd = am->registerAction(actions.frameUpAction, + Constants::FRAME_UP, cppDebuggercontext); + cmd = am->registerAction(theDebuggerAction(OperateByInstruction), Constants::OPERATE_BY_INSTRUCTION, cppDebuggercontext);