From 07ac11c6abf8fdcb3bae091e4df65850105fa201 Mon Sep 17 00:00:00 2001 From: Solant Date: Mon, 17 Feb 2020 22:44:29 +0300 Subject: [PATCH] Qsettings (#401) * initial qsettings implementation * fix qsettings object constructor initialization * added sync method * added setValue method * implemented value method * pass actual app name and org name * accept any value that can be converted to QVariant in setValue method * implemented value method with proper QVariant wrap * added tests * removed testing data, fixed warning * fixed cpp linting --- CMakeLists.txt | 1 + src/cpp/include/deps/yoga/YGStyle.h | 2 +- .../nodegui/QtCore/QSettings/qsettings_wrap.h | 25 +++++++ .../lib/QtCore/QSettings/qsettings_wrap.cpp | 68 +++++++++++++++++++ .../QFontDatabase/qfontdatabase_wrap.cpp | 3 +- src/cpp/main.cpp | 2 + src/lib/QtCore/QSettings.ts | 33 +++++++++ src/lib/QtCore/__tests__/QSettings.test.ts | 15 ++++ 8 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 src/cpp/include/nodegui/QtCore/QSettings/qsettings_wrap.h create mode 100644 src/cpp/lib/QtCore/QSettings/qsettings_wrap.cpp create mode 100644 src/lib/QtCore/QSettings.ts create mode 100644 src/lib/QtCore/__tests__/QSettings.test.ts diff --git a/CMakeLists.txt b/CMakeLists.txt index b306d4ae2..67d629c8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,6 +55,7 @@ add_library(${CORE_WIDGETS_ADDON} SHARED "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QObject/qobject_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QVariant/qvariant_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QSize/qsize_wrap.cpp" + "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QSettings/qsettings_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QRect/qrect_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QPoint/qpoint_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QTime/qtime_wrap.cpp" diff --git a/src/cpp/include/deps/yoga/YGStyle.h b/src/cpp/include/deps/yoga/YGStyle.h index 4b67274ae..0f044da82 100644 --- a/src/cpp/include/deps/yoga/YGStyle.h +++ b/src/cpp/include/deps/yoga/YGStyle.h @@ -56,7 +56,7 @@ class YOGA_EXPORT YGStyle { style.*Prop = values; return *this; } - operator const Values&() const { return style.*Prop; } + operator const Values &() const { return style.*Prop; } Ref operator[](Idx idx) { return {style, idx}; } CompactValue operator[](Idx idx) const { return (style.*Prop)[idx]; } }; diff --git a/src/cpp/include/nodegui/QtCore/QSettings/qsettings_wrap.h b/src/cpp/include/nodegui/QtCore/QSettings/qsettings_wrap.h new file mode 100644 index 000000000..238ca72d0 --- /dev/null +++ b/src/cpp/include/nodegui/QtCore/QSettings/qsettings_wrap.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +#include + +#include "Extras/Utils/nutils.h" +#include "core/Component/component_macro.h" + +class DLL_EXPORT QSettingsWrap : public Napi::ObjectWrap { + COMPONENT_WRAPPED_METHODS_DECLARATION + + private: + std::unique_ptr instance; + + public: + ~QSettingsWrap(); + QSettings* getInternalInstance(); + QSettingsWrap(const Napi::CallbackInfo& info); + Napi::Value sync(const Napi::CallbackInfo& info); + Napi::Value setValue(const Napi::CallbackInfo& info); + Napi::Value value(const Napi::CallbackInfo& info); + static Napi::Object init(Napi::Env env, Napi::Object exports); + static Napi::FunctionReference constructor; +}; diff --git a/src/cpp/lib/QtCore/QSettings/qsettings_wrap.cpp b/src/cpp/lib/QtCore/QSettings/qsettings_wrap.cpp new file mode 100644 index 000000000..bd7c045db --- /dev/null +++ b/src/cpp/lib/QtCore/QSettings/qsettings_wrap.cpp @@ -0,0 +1,68 @@ +#include "QtCore/QSettings/qsettings_wrap.h" + +#include "Extras/Utils/nutils.h" +#include "QtCore/QVariant/qvariant_wrap.h" + +Napi::FunctionReference QSettingsWrap::constructor; + +Napi::Object QSettingsWrap::init(Napi::Env env, Napi::Object exports) { + Napi::HandleScope scope(env); + char CLASSNAME[] = "QSettings"; + Napi::Function func = + DefineClass(env, CLASSNAME, + {InstanceMethod("sync", &QSettingsWrap::sync), + InstanceMethod("setValue", &QSettingsWrap::setValue), + InstanceMethod("value", &QSettingsWrap::value), + COMPONENT_WRAPPED_METHODS_EXPORT_DEFINE(QSettingsWrap)}); + constructor = Napi::Persistent(func); + exports.Set(CLASSNAME, func); + return exports; +} + +QSettingsWrap::QSettingsWrap(const Napi::CallbackInfo& info) + : Napi::ObjectWrap(info) { + Napi::Env env = info.Env(); + + QString organization = + QString::fromUtf8(info[0].As().Utf8Value().c_str()); + QString application = + QString::fromUtf8(info[1].As().Utf8Value().c_str()); + + this->instance = std::make_unique(organization, application); + this->rawData = extrautils::configureQObject(this->getInternalInstance()); +} + +Napi::Value QSettingsWrap::setValue(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + + QString key = + QString::fromUtf8(info[0].As().Utf8Value().c_str()); + Napi::Value value = info[1]; + QVariant* valueVariant = extrautils::convertToQVariant(env, value); + + this->instance.get()->setValue(key, *valueVariant); + delete valueVariant; + return env.Null(); +} + +Napi::Value QSettingsWrap::value(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + + QString key = + QString::fromUtf8(info[0].As().Utf8Value().c_str()); + QVariant value = this->instance.get()->value(key); + + auto instance = QVariantWrap::constructor.New( + {Napi::External::New(env, new QVariant(value))}); + return instance; +} + +Napi::Value QSettingsWrap::sync(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + this->instance.get()->sync(); + return env.Null(); +} + +QSettings* QSettingsWrap::getInternalInstance() { return this->instance.get(); } + +QSettingsWrap::~QSettingsWrap() { this->instance.reset(); } diff --git a/src/cpp/lib/QtGui/QFontDatabase/qfontdatabase_wrap.cpp b/src/cpp/lib/QtGui/QFontDatabase/qfontdatabase_wrap.cpp index 2381531f2..139fe90eb 100644 --- a/src/cpp/lib/QtGui/QFontDatabase/qfontdatabase_wrap.cpp +++ b/src/cpp/lib/QtGui/QFontDatabase/qfontdatabase_wrap.cpp @@ -41,7 +41,8 @@ Napi::Value QFontDatabaseWrap::families(const Napi::CallbackInfo& info) { if (info.Length() == 1) { writingSystem = info[0].As().Int32Value(); } - QStringList families = this->instance->families(static_cast(writingSystem)); + QStringList families = this->instance->families( + static_cast(writingSystem)); Napi::Array familiesNapi = Napi::Array::New(env, families.size()); for (int i = 0; i < families.size(); i++) { familiesNapi[i] = Napi::String::New(env, families[i].toStdString()); diff --git a/src/cpp/main.cpp b/src/cpp/main.cpp index 7d367a631..483c22c24 100644 --- a/src/cpp/main.cpp +++ b/src/cpp/main.cpp @@ -7,6 +7,7 @@ #include "QtCore/QObject/qobject_wrap.h" #include "QtCore/QPoint/qpoint_wrap.h" #include "QtCore/QRect/qrect_wrap.h" +#include "QtCore/QSettings/qsettings_wrap.h" #include "QtCore/QSize/qsize_wrap.h" #include "QtCore/QTime/qtime_wrap.h" #include "QtCore/QUrl/qurl_wrap.h" @@ -145,6 +146,7 @@ Napi::Object Main(Napi::Env env, Napi::Object exports) { QTimeEditWrap::init(env, exports); QButtonGroupWrap::init(env, exports); QStatusBarWrap::init(env, exports); + QSettingsWrap::init(env, exports); return exports; } diff --git a/src/lib/QtCore/QSettings.ts b/src/lib/QtCore/QSettings.ts new file mode 100644 index 000000000..4486708b8 --- /dev/null +++ b/src/lib/QtCore/QSettings.ts @@ -0,0 +1,33 @@ +import { NativeElement, Component } from '../core/Component'; +import addon from '../utils/addon'; +import { QVariant } from './QVariant'; + +enum Format { + NativeFormat = 0, + Registry32Format = 2, + Registry64Format = 3, + IniFormat = 1, + InvalidFormat = 16, +} + +enum Scope { + UserScope = 0, + SystemScope = 1, +} + +export class QSettings extends Component { + native: NativeElement; + constructor(organization: string, application: string) { + super(); + this.native = new addon.QSettings(organization, application); + } + sync(): void { + this.native.sync(); + } + setValue(key: string, value: number | string | boolean): void { + this.native.setValue(key, value); + } + value(key: string): QVariant { + return this.native.value(key); + } +} diff --git a/src/lib/QtCore/__tests__/QSettings.test.ts b/src/lib/QtCore/__tests__/QSettings.test.ts new file mode 100644 index 000000000..ec4635493 --- /dev/null +++ b/src/lib/QtCore/__tests__/QSettings.test.ts @@ -0,0 +1,15 @@ +import { QSettings } from '../QSettings'; + +describe('QSize', () => { + it('initialize', () => { + expect(() => new QSettings('testOrg', 'testApp')).not.toThrow(); + }); + + it('should save and load data correctly', () => { + const value = Math.ceil(Math.random() * 100); + const settings = new QSettings('testOrg', 'testApp'); + settings.setValue('randomNumber', value); + settings.sync(); + expect(settings.value('randomNumber').toInt()).toBe(value); + }); +});