Add style() getter in QApplication (#249)

Add minimal QStyle implementation with just pixelMetric getter
 (allow getting the scrollbars width)
This commit is contained in:
Bundyo (Kamen Bundev) 2019-12-06 00:08:54 +02:00 committed by Atul R
parent b0c9bca53a
commit a8cc7d9441
9 changed files with 150 additions and 2 deletions

View File

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

View File

@ -34,4 +34,5 @@ class QApplicationWrap : public Napi::ObjectWrap<QApplicationWrap> {
namespace StaticQApplicationWrapMethods {
Napi::Value instance(const Napi::CallbackInfo& info);
Napi::Value clipboard(const Napi::CallbackInfo& info);
} // namespace StaticQApplicationWrapMethods
Napi::Value style(const Napi::CallbackInfo& info);
} // namespace StaticQApplicationWrapMethods

View File

@ -0,0 +1,22 @@
#pragma once
#include <napi.h>
#include <QStyle>
#include "core/Component/component_macro.h"
class QStyleWrap : public Napi::ObjectWrap<QStyleWrap> {
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
};

View File

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

View File

@ -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<QStyleWrap>(info) {
Napi::Env env = info.Env();
Napi::HandleScope scope(env);
if (info[0].IsExternal()) {
this->instance = info[0].As<Napi::External<QStyle>>().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<Napi::Number>().Int32Value();
QStyle::PixelMetric metric = static_cast<QStyle::PixelMetric>(metricInt);
return Napi::Value::From(env, this->instance->pixelMetric(metric));
}

View File

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

View File

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

View File

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

65
src/lib/QtGui/QStyle.ts Normal file
View File

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