@@ -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()
79110void 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+ }
0 commit comments