From 3733da1af7e6933e353cd7d772a443423382816e Mon Sep 17 00:00:00 2001 From: Andrea Odetti Date: Tue, 10 Oct 2017 14:26:40 +0100 Subject: [PATCH] Remove configuration from libappleii and delegate it to the frontends. In qapple we use QSettings. Signed-off-by: Andrea Odetti --- .gitignore | 2 - source/CMakeLists.txt | 1 - source/frontends/ncurses/CMakeLists.txt | 1 + .../ncurses}/configuration.cpp | 2 +- .../ncurses}/configuration.h | 5 +- source/frontends/ncurses/main.cpp | 2 +- source/frontends/qapple/CMakeLists.txt | 1 + source/frontends/qapple/main.cpp | 4 + source/frontends/qapple/preferences.cpp | 48 +++++++--- source/frontends/qapple/preferences.h | 6 +- source/frontends/qapple/qapple.cpp | 7 +- source/frontends/qapple/qapple.h | 1 + source/frontends/qapple/qapple.pro | 10 ++- source/frontends/qapple/settings.cpp | 89 +++++++++++++++++++ source/frontends/qapple/settings.h | 12 +++ source/linux/interface.h | 8 ++ 16 files changed, 169 insertions(+), 30 deletions(-) rename source/{linux => frontends/ncurses}/configuration.cpp (98%) rename source/{linux => frontends/ncurses}/configuration.h (53%) create mode 100644 source/frontends/qapple/settings.cpp create mode 100644 source/frontends/qapple/settings.h diff --git a/.gitignore b/.gitignore index 9e002a58..9a7b68d2 100644 --- a/.gitignore +++ b/.gitignore @@ -195,8 +195,6 @@ compile_commands.json CTestTestfile.cmake *.so *.a -applen -qapple # Qt # C++ objects and libs diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 16f8863a..ad8e0f5c 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -17,7 +17,6 @@ add_library(appleii SHARED ParallelPrinter.cpp MouseInterface.cpp - linux/configuration.cpp linux/data.cpp linux/dummies.cpp linux/wwrapper.cpp diff --git a/source/frontends/ncurses/CMakeLists.txt b/source/frontends/ncurses/CMakeLists.txt index 68ed2f7b..138b6de9 100644 --- a/source/frontends/ncurses/CMakeLists.txt +++ b/source/frontends/ncurses/CMakeLists.txt @@ -8,6 +8,7 @@ add_executable(applen nframe.cpp asciiart.cpp resources.cpp + configuration.cpp ) target_link_libraries(applen diff --git a/source/linux/configuration.cpp b/source/frontends/ncurses/configuration.cpp similarity index 98% rename from source/linux/configuration.cpp rename to source/frontends/ncurses/configuration.cpp index e4d935b8..8d09532c 100644 --- a/source/linux/configuration.cpp +++ b/source/frontends/ncurses/configuration.cpp @@ -1,4 +1,4 @@ -#include "linux/configuration.h" +#include "frontends/ncurses/configuration.h" #include "linux/wincompat.h" #include "Log.h" diff --git a/source/linux/configuration.h b/source/frontends/ncurses/configuration.h similarity index 53% rename from source/linux/configuration.h rename to source/frontends/ncurses/configuration.h index 8fbec9dd..76701ffb 100644 --- a/source/linux/configuration.h +++ b/source/frontends/ncurses/configuration.h @@ -1,11 +1,14 @@ #pragma once -#include "linux/interface.h" +#include "linux/wincompat.h" #include void InitializeRegistry(const std::string & filename); const boost::property_tree::ptree & getProperties(); +BOOL RegLoadString (LPCTSTR section, LPCTSTR key, BOOL peruser, LPTSTR buffer, DWORD chars); +BOOL RegLoadValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD *value); +BOOL RegLoadValue (LPCTSTR section, LPCTSTR key, BOOL peruser, BOOL *value); void RegSaveString (LPCTSTR section, LPCTSTR key, BOOL peruser, LPCTSTR buffer); void RegSaveValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD value); diff --git a/source/frontends/ncurses/main.cpp b/source/frontends/ncurses/main.cpp index 8f6eee58..de597f49 100644 --- a/source/frontends/ncurses/main.cpp +++ b/source/frontends/ncurses/main.cpp @@ -19,9 +19,9 @@ #include "Video.h" #include "SaveState.h" -#include "linux/configuration.h" #include "linux/data.h" #include "linux/benchmark.h" +#include "frontends/ncurses/configuration.h" #include "frontends/ncurses/world.h" namespace diff --git a/source/frontends/qapple/CMakeLists.txt b/source/frontends/qapple/CMakeLists.txt index bea85654..057c26c7 100644 --- a/source/frontends/qapple/CMakeLists.txt +++ b/source/frontends/qapple/CMakeLists.txt @@ -18,6 +18,7 @@ add_executable(qapple graphicscache.cpp gamepadpaddle.cpp video.cpp + settings.cpp commands.cpp chunks.cpp diff --git a/source/frontends/qapple/main.cpp b/source/frontends/qapple/main.cpp index e530f7f0..83a34879 100644 --- a/source/frontends/qapple/main.cpp +++ b/source/frontends/qapple/main.cpp @@ -4,6 +4,10 @@ int main(int argc, char *argv[]) { QApplication a(argc, argv); + + QApplication::setOrganizationName("AndSoft"); + QApplication::setApplicationName("QAppleEmulator"); + QApple w; w.show(); diff --git a/source/frontends/qapple/preferences.cpp b/source/frontends/qapple/preferences.cpp index e3d6f23a..066beb4f 100644 --- a/source/frontends/qapple/preferences.cpp +++ b/source/frontends/qapple/preferences.cpp @@ -73,22 +73,38 @@ namespace } } - void processPropertyTree(const boost::property_tree::ptree & registry, QTreeWidgetItem * item) + void processSettingsGroup(QSettings & settings, QTreeWidgetItem * item) { QList items; - for (const auto & it : registry) - { - const boost::property_tree::ptree::data_type & key = it.first; - const boost::property_tree::ptree & subTree = it.second; + // first the leaves + const QStringList children = settings.childKeys(); + for (const auto & child : children) + { QStringList columns; - columns.append(QString::fromStdString(key)); - columns.append(QString::fromStdString(subTree.data())); + columns.append(child); // the name + columns.append(settings.value(child).toString()); // the value QTreeWidgetItem * newItem = new QTreeWidgetItem(item, columns); - processPropertyTree(subTree, newItem); items.append(newItem); } + + // then the subtrees + const QStringList groups = settings.childGroups(); + for (const auto & group : groups) + { + settings.beginGroup(group); + + QStringList columns; + columns.append(group); // the name + + QTreeWidgetItem * newItem = new QTreeWidgetItem(item, columns); + processSettingsGroup(settings, newItem); // process subtree + items.append(newItem); + + settings.endGroup(); + } + item->addChildren(items); } @@ -106,11 +122,11 @@ Preferences::Preferences(QWidget *parent) : myHDs.push_back(hd2); } -void Preferences::setup(const Data & data, const boost::property_tree::ptree & registry) +void Preferences::setup(const Data & data, QSettings & settings) { populateJoysticks(); setData(data); - setRegistry(registry); + setSettings(settings); } void Preferences::populateJoysticks() @@ -132,11 +148,17 @@ void Preferences::populateJoysticks() } } -void Preferences::setRegistry(const boost::property_tree::ptree & registry) +void Preferences::setSettings(QSettings & settings) { registryTree->clear(); - QTreeWidgetItem * newItem = new QTreeWidgetItem(registryTree, QStringList(QString("Registry"))); - processPropertyTree(registry, newItem); + + QStringList columns; + columns.append(QString::fromUtf8("Registry")); // the name + columns.append(settings.fileName()); // the value + + QTreeWidgetItem * newItem = new QTreeWidgetItem(registryTree, columns); + processSettingsGroup(settings, newItem); + registryTree->addTopLevelItem(newItem); registryTree->expandAll(); } diff --git a/source/frontends/qapple/preferences.h b/source/frontends/qapple/preferences.h index 2fc6c9b4..2a46d1d1 100644 --- a/source/frontends/qapple/preferences.h +++ b/source/frontends/qapple/preferences.h @@ -4,7 +4,7 @@ #include "ui_preferences.h" #include -#include +#include class Preferences : public QDialog, private Ui::Preferences { @@ -28,7 +28,7 @@ public: explicit Preferences(QWidget *parent); - void setup(const Data & data, const boost::property_tree::ptree & registry); + void setup(const Data & data, QSettings & settings); Data getData() const; private slots: @@ -48,7 +48,7 @@ private: std::vector myDisks; std::vector myHDs; - void setRegistry(const boost::property_tree::ptree & registry); + void setSettings(QSettings & settings); void setData(const Data & data); void populateJoysticks(); void browseDisk(const std::vector & disks, const size_t id); diff --git a/source/frontends/qapple/qapple.cpp b/source/frontends/qapple/qapple.cpp index 402f8336..1afb86ed 100644 --- a/source/frontends/qapple/qapple.cpp +++ b/source/frontends/qapple/qapple.cpp @@ -15,13 +15,13 @@ #include "Registry.h" #include "linux/data.h" -#include "linux/configuration.h" #include "linux/benchmark.h" #include "linux/paddle.h" #include "emulator.h" #include "memorycontainer.h" #include "gamepadpaddle.h" +#include "settings.h" #include #include @@ -34,8 +34,6 @@ namespace g_fh = fopen("/tmp/applewin.txt", "w"); setbuf(g_fh, NULL); - InitializeRegistry("../qapple/applen.conf"); - LogFileOutput("Initialisation\n"); ImageInitialize(); @@ -320,7 +318,8 @@ void QApple::on_actionOptions_triggered() currentOptions.joystickId = myGamepad->deviceId(); } - myPreferences.setup(currentOptions, getProperties()); + QSettings settings; // the function will "modify" it + myPreferences.setup(currentOptions, settings); if (myPreferences.exec()) { diff --git a/source/frontends/qapple/qapple.h b/source/frontends/qapple/qapple.h index 40115dc5..120e1571 100644 --- a/source/frontends/qapple/qapple.h +++ b/source/frontends/qapple/qapple.h @@ -5,6 +5,7 @@ #include #include +#include #include "preferences.h" class Emulator; diff --git a/source/frontends/qapple/qapple.pro b/source/frontends/qapple/qapple.pro index 4205c338..0613777c 100644 --- a/source/frontends/qapple/qapple.pro +++ b/source/frontends/qapple/qapple.pro @@ -23,7 +23,8 @@ SOURCES += main.cpp\ qhexedit.cpp \ memorycontainer.cpp \ preferences.cpp \ - gamepadpaddle.cpp + gamepadpaddle.cpp \ + settings.cpp HEADERS += qapple.h \ emulator.h \ @@ -34,7 +35,8 @@ HEADERS += qapple.h \ qhexedit.h \ memorycontainer.h \ preferences.h \ - gamepadpaddle.h + gamepadpaddle.h \ + settings.h FORMS += qapple.ui \ emulator.ui \ @@ -44,12 +46,12 @@ FORMS += qapple.ui \ RESOURCES += \ qapple.qrc -unix: LIBS += -L$$PWD/../../../ -lappleii +unix: LIBS += -L$$PWD/../../ -lappleii INCLUDEPATH += $$PWD/../../../source DEPENDPATH += $$PWD/../../../source unix: LIBS += -levdev -unix:QMAKE_RPATHDIR += $ORIGIN/../../.. +unix:QMAKE_RPATHDIR += $ORIGIN/../.. diff --git a/source/frontends/qapple/settings.cpp b/source/frontends/qapple/settings.cpp new file mode 100644 index 00000000..7ae2c12b --- /dev/null +++ b/source/frontends/qapple/settings.cpp @@ -0,0 +1,89 @@ +#include "settings.h" + +#include + +namespace +{ + QString getKey(LPCTSTR section, LPCTSTR key) + { + const QString qkey = QString::fromUtf8(section) + "/" + QString::fromUtf8(key); + return qkey; + } + + QSettings & getOurSettings() + { + static QSettings settings; + return settings; + } +} + +void RegSaveString (LPCTSTR section, LPCTSTR key, BOOL peruser, LPCTSTR buffer) +{ + Q_UNUSED(peruser) + const QString s = QString::fromUtf8(buffer); + getOurSettings().setValue(getKey(section, key), QVariant::fromValue(s)); +} + +void RegSaveValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD value) +{ + Q_UNUSED(peruser) + getOurSettings().setValue(getKey(section, key), QVariant::fromValue(value)); +} + +BOOL RegLoadString (LPCTSTR section, LPCTSTR key, BOOL peruser, LPTSTR buffer, DWORD chars) +{ + Q_UNUSED(peruser) + + QSettings & settings = getOurSettings(); + const QString qkey = getKey(section, key); + if (settings.contains(qkey)) + { + const QVariant value = settings.value(qkey); + const std::string s = value.toString().toStdString(); + + strncpy(buffer, s.c_str(), chars); + buffer[chars - 1] = 0; + + return TRUE; + } + else + { + return FALSE; + } +} + +BOOL RegLoadValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD *value) +{ + Q_UNUSED(peruser) + + QSettings & settings = getOurSettings(); + const QString qkey = getKey(section, key); + if (settings.contains(qkey)) + { + const QVariant v = settings.value(qkey); + *value = v.toUInt(); + return TRUE; + } + else + { + return FALSE; + } +} + +BOOL RegLoadValue (LPCTSTR section, LPCTSTR key, BOOL peruser, BOOL *value) +{ + Q_UNUSED(peruser) + + QSettings & settings = getOurSettings(); + const QString qkey = getKey(section, key); + if (settings.contains(qkey)) + { + const QVariant v = settings.value(qkey); + *value = v.toBool(); + return TRUE; + } + else + { + return FALSE; + } +} diff --git a/source/frontends/qapple/settings.h b/source/frontends/qapple/settings.h new file mode 100644 index 00000000..7930c8a7 --- /dev/null +++ b/source/frontends/qapple/settings.h @@ -0,0 +1,12 @@ +#ifndef SETTINGS_H +#define SETTINGS_H + +#include "linux/wincompat.h" + +BOOL RegLoadString (LPCTSTR section, LPCTSTR key, BOOL peruser, LPTSTR buffer, DWORD chars); +BOOL RegLoadValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD *value); +BOOL RegLoadValue (LPCTSTR section, LPCTSTR key, BOOL peruser, BOOL *value); +void RegSaveString (LPCTSTR section, LPCTSTR key, BOOL peruser, LPCTSTR buffer); +void RegSaveValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD value); + +#endif // SETTINGS_H diff --git a/source/linux/interface.h b/source/linux/interface.h index e4322a84..bbaa721f 100644 --- a/source/linux/interface.h +++ b/source/linux/interface.h @@ -28,3 +28,11 @@ BYTE __stdcall JoyResetPosition(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG n // Speaker BYTE __stdcall SpkrToggle (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft); + +// Registry + +BOOL RegLoadString (LPCTSTR section, LPCTSTR key, BOOL peruser, LPTSTR buffer, DWORD chars); +BOOL RegLoadValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD *value); +BOOL RegLoadValue (LPCTSTR section, LPCTSTR key, BOOL peruser, BOOL *value); +void RegSaveString (LPCTSTR section, LPCTSTR key, BOOL peruser, LPCTSTR buffer); +void RegSaveValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD value);