diff --git a/CMakeLists.txt b/CMakeLists.txt index ed805fd6a..b78288c64 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -146,6 +146,7 @@ add_library(${CORE_WIDGETS_ADDON} SHARED "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QStandardItem/qstandarditem_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QSvgWidget/qsvgwidget_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QDesktopWidget/qdesktopwidget_wrap.cpp" + "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QStyleFactory/qstylefactory_wrap.cpp" # Custom widgets (include them for automoc since they contain Q_OBJECT) "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtCore/QAbstractItemModel/nabstractitemmodel.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtCore/QItemSelectionModel/nitemselectionmodel.hpp" diff --git a/src/cpp/include/nodegui/QtGui/QApplication/qapplication_wrap.h b/src/cpp/include/nodegui/QtGui/QApplication/qapplication_wrap.h index 1bacae92c..a48c99854 100644 --- a/src/cpp/include/nodegui/QtGui/QApplication/qapplication_wrap.h +++ b/src/cpp/include/nodegui/QtGui/QApplication/qapplication_wrap.h @@ -35,5 +35,6 @@ class DLL_EXPORT QApplicationWrap : public Napi::ObjectWrap { namespace StaticQApplicationWrapMethods { DLL_EXPORT Napi::Value instance(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value clipboard(const Napi::CallbackInfo& info); +DLL_EXPORT Napi::Value setStyle(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value style(const Napi::CallbackInfo& info); } // namespace StaticQApplicationWrapMethods diff --git a/src/cpp/include/nodegui/QtWidgets/QStyleFactory/qstylefactory_wrap.h b/src/cpp/include/nodegui/QtWidgets/QStyleFactory/qstylefactory_wrap.h new file mode 100644 index 000000000..304e08eab --- /dev/null +++ b/src/cpp/include/nodegui/QtWidgets/QStyleFactory/qstylefactory_wrap.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +namespace QStyleFactoryWrap { +DLL_EXPORT Napi::Object create(Napi::Env env, Napi::Object exports); +DLL_EXPORT Napi::Object keys(Napi::Env env, Napi::Object exports); +DLL_EXPORT Napi::Object init(Napi::Env env, Napi::Object exports); +} // namespace QStyleFactoryWrap diff --git a/src/cpp/lib/QtGui/QApplication/qapplication_wrap.cpp b/src/cpp/lib/QtGui/QApplication/qapplication_wrap.cpp index b6dabf880..77c79152b 100644 --- a/src/cpp/lib/QtGui/QApplication/qapplication_wrap.cpp +++ b/src/cpp/lib/QtGui/QApplication/qapplication_wrap.cpp @@ -25,6 +25,7 @@ Napi::Object QApplicationWrap::init(Napi::Env env, Napi::Object exports) { InstanceMethod("setStyleSheet", &QApplicationWrap::setStyleSheet), StaticMethod("instance", &StaticQApplicationWrapMethods::instance), StaticMethod("clipboard", &StaticQApplicationWrapMethods::clipboard), + StaticMethod("setStyle", &StaticQApplicationWrapMethods::setStyle), StaticMethod("style", &StaticQApplicationWrapMethods::style), QOBJECT_WRAPPED_METHODS_EXPORT_DEFINE(QApplicationWrap)}); constructor = Napi::Persistent(func); @@ -125,6 +126,19 @@ Napi::Value StaticQApplicationWrapMethods::clipboard( {Napi::External::New(env, clipboard)}); } +Napi::Value StaticQApplicationWrapMethods::setStyle( + const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + QStyleWrap* styleWrap = + Napi::ObjectWrap::Unwrap(info[0].As()); + QStyle* style = styleWrap->getInternalInstance(); + QApplication::setStyle(style); + + return env.Null(); +} + Napi::Value StaticQApplicationWrapMethods::style( const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); diff --git a/src/cpp/lib/QtWidgets/QStyleFactory/qstylefactory_wrap.cpp b/src/cpp/lib/QtWidgets/QStyleFactory/qstylefactory_wrap.cpp new file mode 100644 index 000000000..426238408 --- /dev/null +++ b/src/cpp/lib/QtWidgets/QStyleFactory/qstylefactory_wrap.cpp @@ -0,0 +1,40 @@ +#include + +#include + +#include "QtGui/QStyle/qstyle_wrap.h" + +namespace QStyleFactoryWrap { + +Napi::Value create(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + Napi::String key = info[0].As(); + + QStyle* style = + QStyleFactory::create(QString::fromStdString(key.Utf8Value())); + if (!style) { + return env.Null(); + } + return QStyleWrap::constructor.New({Napi::External::New(env, style)}); +} + +Napi::Value keys(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + + QStringList keys = QStyleFactory::keys(); + Napi::Array keysNapi = Napi::Array::New(env, keys.size()); + for (int i = 0; i < keys.size(); i++) { + keysNapi[i] = Napi::String::New(env, keys[i].toStdString()); + } + return keysNapi; +} + +Napi::Object init(Napi::Env env, Napi::Object exports) { + exports.Set("QStyleFactory_create", Napi::Function::New(env)); + exports.Set("QStyleFactory_keys", Napi::Function::New(env)); + return exports; +} +} // namespace QStyleFactoryWrap \ No newline at end of file diff --git a/src/cpp/main.cpp b/src/cpp/main.cpp index 62f7bfc1a..5e87c73ef 100644 --- a/src/cpp/main.cpp +++ b/src/cpp/main.cpp @@ -94,6 +94,7 @@ #include "QtWidgets/QStandardItem/qstandarditem_wrap.h" #include "QtWidgets/QStandardItemModel/qstandarditemmodel_wrap.h" #include "QtWidgets/QStatusBar/qstatusbar_wrap.h" +#include "QtWidgets/QStyleFactory/qstylefactory_wrap.h" #include "QtWidgets/QSvgWidget/qsvgwidget_wrap.h" #include "QtWidgets/QSystemTrayIcon/qsystemtrayicon_wrap.h" #include "QtWidgets/QTabBar/qtabbar_wrap.h" @@ -226,6 +227,7 @@ Napi::Object Main(Napi::Env env, Napi::Object exports) { QAbstractItemModelWrap::init(env, exports); QHeaderViewWrap::init(env, exports); QItemSelectionModelWrap::init(env, exports); + QStyleFactoryWrap::init(env, exports); return exports; } diff --git a/src/index.ts b/src/index.ts index c7fe1177b..314e52535 100644 --- a/src/index.ts +++ b/src/index.ts @@ -136,6 +136,8 @@ export { QTextEditLineWrapMode, WrapMode, } from './lib/QtWidgets/QTextEdit'; +export { QStyleFactory } from './lib/QtWidgets/QStyleFactory'; + // Core export { QAbstractItemModel } from './lib/QtCore/QAbstractItemModel'; export { QAbstractTableModel } from './lib/QtCore/QAbstractTableModel'; diff --git a/src/lib/QtGui/QApplication.ts b/src/lib/QtGui/QApplication.ts index 21a82ff8f..fdd9fad67 100644 --- a/src/lib/QtGui/QApplication.ts +++ b/src/lib/QtGui/QApplication.ts @@ -74,6 +74,9 @@ export class QApplication extends NodeObject { const preparedSheet = StyleSheet.create(styleSheet); this.native.setStyleSheet(preparedSheet); } + static setStyle(style: QStyle): void { + addon.QApplication.setStyle(style.native); + } static style(): QStyle { return new QStyle(addon.QApplication.style()); } diff --git a/src/lib/QtWidgets/QStyleFactory.ts b/src/lib/QtWidgets/QStyleFactory.ts new file mode 100644 index 000000000..4279a9e31 --- /dev/null +++ b/src/lib/QtWidgets/QStyleFactory.ts @@ -0,0 +1,15 @@ +import addon from '../utils/addon'; +import { QStyle } from '../QtGui/QStyle'; + +export class QStyleFactory { + static create(key: string): QStyle | null { + const qstyle = addon.QStyleFactory_create(key); + if (qstyle == null) { + return null; + } + return new QStyle(qstyle); + } + static keys(): string[] { + return addon.QStyleFactory_keys(); + } +}