summaryrefslogtreecommitdiff
path: root/Source/Core/DolphinQt2/Debugger/RegisterColumn.cpp
diff options
context:
space:
mode:
authorspycrab <spycrab@users.noreply.github.com>2017-09-13 19:33:45 +0200
committerspycrab <spycrab@users.noreply.github.com>2017-12-28 19:07:18 +0100
commitec37ce093f5349a785d056958a187f5391322b4c (patch)
tree601c604aa38d354c28334a8cfe4a91ab51d11dcb /Source/Core/DolphinQt2/Debugger/RegisterColumn.cpp
parent2a19ccf806e79f5d712c2b141a6353bc87be8c38 (diff)
Qt/Debugger: Implement "Registers" window
Diffstat (limited to 'Source/Core/DolphinQt2/Debugger/RegisterColumn.cpp')
-rw-r--r--Source/Core/DolphinQt2/Debugger/RegisterColumn.cpp123
1 files changed, 123 insertions, 0 deletions
diff --git a/Source/Core/DolphinQt2/Debugger/RegisterColumn.cpp b/Source/Core/DolphinQt2/Debugger/RegisterColumn.cpp
new file mode 100644
index 0000000000..e93f6aee9e
--- /dev/null
+++ b/Source/Core/DolphinQt2/Debugger/RegisterColumn.cpp
@@ -0,0 +1,123 @@
+// Copyright 2017 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#include "DolphinQt2/Debugger/RegisterColumn.h"
+
+#include <cstring>
+#include <utility>
+
+#include <QMessageBox>
+
+RegisterColumn::RegisterColumn(RegisterType type, std::function<u64()> get,
+ std::function<void(u64)> set)
+ : m_type(type), m_get_register(std::move(get)), m_set_register(std::move(set))
+{
+ RefreshValue();
+ Update();
+
+ setFlags(set == nullptr ? flags() ^ Qt::ItemIsEditable : flags());
+ setData(DATA_TYPE, static_cast<quint32>(type));
+}
+
+RegisterDisplay RegisterColumn::GetDisplay() const
+{
+ return m_display;
+}
+
+void RegisterColumn::SetDisplay(RegisterDisplay display)
+{
+ m_display = display;
+ Update();
+}
+
+void RegisterColumn::RefreshValue()
+{
+ QBrush brush = QPalette().brush(QPalette::Text);
+
+ if (m_value != m_get_register())
+ {
+ m_value = m_get_register();
+ brush.setColor(Qt::red);
+ }
+
+ setForeground(brush);
+
+ Update();
+}
+
+u64 RegisterColumn::GetValue() const
+{
+ return m_value;
+}
+
+void RegisterColumn::SetValue()
+{
+ u64 value = 0;
+
+ bool valid = false;
+
+ switch (m_display)
+ {
+ case RegisterDisplay::Hex:
+ value = text().toULongLong(&valid, 16);
+ break;
+ case RegisterDisplay::SInt32:
+ value = text().toInt(&valid);
+ break;
+ case RegisterDisplay::UInt32:
+ value = text().toUInt(&valid);
+ break;
+ case RegisterDisplay::Float:
+ {
+ float f = text().toFloat(&valid);
+ std::memcpy(&value, &f, sizeof(u32));
+ break;
+ }
+ }
+
+ if (!valid)
+ {
+ QMessageBox::critical(nullptr, QObject::tr("Invalid input"),
+ QObject::tr("Bad input for field"));
+ }
+ else
+ {
+ m_set_register(value);
+ }
+
+ RefreshValue();
+}
+
+void RegisterColumn::Update()
+{
+ QString text;
+
+ switch (m_display)
+ {
+ case RegisterDisplay::Hex:
+ text = QStringLiteral("%1").arg(m_value,
+ (m_type == RegisterType::ibat || m_type == RegisterType::dbat ||
+ m_type == RegisterType::fpr ?
+ sizeof(u64) :
+ sizeof(u32)) *
+ 2,
+ 16, QLatin1Char('0'));
+ break;
+ case RegisterDisplay::SInt32:
+ text = QString::number(static_cast<qint32>(m_value));
+ break;
+ case RegisterDisplay::UInt32:
+ text = QString::number(static_cast<quint32>(m_value));
+ break;
+ case RegisterDisplay::Float:
+ {
+ float tmp;
+ std::memcpy(&tmp, &m_value, sizeof(float));
+ text = QString::number(tmp);
+ break;
+ }
+ }
+
+ setText(text);
+}