diff --git a/CMakeLists.txt b/CMakeLists.txt index b52f89711..c6e406067 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,7 @@ add_library(${CORE_WIDGETS_ADDON} SHARED "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QCursor/qcursor_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QKeySequence/qkeysequence_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QMovie/qmovie_wrap.cpp" + "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QStyle/qstyle_wrap.cpp" "${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" diff --git a/src/cpp/include/nodegui/QtGui/QApplication/qapplication_wrap.h b/src/cpp/include/nodegui/QtGui/QApplication/qapplication_wrap.h index 52bc7a096..bb15ecbdd 100644 --- a/src/cpp/include/nodegui/QtGui/QApplication/qapplication_wrap.h +++ b/src/cpp/include/nodegui/QtGui/QApplication/qapplication_wrap.h @@ -34,4 +34,5 @@ class QApplicationWrap : public Napi::ObjectWrap { namespace StaticQApplicationWrapMethods { Napi::Value instance(const Napi::CallbackInfo& info); Napi::Value clipboard(const Napi::CallbackInfo& info); -} // namespace StaticQApplicationWrapMethods \ No newline at end of file +Napi::Value style(const Napi::CallbackInfo& info); +} // namespace StaticQApplicationWrapMethods diff --git a/src/cpp/include/nodegui/QtGui/QStyle/qstyle_wrap.h b/src/cpp/include/nodegui/QtGui/QStyle/qstyle_wrap.h new file mode 100644 index 000000000..5fcad2e14 --- /dev/null +++ b/src/cpp/include/nodegui/QtGui/QStyle/qstyle_wrap.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include + +#include "core/Component/component_macro.h" + +class QStyleWrap : public Napi::ObjectWrap { + private: + QStyle* instance; + + public: + static Napi::FunctionReference constructor; + static Napi::Object init(Napi::Env env, Napi::Object exports); + QStyleWrap(const Napi::CallbackInfo& info); + QStyle* getInternalInstance(); + // Wrapped methods + Napi::Value pixelMetric(const Napi::CallbackInfo& info); + + COMPONENT_WRAPPED_METHODS_DECLARATION +}; diff --git a/src/cpp/lib/QtGui/QApplication/qapplication_wrap.cpp b/src/cpp/lib/QtGui/QApplication/qapplication_wrap.cpp index e1b39aae8..0b20a03b4 100644 --- a/src/cpp/lib/QtGui/QApplication/qapplication_wrap.cpp +++ b/src/cpp/lib/QtGui/QApplication/qapplication_wrap.cpp @@ -2,6 +2,7 @@ #include "Extras/Utils/nutils.h" #include "QtGui/QClipboard/qclipboard_wrap.h" +#include "QtGui/QStyle/qstyle_wrap.h" Napi::FunctionReference QApplicationWrap::constructor; int QApplicationWrap::argc = 0; @@ -22,6 +23,7 @@ Napi::Object QApplicationWrap::init(Napi::Env env, Napi::Object exports) { &QApplicationWrap::quitOnLastWindowClosed), StaticMethod("instance", &StaticQApplicationWrapMethods::instance), StaticMethod("clipboard", &StaticQApplicationWrapMethods::clipboard), + StaticMethod("style", &StaticQApplicationWrapMethods::style), COMPONENT_WRAPPED_METHODS_EXPORT_DEFINE}); constructor = Napi::Persistent(func); exports.Set(CLASSNAME, func); @@ -99,6 +101,15 @@ Napi::Value StaticQApplicationWrapMethods::clipboard( {Napi::External::New(env, clipboard)}); } +Napi::Value StaticQApplicationWrapMethods::style( + const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + QStyle* style = QApplication::style(); + return QStyleWrap::constructor.New( + {Napi::External::New(env, style)}); +} + Napi::Value QApplicationWrap::setQuitOnLastWindowClosed( const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); @@ -115,4 +126,4 @@ Napi::Value QApplicationWrap::quitOnLastWindowClosed( Napi::HandleScope scope(env); bool quit = this->instance->quitOnLastWindowClosed(); return Napi::Value::From(env, quit); -} \ No newline at end of file +} diff --git a/src/cpp/lib/QtGui/QStyle/qstyle_wrap.cpp b/src/cpp/lib/QtGui/QStyle/qstyle_wrap.cpp new file mode 100644 index 000000000..b95a53fec --- /dev/null +++ b/src/cpp/lib/QtGui/QStyle/qstyle_wrap.cpp @@ -0,0 +1,41 @@ +#include "QtGui/QStyle/qstyle_wrap.h" + +#include "Extras/Utils/nutils.h" + +Napi::FunctionReference QStyleWrap::constructor; + +Napi::Object QStyleWrap::init(Napi::Env env, Napi::Object exports) { + Napi::HandleScope scope(env); + char CLASSNAME[] = "QStyle"; + Napi::Function func = + DefineClass(env, CLASSNAME, + {InstanceMethod("pixelMetric", &QStyleWrap::pixelMetric), + COMPONENT_WRAPPED_METHODS_EXPORT_DEFINE}); + constructor = Napi::Persistent(func); + exports.Set(CLASSNAME, func); + return exports; +} + +QStyleWrap::QStyleWrap(const Napi::CallbackInfo& info) + : Napi::ObjectWrap(info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + if (info[0].IsExternal()) { + this->instance = info[0].As>().Data(); + } else { + Napi::TypeError::New(env, "Incorrect initialization of QStyleWrap") + .ThrowAsJavaScriptException(); + } + this->rawData = extrautils::configureComponent(this->getInternalInstance()); +} + +QStyle* QStyleWrap::getInternalInstance() { return this->instance; } + +Napi::Value QStyleWrap::pixelMetric(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + Napi::HandleScope scope(env); + int metricInt = info[0].As().Int32Value(); + QStyle::PixelMetric metric = static_cast(metricInt); + + return Napi::Value::From(env, this->instance->pixelMetric(metric)); +} diff --git a/src/cpp/main.cpp b/src/cpp/main.cpp index 5df2bbb3c..b5a90d234 100644 --- a/src/cpp/main.cpp +++ b/src/cpp/main.cpp @@ -14,6 +14,7 @@ #include "QtGui/QKeySequence/qkeysequence_wrap.h" #include "QtGui/QMovie/qmovie_wrap.h" #include "QtGui/QPixmap/qpixmap_wrap.h" +#include "QtGui/QStyle/qstyle_wrap.h" #include "QtWidgets/QAction/qaction_wrap.h" #include "QtWidgets/QBoxLayout/qboxlayout_wrap.h" #include "QtWidgets/QCheckBox/qcheckbox_wrap.h" @@ -57,6 +58,7 @@ Napi::Object Main(Napi::Env env, Napi::Object exports) { QKeySequenceWrap::init(env, exports); QIconWrap::init(env, exports); QMovieWrap::init(env, exports); + QStyleWrap::init(env, exports); QCursorWrap::init(env, exports); QBoxLayoutWrap::init(env, exports); QGridLayoutWrap::init(env, exports); diff --git a/src/index.ts b/src/index.ts index ef02e1a55..d39baf223 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,6 +11,7 @@ export { QMovie, CacheMode, MovieState, QMovieEvents } from './lib/QtGui/QMovie' export { QCursor } from './lib/QtGui/QCursor'; export { QTextOptionWrapMode } from './lib/QtGui/QTextOption'; export { QClipboard, QClipboardMode } from './lib/QtGui/QClipboard'; +export { QStyle, QStylePixelMetric } from './lib/QtGui/QStyle'; // Events: Maybe a separate module ? export { QKeyEvent } from './lib/QtGui/QEvent/QKeyEvent'; export { QMouseEvent } from './lib/QtGui/QEvent/QMouseEvent'; diff --git a/src/lib/QtGui/QApplication.ts b/src/lib/QtGui/QApplication.ts index f51d11bb7..2edcf35d0 100644 --- a/src/lib/QtGui/QApplication.ts +++ b/src/lib/QtGui/QApplication.ts @@ -2,6 +2,7 @@ import addon from '../utils/addon'; import { Component, NativeElement } from '../core/Component'; import { checkIfNativeElement } from '../utils/helpers'; import { QClipboard } from './QClipboard'; +import { QStyle } from './QStyle'; type arg = NativeElement; export class QApplication extends Component { @@ -39,4 +40,7 @@ export class QApplication extends Component { quitOnLastWindowClosed(): boolean { return this.native.quitOnLastWindowClosed(); } + static style(): QStyle { + return new QStyle(addon.QApplication.style()); + } } diff --git a/src/lib/QtGui/QStyle.ts b/src/lib/QtGui/QStyle.ts new file mode 100644 index 000000000..e48644037 --- /dev/null +++ b/src/lib/QtGui/QStyle.ts @@ -0,0 +1,65 @@ +import { Component, NativeElement } from '../core/Component'; +import { checkIfNativeElement } from '../utils/helpers'; + +export class QStyle extends Component { + native: NativeElement; + constructor(native: NativeElement) { + super(); + if (checkIfNativeElement(native)) { + this.native = native; + } else { + throw new Error('QStyle cannot be initialised this way. Use QApplication::style()'); + } + } + + pixelMetric(metric: QStylePixelMetric): number { + return this.native.pixelMetric(metric); + } +} + +export enum QStylePixelMetric { + PM_ButtonMargin = 0, + PM_ButtonDefaultIndicator = 1, + PM_MenuButtonIndicator = 2, + PM_ButtonShiftHorizontal = 3, + PM_ButtonShiftVertical = 4, + PM_DefaultFrameWidth = 5, + PM_SpinBoxFrameWidth = 6, + PM_ComboBoxFrameWidth = 7, + PM_MaximumDragDistance = 8, + PM_ScrollBarExtent = 9, + PM_ScrollBarSliderMin = 10, + PM_SliderThickness = 11, + PM_SliderControlThickness = 12, + PM_SliderLength = 13, + PM_SliderTickmarkOffset = 14, + PM_SliderSpaceAvailable = 15, + PM_DockWidgetSeparatorExtent = 16, + PM_DockWidgetHandleExtent = 17, + PM_DockWidgetFrameWidth = 18, + PM_MenuBarPanelWidth = 33, + PM_MenuBarItemSpacing = 34, + PM_MenuBarHMargin = 36, + PM_MenuBarVMargin = 35, + PM_TabBarTabOverlap = 19, + PM_TabBarTabHSpace = 20, + PM_TabBarTabVSpace = 21, + PM_TabBarBaseHeight = 22, + PM_TabBarBaseOverlap = 23, + PM_ProgressBarChunkWidth = 24, + PM_SplitterWidth = 25, + PM_TitleBarHeight = 26, + PM_IndicatorWidth = 37, + PM_IndicatorHeight = 38, + PM_ExclusiveIndicatorWidth = 39, + PM_ExclusiveIndicatorHeight = 40, + PM_MenuPanelWidth = 30, + PM_MenuHMargin = 28, + PM_MenuVMargin = 29, + PM_MenuScrollerHeight = 27, + PM_MenuTearoffHeight = 31, + PM_MenuDesktopFrameWidth = 32, + PM_CheckListButtonSize = 41, + PM_CheckListControllerSize = 42, + PM_MdiSubWindowFrameWidth = 46, +}