Added a crude dark theme for the Win32 debugger.

Also made a start on weaning the Qt debugger off its weird configuation
objects.  It can now save more view state with less string comparisons
on memory labels, but it can't restore all of it yet.
This commit is contained in:
Vas Crabb 2022-09-17 06:28:25 +10:00
parent b64b4ef8bb
commit c25428f519
30 changed files with 511 additions and 395 deletions

View File

@ -56,8 +56,13 @@ public:
#if defined(_WIN32) && !defined(SDLMAME_WIN32)
virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *) Q_DECL_OVERRIDE;
#endif
private:
void configuration_save(config_type which_type, util::xml::data_node *parentnode);
void gather_save_configurations();
running_machine *m_machine;
util::xml::file::ptr m_config;
};
@ -94,16 +99,15 @@ void xml_configuration_load(running_machine &machine, config_type cfg_type, conf
util::xml::data_node const *wnode = nullptr;
for (wnode = parentnode->get_child(osd::debugger::NODE_WINDOW); wnode; wnode = wnode->get_next_sibling(osd::debugger::NODE_WINDOW))
{
WindowQtConfig::WindowType type = (WindowQtConfig::WindowType)wnode->get_attribute_int(osd::debugger::ATTR_WINDOW_TYPE, WindowQtConfig::WIN_TYPE_UNKNOWN);
switch (type)
switch (wnode->get_attribute_int(osd::debugger::ATTR_WINDOW_TYPE, -1))
{
case WindowQtConfig::WIN_TYPE_MAIN: xmlConfigurations.push_back(std::make_unique<MainWindowQtConfig>()); break;
case WindowQtConfig::WIN_TYPE_MEMORY: xmlConfigurations.push_back(std::make_unique<MemoryWindowQtConfig>()); break;
case WindowQtConfig::WIN_TYPE_DASM: xmlConfigurations.push_back(std::make_unique<DasmWindowQtConfig>()); break;
case WindowQtConfig::WIN_TYPE_LOG: xmlConfigurations.push_back(std::make_unique<LogWindowQtConfig>()); break;
case WindowQtConfig::WIN_TYPE_BREAK_POINTS: xmlConfigurations.push_back(std::make_unique<BreakpointsWindowQtConfig>()); break;
case WindowQtConfig::WIN_TYPE_DEVICES: xmlConfigurations.push_back(std::make_unique<DevicesWindowQtConfig>()); break;
case WindowQtConfig::WIN_TYPE_DEVICE_INFORMATION: xmlConfigurations.push_back(std::make_unique<DeviceInformationWindowQtConfig>()); break;
case osd::debugger::WINDOW_TYPE_CONSOLE: xmlConfigurations.push_back(std::make_unique<MainWindowQtConfig>()); break;
case osd::debugger::WINDOW_TYPE_MEMORY_VIEWER: xmlConfigurations.push_back(std::make_unique<MemoryWindowQtConfig>()); break;
case osd::debugger::WINDOW_TYPE_DISASSEMBLY_VIEWER: xmlConfigurations.push_back(std::make_unique<DasmWindowQtConfig>()); break;
case osd::debugger::WINDOW_TYPE_ERROR_LOG_VIEWER: xmlConfigurations.push_back(std::make_unique<LogWindowQtConfig>()); break;
case osd::debugger::WINDOW_TYPE_POINTS_VIEWER: xmlConfigurations.push_back(std::make_unique<BreakpointsWindowQtConfig>()); break;
case osd::debugger::WINDOW_TYPE_DEVICES_VIEWER: xmlConfigurations.push_back(std::make_unique<DevicesWindowQtConfig>()); break;
case osd::debugger::WINDOW_TYPE_DEVICE_INFO_VIEWER: xmlConfigurations.push_back(std::make_unique<DeviceInformationWindowQtConfig>()); break;
default: continue;
}
xmlConfigurations.back()->recoverFromXmlNode(*wnode);
@ -111,60 +115,6 @@ void xml_configuration_load(running_machine &machine, config_type cfg_type, conf
}
void xml_configuration_save(running_machine &machine, config_type cfg_type, util::xml::data_node *parentnode)
{
// We only save system configuration
if (cfg_type != config_type::SYSTEM)
return;
for (int i = 0; i < xmlConfigurations.size(); i++)
{
WindowQtConfig &config = *xmlConfigurations[i];
// Create an xml node
util::xml::data_node *const debugger_node = parentnode->add_child(osd::debugger::NODE_WINDOW, nullptr);
// Insert the appropriate information
if (debugger_node)
config.addToXmlDataNode(*debugger_node);
}
}
void gather_save_configurations()
{
xmlConfigurations.clear();
// Loop over all the open windows
foreach (QWidget *widget, QApplication::topLevelWidgets())
{
if (!widget->isVisible())
continue;
if (!widget->isWindow() || widget->windowType() != Qt::Window)
continue;
// Figure out its type
if (dynamic_cast<MainWindow *>(widget))
xmlConfigurations.push_back(std::make_unique<MainWindowQtConfig>());
else if (dynamic_cast<MemoryWindow *>(widget))
xmlConfigurations.push_back(std::make_unique<MemoryWindowQtConfig>());
else if (dynamic_cast<DasmWindow *>(widget))
xmlConfigurations.push_back(std::make_unique<DasmWindowQtConfig>());
else if (dynamic_cast<LogWindow *>(widget))
xmlConfigurations.push_back(std::make_unique<LogWindowQtConfig>());
else if (dynamic_cast<BreakpointsWindow *>(widget))
xmlConfigurations.push_back(std::make_unique<BreakpointsWindowQtConfig>());
else if (dynamic_cast<DevicesWindow *>(widget))
xmlConfigurations.push_back(std::make_unique<DevicesWindowQtConfig>());
else if (dynamic_cast<DeviceInformationWindow *>(widget))
xmlConfigurations.push_back(std::make_unique<DeviceInformationWindowQtConfig>());
xmlConfigurations.back()->buildFromQWidget(widget);
}
}
//============================================================
// Utilities
//============================================================
@ -174,7 +124,7 @@ void load_and_clear_main_window_config(std::vector<std::unique_ptr<WindowQtConfi
for (int i = 0; i < configList.size(); i++)
{
WindowQtConfig &config = *configList[i];
if (config.m_type == WindowQtConfig::WIN_TYPE_MAIN)
if (config.m_type == osd::debugger::WINDOW_TYPE_CONSOLE)
{
config.applyToQWidget(mainQtWindow);
configList.erase(configList.begin() + i);
@ -193,17 +143,17 @@ void setup_additional_startup_windows(running_machine &machine, std::vector<std:
WindowQt *foo = nullptr;
switch (config.m_type)
{
case WindowQtConfig::WIN_TYPE_MEMORY:
case osd::debugger::WINDOW_TYPE_MEMORY_VIEWER:
foo = new MemoryWindow(machine); break;
case WindowQtConfig::WIN_TYPE_DASM:
case osd::debugger::WINDOW_TYPE_DISASSEMBLY_VIEWER:
foo = new DasmWindow(machine); break;
case WindowQtConfig::WIN_TYPE_LOG:
case osd::debugger::WINDOW_TYPE_ERROR_LOG_VIEWER:
foo = new LogWindow(machine); break;
case WindowQtConfig::WIN_TYPE_BREAK_POINTS:
case osd::debugger::WINDOW_TYPE_POINTS_VIEWER:
foo = new BreakpointsWindow(machine); break;
case WindowQtConfig::WIN_TYPE_DEVICES:
case osd::debugger::WINDOW_TYPE_DEVICES_VIEWER:
foo = new DevicesWindow(machine); break;
case WindowQtConfig::WIN_TYPE_DEVICE_INFORMATION:
case osd::debugger::WINDOW_TYPE_DEVICE_INFO_VIEWER:
foo = new DeviceInformationWindow(machine); break;
default:
break;
@ -266,10 +216,11 @@ void debug_qt::init_debugger(running_machine &machine)
}
m_machine = &machine;
// Setup the configuration XML saving and loading
machine.configuration().config_register("debugger",
configuration_manager::load_delegate(&xml_configuration_load, &machine),
configuration_manager::save_delegate(&xml_configuration_save, &machine));
configuration_manager::save_delegate(&debug_qt::configuration_save, this));
}
@ -346,6 +297,7 @@ void debug_qt::wait_for_debugger(device_t &device, bool firststop)
// all the QT windows are already gone.
gather_save_configurations();
}
#if defined(_WIN32) && !defined(SDLMAME_WIN32)
winwindow_update_cursor_state(*m_machine); // make sure the cursor isn't hidden while in debugger
#endif
@ -361,6 +313,38 @@ void debug_qt::debugger_update()
qApp->processEvents(QEventLoop::AllEvents, 1);
}
void debug_qt::configuration_save(config_type which_type, util::xml::data_node *parentnode)
{
// We only save system configuration for now
if ((config_type::SYSTEM == which_type) && parentnode && m_config)
{
for (util::xml::data_node const *node = m_config->get_first_child(); node; node = node->get_next_sibling())
node->copy_into(*parentnode);
m_config.reset();
}
}
void debug_qt::gather_save_configurations()
{
m_config = util::xml::file::create();
// Loop over all the open windows
foreach (QWidget *widget, QApplication::topLevelWidgets())
{
if (!widget->isVisible())
continue;
if (!widget->isWindow() || widget->windowType() != Qt::Window)
continue;
WindowQt *const win = dynamic_cast<WindowQt *>(widget);
if (win)
win->saveConfiguration(*m_config);
}
}
#else // USE_QTDEBUG
MODULE_NOT_SUPPORTED(debug_qt, OSD_DEBUG_PROVIDER, "qt")

View File

@ -43,7 +43,9 @@ public:
m_metrics(),
m_waiting_for_debugger(false),
m_window_list(),
m_main_console(nullptr)
m_main_console(nullptr),
m_config(),
m_save_windows(true)
{
}
@ -60,6 +62,9 @@ protected:
virtual running_machine &machine() const override { return *m_machine; }
virtual ui_metrics &metrics() const override { return *m_metrics; }
virtual void set_color_theme(int index) override;
virtual bool get_save_window_arrangement() const override { return m_save_windows; }
virtual void set_save_window_arrangement(bool save) override { m_save_windows = save; }
virtual bool const &waiting_for_debugger() const override { return m_waiting_for_debugger; }
virtual bool seq_pressed() const override;
@ -88,6 +93,7 @@ private:
consolewin_info *m_main_console;
util::xml::file::ptr m_config;
bool m_save_windows;
};
@ -191,6 +197,14 @@ void debugger_windows::debugger_update()
}
void debugger_windows::set_color_theme(int index)
{
m_metrics->set_color_theme(index);
for (auto const &window : m_window_list)
window->redraw();
}
bool debugger_windows::seq_pressed() const
{
input_seq const &seq = m_machine->ioport().type_seq(IPT_UI_DEBUG_BREAK);
@ -286,7 +300,14 @@ void debugger_windows::config_load(config_type cfgtype, config_level cfglevel, u
{
if (parentnode)
{
if (config_type::SYSTEM == cfgtype)
if (config_type::DEFAULT == cfgtype)
{
m_save_windows = 0 != parentnode->get_attribute_int(osd::debugger::ATTR_DEBUGGER_SAVE_WINDOWS, m_save_windows ? 1 : 0);
util::xml::data_node const *const colors = parentnode->get_child(osd::debugger::NODE_COLORS);
if (colors)
m_metrics->set_color_theme(colors->get_attribute_int(osd::debugger::ATTR_COLORS_THEME, m_metrics->get_color_theme()));
}
else if (config_type::SYSTEM == cfgtype)
{
if (m_main_console)
{
@ -305,7 +326,14 @@ void debugger_windows::config_load(config_type cfgtype, config_level cfglevel, u
void debugger_windows::config_save(config_type cfgtype, util::xml::data_node *parentnode)
{
if (config_type::SYSTEM == cfgtype)
if (config_type::DEFAULT == cfgtype)
{
parentnode->set_attribute_int(osd::debugger::ATTR_DEBUGGER_SAVE_WINDOWS, m_save_windows ? 1 : 0);
util::xml::data_node *const colors = parentnode->add_child(osd::debugger::NODE_COLORS, nullptr);
if (colors)
colors->set_attribute_int(osd::debugger::ATTR_COLORS_THEME, m_metrics->get_color_theme());
}
else if (m_save_windows && (config_type::SYSTEM == cfgtype))
{
for (auto &info : m_window_list)
info->save_configuration(*parentnode);

View File

@ -81,6 +81,31 @@ BreakpointsWindow::~BreakpointsWindow()
}
void BreakpointsWindow::saveConfigurationToNode(util::xml::data_node &node)
{
WindowQt::saveConfigurationToNode(node);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_TYPE, osd::debugger::WINDOW_TYPE_POINTS_VIEWER);
if (m_breakpointsView)
{
switch (m_breakpointsView->view()->type())
{
case DVT_BREAK_POINTS:
node.set_attribute_int(osd::debugger::ATTR_WINDOW_POINTS_TYPE, 0);
break;
case DVT_WATCH_POINTS:
node.set_attribute_int(osd::debugger::ATTR_WINDOW_POINTS_TYPE, 1);
break;
case DVT_REGISTER_POINTS:
node.set_attribute_int(osd::debugger::ATTR_WINDOW_POINTS_TYPE, 2);
break;
default:
break;
}
}
}
void BreakpointsWindow::typeChanged(QAction* changedTo)
{
// Clean
@ -114,21 +139,6 @@ void BreakpointsWindow::typeChanged(QAction* changedTo)
//=========================================================================
// BreakpointsWindowQtConfig
//=========================================================================
void BreakpointsWindowQtConfig::buildFromQWidget(QWidget *widget)
{
WindowQtConfig::buildFromQWidget(widget);
BreakpointsWindow *window = dynamic_cast<BreakpointsWindow *>(widget);
QActionGroup* typeGroup = window->findChild<QActionGroup*>("typegroup");
if (typeGroup->checkedAction()->text() == "Breakpoints")
m_bwType = 0;
else if (typeGroup->checkedAction()->text() == "Watchpoints")
m_bwType = 1;
else if (typeGroup->checkedAction()->text() == "Registerpoints")
m_bwType = 2;
}
void BreakpointsWindowQtConfig::applyToQWidget(QWidget* widget)
{
WindowQtConfig::applyToQWidget(widget);
@ -139,13 +149,6 @@ void BreakpointsWindowQtConfig::applyToQWidget(QWidget* widget)
}
void BreakpointsWindowQtConfig::addToXmlDataNode(util::xml::data_node &node) const
{
WindowQtConfig::addToXmlDataNode(node);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_POINTS_TYPE, m_bwType);
}
void BreakpointsWindowQtConfig::recoverFromXmlNode(util::xml::data_node const &node)
{
WindowQtConfig::recoverFromXmlNode(node);

View File

@ -18,6 +18,9 @@ public:
BreakpointsWindow(running_machine &machine, QWidget *parent = nullptr);
virtual ~BreakpointsWindow();
protected:
virtual void saveConfigurationToNode(util::xml::data_node &node) override;
private slots:
void typeChanged(QAction *changedTo);
@ -34,7 +37,7 @@ class BreakpointsWindowQtConfig : public WindowQtConfig
{
public:
BreakpointsWindowQtConfig() :
WindowQtConfig(WIN_TYPE_BREAK_POINTS),
WindowQtConfig(osd::debugger::WINDOW_TYPE_POINTS_VIEWER),
m_bwType(0)
{
}
@ -44,9 +47,7 @@ public:
// Settings
int m_bwType;
void buildFromQWidget(QWidget *widget);
void applyToQWidget(QWidget *widget);
void addToXmlDataNode(util::xml::data_node &node) const;
void recoverFromXmlNode(util::xml::data_node const &node);
};

View File

@ -51,7 +51,7 @@ DasmWindow::DasmWindow(running_machine &machine, QWidget *parent) :
connect(m_dasmView, &DebuggerView::updated, this, &DasmWindow::dasmViewUpdated);
// Force a recompute of the disassembly region
downcast<debug_view_disasm *>(m_dasmView->view())->set_expression("curpc");
m_dasmView->view<debug_view_disasm>()->set_expression("curpc");
// Populate the combo box & set the proper CPU
populateComboBox();
@ -119,6 +119,19 @@ DasmWindow::~DasmWindow()
}
void DasmWindow::saveConfigurationToNode(util::xml::data_node &node)
{
WindowQt::saveConfigurationToNode(node);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_TYPE, osd::debugger::WINDOW_TYPE_DISASSEMBLY_VIEWER);
debug_view_disasm &dasmview = *m_dasmView->view<debug_view_disasm>();
node.set_attribute_int(osd::debugger::ATTR_WINDOW_DISASSEMBLY_CPU, m_dasmView->sourceIndex());
node.set_attribute_int(osd::debugger::ATTR_WINDOW_DISASSEMBLY_RIGHT_COLUMN, dasmview.right_column());
node.add_child(osd::debugger::NODE_WINDOW_EXPRESSION, dasmview.expression());
}
void DasmWindow::cpuChanged(int index)
{
if (index < m_dasmView->view()->source_count())
@ -132,7 +145,7 @@ void DasmWindow::cpuChanged(int index)
void DasmWindow::expressionSubmitted()
{
const QString expression = m_inputEdit->text();
downcast<debug_view_disasm *>(m_dasmView->view())->set_expression(expression.toLocal8Bit().data());
m_dasmView->view<debug_view_disasm>()->set_expression(expression.toLocal8Bit().data());
m_dasmView->viewport()->update();
}
@ -141,7 +154,7 @@ void DasmWindow::toggleBreakpointAtCursor(bool changedTo)
{
if (m_dasmView->view()->cursor_visible())
{
offs_t const address = downcast<debug_view_disasm *>(m_dasmView->view())->selected_address();
offs_t const address = m_dasmView->view<debug_view_disasm>()->selected_address();
device_t *const device = m_dasmView->view()->source()->device();
device_debug *const cpuinfo = device->debug();
@ -172,7 +185,7 @@ void DasmWindow::enableBreakpointAtCursor(bool changedTo)
{
if (m_dasmView->view()->cursor_visible())
{
offs_t const address = downcast<debug_view_disasm *>(m_dasmView->view())->selected_address();
offs_t const address = m_dasmView->view<debug_view_disasm>()->selected_address();
device_t *const device = m_dasmView->view()->source()->device();
device_debug *const cpuinfo = device->debug();
@ -196,7 +209,7 @@ void DasmWindow::runToCursor(bool changedTo)
{
if (m_dasmView->view()->cursor_visible())
{
offs_t const address = downcast<debug_view_disasm *>(m_dasmView->view())->selected_address();
offs_t const address = m_dasmView->view<debug_view_disasm>()->selected_address();
m_dasmView->view()->source()->device()->debug()->go(address);
}
}
@ -204,7 +217,7 @@ void DasmWindow::runToCursor(bool changedTo)
void DasmWindow::rightBarChanged(QAction* changedTo)
{
debug_view_disasm* dasmView = downcast<debug_view_disasm*>(m_dasmView->view());
debug_view_disasm* dasmView = m_dasmView->view<debug_view_disasm>();
if (changedTo->text() == "Raw Opcodes")
{
dasmView->set_right_column(DASM_RIGHTCOL_RAW);
@ -228,7 +241,7 @@ void DasmWindow::dasmViewUpdated()
bool breakpointEnabled = false;
if (haveCursor)
{
offs_t const address = downcast<debug_view_disasm *>(m_dasmView->view())->selected_address();
offs_t const address = m_dasmView->view<debug_view_disasm>()->selected_address();
device_t *const device = m_dasmView->view()->source()->device();
device_debug *const cpuinfo = device->debug();
@ -281,21 +294,6 @@ void DasmWindow::setToCurrentCpu()
//=========================================================================
// DasmWindowQtConfig
//=========================================================================
void DasmWindowQtConfig::buildFromQWidget(QWidget *widget)
{
WindowQtConfig::buildFromQWidget(widget);
DasmWindow *window = dynamic_cast<DasmWindow *>(widget);
QComboBox *cpu = window->findChild<QComboBox *>("cpu");
m_cpu = cpu->currentIndex();
QActionGroup *rightBarGroup = window->findChild<QActionGroup *>("rightbargroup");
if (rightBarGroup->checkedAction()->text() == "Raw Opcodes")
m_rightBar = DASM_RIGHTCOL_RAW;
else if (rightBarGroup->checkedAction()->text() == "Encrypted Opcodes")
m_rightBar = DASM_RIGHTCOL_ENCRYPTED;
else if (rightBarGroup->checkedAction()->text() == "Comments")
m_rightBar = DASM_RIGHTCOL_COMMENTS;
}
void DasmWindowQtConfig::applyToQWidget(QWidget *widget)
{
@ -311,13 +309,6 @@ void DasmWindowQtConfig::applyToQWidget(QWidget *widget)
}
}
void DasmWindowQtConfig::addToXmlDataNode(util::xml::data_node &node) const
{
WindowQtConfig::addToXmlDataNode(node);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_DISASSEMBLY_CPU, m_cpu);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_DISASSEMBLY_RIGHT_COLUMN, m_rightBar);
}
void DasmWindowQtConfig::recoverFromXmlNode(util::xml::data_node const &node)
{
WindowQtConfig::recoverFromXmlNode(node);

View File

@ -3,6 +3,8 @@
#ifndef MAME_DEBUGGER_QT_DASMWINDOW_H
#define MAME_DEBUGGER_QT_DASMWINDOW_H
#pragma once
#include "debuggerview.h"
#include "windowqt.h"
@ -21,6 +23,9 @@ public:
DasmWindow(running_machine &machine, QWidget *parent = nullptr);
virtual ~DasmWindow();
protected:
virtual void saveConfigurationToNode(util::xml::data_node &node) override;
private slots:
void cpuChanged(int index);
void expressionSubmitted();
@ -55,7 +60,7 @@ class DasmWindowQtConfig : public WindowQtConfig
{
public:
DasmWindowQtConfig() :
WindowQtConfig(WIN_TYPE_DASM),
WindowQtConfig(osd::debugger::WINDOW_TYPE_DISASSEMBLY_VIEWER),
m_cpu(0),
m_rightBar(0)
{
@ -67,9 +72,7 @@ public:
int m_cpu;
int m_rightBar;
void buildFromQWidget(QWidget *widget);
void applyToQWidget(QWidget *widget);
void addToXmlDataNode(util::xml::data_node &node) const;
void recoverFromXmlNode(util::xml::data_node const &node);
};

View File

@ -51,6 +51,19 @@ DebuggerView::~DebuggerView()
m_machine.debug_view().free_view(*m_view);
}
int DebuggerView::sourceIndex() const
{
if (m_view)
{
debug_view_source const *const source = m_view->source();
if (source)
return m_view->source_index(*source);
}
return -1;
}
void DebuggerView::paintEvent(QPaintEvent *event)
{
// Tell the MAME debug view how much real estate is available

View File

@ -3,6 +3,8 @@
#ifndef MAME_DEBUGGER_QT_DEBUGGERVIEW_H
#define MAME_DEBUGGER_QT_DEBUGGERVIEW_H
#pragma once
#include "debug/debugvw.h"
#include <QtWidgets/QAbstractScrollArea>
@ -22,6 +24,8 @@ public:
// Setters and accessors
void setPreferBottom(bool pb) { m_preferBottom = pb; }
debug_view *view() { return m_view; }
template <typename T> T *view() { return downcast<T *>(m_view); }
int sourceIndex() const;
signals:
void updated();

View File

@ -29,6 +29,17 @@ DeviceInformationWindow::~DeviceInformationWindow()
{
}
void DeviceInformationWindow::saveConfigurationToNode(util::xml::data_node &node)
{
WindowQt::saveConfigurationToNode(node);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_TYPE, osd::debugger::WINDOW_TYPE_DEVICE_INFO_VIEWER);
node.set_attribute(osd::debugger::ATTR_WINDOW_DEVICE_TAG, m_device->tag());
}
void DeviceInformationWindow::fill_device_information()
{
setWindowTitle(util::string_format("Debug: Device %s", m_device->tag()).c_str());
@ -101,22 +112,10 @@ void DeviceInformationWindow::set_device(const char *tag)
fill_device_information();
}
const char *DeviceInformationWindow::device_tag() const
{
return m_device->tag();
}
//=========================================================================
// DeviceInformationWindowQtConfig
//=========================================================================
void DeviceInformationWindowQtConfig::buildFromQWidget(QWidget *widget)
{
WindowQtConfig::buildFromQWidget(widget);
DeviceInformationWindow *window = dynamic_cast<DeviceInformationWindow *>(widget);
m_device_tag = window->device_tag();
}
void DeviceInformationWindowQtConfig::applyToQWidget(QWidget *widget)
{
@ -126,13 +125,6 @@ void DeviceInformationWindowQtConfig::applyToQWidget(QWidget *widget)
}
void DeviceInformationWindowQtConfig::addToXmlDataNode(util::xml::data_node &node) const
{
WindowQtConfig::addToXmlDataNode(node);
node.set_attribute(osd::debugger::ATTR_WINDOW_DEVICE_TAG, m_device_tag.c_str());
}
void DeviceInformationWindowQtConfig::recoverFromXmlNode(util::xml::data_node const &node)
{
WindowQtConfig::recoverFromXmlNode(node);

View File

@ -3,6 +3,8 @@
#ifndef MAME_DEBUGGER_QT_DEVICEINFORMATIONWINDOW_H
#define MAME_DEBUGGER_QT_DEVICEINFORMATIONWINDOW_H
#pragma once
#include "windowqt.h"
//============================================================
@ -17,7 +19,9 @@ public:
virtual ~DeviceInformationWindow();
void set_device(const char *tag);
const char *device_tag() const;
protected:
virtual void saveConfigurationToNode(util::xml::data_node &node) override;
private:
device_t *m_device;
@ -37,15 +41,13 @@ public:
std::string m_device_tag;
DeviceInformationWindowQtConfig() :
WindowQtConfig(WIN_TYPE_DEVICE_INFORMATION)
WindowQtConfig(osd::debugger::WINDOW_TYPE_DEVICE_INFO_VIEWER)
{
}
~DeviceInformationWindowQtConfig() {}
void buildFromQWidget(QWidget *widget);
void applyToQWidget(QWidget *widget);
void addToXmlDataNode(util::xml::data_node &node) const;
void recoverFromXmlNode(util::xml::data_node const &node);
};

View File

@ -156,16 +156,18 @@ void DevicesWindow::activated(const QModelIndex &index)
}
void DevicesWindow::saveConfigurationToNode(util::xml::data_node &node)
{
WindowQt::saveConfigurationToNode(node);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_TYPE, osd::debugger::WINDOW_TYPE_DEVICES_VIEWER);
}
//=========================================================================
// DevicesWindowQtConfig
//=========================================================================
void DevicesWindowQtConfig::buildFromQWidget(QWidget *widget)
{
WindowQtConfig::buildFromQWidget(widget);
// DevicesWindow *window = dynamic_cast<DevicesWindow *>(widget);
}
void DevicesWindowQtConfig::applyToQWidget(QWidget *widget)
{
@ -174,12 +176,6 @@ void DevicesWindowQtConfig::applyToQWidget(QWidget *widget)
}
void DevicesWindowQtConfig::addToXmlDataNode(util::xml::data_node &node) const
{
WindowQtConfig::addToXmlDataNode(node);
}
void DevicesWindowQtConfig::recoverFromXmlNode(util::xml::data_node const &node)
{
WindowQtConfig::recoverFromXmlNode(node);

View File

@ -3,6 +3,8 @@
#ifndef MAME_DEBUGGER_QT_DEVICESWINDOW_H
#define MAME_DEBUGGER_QT_DEVICESWINDOW_H
#pragma once
#include "windowqt.h"
#include <QtWidgets/QTreeView>
@ -47,6 +49,9 @@ public slots:
void currentRowChanged(const QModelIndex &current, const QModelIndex &previous);
void activated(const QModelIndex &index);
protected:
virtual void saveConfigurationToNode(util::xml::data_node &node) override;
private:
QTreeView *m_devices_view;
DevicesWindowModel m_devices_model;
@ -63,7 +68,7 @@ class DevicesWindowQtConfig : public WindowQtConfig
{
public:
DevicesWindowQtConfig() :
WindowQtConfig(WIN_TYPE_DEVICES)
WindowQtConfig(osd::debugger::WINDOW_TYPE_DEVICES_VIEWER)
{
}

View File

@ -46,14 +46,17 @@ LogWindow::~LogWindow()
}
void LogWindow::saveConfigurationToNode(util::xml::data_node &node)
{
WindowQt::saveConfigurationToNode(node);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_TYPE, osd::debugger::WINDOW_TYPE_ERROR_LOG_VIEWER);
}
//=========================================================================
// LogWindowQtConfig
//=========================================================================
void LogWindowQtConfig::buildFromQWidget(QWidget *widget)
{
WindowQtConfig::buildFromQWidget(widget);
}
void LogWindowQtConfig::applyToQWidget(QWidget *widget)
{
@ -61,12 +64,6 @@ void LogWindowQtConfig::applyToQWidget(QWidget *widget)
}
void LogWindowQtConfig::addToXmlDataNode(util::xml::data_node &node) const
{
WindowQtConfig::addToXmlDataNode(node);
}
void LogWindowQtConfig::recoverFromXmlNode(util::xml::data_node const &node)
{
WindowQtConfig::recoverFromXmlNode(node);

View File

@ -3,6 +3,8 @@
#ifndef MAME_DEBUGGER_QT_LOGWINDOW_H
#define MAME_DEBUGGER_QT_LOGWINDOW_H
#pragma once
#include "debuggerview.h"
#include "windowqt.h"
@ -18,6 +20,9 @@ public:
LogWindow(running_machine &machine, QWidget *parent = nullptr);
virtual ~LogWindow();
protected:
virtual void saveConfigurationToNode(util::xml::data_node &node) override;
private:
// Widgets
DebuggerView *m_logView;
@ -31,15 +36,13 @@ class LogWindowQtConfig : public WindowQtConfig
{
public:
LogWindowQtConfig() :
WindowQtConfig(WIN_TYPE_LOG)
WindowQtConfig(osd::debugger::WINDOW_TYPE_ERROR_LOG_VIEWER)
{
}
~LogWindowQtConfig() {}
void buildFromQWidget(QWidget *widget);
void applyToQWidget(QWidget *widget);
void addToXmlDataNode(util::xml::data_node &node) const;
void recoverFromXmlNode(util::xml::data_node const &node);
};

View File

@ -148,6 +148,18 @@ void MainWindow::setProcessor(device_t *processor)
}
void MainWindow::saveConfigurationToNode(util::xml::data_node &node)
{
WindowQt::saveConfigurationToNode(node);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_TYPE, osd::debugger::WINDOW_TYPE_CONSOLE);
debug_view_disasm &dasmview = *m_dasmFrame->view()->view<debug_view_disasm>();
node.set_attribute_int(osd::debugger::ATTR_WINDOW_DISASSEMBLY_RIGHT_COLUMN, dasmview.right_column());
node.set_attribute("qtwindowstate", saveState().toPercentEncoding().data());
}
// Used to intercept the user clicking 'X' in the upper corner
void MainWindow::closeEvent(QCloseEvent *event)
{
@ -207,10 +219,10 @@ bool MainWindow::eventFilter(QObject *obj, QEvent *event)
void MainWindow::toggleBreakpointAtCursor(bool changedTo)
{
debug_view_disasm *const dasmView = downcast<debug_view_disasm*>(m_dasmFrame->view()->view());
debug_view_disasm *const dasmView = m_dasmFrame->view()->view<debug_view_disasm>();
if (dasmView->cursor_visible() && (m_machine.debugger().console().get_visible_cpu() == dasmView->source()->device()))
{
offs_t const address = downcast<debug_view_disasm *>(dasmView)->selected_address();
offs_t const address = dasmView->selected_address();
device_debug *const cpuinfo = dasmView->source()->device()->debug();
// Find an existing breakpoint at this address
@ -231,7 +243,7 @@ void MainWindow::toggleBreakpointAtCursor(bool changedTo)
void MainWindow::enableBreakpointAtCursor(bool changedTo)
{
debug_view_disasm *const dasmView = downcast<debug_view_disasm*>(m_dasmFrame->view()->view());
debug_view_disasm *const dasmView = m_dasmFrame->view()->view<debug_view_disasm>();
if (dasmView->cursor_visible() && (m_machine.debugger().console().get_visible_cpu() == dasmView->source()->device()))
{
offs_t const address = dasmView->selected_address();
@ -254,10 +266,10 @@ void MainWindow::enableBreakpointAtCursor(bool changedTo)
void MainWindow::runToCursor(bool changedTo)
{
debug_view_disasm *dasmView = downcast<debug_view_disasm*>(m_dasmFrame->view()->view());
debug_view_disasm *const dasmView = m_dasmFrame->view()->view<debug_view_disasm>();
if (dasmView->cursor_visible() && (m_machine.debugger().console().get_visible_cpu() == dasmView->source()->device()))
{
offs_t address = downcast<debug_view_disasm*>(dasmView)->selected_address();
offs_t address = dasmView->selected_address();
std::string command = string_format("go 0x%X", address);
m_machine.debugger().console().execute_command(command, true);
}
@ -266,7 +278,7 @@ void MainWindow::runToCursor(bool changedTo)
void MainWindow::rightBarChanged(QAction *changedTo)
{
debug_view_disasm *dasmView = downcast<debug_view_disasm*>(m_dasmFrame->view()->view());
debug_view_disasm *const dasmView = m_dasmFrame->view()->view<debug_view_disasm>();
if (changedTo->text() == "Raw Opcodes")
dasmView->set_right_column(DASM_RIGHTCOL_RAW);
@ -382,7 +394,7 @@ void MainWindow::unmountImage(bool changedTo)
void MainWindow::dasmViewUpdated()
{
debug_view_disasm *const dasmView = downcast<debug_view_disasm *>(m_dasmFrame->view()->view());
debug_view_disasm *const dasmView = m_dasmFrame->view()->view<debug_view_disasm>();
bool const haveCursor = dasmView->cursor_visible() && (m_machine.debugger().console().get_visible_cpu() == dasmView->source()->device());
bool haveBreakpoint = false;
bool breakpointEnabled = false;
@ -471,22 +483,6 @@ void MainWindow::createImagesMenu()
//=========================================================================
// MainWindowQtConfig
//=========================================================================
void MainWindowQtConfig::buildFromQWidget(QWidget* widget)
{
WindowQtConfig::buildFromQWidget(widget);
MainWindow *window = dynamic_cast<MainWindow *>(widget);
m_windowState = window->saveState();
QActionGroup *rightBarGroup = window->findChild<QActionGroup*>("rightbargroup");
if (rightBarGroup->checkedAction()->text() == "Raw Opcodes")
m_rightBar = 0;
else if (rightBarGroup->checkedAction()->text() == "Encrypted Opcodes")
m_rightBar = 1;
else if (rightBarGroup->checkedAction()->text() == "Comments")
m_rightBar = 2;
}
void MainWindowQtConfig::applyToQWidget(QWidget *widget)
{
WindowQtConfig::applyToQWidget(widget);
@ -494,15 +490,7 @@ void MainWindowQtConfig::applyToQWidget(QWidget *widget)
window->restoreState(m_windowState);
QActionGroup* rightBarGroup = window->findChild<QActionGroup*>("rightbargroup");
rightBarGroup->actions()[m_rightBar]->trigger();
}
void MainWindowQtConfig::addToXmlDataNode(util::xml::data_node &node) const
{
WindowQtConfig::addToXmlDataNode(node);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_DISASSEMBLY_RIGHT_COLUMN, m_rightBar);
node.set_attribute("qtwindowstate", m_windowState.toPercentEncoding().data());
rightBarGroup->actions()[m_rightBar - 1]->trigger();
}

View File

@ -3,6 +3,8 @@
#ifndef MAME_DEBUGGER_QT_MAINWINDOW_H
#define MAME_DEBUGGER_QT_MAINWINDOW_H
#pragma once
#include "debuggerview.h"
#include "windowqt.h"
@ -32,8 +34,9 @@ public:
void setProcessor(device_t *processor);
protected:
virtual void saveConfigurationToNode(util::xml::data_node &node) override;
// Used to intercept the user clicking 'X' in the upper corner
void closeEvent(QCloseEvent *event);
@ -157,7 +160,7 @@ class MainWindowQtConfig : public WindowQtConfig
{
public:
MainWindowQtConfig() :
WindowQtConfig(WIN_TYPE_MAIN),
WindowQtConfig(osd::debugger::WINDOW_TYPE_CONSOLE),
m_rightBar(0),
m_windowState()
{}
@ -168,9 +171,7 @@ public:
int m_rightBar;
QByteArray m_windowState;
void buildFromQWidget(QWidget *widget);
void applyToQWidget(QWidget *widget);
void addToXmlDataNode(util::xml::data_node &node) const;
void recoverFromXmlNode(util::xml::data_node const &node);
};

View File

@ -214,6 +214,23 @@ MemoryWindow::~MemoryWindow()
}
void MemoryWindow::saveConfigurationToNode(util::xml::data_node &node)
{
WindowQt::saveConfigurationToNode(node);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_TYPE, osd::debugger::WINDOW_TYPE_MEMORY_VIEWER);
debug_view_memory &memView = *m_memTable->view<debug_view_memory>();
node.set_attribute_int(osd::debugger::ATTR_WINDOW_MEMORY_REGION, m_memTable->sourceIndex());
node.set_attribute_int(osd::debugger::ATTR_WINDOW_MEMORY_REVERSE_COLUMNS, memView.reverse() ? 1 : 0);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_MEMORY_ADDRESS_MODE, memView.physical() ? 1 : 0);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_MEMORY_ADDRESS_RADIX, memView.address_radix());
node.set_attribute_int(osd::debugger::ATTR_WINDOW_MEMORY_DATA_FORMAT, int(memView.get_data_format()));
node.set_attribute_int(osd::debugger::ATTR_WINDOW_MEMORY_ROW_CHUNKS, memView.chunks_per_row());
node.add_child(osd::debugger::NODE_WINDOW_EXPRESSION, memView.expression());
}
void MemoryWindow::memoryRegionChanged(int index)
{
if (index < m_memTable->view()->source_count())
@ -222,7 +239,7 @@ void MemoryWindow::memoryRegionChanged(int index)
m_memTable->viewport()->update();
// Update the data format radio buttons to the memory region's default
debug_view_memory *memView = downcast<debug_view_memory*>(m_memTable->view());
debug_view_memory *memView = m_memTable->view<debug_view_memory>();
switch (memView->get_data_format())
{
case debug_view_memory::data_format::HEX_8BIT: dataFormatMenuItem("formatActOne")->setChecked(true); break;
@ -252,7 +269,7 @@ void MemoryWindow::memoryRegionChanged(int index)
void MemoryWindow::expressionSubmitted()
{
const QString expression = m_inputEdit->text();
downcast<debug_view_memory *>(m_memTable->view())->set_expression(expression.toLocal8Bit().data());
m_memTable->view<debug_view_memory>()->set_expression(expression.toLocal8Bit().data());
// Make the cursor pop
m_memTable->view()->set_cursor_visible(true);
@ -269,7 +286,7 @@ void MemoryWindow::expressionSubmitted()
void MemoryWindow::formatChanged(QAction* changedTo)
{
debug_view_memory *memView = downcast<debug_view_memory*>(m_memTable->view());
debug_view_memory *const memView = m_memTable->view<debug_view_memory>();
if (changedTo->text() == "1-byte hexadecimal")
memView->set_data_format(debug_view_memory::data_format::HEX_8BIT);
@ -300,7 +317,7 @@ void MemoryWindow::formatChanged(QAction* changedTo)
void MemoryWindow::addressChanged(QAction* changedTo)
{
debug_view_memory *memView = downcast<debug_view_memory *>(m_memTable->view());
debug_view_memory *const memView = m_memTable->view<debug_view_memory>();
if (changedTo->text() == "Logical Addresses")
memView->set_physical(false);
@ -313,7 +330,7 @@ void MemoryWindow::addressChanged(QAction* changedTo)
void MemoryWindow::radixChanged(QAction* changedTo)
{
debug_view_memory *memView = downcast<debug_view_memory *>(m_memTable->view());
debug_view_memory *const memView = m_memTable->view<debug_view_memory>();
if (changedTo->text() == "Hexadecimal Addresses")
memView->set_address_radix(16);
@ -328,7 +345,7 @@ void MemoryWindow::radixChanged(QAction* changedTo)
void MemoryWindow::reverseChanged(bool changedTo)
{
debug_view_memory *memView = downcast<debug_view_memory*>(m_memTable->view());
debug_view_memory *const memView = m_memTable->view<debug_view_memory>();
memView->set_reverse(changedTo);
m_memTable->viewport()->update();
}
@ -336,7 +353,7 @@ void MemoryWindow::reverseChanged(bool changedTo)
void MemoryWindow::increaseBytesPerLine(bool changedTo)
{
debug_view_memory *memView = downcast<debug_view_memory*>(m_memTable->view());
debug_view_memory *const memView = m_memTable->view<debug_view_memory>();
memView->set_chunks_per_row(memView->chunks_per_row() + 1);
m_memTable->viewport()->update();
}
@ -344,7 +361,7 @@ void MemoryWindow::increaseBytesPerLine(bool changedTo)
void MemoryWindow::decreaseBytesPerLine(bool checked)
{
debug_view_memory *memView = downcast<debug_view_memory *>(m_memTable->view());
debug_view_memory *const memView = m_memTable->view<debug_view_memory>();
memView->set_chunks_per_row(memView->chunks_per_row() - 1);
m_memTable->viewport()->update();
}
@ -404,7 +421,7 @@ void DebuggerMemView::addItemsToContextMenu(QMenu *menu)
if (view()->cursor_visible())
{
debug_view_memory &memView = downcast<debug_view_memory &>(*view());
debug_view_memory &memView = *view<debug_view_memory>();
debug_view_memory_source const &source = downcast<debug_view_memory_source const &>(*memView.source());
address_space *const addressSpace = source.space();
if (addressSpace)
@ -468,55 +485,6 @@ void DebuggerMemView::copyLastPc()
//=========================================================================
// MemoryWindowQtConfig
//=========================================================================
void MemoryWindowQtConfig::buildFromQWidget(QWidget *widget)
{
WindowQtConfig::buildFromQWidget(widget);
MemoryWindow *window = dynamic_cast<MemoryWindow *>(widget);
QComboBox *memoryRegion = window->findChild<QComboBox*>("memoryregion");
m_memoryRegion = memoryRegion->currentIndex();
QAction *reverse = window->findChild<QAction *>("reverse");
m_reverse = reverse->isChecked();
QActionGroup *addressGroup = window->findChild<QActionGroup*>("addressgroup");
if (addressGroup->checkedAction()->text() == "Logical Addresses")
m_addressMode = 0;
else if (addressGroup->checkedAction()->text() == "Physical Addresses")
m_addressMode = 1;
QActionGroup *radixGroup = window->findChild<QActionGroup*>("radixgroup");
if (radixGroup->checkedAction()->text() == "Hexadecimal Addresses")
m_addressRadix = 16;
else if (radixGroup->checkedAction()->text() == "Decimal Addresses")
m_addressRadix = 10;
else if (radixGroup->checkedAction()->text() == "Octal Addresses")
m_addressRadix = 8;
QActionGroup *dataFormat = window->findChild<QActionGroup*>("dataformat");
if (dataFormat->checkedAction()->text() == "1-byte Chunks (Hex)")
m_dataFormat = int(debug_view_memory::data_format::HEX_8BIT);
else if (dataFormat->checkedAction()->text() == "2-byte Chunks (Hex)")
m_dataFormat = int(debug_view_memory::data_format::HEX_16BIT);
else if (dataFormat->checkedAction()->text() == "4-byte Chunks (Hex)")
m_dataFormat = int(debug_view_memory::data_format::HEX_32BIT);
else if (dataFormat->checkedAction()->text() == "8-byte Chunks (Hex)")
m_dataFormat = int(debug_view_memory::data_format::HEX_64BIT);
else if (dataFormat->checkedAction()->text() == "1-byte Chunks (Octal)")
m_dataFormat = int(debug_view_memory::data_format::OCTAL_8BIT);
else if (dataFormat->checkedAction()->text() == "2-byte Chunks (Octal)")
m_dataFormat = int(debug_view_memory::data_format::OCTAL_16BIT);
else if (dataFormat->checkedAction()->text() == "4-byte Chunks (Octal)")
m_dataFormat = int(debug_view_memory::data_format::OCTAL_32BIT);
else if (dataFormat->checkedAction()->text() == "8-byte Chunks (Octal)")
m_dataFormat = int(debug_view_memory::data_format::OCTAL_64BIT);
else if (dataFormat->checkedAction()->text() == "32-bit floating point")
m_dataFormat = int(debug_view_memory::data_format::FLOAT_32BIT);
else if (dataFormat->checkedAction()->text() == "64-bit Floating Point")
m_dataFormat = int(debug_view_memory::data_format::FLOAT_64BIT);
else if (dataFormat->checkedAction()->text() == "80-bit Floating Point")
m_dataFormat = int(debug_view_memory::data_format::FLOAT_80BIT);
}
void MemoryWindowQtConfig::applyToQWidget(QWidget *widget)
{
@ -560,17 +528,6 @@ void MemoryWindowQtConfig::applyToQWidget(QWidget *widget)
}
void MemoryWindowQtConfig::addToXmlDataNode(util::xml::data_node &node) const
{
WindowQtConfig::addToXmlDataNode(node);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_MEMORY_REGION, m_memoryRegion);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_MEMORY_REVERSE_COLUMNS, m_reverse);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_MEMORY_ADDRESS_MODE, m_addressMode);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_MEMORY_ADDRESS_RADIX, m_addressRadix);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_MEMORY_DATA_FORMAT, m_dataFormat);
}
void MemoryWindowQtConfig::recoverFromXmlNode(util::xml::data_node const &node)
{
WindowQtConfig::recoverFromXmlNode(node);

View File

@ -3,6 +3,8 @@
#ifndef MAME_DEBUGGER_QT_MEMORYWINDOW_H
#define MAME_DEBUGGER_QT_MEMORYWINDOW_H
#pragma once
#include "debuggerview.h"
#include "windowqt.h"
@ -23,6 +25,9 @@ public:
MemoryWindow(running_machine &machine, QWidget *parent = nullptr);
virtual ~MemoryWindow();
protected:
virtual void saveConfigurationToNode(util::xml::data_node &node) override;
private slots:
void memoryRegionChanged(int index);
void expressionSubmitted();
@ -77,7 +82,7 @@ class MemoryWindowQtConfig : public WindowQtConfig
{
public:
MemoryWindowQtConfig() :
WindowQtConfig(WIN_TYPE_MEMORY),
WindowQtConfig(osd::debugger::WINDOW_TYPE_MEMORY_VIEWER),
m_reverse(0),
m_addressMode(0),
m_addressRadix(0),
@ -95,9 +100,7 @@ public:
int m_dataFormat;
int m_memoryRegion;
void buildFromQWidget(QWidget *widget);
void applyToQWidget(QWidget *widget);
void addToXmlDataNode(util::xml::data_node &node) const;
void recoverFromXmlNode(util::xml::data_node const &node);
};

View File

@ -243,17 +243,26 @@ void WindowQt::debugActQuit()
}
void WindowQt::saveConfiguration(util::xml::data_node &parentnode)
{
util::xml::data_node *const node = parentnode.add_child(osd::debugger::NODE_WINDOW, nullptr);
if (node)
saveConfigurationToNode(*node);
}
void WindowQt::saveConfigurationToNode(util::xml::data_node &node)
{
node.set_attribute_int(osd::debugger::ATTR_WINDOW_POSITION_X, geometry().topLeft().x());
node.set_attribute_int(osd::debugger::ATTR_WINDOW_POSITION_Y, geometry().topLeft().y());
node.set_attribute_int(osd::debugger::ATTR_WINDOW_WIDTH, size().width());
node.set_attribute_int(osd::debugger::ATTR_WINDOW_HEIGHT, size().height());
}
//=========================================================================
// WindowQtConfig
//=========================================================================
void WindowQtConfig::buildFromQWidget(QWidget *widget)
{
m_position.setX(widget->geometry().topLeft().x());
m_position.setY(widget->geometry().topLeft().y());
m_size.setX(widget->size().width());
m_size.setY(widget->size().height());
}
void WindowQtConfig::applyToQWidget(QWidget *widget)
{
@ -261,21 +270,11 @@ void WindowQtConfig::applyToQWidget(QWidget *widget)
}
void WindowQtConfig::addToXmlDataNode(util::xml::data_node &node) const
{
node.set_attribute_int(osd::debugger::ATTR_WINDOW_TYPE, m_type);
node.set_attribute_int(osd::debugger::ATTR_WINDOW_POSITION_X, m_position.x());
node.set_attribute_int(osd::debugger::ATTR_WINDOW_POSITION_Y, m_position.y());
node.set_attribute_int(osd::debugger::ATTR_WINDOW_WIDTH, m_size.x());
node.set_attribute_int(osd::debugger::ATTR_WINDOW_HEIGHT, m_size.y());
}
void WindowQtConfig::recoverFromXmlNode(util::xml::data_node const &node)
{
m_size.setX(node.get_attribute_int(osd::debugger::ATTR_WINDOW_WIDTH, m_size.x()));
m_size.setY(node.get_attribute_int(osd::debugger::ATTR_WINDOW_HEIGHT, m_size.y()));
m_position.setX(node.get_attribute_int(osd::debugger::ATTR_WINDOW_POSITION_X, m_position.x()));
m_position.setY(node.get_attribute_int(osd::debugger::ATTR_WINDOW_POSITION_Y, m_position.y()));
m_type = (WindowQtConfig::WindowType)node.get_attribute_int(osd::debugger::ATTR_WINDOW_TYPE, m_type);
m_type = node.get_attribute_int(osd::debugger::ATTR_WINDOW_TYPE, m_type);
}

View File

@ -5,7 +5,6 @@
#include "../xmlconfig.h"
#include "config.h"
#include "debugger.h"
#include <QtWidgets/QMainWindow>
@ -31,6 +30,7 @@ public:
bool wantsHide() { return s_hideAll; }
void clearHideFlag() { s_hideAll = false; }
void saveConfiguration(util::xml::data_node &parentnode);
protected slots:
void debugActOpenMemory();
@ -53,6 +53,8 @@ protected slots:
protected:
virtual void saveConfigurationToNode(util::xml::data_node &node);
running_machine &m_machine;
static bool s_refreshAll;
@ -66,20 +68,7 @@ protected:
class WindowQtConfig
{
public:
enum WindowType
{
WIN_TYPE_UNKNOWN,
WIN_TYPE_MAIN,
WIN_TYPE_MEMORY,
WIN_TYPE_DASM,
WIN_TYPE_LOG,
WIN_TYPE_BREAK_POINTS,
WIN_TYPE_DEVICES,
WIN_TYPE_DEVICE_INFORMATION
};
public:
WindowQtConfig(const WindowType& type=WIN_TYPE_UNKNOWN) :
WindowQtConfig(int type) :
m_type(type),
m_size(800, 600),
m_position(120, 120)
@ -87,13 +76,11 @@ public:
virtual ~WindowQtConfig() {}
// Settings
WindowType m_type;
int m_type;
QPoint m_size;
QPoint m_position;
virtual void buildFromQWidget(QWidget *widget);
virtual void applyToQWidget(QWidget *widget);
virtual void addToXmlDataNode(util::xml::data_node &node) const;
virtual void recoverFromXmlNode(util::xml::data_node const &node);
};

View File

@ -212,7 +212,7 @@ consolewin_info::consolewin_info(debugger_windows_interface &debugger) :
m_current_cpu(nullptr),
m_devices_menu(nullptr)
{
if ((window() == nullptr) || (m_views[0] == nullptr))
if (!window() || !m_views[0])
goto cleanup;
// create the views
@ -224,21 +224,30 @@ consolewin_info::consolewin_info(debugger_windows_interface &debugger) :
goto cleanup;
{
// Add image menu only if image devices exist
// add image menu only if image devices exist
image_interface_enumerator iter(machine().root_device());
if (iter.first() != nullptr)
{
m_devices_menu = CreatePopupMenu();
for (device_image_interface &img : iter)
{
if (!img.user_loadable())
continue;
if (img.user_loadable())
{
osd::text::tstring tc_buf = osd::text::to_tstring(string_format("%s : %s", img.device().name(), img.exists() ? img.filename() : "[no image]"));
AppendMenu(m_devices_menu, MF_ENABLED, 0, tc_buf.c_str());
}
}
AppendMenu(GetMenu(window()), MF_ENABLED | MF_POPUP, (UINT_PTR)m_devices_menu, TEXT("Media"));
}
// add the settings menu
HMENU const settingsmenu = CreatePopupMenu();
AppendMenu(settingsmenu, MF_ENABLED, ID_SAVE_WINDOWS, TEXT("Save Window Arrangement"));
AppendMenu(settingsmenu, MF_DISABLED | MF_SEPARATOR, 0, TEXT(""));
AppendMenu(settingsmenu, MF_ENABLED, ID_LIGHT_BACKGROUND, TEXT("Light Background"));
AppendMenu(settingsmenu, MF_ENABLED, ID_DARK_BACKGROUND, TEXT("Dark Background"));
AppendMenu(GetMenu(window()), MF_ENABLED | MF_POPUP, (UINT_PTR)settingsmenu, TEXT("Settings"));
// get the work bounds
RECT work_bounds, bounds;
SystemParametersInfo(SPI_GETWORKAREA, 0, &work_bounds, 0);
@ -349,7 +358,7 @@ void consolewin_info::update_menu()
{
disasmbasewin_info::update_menu();
if (m_devices_menu != nullptr)
if (m_devices_menu)
{
// create the image menu
uint32_t cnt = 0;
@ -435,12 +444,19 @@ void consolewin_info::update_menu()
cnt++;
}
}
HMENU const menu = GetMenu(window());
CheckMenuItem(menu, ID_SAVE_WINDOWS, MF_BYCOMMAND | (debugger().get_save_window_arrangement() ? MF_CHECKED : MF_UNCHECKED));
CheckMenuItem(menu, ID_LIGHT_BACKGROUND, MF_BYCOMMAND | ((ui_metrics::THEME_LIGHT_BACKGROUND == metrics().get_color_theme()) ? MF_CHECKED : MF_UNCHECKED));
CheckMenuItem(menu, ID_DARK_BACKGROUND, MF_BYCOMMAND | ((ui_metrics::THEME_DARK_BACKGROUND == metrics().get_color_theme()) ? MF_CHECKED : MF_UNCHECKED));
}
bool consolewin_info::handle_command(WPARAM wparam, LPARAM lparam)
{
if ((HIWORD(wparam) == 0) && (LOWORD(wparam) >= ID_DEVICE_OPTIONS))
if (HIWORD(wparam) == 0)
{
if (LOWORD(wparam) >= ID_DEVICE_OPTIONS)
{
uint32_t const devid = (LOWORD(wparam) - ID_DEVICE_OPTIONS) / DEVOPTION_MAX;
image_interface_enumerator iter(machine().root_device());
@ -482,19 +498,32 @@ bool consolewin_info::handle_command(WPARAM wparam, LPARAM lparam)
return true;
case DEVOPTION_CASSETTE_FASTFORWARD:
cassette->seek(+300.0, SEEK_CUR); // 5 minutes forward or end, whichever comes first
break;
return true;
case DEVOPTION_CASSETTE_MOTOR:
s = ((cassette->get_state() & CASSETTE_MASK_MOTOR) == CASSETTE_MOTOR_DISABLED);
cassette->change_state(s ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
break;
return true;
case DEVOPTION_CASSETTE_SOUND:
s = ((cassette->get_state() & CASSETTE_MASK_SPEAKER) == CASSETTE_SPEAKER_MUTED);
cassette->change_state(s ? CASSETTE_SPEAKER_ENABLED : CASSETTE_SPEAKER_MUTED, CASSETTE_MASK_SPEAKER);
break;
return true;
}
}
}
}
else switch (LOWORD(wparam))
{
case ID_SAVE_WINDOWS:
debugger().set_save_window_arrangement(!debugger().get_save_window_arrangement());
return true;
case ID_LIGHT_BACKGROUND:
debugger().set_color_theme(ui_metrics::THEME_LIGHT_BACKGROUND);
return true;
case ID_DARK_BACKGROUND:
debugger().set_color_theme(ui_metrics::THEME_DARK_BACKGROUND);
return true;
}
}
return disasmbasewin_info::handle_command(wparam, lparam);
}

View File

@ -498,7 +498,7 @@ void debugview_info::draw_contents(HDC windc)
for (int iter = 0; iter < 2; iter++)
{
COLORREF fgcolor;
COLORREF bgcolor = RGB(0xff,0xff,0xff);
COLORREF bgcolor = metrics().view_colors(DCA_NORMAL).second;
HBRUSH bgbrush = nullptr;
int last_attrib = -1;
TCHAR buffer[256];
@ -522,20 +522,8 @@ void debugview_info::draw_contents(HDC windc)
{
COLORREF oldbg = bgcolor;
// pick new background color
bgcolor = RGB(0xff,0xff,0xff);
if (viewdata[col].attrib & DCA_VISITED) bgcolor = RGB(0xc6, 0xe2, 0xff);
if (viewdata[col].attrib & DCA_ANCILLARY) bgcolor = RGB(0xe0,0xe0,0xe0);
if (viewdata[col].attrib & DCA_SELECTED) bgcolor = RGB(0xff,0x80,0x80);
if (viewdata[col].attrib & DCA_CURRENT) bgcolor = RGB(0xff,0xff,0x00);
if ((viewdata[col].attrib & DCA_SELECTED) && (viewdata[col].attrib & DCA_CURRENT)) bgcolor = RGB(0xff,0xc0,0x80);
// pick new foreground color
fgcolor = RGB(0x00,0x00,0x00);
if (viewdata[col].attrib & DCA_CHANGED) fgcolor = RGB(0xff,0x00,0x00);
if (viewdata[col].attrib & DCA_INVALID) fgcolor = RGB(0x00,0x00,0xff);
if (viewdata[col].attrib & DCA_DISABLED) fgcolor = RGB((GetRValue(fgcolor) + GetRValue(bgcolor)) / 2, (GetGValue(fgcolor) + GetGValue(bgcolor)) / 2, (GetBValue(fgcolor) + GetBValue(bgcolor)) / 2);
if (viewdata[col].attrib & DCA_COMMENT) fgcolor = RGB(0x00,0x80,0x00);
// pick new colors
std::tie(fgcolor, bgcolor) = metrics().view_colors(viewdata[col].attrib);
// flush any pending drawing
if (count > 0)
@ -546,7 +534,7 @@ void debugview_info::draw_contents(HDC windc)
FillRect(dc, &bounds, bgbrush);
if (do_filldown)
{
COLORREF const filldown = (last_attrib & DCA_ANCILLARY) ? RGB(0xe0,0xe0,0xe0) : RGB(0xff,0xff,0xff);
COLORREF const filldown = metrics().view_colors(last_attrib & DCA_ANCILLARY).second;
if (oldbg != filldown)
{
DeleteObject(bgbrush);
@ -593,7 +581,7 @@ void debugview_info::draw_contents(HDC windc)
FillRect(dc, &bounds, bgbrush);
if (do_filldown)
{
COLORREF const filldown = (last_attrib & DCA_ANCILLARY) ? RGB(0xe0,0xe0,0xe0) : RGB(0xff,0xff,0xff);
COLORREF const filldown = metrics().view_colors(last_attrib & DCA_ANCILLARY).second;
if (bgcolor != filldown)
{
DeleteObject(bgbrush);

View File

@ -35,6 +35,9 @@ public:
virtual running_machine &machine() const = 0;
virtual ui_metrics &metrics() const = 0;
virtual void set_color_theme(int index) = 0;
virtual bool get_save_window_arrangement() const = 0;
virtual void set_save_window_arrangement(bool save) = 0;
virtual bool const &waiting_for_debugger() const = 0;
virtual bool seq_pressed() const = 0;

View File

@ -59,6 +59,12 @@ debugwin_info::~debugwin_info()
}
void debugwin_info::redraw()
{
RedrawWindow(m_wnd, nullptr, nullptr, RDW_INVALIDATE | RDW_ALLCHILDREN);
}
void debugwin_info::destroy()
{
for (int curview = 0; curview < MAX_VIEWS; curview++)

View File

@ -40,6 +40,7 @@ public:
void show() const { smart_show_window(m_wnd, true); }
void hide() const { smart_show_window(m_wnd, false); }
void set_foreground() const { SetForegroundWindow(m_wnd); }
void redraw();
void destroy();
virtual bool set_default_focus();
@ -111,6 +112,10 @@ protected:
ID_CLEAR_LOG,
ID_SAVE_WINDOWS,
ID_LIGHT_BACKGROUND,
ID_DARK_BACKGROUND,
ID_DEVICE_OPTIONS // always keep this at the end
};

View File

@ -9,8 +9,39 @@
#include "emu.h"
#include "uimetrics.h"
#include "debug/debugvw.h"
#include "strconv.h"
#include <algorithm>
COLORREF const ui_metrics::s_themes[][COLOR_COUNT] = {
{
RGB(0x00, 0x00, 0x00), // foreground normal
RGB(0xff, 0x00, 0x00), // foreground changed
RGB(0x00, 0x00, 0xff), // foreground invalid
RGB(0x00, 0x80, 0x00), // foreground comment
RGB(0xff, 0xff, 0xff), // background normal
RGB(0xff, 0x80, 0x80), // background selected
RGB(0xe0, 0xe0, 0xe0), // background ancillary
RGB(0xff, 0xff, 0x00), // background current
RGB(0xff, 0xc0, 0x80), // background current selected
RGB(0xc0, 0xe0, 0xff) // background visited
},
{
RGB(0xe0, 0xe0, 0xe0), // foreground normal
RGB(0xff, 0x60, 0xff), // foreground changed
RGB(0x00, 0xc0, 0xe0), // foreground invalid
RGB(0x00, 0xe0, 0x00), // foreground comment
RGB(0x00, 0x00, 0x00), // background normal
RGB(0xe0, 0x00, 0x00), // background selected
RGB(0x40, 0x40, 0x40), // background ancillary
RGB(0x00, 0x00, 0xc0), // background current
RGB(0xb0, 0x60, 0x00), // background current selected
RGB(0x00, 0x40, 0x80) // background visited
} };
ui_metrics::ui_metrics(osd_options const &options) :
m_debug_font(nullptr),
@ -22,7 +53,7 @@ ui_metrics::ui_metrics(osd_options const &options) :
{
// create a temporary DC
HDC const temp_dc = GetDC(nullptr);
if (temp_dc != nullptr)
if (temp_dc)
{
float const size = options.debugger_font_size();
char const *const face = options.debugger_font();
@ -47,6 +78,9 @@ ui_metrics::ui_metrics(osd_options const &options) :
SelectObject(temp_dc, old_font);
ReleaseDC(nullptr, temp_dc);
}
// set default color theme
set_color_theme(THEME_LIGHT_BACKGROUND);
}
@ -69,3 +103,54 @@ ui_metrics::~ui_metrics()
if (m_debug_font)
DeleteObject(m_debug_font);
}
std::pair<COLORREF, COLORREF> ui_metrics::view_colors(u8 attrib) const
{
std::pair<COLORREF, COLORREF> result;
if (attrib & DCA_SELECTED)
result.second = (attrib & DCA_CURRENT) ? m_colors[COLOR_BG_CURRENT_SELECTED] : m_colors[COLOR_BG_SELECTED];
else if (attrib & DCA_CURRENT)
result.second = m_colors[COLOR_BG_CURRENT];
else if (attrib & DCA_ANCILLARY)
result.second = m_colors[COLOR_BG_ANCILLARY];
else if (attrib & DCA_VISITED)
result.second = m_colors[COLOR_BG_VISITED];
else
result.second = m_colors[COLOR_BG_NORMAL];
if (DCA_COMMENT & attrib)
{
result.first = m_colors[COLOR_FG_COMMENT];
}
else
{
if (attrib & DCA_INVALID)
result.first = m_colors[COLOR_FG_INVALID];
else if (attrib & DCA_CHANGED)
result.first = m_colors[COLOR_FG_CHANGED];
else
result.first = m_colors[COLOR_FG_NORMAL];
if (attrib & DCA_DISABLED)
{
result.first = RGB(
(GetRValue(result.first) + GetRValue(result.second) + 1) >> 1,
(GetGValue(result.first) + GetGValue(result.second) + 1) >> 1,
(GetBValue(result.first) + GetBValue(result.second) + 1) >> 1);
}
}
return result;
}
void ui_metrics::set_color_theme(int index)
{
if ((0 <= index) && (std::size(s_themes) > index))
{
std::copy(std::begin(s_themes[index]), std::end(s_themes[index]), m_colors);
m_color_theme = index;
}
}

View File

@ -12,13 +12,20 @@
#include "debugwin.h"
#include "modules/lib/osdobj_common.h"
#include <utility>
class ui_metrics
{
public:
enum
{
THEME_LIGHT_BACKGROUND,
THEME_DARK_BACKGROUND
};
ui_metrics(osd_options const &options);
ui_metrics(ui_metrics const &that);
~ui_metrics();
@ -31,7 +38,28 @@ public:
uint32_t hscroll_height() const { return m_hscroll_height; }
uint32_t vscroll_width() const { return m_vscroll_width; }
std::pair<COLORREF, COLORREF> view_colors(u8 attrib) const;
int get_color_theme() const { return m_color_theme; }
void set_color_theme(int index);
private:
enum
{
COLOR_FG_NORMAL,
COLOR_FG_CHANGED,
COLOR_FG_INVALID,
COLOR_FG_COMMENT,
COLOR_BG_NORMAL,
COLOR_BG_SELECTED,
COLOR_BG_ANCILLARY,
COLOR_BG_CURRENT,
COLOR_BG_CURRENT_SELECTED,
COLOR_BG_VISITED,
COLOR_COUNT
};
HFONT m_debug_font;
uint32_t m_debug_font_height;
uint32_t m_debug_font_width;
@ -39,6 +67,11 @@ private:
uint32_t const m_hscroll_height;
uint32_t const m_vscroll_width;
COLORREF m_colors[COLOR_COUNT];
int m_color_theme;
static COLORREF const s_themes[][COLOR_COUNT];
};
#endif // MAME_DEBUGGER_WIN_UIMETRICS_H

View File

@ -6,12 +6,15 @@
namespace osd::debugger {
char const *const NODE_WINDOW = "window";
char const *const NODE_COLORS = "colors";
char const *const NODE_WINDOW_SPLITS = "splits";
char const *const NODE_WINDOW_SELECTION = "selection";
char const *const NODE_WINDOW_SCROLL = "scroll";
char const *const NODE_WINDOW_EXPRESSION = "expression";
char const *const ATTR_DEBUGGER_SAVE_WINDOWS = "savewindows";
char const *const ATTR_WINDOW_TYPE = "type";
char const *const ATTR_WINDOW_POSITION_X = "position_x";
char const *const ATTR_WINDOW_POSITION_Y = "position_y";
@ -32,6 +35,8 @@ char const *const ATTR_WINDOW_POINTS_TYPE = "bwtype";
char const *const ATTR_WINDOW_DEVICE_TAG = "device-tag";
char const *const ATTR_COLORS_THEME = "theme";
char const *const ATTR_SPLITS_CONSOLE_STATE = "state";
char const *const ATTR_SPLITS_CONSOLE_DISASSEMBLY = "disassembly";

View File

@ -22,12 +22,15 @@ WINDOW_TYPE_DEVICE_INFO_VIEWER
};
extern char const *const NODE_WINDOW;
extern char const *const NODE_COLORS;
extern char const *const NODE_WINDOW_SPLITS;
extern char const *const NODE_WINDOW_SELECTION;
extern char const *const NODE_WINDOW_SCROLL;
extern char const *const NODE_WINDOW_EXPRESSION;
extern char const *const ATTR_DEBUGGER_SAVE_WINDOWS;
extern char const *const ATTR_WINDOW_TYPE;
extern char const *const ATTR_WINDOW_POSITION_X;
extern char const *const ATTR_WINDOW_POSITION_Y;
@ -48,6 +51,8 @@ extern char const *const ATTR_WINDOW_POINTS_TYPE;
extern char const *const ATTR_WINDOW_DEVICE_TAG;
extern char const *const ATTR_COLORS_THEME;
extern char const *const ATTR_SPLITS_CONSOLE_STATE;
extern char const *const ATTR_SPLITS_CONSOLE_DISASSEMBLY;