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
This commit is contained in:
Solant 2020-02-17 22:44:29 +03:00 committed by GitHub
parent b09b1cf0e0
commit 07ac11c6ab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 147 additions and 2 deletions

View File

@ -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"

View File

@ -56,7 +56,7 @@ class YOGA_EXPORT YGStyle {
style.*Prop = values;
return *this;
}
operator const Values<Idx>&() const { return style.*Prop; }
operator const Values<Idx> &() const { return style.*Prop; }
Ref operator[](Idx idx) { return {style, idx}; }
CompactValue operator[](Idx idx) const { return (style.*Prop)[idx]; }
};

View File

@ -0,0 +1,25 @@
#pragma once
#include <napi.h>
#include <QSettings>
#include "Extras/Utils/nutils.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QSettingsWrap : public Napi::ObjectWrap<QSettingsWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
private:
std::unique_ptr<QSettings> 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;
};

View File

@ -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<QSettingsWrap>(info) {
Napi::Env env = info.Env();
QString organization =
QString::fromUtf8(info[0].As<Napi::String>().Utf8Value().c_str());
QString application =
QString::fromUtf8(info[1].As<Napi::String>().Utf8Value().c_str());
this->instance = std::make_unique<QSettings>(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<Napi::String>().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<Napi::String>().Utf8Value().c_str());
QVariant value = this->instance.get()->value(key);
auto instance = QVariantWrap::constructor.New(
{Napi::External<QVariant>::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(); }

View File

@ -41,7 +41,8 @@ Napi::Value QFontDatabaseWrap::families(const Napi::CallbackInfo& info) {
if (info.Length() == 1) {
writingSystem = info[0].As<Napi::Number>().Int32Value();
}
QStringList families = this->instance->families(static_cast<QFontDatabase::WritingSystem>(writingSystem));
QStringList families = this->instance->families(
static_cast<QFontDatabase::WritingSystem>(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());

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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);
});
});