src/platform/qt/GDBWindow.cpp (view raw)
1#include "GDBWindow.h"
2
3#include <QGridLayout>
4#include <QGroupBox>
5#include <QLabel>
6#include <QLineEdit>
7#include <QPushButton>
8#include <QVBoxLayout>
9
10#include "GDBController.h"
11
12using namespace QGBA;
13
14GDBWindow::GDBWindow(GDBController* controller, QWidget* parent)
15 : QWidget(parent)
16 , m_gdbController(controller)
17{
18 setWindowFlags(windowFlags() & ~Qt::WindowFullscreenButtonHint);
19 QVBoxLayout* mainSegment = new QVBoxLayout;
20 setLayout(mainSegment);
21 QGroupBox* settings = new QGroupBox(tr("Server settings"));
22 mainSegment->addWidget(settings);
23
24 QGridLayout* settingsGrid = new QGridLayout;
25 settings->setLayout(settingsGrid);
26
27 QLabel* portLabel = new QLabel(tr("Local port"));
28 settingsGrid->addWidget(portLabel, 0, 0, Qt::AlignRight);
29 QLabel* bindAddressLabel = new QLabel(tr("Bind address"));
30 settingsGrid->addWidget(bindAddressLabel, 1, 0, Qt::AlignRight);
31
32 m_portEdit = new QLineEdit("2345");
33 m_portEdit->setMaxLength(5);
34 connect(m_portEdit, SIGNAL(textChanged(const QString&)), this, SLOT(portChanged(const QString&)));
35 settingsGrid->addWidget(m_portEdit, 0, 1, Qt::AlignLeft);
36
37 m_bindAddressEdit = new QLineEdit("0.0.0.0");
38 m_bindAddressEdit->setMaxLength(15);
39 connect(m_bindAddressEdit, SIGNAL(textChanged(const QString&)), this, SLOT(bindAddressChanged(const QString&)));
40 settingsGrid->addWidget(m_bindAddressEdit, 1, 1, Qt::AlignLeft);
41
42 m_startStopButton = new QPushButton(tr("Start"));
43 connect(m_startStopButton, SIGNAL(clicked()), m_gdbController, SLOT(listen()));
44 connect(m_startStopButton, SIGNAL(clicked()), this, SLOT(started()));
45 mainSegment->addWidget(m_startStopButton);
46}
47
48void GDBWindow::portChanged(const QString& portString) {
49 bool ok = false;
50 ushort port = portString.toUShort(&ok);
51 if (ok) {
52 m_gdbController->setPort(port);
53 }
54}
55
56void GDBWindow::bindAddressChanged(const QString& bindAddressString) {
57 bool ok = false;
58 QStringList parts = bindAddressString.split('.');
59 if (parts.length() != 4) {
60 return;
61 }
62 int i;
63 uint32_t address = 0;
64 for (i = 0; i < 4; ++i) {
65 ushort octet = parts[i].toUShort(&ok);
66 if (!ok) {
67 return;
68 }
69 if (octet > 0xFF) {
70 return;
71 }
72 address <<= 8;
73 address += octet;
74 }
75 m_gdbController->setBindAddress(address);
76}
77
78void GDBWindow::started() {
79 m_portEdit->setEnabled(false);
80 m_bindAddressEdit->setEnabled(false);
81 m_startStopButton->setText(tr("Stop"));
82 disconnect(m_startStopButton, SIGNAL(clicked()), m_gdbController, SLOT(listen()));
83 disconnect(m_startStopButton, SIGNAL(clicked()), this, SLOT(started()));
84 connect(m_startStopButton, SIGNAL(clicked()), m_gdbController, SLOT(detach()));
85 connect(m_startStopButton, SIGNAL(clicked()), this, SLOT(stopped()));
86}
87
88void GDBWindow::stopped() {
89 m_portEdit->setEnabled(true);
90 m_bindAddressEdit->setEnabled(true);
91 m_startStopButton->setText(tr("Start"));
92 disconnect(m_startStopButton, SIGNAL(clicked()), m_gdbController, SLOT(detach()));
93 disconnect(m_startStopButton, SIGNAL(clicked()), this, SLOT(stopped()));
94 connect(m_startStopButton, SIGNAL(clicked()), m_gdbController, SLOT(listen()));
95 connect(m_startStopButton, SIGNAL(clicked()), this, SLOT(started()));
96}