diff options
| author | Pierre Bourdon <delroth@gmail.com> | 2018-01-03 03:44:27 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-01-03 03:44:27 +0100 |
| commit | fd13851df26937dadb681adb12864149c48698ba (patch) | |
| tree | f0ede563e56f694f8659ffb58fd6fab184d8d85c /Source/Core/DolphinQt2/Debugger/RegisterColumn.cpp | |
| parent | cb168b184386f169aeb828f660ac63c5bc3e540c (diff) | |
| parent | b63ec57c1e5ace830ab67f0d4779b782d08b7b21 (diff) | |
Merge pull request #6076 from spycrab/qt_debugger
Qt: Implement Debugger (part 1 of ∞)
Diffstat (limited to 'Source/Core/DolphinQt2/Debugger/RegisterColumn.cpp')
| -rw-r--r-- | Source/Core/DolphinQt2/Debugger/RegisterColumn.cpp | 123 |
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); +} |
