Skip to content

Commit 41ecd43

Browse files
authored
Add debug adapter selection dropdown at the top of the debugger sidebar (#895)
1 parent e9ffd88 commit 41ecd43

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

ui/debuggerwidget.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ limitations under the License.
1818
#include <QHeaderView>
1919
#include <QLineEdit>
2020
#include <QStatusBar>
21+
#include <QLabel>
22+
#include <QHBoxLayout>
2123
#include "debuggerwidget.h"
2224
#include "ui.h"
2325

@@ -36,6 +38,35 @@ DebuggerWidget::DebuggerWidget(const QString& name, ViewFrame* view, BinaryViewR
3638
layout->setSpacing(0);
3739
layout->setAlignment(Qt::AlignTop);
3840

41+
m_adapterSelector = new QComboBox();
42+
// Populate adapter selector
43+
for (const std::string& adapter : DebugAdapterType::GetAvailableAdapters(m_controller->GetData()))
44+
{
45+
m_adapterSelector->addItem(QString::fromStdString(adapter));
46+
}
47+
48+
// Set current adapter
49+
if (!m_controller->GetAdapterType().empty())
50+
{
51+
m_adapterSelector->setCurrentText(QString::fromStdString(m_controller->GetAdapterType()));
52+
}
53+
else if (m_adapterSelector->count() > 0)
54+
{
55+
// Set first available adapter if none is set
56+
m_controller->SetAdapterType(m_adapterSelector->itemText(0).toStdString());
57+
m_adapterSelector->setCurrentIndex(0);
58+
}
59+
else
60+
{
61+
// No adapters available
62+
m_adapterSelector->addItem("(No available debug adapter)");
63+
m_adapterSelector->setEnabled(false);
64+
}
65+
66+
connect(m_adapterSelector, &QComboBox::currentTextChanged, this, &DebuggerWidget::selectAdapter);
67+
68+
layout->addWidget(m_adapterSelector);
69+
3970
m_splitter = new QSplitter(Qt::Vertical, this);
4071
m_splitter->setChildrenCollapsible(true);
4172

@@ -79,6 +110,14 @@ void DebuggerWidget::updateContent()
79110
void DebuggerWidget::uiEventHandler(const DebuggerEvent& event)
80111
{
81112
m_controlsWidget->updateButtons();
113+
114+
// Enable adapter selector only when not connected
115+
DebugAdapterConnectionStatus connection = m_controller->GetConnectionStatus();
116+
if (m_adapterSelector->count() > 0 && m_adapterSelector->currentText() != "(No available debug adapter)")
117+
{
118+
m_adapterSelector->setEnabled(connection == DebugAdapterNotConnectedStatus);
119+
}
120+
82121
switch (event.type)
83122
{
84123
case TargetStoppedEventType:
@@ -102,3 +141,21 @@ void DebuggerWidget::uiEventHandler(const DebuggerEvent& event)
102141
break;
103142
}
104143
}
144+
145+
146+
void DebuggerWidget::selectAdapter(const QString& adapter)
147+
{
148+
if (adapter.isEmpty())
149+
return;
150+
151+
auto adapterType = DebugAdapterType::GetByName(adapter.toStdString());
152+
if (!adapterType)
153+
return;
154+
155+
m_controller->SetAdapterType(adapter.toStdString());
156+
Ref<Metadata> data = new Metadata(adapter.toStdString());
157+
m_controller->GetData()->StoreMetadata("debugger.adapter_type", data);
158+
159+
// Update button states after adapter change
160+
m_controlsWidget->updateButtons();
161+
}

ui/debuggerwidget.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ limitations under the License.
2222
#include <QTableView>
2323
#include <QStyledItemDelegate>
2424
#include <QTabWidget>
25+
#include <QComboBox>
2526
#include "inttypes.h"
2627
#include "binaryninjaapi.h"
2728
#include "viewframe.h"
@@ -45,6 +46,7 @@ class DebuggerWidget : public SidebarWidget
4546
ViewFrame* m_view;
4647
DbgRef<DebuggerController> m_controller;
4748

49+
QComboBox* m_adapterSelector;
4850
QSplitter* m_splitter;
4951
QTabWidget* m_tabs;
5052

@@ -60,6 +62,7 @@ class DebuggerWidget : public SidebarWidget
6062

6163
private slots:
6264
void uiEventHandler(const DebuggerEvent& event);
65+
void selectAdapter(const QString& adapter);
6366

6467
public:
6568
DebuggerWidget(const QString& name, ViewFrame* view, BinaryViewRef data);

0 commit comments

Comments
 (0)