Compare commits

..

No commits in common. "master" and "v0.17.0" have entirely different histories.

736 changed files with 15376 additions and 92369 deletions

View File

@ -229,179 +229,6 @@
"contributions": [ "contributions": [
"code" "code"
] ]
},
{
"login": "Singha360",
"name": "Singha360",
"avatar_url": "https://avatars1.githubusercontent.com/u/35334787?v=4",
"profile": "https://github.com/Singha360",
"contributions": [
"code"
]
},
{
"login": "MihkelBaranov",
"name": "Mihkel",
"avatar_url": "https://avatars3.githubusercontent.com/u/3790782?v=4",
"profile": "http://wellenline.com",
"contributions": [
"code"
]
},
{
"login": "stevo2588",
"name": "Stephen A",
"avatar_url": "https://avatars1.githubusercontent.com/u/3278045?v=4",
"profile": "https://github.com/stevo2588",
"contributions": [
"code"
]
},
{
"login": "jardenliu",
"name": "流君酱",
"avatar_url": "https://avatars1.githubusercontent.com/u/15191056?v=4",
"profile": "http://liujunjiang.com",
"contributions": [
"code"
]
},
{
"login": "agg23",
"name": "Adam Gastineau",
"avatar_url": "https://avatars1.githubusercontent.com/u/238679?v=4",
"profile": "https://github.com/agg23",
"contributions": [
"code"
]
},
{
"login": "swittk",
"name": "swittk",
"avatar_url": "https://avatars2.githubusercontent.com/u/5000572?v=4",
"profile": "https://github.com/swittk",
"contributions": [
"code"
]
},
{
"login": "craftingmod",
"name": "craftingmod",
"avatar_url": "https://avatars2.githubusercontent.com/u/9389278?v=4",
"profile": "https://github.com/craftingmod",
"contributions": [
"code"
]
},
{
"login": "dooglio",
"name": "Doug Barbieri",
"avatar_url": "https://avatars1.githubusercontent.com/u/643129?v=4",
"profile": "http://www.m2osw.com",
"contributions": [
"code"
]
},
{
"login": "NeryHenrique",
"name": "HENRIQUE DE SOUZA NERY",
"avatar_url": "https://avatars0.githubusercontent.com/u/6879141?v=4",
"profile": "https://github.com/NeryHenrique",
"contributions": [
"code"
]
},
{
"login": "ruslang02",
"name": "Ruslan Garifullin",
"avatar_url": "https://avatars0.githubusercontent.com/u/25264730?v=4",
"profile": "https://ruslang.xyz",
"contributions": [
"code"
]
},
{
"login": "ran-j",
"name": "Ranieri",
"avatar_url": "https://avatars0.githubusercontent.com/u/17410205?v=4",
"profile": "https://github.com/ran-j",
"contributions": [
"code",
"doc"
]
},
{
"login": "NathanaelA",
"name": "Nathanael Anderson",
"avatar_url": "https://avatars3.githubusercontent.com/u/850871?v=4",
"profile": "https://master-technology.com",
"contributions": [
"code"
]
},
{
"login": "rocbear",
"name": "Ross",
"avatar_url": "https://avatars0.githubusercontent.com/u/4415071?v=4",
"profile": "https://ubiq.co.za",
"contributions": [
"code",
"doc"
]
},
{
"login": "4h7l",
"name": "4h7l",
"avatar_url": "https://avatars.githubusercontent.com/u/69183283?v=4",
"profile": "https://github.com/4h7l",
"contributions": [
"code"
]
},
{
"login": "Maks-s",
"name": "Maks",
"avatar_url": "https://avatars.githubusercontent.com/u/26678512?v=4",
"profile": "https://github.com/Maks-s",
"contributions": [
"code"
]
},
{
"login": "zhb124404",
"name": "zhb124404",
"avatar_url": "https://avatars.githubusercontent.com/u/16805041?v=4",
"profile": "https://github.com/zhb124404",
"contributions": [
"doc"
]
},
{
"login": "wkirby",
"name": "Wyatt Kirby",
"avatar_url": "https://avatars.githubusercontent.com/u/579688?v=4",
"profile": "http://www.apsis.io",
"contributions": [
"code"
]
},
{
"login": "stvkoch",
"name": "Steven Koch",
"avatar_url": "https://avatars.githubusercontent.com/u/14454?v=4",
"profile": "https://stvkoch.github.io.",
"contributions": [
"code"
]
},
{
"login": "sedwards2009",
"name": "Simon Edwards",
"avatar_url": "https://avatars.githubusercontent.com/u/6926644?v=4",
"profile": "https://github.com/sedwards2009",
"contributions": [
"code"
]
} }
], ],
"contributorsPerLine": 7, "contributorsPerLine": 7,

View File

@ -12,6 +12,7 @@ module.exports = {
parser: '@typescript-eslint/parser', // Specifies the ESLint parser parser: '@typescript-eslint/parser', // Specifies the ESLint parser
extends: [ extends: [
'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin 'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin
'prettier/@typescript-eslint', // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier
'plugin:prettier/recommended', // Enables eslint-plugin-prettier and eslint-config-prettier. This will display prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array. 'plugin:prettier/recommended', // Enables eslint-plugin-prettier and eslint-config-prettier. This will display prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array.
], ],
parserOptions: { parserOptions: {
@ -22,7 +23,6 @@ module.exports = {
'@typescript-eslint/camelcase': 0, '@typescript-eslint/camelcase': 0,
'@typescript-eslint/no-var-requires': 0, '@typescript-eslint/no-var-requires': 0,
'@typescript-eslint/no-explicit-any': 0, '@typescript-eslint/no-explicit-any': 0,
'@typescript-eslint/no-unused-vars': ['warn', { args: 'none' }],
}, },
}, },
], ],

View File

@ -1,46 +0,0 @@
name: documentation
on:
push:
branches:
- master
jobs:
gh-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '16.x'
- name: Add key to allow access to repository
env:
SSH_AUTH_SOCK: /tmp/ssh_agent.sock
run: |
mkdir -p ~/.ssh
ssh-keyscan github.com >> ~/.ssh/known_hosts
echo "${{ secrets.GH_PAGES_DEPLOY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
cat <<EOT >> ~/.ssh/config
Host github.com
HostName github.com
IdentityFile ~/.ssh/id_rsa
EOT
- name: Release to GitHub Pages
env:
USE_SSH: true
GIT_USER: git
run: |
git config --global user.email "actions@gihub.com"
git config --global user.name "gh-actions"
yarn install --ignore-scripts
npm run docs
cd website
if [ -e yarn.lock ]; then
yarn install --frozen-lockfile
elif [ -e package-lock.json ]; then
npm ci
else
npm i
fi
yarn deploy

View File

@ -7,20 +7,17 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-20.04] os: [ubuntu-18.04]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@master
- uses: actions/setup-node@v2 - uses: actions/setup-node@master
with: with:
node-version: '16.x' node-version: '13.x'
- name: Install ubuntu deps
if: contains(matrix.os, 'ubuntu-20.04')
run: sudo apt install mesa-common-dev libglu1-mesa-dev libegl1 libopengl-dev
- name: Install deps - name: Install deps
run: npm install run: npm install --ignore-scripts
- name: Build nodegui - name: Build nodegui
run: npm run build run: npx tsc
- name: Archive using npm pack - name: Archive using npm pack
run: npm --no-git-tag-version version 0.0.0-latest-master && npm pack run: npm --no-git-tag-version version 0.0.0-latest-master && npm pack
- uses: actions/upload-artifact@v1 - uses: actions/upload-artifact@v1

38
.github/workflows/prebuild.yml vendored Normal file
View File

@ -0,0 +1,38 @@
on:
repository_dispatch:
types: [on-demand-build]
release:
types: [created]
jobs:
build:
strategy:
fail-fast: false
matrix:
os: [ubuntu-18.04, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.ref }}
# - uses: actions/setup-node@master
# with:
# node-version: '13.x'
# - name: Install ubuntu deps
# if: contains(matrix.os, 'ubuntu')
# run: sudo apt install mesa-common-dev libglu1-mesa-dev
# - name: Install deps
# run: npm install
# env:
# SKIP_BUILD: 1
# - name: Change version if master
# if: contains(github.event.client_payload.tag, '0.0.0-latest-master')
# run: npm --no-git-tag-version version 0.0.0-latest-master
# - name: Prebuild binary
# run: npx prebuild --all --backend=cmake-js --strip --runtime=napi --include-regex="\.[n,e,l][a-z]*$"
# - name: Release
# uses: softprops/action-gh-release@master
# with:
# files: prebuilds/@nodegui/*.tar.gz
# tag_name: ${{ github.event.release.tag_name || github.event.client_payload.tag }}
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -1,97 +0,0 @@
name: Build and Deploy to npm
on:
release:
types: [published]
jobs:
precompile:
if: contains(github.event.release.tag_name, 'v0.0.0-latest-master') == false
strategy:
matrix:
include:
- os: ubuntu-20.04
platform: linux
arch: x64
- os: windows-latest
platform: win32
arch: x64
- os: macos-latest
platform: darwin
arch: x64
runs-on: ${{ matrix.os }}
env:
ARCHIVE_FILENAME: nodegui-binary-${{github.event.release.tag_name}}-${{ matrix.platform }}-${{ matrix.arch }}.tar.gz
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '16.x'
- name: Install ubuntu deps
if: contains(matrix.os, 'ubuntu-20.04')
run: sudo apt install mesa-common-dev libglu1-mesa-dev libegl1 libopengl-dev
- name: Install deps
run: npm install
- name: Build nodegui
run: npm run build
env:
CMAKE_BUILD_PARALLEL_LEVEL: 8
- name: Compress files
if: ${{!contains(matrix.os, 'windows-latest')}}
uses: a7ul/tar-action@v1.0.2
id: compress
with:
command: c
cwd: ./build/Release
files: |
./nodegui_core.node
outPath: ${{ env.ARCHIVE_FILENAME }}
- name: Compress files (Windows)
if: contains(matrix.os, 'windows-latest')
uses: a7ul/tar-action@v1.0.2
id: compress-windows
with:
command: c
cwd: ./build/Release
files: |
./nodegui_core.node
./nodegui_core.lib
./nodegui_core.exp
outPath: ${{ env.ARCHIVE_FILENAME }}
- uses: actions/upload-artifact@v1
with:
name: ${{ env.ARCHIVE_FILENAME }}
path: ${{ env.ARCHIVE_FILENAME }}
- name: Upload release binaries
uses: alexellis/upload-assets@0.2.2
env:
GITHUB_TOKEN: ${{ github.token }}
with:
asset_paths: '["${{ env.ARCHIVE_FILENAME }}"]'
publish-npm-package:
needs: precompile
if: contains(github.event.release.tag_name, 'v0.0.0-latest-master') == false
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '16.x'
- name: Install ubuntu deps
run: sudo apt update
- run: sudo apt install mesa-common-dev libglu1-mesa-dev
- run: npm install
- run: echo '//registry.npmjs.org/:_authToken=${NPM_TOKEN}' >> .npmrc
- run: npm publish --access=public
env:
NPM_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }}
CMAKE_BUILD_PARALLEL_LEVEL: 8

View File

@ -6,22 +6,20 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ubuntu-20.04, windows-latest, macos-latest] os: [ubuntu-18.04, windows-latest, macos-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@master
- uses: actions/setup-node@v2 - uses: actions/setup-node@master
with: with:
node-version: '16.x' node-version: '13.x'
- name: Install ubuntu deps - name: Install ubuntu deps
if: contains(matrix.os, 'ubuntu-20.04') if: contains(matrix.os, 'ubuntu')
run: sudo apt install mesa-common-dev libglu1-mesa-dev libegl1 libopengl-dev run: sudo apt install mesa-common-dev libglu1-mesa-dev
- name: Install deps - name: Install deps
run: npm install run: npm install
- name: Build nodegui - name: Build nodegui
run: npm run build run: npm run build
env:
CMAKE_BUILD_PARALLEL_LEVEL: 8
- name: Run tests - name: Run tests
run: npm run test run: npm run test
- name: Run linters for cpp - name: Run linters for cpp

1
.gitignore vendored
View File

@ -9,4 +9,3 @@ coverage
/.idea/ /.idea/
/prebuilds /prebuilds
miniqt miniqt
cmake-build-debug

View File

@ -11,10 +11,6 @@ set(CORE_WIDGETS_ADDON "nodegui_core")
project(${CORE_WIDGETS_ADDON}) project(${CORE_WIDGETS_ADDON})
set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
# Note: CMake+moc also use this list when finding files which `moc` applied.
add_library(${CORE_WIDGETS_ADDON} SHARED add_library(${CORE_WIDGETS_ADDON} SHARED
"${CMAKE_JS_SRC}" "${CMAKE_JS_SRC}"
"${PROJECT_SOURCE_DIR}/src/cpp/main.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/main.cpp"
@ -28,8 +24,6 @@ add_library(${CORE_WIDGETS_ADDON} SHARED
"${PROJECT_SOURCE_DIR}/src/cpp/lib/core/Events/eventsmap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/core/Events/eventsmap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/core/Events/eventwidget.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/core/Events/eventwidget.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/core/YogaWidget/yogawidget.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/core/YogaWidget/yogawidget.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/core/WrapperCache/wrappercache.h"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/core/WrapperCache/wrappercache.cpp"
# core deps # core deps
"${PROJECT_SOURCE_DIR}/src/cpp/include/deps/yoga/log.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/deps/yoga/log.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/deps/yoga/Utils.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/deps/yoga/Utils.cpp"
@ -44,58 +38,31 @@ add_library(${CORE_WIDGETS_ADDON} SHARED
"${PROJECT_SOURCE_DIR}/src/cpp/include/deps/yoga/event/event.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/deps/yoga/event/event.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/deps/yoga/internal/experiments.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/deps/yoga/internal/experiments.cpp"
# wrapped cpps # wrapped cpps
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QBrush/qbrush_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QPen/qpen_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QColor/qcolor_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QColor/qcolor_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QApplication/qapplication_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QApplication/qapplication_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QClipboard/qclipboard_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QClipboard/qclipboard_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QDrag/qdrag_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QKeyEvent/qkeyevent_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QKeyEvent/qkeyevent_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QMouseEvent/qmouseevent_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QMouseEvent/qmouseevent_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QMoveEvent/qmoveevent_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QWheelEvent/qwheelevent_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QNativeGestureEvent/qnativegestureevent_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QPaintEvent/qpaintevent_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QTabletEvent/qtabletevent_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QTimerEvent/qtimerevent_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QDropEvent/qdropevent_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QDragMoveEvent/qdragmoveevent_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QDragLeaveEvent/qdragleaveevent_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QResizeEvent/qresizeevent_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QInputMethodEvent/qinputmethodevent_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QEvent/QInputMethodQueryEvent/qinputmethodqueryevent_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QFontDatabase/qfontdatabase_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QFontDatabase/qfontdatabase_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QFontMetrics/qfontmetrics_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QFontMetricsF/qfontmetricsf_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QPicture/qpicture_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QPicture/qpicture_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QPixmap/qpixmap_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QPixmap/qpixmap_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QIcon/qicon_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QIcon/qicon_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QImage/qimage_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QFont/qfont_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QFont/qfont_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QCursor/qcursor_wrap.cpp" "${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/QKeySequence/qkeysequence_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QMovie/qmovie_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QMovie/qmovie_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QPalette/qpalette_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QScreen/qscreen_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QStyle/qstyle_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QStyle/qstyle_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QWindow/qwindow_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QAbstractItemModel/qabstractitemmodel_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QDate/qdate_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QDate/qdate_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QDateTime/qdatetime_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QDateTime/qdatetime_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QItemSelectionModel/qitemselectionmodel_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QModelIndex/qmodelindex_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QModelIndex/qmodelindex_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QObject/qobject_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/QVariant/qvariant_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QSize/qsize_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QSize/qsize_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QSizeF/qsizef_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QSettings/qsettings_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/QRect/qrect_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QRectF/qrectf_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QPoint/qpoint_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QPoint/qpoint_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QPointF/qpointf_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QTime/qtime_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QTime/qtime_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QUrl/qurl_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QUrl/qurl_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QMimeData/qmimedata_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QWidget/qwidget_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QWidget/qwidget_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QDialog/qdialog_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QDialog/qdialog_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QBoxLayout/qboxlayout_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QBoxLayout/qboxlayout_wrap.cpp"
@ -105,33 +72,24 @@ add_library(${CORE_WIDGETS_ADDON} SHARED
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QDateEdit/qdateedit_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QDateEdit/qdateedit_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QDateTimeEdit/qdatetimeedit_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QDateTimeEdit/qdatetimeedit_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QDoubleSpinBox/qdoublespinbox_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QDoubleSpinBox/qdoublespinbox_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QErrorMessage/qerrormessage_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QFileDialog/qfiledialog_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QFileDialog/qfiledialog_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QFontDialog/qfontdialog_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QFrame/qframe_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QFrame/qframe_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QGraphicsBlurEffect/qgraphicsblureffect_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QGraphicsDropShadowEffect/qgraphicsdropshadoweffect_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QHeaderView/qheaderview_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QListView/qlistview_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QListWidget/qlistwidget_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QListWidget/qlistwidget_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QListWidgetItem/qlistwidgetitem_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QListWidgetItem/qlistwidgetitem_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QTableView/qtableview_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QTableView/qtableview_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QTableWidget/qtablewidget_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QTableWidget/qtablewidget_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QTableWidgetItem/qtablewidgetitem_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QTableWidgetItem/qtablewidgetitem_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QPainter/qpainter_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QPainter/qpainter_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QPainterPath/qpainterpath_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QGridLayout/qgridlayout_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QGridLayout/qgridlayout_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QDial/qdial_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QDial/qdial_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QLabel/qlabel_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QLabel/qlabel_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QLayout/qlayout_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QLayout/qlayout_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QLCDNumber/qlcdnumber_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QMainWindow/qmainwindow_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QMainWindow/qmainwindow_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QPushButton/qpushbutton_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QPushButton/qpushbutton_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QToolButton/qtoolbutton_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QToolButton/qtoolbutton_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QSpinBox/qspinbox_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QSpinBox/qspinbox_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QCheckBox/qcheckbox_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QCheckBox/qcheckbox_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QProgressBar/qprogressbar_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QProgressBar/qprogressbar_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QProgressDialog/qprogressdialog_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QRadioButton/qradiobutton_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QRadioButton/qradiobutton_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QStackedWidget/qstackedwidget_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QStackedWidget/qstackedwidget_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QTabBar/qtabbar_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QTabBar/qtabbar_wrap.cpp"
@ -155,22 +113,11 @@ add_library(${CORE_WIDGETS_ADDON} SHARED
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QButtonGroup/qbuttongroup_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QButtonGroup/qbuttongroup_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QStatusBar/qstatusbar_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QStatusBar/qstatusbar_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/core/FlexLayout/flexlayout_wrap.cpp" "${PROJECT_SOURCE_DIR}/src/cpp/lib/core/FlexLayout/flexlayout_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QTextBrowser/qtextbrowser_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QTextEdit/qtextedit_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QStandardItemModel/qstandarditemmodel_wrap.cpp"
"${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/QStyleFactory/qstylefactory_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QSplitter/qsplitter_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtWidgets/QAbstractItemDelegate/qabstractitemdelegate_wrap.cpp"
# Custom widgets (include them for automoc since they contain Q_OBJECT) # 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"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtCore/QObject/nobject.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtCore/QObject/nobject.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/core/FlexLayout/flexlayout.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/core/FlexLayout/flexlayout.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtGui/QMovie/nmovie.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtGui/QMovie/nmovie.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtGui/QApplication/napplication.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtGui/QApplication/napplication.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtGui/QDrag/ndrag.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QWidget/nwidget.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QWidget/nwidget.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QDialog/ndialog.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QDialog/ndialog.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QLabel/nlabel.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QLabel/nlabel.hpp"
@ -181,21 +128,14 @@ add_library(${CORE_WIDGETS_ADDON} SHARED
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QDateTimeEdit/ndatetimeedit.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QDateTimeEdit/ndatetimeedit.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QDial/ndial.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QDial/ndial.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QDoubleSpinBox/ndoublespinbox.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QDoubleSpinBox/ndoublespinbox.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QErrorMessage/nerrormessage.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QFileDialog/nfiledialog.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QFileDialog/nfiledialog.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QFontDialog/nfontdialog.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QFrame/nframe.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QFrame/nframe.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QGraphicsBlurEffect/ngraphicsblureffect.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QGraphicsDropShadowEffect/ngraphicsdropshadoweffect.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QLCDNumber/nlcdnumber.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QListView/nlistview.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QListWidget/nlistwidget.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QListWidget/nlistwidget.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QTableView/ntableview.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QTableView/ntableview.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QTableWidget/ntablewidget.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QTableWidget/ntablewidget.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QLineEdit/nlineedit.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QLineEdit/nlineedit.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QMainWindow/nmainwindow.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QMainWindow/nmainwindow.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QProgressBar/nprogressbar.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QProgressBar/nprogressbar.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QProgressDialog/nprogressdialog.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QPushButton/npushbutton.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QPushButton/npushbutton.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QMessageBox/nmessagebox.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QMessageBox/nmessagebox.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QInputDialog/ninputdialog.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QInputDialog/ninputdialog.hpp"
@ -223,17 +163,7 @@ add_library(${CORE_WIDGETS_ADDON} SHARED
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QTreeWidget/ntreewidget.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QTreeWidget/ntreewidget.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QButtonGroup/nbuttongroup.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QButtonGroup/nbuttongroup.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QStatusBar/nstatusbar.hpp" "${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QStatusBar/nstatusbar.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QStandardItemModel/nstandarditemmodel.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QTextBrowser/ntextbrowser.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QTextEdit/ntextedit.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QSvgWidget/nsvgwidget.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QHeaderView/nheaderview.hpp"
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtWidgets/QSplitter/nsplitter.hpp"
# Test
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/test/CacheTestQObject.h"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/test/CacheTestQObject.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/lib/test/cachetestqobject_wrap.cpp"
) )
AddCommonConfig(${CORE_WIDGETS_ADDON}) AddCommonConfig(${CORE_WIDGETS_ADDON})
@ -252,32 +182,17 @@ target_include_directories(${CORE_WIDGETS_ADDON} PRIVATE
if (WIN32) if (WIN32)
add_definitions(/bigobj)
target_compile_definitions(${CORE_WIDGETS_ADDON} PRIVATE target_compile_definitions(${CORE_WIDGETS_ADDON} PRIVATE
ENABLE_DLL_EXPORT=1 ENABLE_DLL_EXPORT=1
) )
target_compile_options(${CORE_WIDGETS_ADDON} PRIVATE "/MP") target_compile_options(${CORE_WIDGETS_ADDON} PRIVATE "/MP4")
endif()
if (UNIX AND NOT APPLE)
# Set the RPATH in the binary to a relative one to allow it to find our Qt
# libraries regardless of where the base installation directory is.
file(RELATIVE_PATH QT_LIBRARY_REL_PATH "${CMAKE_BINARY_DIR}/Release" "${QT_CMAKE_HOME_DIR}/../..")
set_target_properties(${CORE_WIDGETS_ADDON} PROPERTIES INSTALL_RPATH "\$ORIGIN/${QT_LIBRARY_REL_PATH}")
set_target_properties(${CORE_WIDGETS_ADDON} PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE)
endif()
if (APPLE)
set(CMAKE_MACOSX_RPATH ON)
file(RELATIVE_PATH QT_LIBRARY_REL_PATH "${CMAKE_BINARY_DIR}/Release" "${QT_CMAKE_HOME_DIR}/../..")
set_target_properties(${CORE_WIDGETS_ADDON} PROPERTIES INSTALL_RPATH "@loader_path/${QT_LIBRARY_REL_PATH}")
endif() endif()
target_link_libraries(${CORE_WIDGETS_ADDON} PRIVATE target_link_libraries(${CORE_WIDGETS_ADDON} PRIVATE
"${CMAKE_JS_LIB}" "${CMAKE_JS_LIB}"
Qt6::Widgets Qt5::Widgets
Qt6::Core Qt5::Core
Qt6::Gui Qt5::Gui
Qt6::Svg
Qt6::SvgWidgets
) )

250
README.md
View File

@ -1,21 +1,18 @@
# NodeGui # NodeGui
[![All Contributors](https://img.shields.io/badge/All_contributors-66-orange.svg)](#contributors) [![Join the NodeGUI community on Spectrum](https://withspectrum.github.io/badge/badge.svg)](https://spectrum.chat/nodegui)
[![All Contributors](https://img.shields.io/badge/all_contributors-16-orange.svg?style=flat-square)](#contributors)
[![JS Party #96](https://img.shields.io/badge/JS%20Party-%2396-FFCD00.svg)](https://changelog.com/jsparty/96) [![JS Party #96](https://img.shields.io/badge/JS%20Party-%2396-FFCD00.svg)](https://changelog.com/jsparty/96)
[![Build and Test status](https://github.com/nodegui/nodegui/workflows/.github/workflows/test.yml/badge.svg)](https://github.com/nodegui/nodegui/actions) [![Build and Test status](https://github.com/nodegui/nodegui/workflows/.github/workflows/test.yml/badge.svg)](https://github.com/nodegui/nodegui/actions)
[![Discuss on GitHub](https://img.shields.io/badge/Discuss%20on-GitHub-blue)](https://github.com/nodegui/nodegui/discussions)
Build **performant**, **native** and **cross-platform** desktop applications with **Node.js** and **CSS like styling**.🚀 Build **performant**, **native** and **cross-platform** desktop applications with **Node.js** and **CSS like styling**.🚀
NodeGUI is powered by **Qt6** 💚 which makes it CPU and memory efficient as compared to other chromium based solutions like Electron. NodeGUI is powered by **Qt5** 💚 which makes it CPU and memory efficient as compared to other chromium based solutions like electron.
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/React-icon.svg/1024px-React-icon.svg.png" alt="" width="25"> If you are looking for **React** based version, check out: **[React NodeGUI](https://github.com/nodegui/react-nodegui)**. If you are looking for **React** based version, check out: **[React NodeGUI](https://github.com/nodegui/react-nodegui)**.
<img src="https://vuejs.org/images/logo.png" alt="" width="25" /> If you are looking for **Vue** based version, check out: **[Vue NodeGUI](https://github.com/nodegui/vue-nodegui)**. Visit: https://nodegui.github.io/nodegui for docs.
<img src="https://github.com/sveltejs/branding/raw/master/svelte-logo.png" alt="" width="25" /> If you are looking for **Svelte** based version, check out: **[Svelte NodeGUI](https://github.com/nodegui/svelte-nodegui)**
Visit https://nodegui.github.io/nodegui for docs.
<img alt="logo" src="https://github.com/nodegui/nodegui/raw/master/extras/logo/nodegui.png" height="200" /> <img alt="logo" src="https://github.com/nodegui/nodegui/raw/master/extras/logo/nodegui.png" height="200" />
@ -30,7 +27,9 @@ Visit https://nodegui.github.io/nodegui for docs.
<div style="display:inline; margin: 0 auto;"><img alt="kitchen" src="https://github.com/nodegui/nodegui/raw/master/extras/assets/kitchen.png" height="280" /><img alt="demo_mac" src="https://github.com/nodegui/examples/raw/master/react-nodegui/weather-app-widget/weather_widget_mac.png" height="280" /><img alt="demo_win" src="https://github.com/nodegui/examples/raw/master/react-nodegui/image-view/image_view_win.jpg" height="280" /> <div style="display:inline; margin: 0 auto;"><img alt="kitchen" src="https://github.com/nodegui/nodegui/raw/master/extras/assets/kitchen.png" height="280" /><img alt="demo_mac" src="https://github.com/nodegui/examples/raw/master/react-nodegui/weather-app-widget/weather_widget_mac.png" height="280" /><img alt="demo_win" src="https://github.com/nodegui/examples/raw/master/react-nodegui/image-view/image_view_win.jpg" height="280" />
</div> </div>
### Code Examples **More screenshots?**
### More Examples:
https://github.com/nodegui/examples https://github.com/nodegui/examples
@ -38,17 +37,17 @@ https://github.com/nodegui/examples
## Features ## Features
- 🧬 **Cross platform.** Works on major Linux flavours, Windows, and MacOS. - 🧬 Cross platform. Should work on major Linux flavours, Windows and MacOS.
- 📉 **Low CPU and memory** footprint. Current CPU stays at 0% on idle and memory usage is under 20MB for a Hello World program. - 📉 Low CPU and memory footprint. Current CPU stays at 0% on idle and memory usage is under 20mb for a hello world program.
- 💅 **Styling with CSS** (includes actual cascading). Also has full support for Flexbox layout (thanks to Yoga). - 💅 Styling with CSS (includes actual cascading). Also has full support for Flexbox layout (thanks to Yoga).
- ✅ **Complete Nodejs API support** (Currently runs on Node v16.x - and is easily upgradable). Hence has access to all Nodejs compatible NPM modules. - ✅ Complete Nodejs api support (Currently runs on Node v12.x - and is easily upgradable). Hence has access to all nodejs compatible npm modules.
- 🎪 **Native widget event listener support.** Supports all events available from Qt / NodeJs. - 🎪 Native widget event listener support. Supports all events available from Qt / NodeJs.
- 💸 **Can be used for Commercial applications.** - 💸 Can be used for Commercial applications.
- 🕵️‍♂️ **Good Devtools support.** - 🕵️‍♂️ Good Devtools support.
- 📚 **Good documentation and website.** - 📚 Good documentation and website.
- 🧙‍♂️ **Good documentation for contributors.** - 🧙‍♂️ Good documentation for contributors.
- 🦹🏻‍♀️ **Good support for dark mode (Thanks to Qt).** - 🦹🏻‍♀️ Good support for dark mode (Thanks to QT).
- 🏅**First class Typescript support.** (Works on regular JS projects too 😉). - 🏅First class Typescript support. (Works on regular JS projects too 😉).
## Getting Started ## Getting Started
@ -57,16 +56,15 @@ https://github.com/nodegui/examples
- Checkout the examples: https://github.com/nodegui/examples . - Checkout the examples: https://github.com/nodegui/examples .
- [Tutorial: Build a native Meme Search Desktop app with Javascript (NodeGui) and Giphy API](https://www.sitepoint.com/build-native-desktop-gif-searcher-app-using-nodegui/) - [Tutorial: Build a native Meme Search Desktop app with Javascript (NodeGui) and Giphy API](https://www.sitepoint.com/build-native-desktop-gif-searcher-app-using-nodegui/)
## Installation ## Installation
To install latest stable release: #### To install latest stable release:
``` ```
npm install @nodegui/nodegui npm install @nodegui/nodegui
``` ```
To install the latest version available on master branch: #### To install the latest version available on master branch:
``` ```
npm install https://github.com/nodegui/nodegui/releases/download/v0.0.0-latest-master/nodegui-master.tgz npm install https://github.com/nodegui/nodegui/releases/download/v0.0.0-latest-master/nodegui-master.tgz
@ -78,25 +76,13 @@ or a shorter version:
npm i http://master-release.nodegui.org npm i http://master-release.nodegui.org
``` ```
If the installation fails to download the Qt binaries, a mirror can be used by setting the following environment variable and running the install command again: **Community guides**
```sh
QT_LINK_MIRROR=<alternative domain> # eg. QT_LINK_MIRROR=https://qt-mirror.dannhauer.de
npm install @nodegui/nodegui
```
See [FAQs](https://github.com/nodegui/nodegui/tree/master/website/docs/faq.md#why-does-installation-fail-at-minimal-qt-setup) for more details.
## Community guides
- [Tutorial: Build a native Meme Search Desktop app with Javascript (NodeGui) and Giphy API](https://www.sitepoint.com/build-native-desktop-gif-searcher-app-using-nodegui/) - [Tutorial: Build a native Meme Search Desktop app with Javascript (NodeGui) and Giphy API](https://www.sitepoint.com/build-native-desktop-gif-searcher-app-using-nodegui/)
- https://blog.logrocket.com/electron-alternatives-exploring-nodegui-and-react-nodegui/ - Electron alternatives: Exploring NodeGUI and React NodeGUI by [Siegfried Grimbeek](https://blog.logrocket.com/author/siegfriedgrimbeek/). - https://blog.logrocket.com/electron-alternatives-exploring-nodegui-and-react-nodegui/ - Electron alternatives: Exploring NodeGUI and React NodeGUI by [Siegfried Grimbeek](https://blog.logrocket.com/author/siegfriedgrimbeek/).
- https://hibbard.eu/node-gui/ - Excellent guide from [James Hibbard](https://github.com/jameshibbard). - https://hibbard.eu/node-gui/ - Excellent guide from [James Hibbard](https://github.com/jameshibbard).
## Talks/Podcasts **Talks/Podcasts**
- [NodeGui and React NodeGui at KarmaJS Nov 2019 meetup: https://www.youtube.com/watch?v=8jH5gaEEDv4](https://www.youtube.com/watch?v=8jH5gaEEDv4) - [NodeGui and React NodeGui at KarmaJS Nov 2019 meetup: https://www.youtube.com/watch?v=8jH5gaEEDv4](https://www.youtube.com/watch?v=8jH5gaEEDv4)
@ -112,116 +98,15 @@ Looking to contribute? If you wish to implement a new widget/add more features a
Please read https://github.com/nodegui/.github/blob/master/CONTRIBUTING.md Please read https://github.com/nodegui/.github/blob/master/CONTRIBUTING.md
## Building
## Building from source `npm run build`
This section is useful for those wanting to work on NodeGui itself. Optionally set `QT_INSTALL_DIR='/path/to/qt'` environment variable to build using your own version of Qt.
### Required tooling
NodeGui requires CMake and Compilation Tools as it is a wrapper for a native C++ widget toolkit QT.
Detailed instructions here: https://www.sitepoint.com/build-native-desktop-gif-searcher-app-using-nodegui/
TL;DR:
**MacOS**
```
brew install cmake
brew install make
```
**Windows**
https://cmake.org/download/
**Linux (Debian/Ubuntu)**
```
sudo apt-get install pkg-config build-essential
sudo apt-get install cmake make
sudo apt-get install mesa-common-dev libglu1-mesa-dev
```
**Linux (Fedora/RHEL/CentOS)**
```
sudo dnf groupinstall "Development Tools" "Development Libraries"
sudo dnf groupinstall "C Development Tools and Libraries"
sudo dnf install mesa-libGL mesa-libGL-devel
```
### Building
Once you have cloned this git repository, run this to build:
```
npm install
npm run build
```
The last step will takes some time to run as it builds the C++ binaries at the core of NodeGui.
### Using your own custom Qt installation (Optional)
**Compiling Qt from source**
You will need to download and install Qt from source since there are no binaries from Qt for M1 yet.
(https://www.reddit.com/r/QtFramework/comments/ll58wg/how_to_build_qt_creator_for_macos_arm64_a_guide/)
```
git clone git://code.qt.io/qt/qt5.git
cd qt5
git checkout 5.15
./init-repository --module-subset=essential -f
git submodule init qtsvg
git submodule update qtsvg
cd ..
mkdir qt5-5.15-macOS-release
cd qt5-5.15-macOS-release
../qt5/configure -release QMAKE_APPLE_DEVICE_ARCHS=arm64 -opensource -confirm-license -nomake examples -nomake tests -skip qt3d -skip webengine -skip qtactiveqt -skip qtcanvas3d -skip qtdeclarative -skip qtdatavis3d -skip qtdoc -skip qtgamepad -skip qtcharts -skip qtgraphicaleffects -skip qtlocation -skip qtpurchasing -skip qtquickcontrols -skip qtquickcontrols2 -skip qtremoteobjects -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qtvirtualkeyboard -skip qtscript
make -j15
make install
```
This should install Qt into something like this `/usr/local/Qt-5.15.3` (your directory can change. This will be displayed when running make)
**Pointing nodegui to use your custom Qt installation**
Now just set `export QT_INSTALL_DIR=<your qt path>` . In the above example it would look something like this `export QT_INSTALL_DIR=/usr/local/Qt-5.15.3`. Add this in your .zshrc or .bashrc so that you dont need to repeat this process again.
Now just `rm -rf node_modules` and do `npm install` again.
The logs should say something like `CustomQt detected at <your qt path>. Hence, skipping Mini Qt installation`.
### Running example programs
A number of small programs to show different parts of the Qt API are in `src/examples`. They can be run directly with:
```
npm run qode dist/examples/modelview_1_readonly.js
```
## Updating docs
`npm run docs`
then followed by:
`cd website && GIT_USER=<your_git_username> yarn deploy`
## Funding ## Funding
NodeGui is an open source project and requires your support. If you like this project, please consider supporting my work by clicking on the Sponsor button on this Github repository or via Ko-Fi. NodeGUI is an open source project and requires your support. If you like this project, please consider supporting my work by clicking on the Sponsor button on this Github repository or via Ko-Fi.
Alternatively, Issues on NodeGui can be funded by anyone via Issuehunt and the amount will be distributed to respective contributors. Alternatively, Issues on NodeGui can be funded by anyone via Issuehunt and the amount will be distributed to respective contributors.
<p> <p>
@ -263,7 +148,7 @@ People maintaining this project.
<table> <table>
<tr> <tr>
<td align="center"><a href="https://blog.atulr.com"><img src="https://avatars2.githubusercontent.com/u/4029423?v=4" width="100px;" alt="Atul R"/><br /><sub><b>Atul R</b></sub></a></td> <td align="center"><a href="https://blog.atulr.com"><img src="https://avatars2.githubusercontent.com/u/4029423?v=4" width="100px;" alt="Atul R"/><br /><sub><b>Atul R</b></sub></a></td>
<td align="center"><a href="https://github.com/sedwards2009"><img src="https://avatars.githubusercontent.com/u/6926644?v=4" width="100px;" alt="Simon Edwards"/><br /><sub><b>Simon Edwards</b></sub></a></td> <td align="center"><a href="https://github.com/feng8848"><img src="https://avatars2.githubusercontent.com/u/40539968?v=4" width="100px;" alt=""/><br /><sub><b>feng8848</b></sub></a></td>
</tr> </tr>
</table> </table>
@ -276,66 +161,41 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<!-- markdownlint-disable --> <!-- markdownlint-disable -->
<table> <table>
<tr> <tr>
<td align="center"><a href="https://lramage.gitlab.io"><img src="https://avatars1.githubusercontent.com/u/43783393?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucas Ramage</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=oxr463" title="Documentation">📖</a></td> <td align="center"><a href="https://lramage.gitlab.io"><img src="https://avatars1.githubusercontent.com/u/43783393?v=4" width="100px;" alt=""/><br /><sub><b>Lucas Ramage</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=oxr463" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/gamtiq"><img src="https://avatars3.githubusercontent.com/u/1177323?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Denis Sikuler</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=gamtiq" title="Documentation">📖</a></td> <td align="center"><a href="https://github.com/gamtiq"><img src="https://avatars3.githubusercontent.com/u/1177323?v=4" width="100px;" alt=""/><br /><sub><b>Denis Sikuler</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=gamtiq" title="Documentation">📖</a></td>
<td align="center"><a href="https://twitter.com/nahueljo"><img src="https://avatars1.githubusercontent.com/u/1612488?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nahuel José</b></sub></a><br /><a href="#question-Naahuel" title="Answering Questions">💬</a></td> <td align="center"><a href="https://twitter.com/nahueljo"><img src="https://avatars1.githubusercontent.com/u/1612488?v=4" width="100px;" alt=""/><br /><sub><b>Nahuel José</b></sub></a><br /><a href="#question-Naahuel" title="Answering Questions">💬</a></td>
<td align="center"><a href="https://github.com/kakulgupta"><img src="https://avatars3.githubusercontent.com/u/10727047?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kakul Gupta</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=kakulgupta" title="Code">💻</a></td> <td align="center"><a href="https://github.com/kakulgupta"><img src="https://avatars3.githubusercontent.com/u/10727047?v=4" width="100px;" alt=""/><br /><sub><b>Kakul Gupta</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=kakulgupta" title="Code">💻</a></td>
<td align="center"><a href="http://rahulgaba.com"><img src="https://avatars3.githubusercontent.com/u/7898942?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rahul Gaba</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=rgabs" title="Code">💻</a></td> <td align="center"><a href="http://rahulgaba.com"><img src="https://avatars3.githubusercontent.com/u/7898942?v=4" width="100px;" alt=""/><br /><sub><b>Rahul Gaba</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=rgabs" title="Code">💻</a></td>
<td align="center"><a href="http://uriziel.pl"><img src="https://avatars1.githubusercontent.com/u/568207?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Paweł Borecki</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=Uriziel01" title="Code">💻</a></td> <td align="center"><a href="http://uriziel.pl"><img src="https://avatars1.githubusercontent.com/u/568207?v=4" width="100px;" alt=""/><br /><sub><b>Paweł Borecki</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=Uriziel01" title="Code">💻</a></td>
<td align="center"><a href="http://marcus-sa.me"><img src="https://avatars0.githubusercontent.com/u/8391194?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Marcus S. Abildskov</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=marcus-sa" title="Tests">⚠️</a></td> <td align="center"><a href="http://marcus-sa.me"><img src="https://avatars0.githubusercontent.com/u/8391194?v=4" width="100px;" alt=""/><br /><sub><b>Marcus S. Abildskov</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=marcus-sa" title="Tests">⚠️</a></td>
</tr> </tr>
<tr> <tr>
<td align="center"><a href="http://www.mad3linux.org"><img src="https://avatars3.githubusercontent.com/u/508624?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Átila Camurça Alves</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=atilacamurca" title="Documentation">📖</a></td> <td align="center"><a href="http://www.mad3linux.org"><img src="https://avatars3.githubusercontent.com/u/508624?v=4" width="100px;" alt=""/><br /><sub><b>Átila Camurça Alves</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=atilacamurca" title="Documentation">📖</a></td>
<td align="center"><a href="http://hibbard.eu"><img src="https://avatars2.githubusercontent.com/u/1940994?v=4?s=100" width="100px;" alt=""/><br /><sub><b>James Hibbard</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=jameshibbard" title="Code">💻</a></td> <td align="center"><a href="http://hibbard.eu"><img src="https://avatars2.githubusercontent.com/u/1940994?v=4" width="100px;" alt=""/><br /><sub><b>James Hibbard</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=jameshibbard" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/soonoo"><img src="https://avatars2.githubusercontent.com/u/5436405?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Soonwoo Hong</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=soonoo" title="Code">💻</a></td> <td align="center"><a href="https://github.com/soonoo"><img src="https://avatars2.githubusercontent.com/u/5436405?v=4" width="100px;" alt=""/><br /><sub><b>Soonwoo Hong</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=soonoo" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/illBeRoy"><img src="https://avatars2.githubusercontent.com/u/6681893?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Roy Sommer</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=illBeRoy" title="Code">💻</a></td> <td align="center"><a href="https://github.com/illBeRoy"><img src="https://avatars2.githubusercontent.com/u/6681893?v=4" width="100px;" alt=""/><br /><sub><b>Roy Sommer</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=illBeRoy" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/paulocoghi"><img src="https://avatars1.githubusercontent.com/u/378397?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Paulo Coghi</b></sub></a><br /><a href="#ideas-paulocoghi" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center"><a href="https://github.com/paulocoghi"><img src="https://avatars1.githubusercontent.com/u/378397?v=4" width="100px;" alt=""/><br /><sub><b>Paulo Coghi</b></sub></a><br /><a href="#ideas-paulocoghi" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="https://balthild.com"><img src="https://avatars2.githubusercontent.com/u/2662758?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Balthild Ires</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=balthild" title="Code">💻</a></td> <td align="center"><a href="https://balthild.com"><img src="https://avatars2.githubusercontent.com/u/2662758?v=4" width="100px;" alt=""/><br /><sub><b>Balthild Ires</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=balthild" title="Code">💻</a></td>
<td align="center"><a href="https://dimitarnestorov.com"><img src="https://avatars0.githubusercontent.com/u/8790386?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dimitar Nestorov</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=dimitarnestorov" title="Code">💻</a></td> <td align="center"><a href="https://dimitarnestorov.com"><img src="https://avatars0.githubusercontent.com/u/8790386?v=4" width="100px;" alt=""/><br /><sub><b>Dimitar Nestorov</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=dimitarnestorov" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center"><a href="https://www.greatapes.fi"><img src="https://avatars3.githubusercontent.com/u/3404389?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mikko Sairio</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=msairio" title="Code">💻</a></td> <td align="center"><a href="https://www.greatapes.fi"><img src="https://avatars3.githubusercontent.com/u/3404389?v=4" width="100px;" alt=""/><br /><sub><b>Mikko Sairio</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=msairio" title="Code">💻</a></td>
<td align="center"><a href="http://blog.pepf.nl"><img src="https://avatars1.githubusercontent.com/u/1265435?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Pepijn</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=pepf" title="Code">💻</a></td> <td align="center"><a href="http://blog.pepf.nl"><img src="https://avatars1.githubusercontent.com/u/1265435?v=4" width="100px;" alt=""/><br /><sub><b>Pepijn</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=pepf" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/slidinghotdog"><img src="https://avatars3.githubusercontent.com/u/33790211?v=4?s=100" width="100px;" alt=""/><br /><sub><b>slidinghotdog</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=slidinghotdog" title="Code">💻</a></td> <td align="center"><a href="https://github.com/slidinghotdog"><img src="https://avatars3.githubusercontent.com/u/33790211?v=4" width="100px;" alt=""/><br /><sub><b>slidinghotdog</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=slidinghotdog" title="Code">💻</a></td>
<td align="center"><a href="http://www.bundyo.org"><img src="https://avatars1.githubusercontent.com/u/98318?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Bundyo (Kamen Bundev)</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=bundyo" title="Code">💻</a></td> <td align="center"><a href="http://www.bundyo.org"><img src="https://avatars1.githubusercontent.com/u/98318?v=4" width="100px;" alt=""/><br /><sub><b>Bundyo (Kamen Bundev)</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=bundyo" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/feng8848"><img src="https://avatars2.githubusercontent.com/u/40539968?v=4?s=100" width="100px;" alt=""/><br /><sub><b>feng8848</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=feng8848" title="Code">💻</a></td> <td align="center"><a href="https://github.com/feng8848"><img src="https://avatars2.githubusercontent.com/u/40539968?v=4" width="100px;" alt=""/><br /><sub><b>feng8848</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=feng8848" title="Code">💻</a></td>
<td align="center"><a href="https://karelov.info"><img src="https://avatars3.githubusercontent.com/u/2384454?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Maksim Karelov</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=Ty3uK" title="Code">💻</a></td> <td align="center"><a href="https://karelov.info"><img src="https://avatars3.githubusercontent.com/u/2384454?v=4" width="100px;" alt=""/><br /><sub><b>Maksim Karelov</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=Ty3uK" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/mspencer92"><img src="https://avatars2.githubusercontent.com/u/1910455?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mspencer92</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=mspencer92" title="Code">💻</a></td> <td align="center"><a href="https://github.com/mspencer92"><img src="https://avatars2.githubusercontent.com/u/1910455?v=4" width="100px;" alt=""/><br /><sub><b>mspencer92</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=mspencer92" title="Code">💻</a></td>
</tr> </tr>
<tr> <tr>
<td align="center"><a href="https://github.com/blncd2020"><img src="https://avatars1.githubusercontent.com/u/59541979?v=4?s=100" width="100px;" alt=""/><br /><sub><b>blncd2020</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=blncd2020" title="Documentation">📖</a></td> <td align="center"><a href="https://github.com/blncd2020"><img src="https://avatars1.githubusercontent.com/u/59541979?v=4" width="100px;" alt=""/><br /><sub><b>blncd2020</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=blncd2020" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/gluaxspeed"><img src="https://avatars2.githubusercontent.com/u/16431709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>gluaxspeed</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=gluaxspeed" title="Code">💻</a></td> <td align="center"><a href="https://github.com/gluaxspeed"><img src="https://avatars2.githubusercontent.com/u/16431709?v=4" width="100px;" alt=""/><br /><sub><b>gluaxspeed</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=gluaxspeed" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/Solant"><img src="https://avatars2.githubusercontent.com/u/5971578?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Solant</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=Solant" title="Code">💻</a></td> <td align="center"><a href="https://github.com/Solant"><img src="https://avatars2.githubusercontent.com/u/5971578?v=4" width="100px;" alt=""/><br /><sub><b>Solant</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=Solant" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/shubhamzanwar"><img src="https://avatars0.githubusercontent.com/u/15626155?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Shubham Zanwar</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=shubhamzanwar" title="Code">💻</a></td> <td align="center"><a href="https://github.com/shubhamzanwar"><img src="https://avatars0.githubusercontent.com/u/15626155?v=4" width="100px;" alt=""/><br /><sub><b>Shubham Zanwar</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=shubhamzanwar" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/Singha360"><img src="https://avatars1.githubusercontent.com/u/35334787?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Singha360</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=Singha360" title="Code">💻</a></td>
<td align="center"><a href="http://wellenline.com"><img src="https://avatars3.githubusercontent.com/u/3790782?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mihkel</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=MihkelBaranov" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/stevo2588"><img src="https://avatars1.githubusercontent.com/u/3278045?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Stephen A</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=stevo2588" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="http://liujunjiang.com"><img src="https://avatars1.githubusercontent.com/u/15191056?v=4?s=100" width="100px;" alt=""/><br /><sub><b>流君酱</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=jardenliu" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/agg23"><img src="https://avatars1.githubusercontent.com/u/238679?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Adam Gastineau</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=agg23" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/swittk"><img src="https://avatars2.githubusercontent.com/u/5000572?v=4?s=100" width="100px;" alt=""/><br /><sub><b>swittk</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=swittk" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/craftingmod"><img src="https://avatars2.githubusercontent.com/u/9389278?v=4?s=100" width="100px;" alt=""/><br /><sub><b>craftingmod</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=craftingmod" title="Code">💻</a></td>
<td align="center"><a href="http://www.m2osw.com"><img src="https://avatars1.githubusercontent.com/u/643129?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Doug Barbieri</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=dooglio" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/NeryHenrique"><img src="https://avatars0.githubusercontent.com/u/6879141?v=4?s=100" width="100px;" alt=""/><br /><sub><b>HENRIQUE DE SOUZA NERY</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=NeryHenrique" title="Code">💻</a></td>
<td align="center"><a href="https://ruslang.xyz"><img src="https://avatars0.githubusercontent.com/u/25264730?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ruslan Garifullin</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=ruslang02" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/ran-j"><img src="https://avatars0.githubusercontent.com/u/17410205?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ranieri</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=ran-j" title="Code">💻</a> <a href="https://github.com/nodegui/nodegui/commits?author=ran-j" title="Documentation">📖</a></td>
<td align="center"><a href="https://master-technology.com"><img src="https://avatars3.githubusercontent.com/u/850871?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nathanael Anderson</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=NathanaelA" title="Code">💻</a></td>
<td align="center"><a href="https://ubiq.co.za"><img src="https://avatars0.githubusercontent.com/u/4415071?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ross</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=rocbear" title="Code">💻</a> <a href="https://github.com/nodegui/nodegui/commits?author=rocbear" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/4h7l"><img src="https://avatars.githubusercontent.com/u/69183283?v=4?s=100" width="100px;" alt=""/><br /><sub><b>4h7l</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=4h7l" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/Maks-s"><img src="https://avatars.githubusercontent.com/u/26678512?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Maks</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=Maks-s" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/zhb124404"><img src="https://avatars.githubusercontent.com/u/16805041?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zhb124404</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=zhb124404" title="Documentation">📖</a></td>
<td align="center"><a href="http://www.apsis.io"><img src="https://avatars.githubusercontent.com/u/579688?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Wyatt Kirby</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=wkirby" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://stvkoch.github.io."><img src="https://avatars.githubusercontent.com/u/14454?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Steven Koch</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=stvkoch" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/sedwards2009"><img src="https://avatars.githubusercontent.com/u/6926644?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Simon Edwards</b></sub></a><br /><a href="https://github.com/nodegui/nodegui/commits?author=sedwards2009" title="Code">💻</a></td>
</tr> </tr>
</table> </table>
<!-- markdownlint-restore --> <!-- markdownlint-enable -->
<!-- prettier-ignore-end --> <!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END --> <!-- ALL-CONTRIBUTORS-LIST:END -->

View File

@ -5,17 +5,15 @@ if(CCACHE_PROGRAM)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}") set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
endif() endif()
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "Minimum OS X deployment version") set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "Minimum OS X deployment version")
function(AddCommonConfig addonName) function(AddCommonConfig addonName)
target_compile_features(${addonName} PRIVATE target_compile_features(${addonName} PRIVATE
cxx_constexpr
cxx_inheriting_constructors cxx_inheriting_constructors
cxx_lambdas cxx_lambdas
cxx_auto_type cxx_auto_type
cxx_variadic_templates cxx_variadic_templates
cxx_variable_templates cxx_variable_templates
cxx_std_17
) )
if(napi_build_version) if(napi_build_version)

View File

@ -11,7 +11,7 @@ include("${PLUGIN_CMAKE_DIR}/common.cmake")
include("${PLUGIN_CMAKE_DIR}/qt.cmake") include("${PLUGIN_CMAKE_DIR}/qt.cmake")
include("${PLUGIN_CMAKE_DIR}/napi.cmake") include("${PLUGIN_CMAKE_DIR}/napi.cmake")
macro(AddPluginConfig addonName) function(AddPluginConfig addonName)
AddCommonConfig(${addonName}) AddCommonConfig(${addonName})
AddQtSupport(${addonName}) AddQtSupport(${addonName})
AddNapiSupport(${addonName}) AddNapiSupport(${addonName})
@ -29,5 +29,5 @@ macro(AddPluginConfig addonName)
"${NODEGUI_ROOT}/src/cpp/include/nodegui" "${NODEGUI_ROOT}/src/cpp/include/nodegui"
) )
endmacro(AddPluginConfig addonName) endfunction(AddPluginConfig addonName)

View File

@ -16,7 +16,7 @@ macro(AddQodeSupport addonName)
message(STATUS "Using Qode installation for ${addonName} QODE_BINARY_DIR:${QODE_BINARY_DIR}") message(STATUS "Using Qode installation for ${addonName} QODE_BINARY_DIR:${QODE_BINARY_DIR}")
target_link_libraries(${CORE_WIDGETS_ADDON} PRIVATE target_link_libraries(${CORE_WIDGETS_ADDON} PRIVATE
"${QODE_BINARY_DIR}\\node.lib" "${QODE_BINARY_DIR}\\qode.lib"
) )
endif() endif()

View File

@ -17,9 +17,9 @@ macro(AddQtSupport addonName)
string(REPLACE "\n" "" QT_CMAKE_HOME_DIR "${QT_CMAKE_HOME_DIR}") string(REPLACE "\n" "" QT_CMAKE_HOME_DIR "${QT_CMAKE_HOME_DIR}")
string(REPLACE "\"" "" QT_CMAKE_HOME_DIR "${QT_CMAKE_HOME_DIR}") string(REPLACE "\"" "" QT_CMAKE_HOME_DIR "${QT_CMAKE_HOME_DIR}")
message(STATUS "Using Qt installation for ${addonName} QT_CMAKE_HOME_DIR:${QT_CMAKE_HOME_DIR}") message(STATUS "Using QT installation for ${addonName} QT_CMAKE_HOME_DIR:${QT_CMAKE_HOME_DIR}")
list(APPEND CMAKE_PREFIX_PATH "${QT_CMAKE_HOME_DIR}/../../..") set(Qt5_DIR ${QT_CMAKE_HOME_DIR})
find_package(Qt6 REQUIRED COMPONENTS Widgets Gui Core Svg SvgWidgets) find_package(Qt5 COMPONENTS Widgets Gui Core REQUIRED)
endmacro(AddQtSupport addonName) endmacro(AddQtSupport addonName)

View File

@ -3,56 +3,45 @@ const path = require('path');
const fs = require('fs'); const fs = require('fs');
const SETUP_DIR = path.resolve(__dirname, '..', 'miniqt'); const SETUP_DIR = path.resolve(__dirname, '..', 'miniqt');
const QT_VERSION = '6.4.1'; const QT_VERSION = '5.14.1';
const MIRROR = Boolean(process.env.QT_LINK_MIRROR) ? process.env.QT_LINK_MIRROR : 'https://download.qt.io';
const checkIfExists = (fullPath) => { const checkIfExists = fullPath => {
return () => fs.existsSync(fullPath); return () => fs.existsSync(fullPath);
}; };
function getMiniQtConfig() { function getMiniQtConfig() {
switch (os.platform()) { switch (os.platform()) {
case 'darwin': { case 'darwin': {
const qtHome = path.resolve(SETUP_DIR, QT_VERSION, 'macos'); const qtHome = path.resolve(SETUP_DIR, QT_VERSION, 'clang_64');
return { return {
qtHome, qtHome,
artifacts: [ artifacts: [
{ {
name: 'Qt Base', name: 'Qt Base',
link: `${MIRROR}/online/qtsdkrepository/mac_x64/desktop/qt6_641/qt.qt6.641.clang_64/6.4.1-0-202211101256qtbase-MacOS-MacOS_12-Clang-MacOS-MacOS_12-X86_64-ARM64.7z`, link: `https://download.qt.io/online/qtsdkrepository/mac_x64/desktop/qt5_5141/qt.qt5.5141.clang_64/5.14.1-0-202001241000qtbase-MacOS-MacOS_10_13-Clang-MacOS-MacOS_10_13-X86_64.7z`,
skipSetup: checkIfExists(path.resolve(qtHome, 'plugins', 'platforms', 'libqcocoa.dylib')), skipSetup: checkIfExists(path.resolve(qtHome, 'plugins', 'platforms', 'libqcocoa.dylib')),
}, },
{
name: 'Qt Svg',
link: `${MIRROR}/online/qtsdkrepository/mac_x64/desktop/qt6_641/qt.qt6.641.clang_64/6.4.1-0-202211101256qtsvg-MacOS-MacOS_12-Clang-MacOS-MacOS_12-X86_64-ARM64.7z`,
skipSetup: checkIfExists(path.resolve(qtHome, 'lib', 'QtSvg.framework', 'QtSvg')),
},
{ {
name: 'Qt Tools', name: 'Qt Tools',
link: `${MIRROR}/online/qtsdkrepository/mac_x64/desktop/qt6_641/qt.qt6.641.clang_64/6.4.1-0-202211101256qttools-MacOS-MacOS_12-Clang-MacOS-MacOS_12-X86_64-ARM64.7z`, link: `https://download.qt.io/online/qtsdkrepository/mac_x64/desktop/qt5_5141/qt.qt5.5141.clang_64/5.14.1-0-202001241000qttools-MacOS-MacOS_10_13-Clang-MacOS-MacOS_10_13-X86_64.7z`,
skipSetup: checkIfExists(path.resolve(qtHome, 'bin', 'macdeployqt')), skipSetup: checkIfExists(path.resolve(qtHome, 'bin', 'macdeployqt')),
}, },
], ],
}; };
} }
case 'win32': { case 'win32': {
const qtHome = path.resolve(SETUP_DIR, QT_VERSION, 'msvc2019_64'); const qtHome = path.resolve(SETUP_DIR, QT_VERSION, 'msvc2017_64');
return { return {
qtHome, qtHome,
artifacts: [ artifacts: [
{ {
name: 'Qt Base', name: 'Qt Base',
link: `${MIRROR}/online/qtsdkrepository/windows_x86/desktop/qt6_641/qt.qt6.641.win64_msvc2019_64/6.4.1-0-202211101254qtbase-Windows-Windows_10_21H2-MSVC2019-Windows-Windows_10_21H2-X86_64.7z`, link: `https://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_5141/qt.qt5.5141.win64_msvc2017_64/5.14.1-0-202001240957qtbase-Windows-Windows_10-MSVC2017-Windows-Windows_10-X86_64.7z`,
skipSetup: checkIfExists(path.resolve(qtHome, 'bin', 'Qt6Core.dll')), skipSetup: checkIfExists(path.resolve(qtHome, 'bin', 'Qt5Core.dll')),
},
{
name: 'Qt SVG',
link: `${MIRROR}/online/qtsdkrepository/windows_x86/desktop/qt6_641/qt.qt6.641.win64_msvc2019_64/6.4.1-0-202211101254qtsvg-Windows-Windows_10_21H2-MSVC2019-Windows-Windows_10_21H2-X86_64.7z`,
skipSetup: checkIfExists(path.resolve(qtHome, 'bin', 'Qt6Svg.dll')),
}, },
{ {
name: 'Qt Tools', name: 'Qt Tools',
link: `${MIRROR}/online/qtsdkrepository/windows_x86/desktop/qt6_641/qt.qt6.641.win64_msvc2019_64/6.4.1-0-202211101254qttools-Windows-Windows_10_21H2-MSVC2019-Windows-Windows_10_21H2-X86_64.7z`, link: `https://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_5141/qt.qt5.5141.win64_msvc2017_64/5.14.1-0-202001240957qttools-Windows-Windows_10-MSVC2017-Windows-Windows_10-X86_64.7z`,
skipSetup: checkIfExists(path.resolve(qtHome, 'bin', 'windeployqt.exe')), skipSetup: checkIfExists(path.resolve(qtHome, 'bin', 'windeployqt.exe')),
}, },
], ],
@ -65,17 +54,12 @@ function getMiniQtConfig() {
artifacts: [ artifacts: [
{ {
name: 'Qt Base', name: 'Qt Base',
link: `${MIRROR}/online/qtsdkrepository/linux_x64/desktop/qt6_641/qt.qt6.641.gcc_64/6.4.1-0-202211101305qtbase-Linux-RHEL_8_4-GCC-Linux-RHEL_8_4-X86_64.7z`, link: `https://download.qt.io/online/qtsdkrepository/linux_x64/desktop/qt5_5141/qt.qt5.5141.gcc_64/5.14.1-0-202001240953qtbase-Linux-RHEL_7_6-GCC-Linux-RHEL_7_6-X86_64.7z`,
skipSetup: checkIfExists(path.resolve(qtHome, 'bin', 'moc')), skipSetup: checkIfExists(path.resolve(qtHome, 'bin', 'moc')),
}, },
{
name: 'Qt SVG',
link: `${MIRROR}/online/qtsdkrepository/linux_x64/desktop/qt6_641/qt.qt6.641.gcc_64/6.4.1-0-202211101305qtsvg-Linux-RHEL_8_4-GCC-Linux-RHEL_8_4-X86_64.7z`,
skipSetup: checkIfExists(path.resolve(qtHome, 'lib', 'libQt6Svg.so')),
},
{ {
name: 'Qt ICU', name: 'Qt ICU',
link: `${MIRROR}/online/qtsdkrepository/linux_x64/desktop/qt6_641/qt.qt6.641.gcc_64/6.4.1-0-202211101305icu-linux-Rhel7.2-x64.7z`, link: `https://download.qt.io/online/qtsdkrepository/linux_x64/desktop/qt5_5141/qt.qt5.5141.gcc_64/5.14.1-0-202001240953icu-linux-Rhel7.2-x64.7z`,
skipSetup: checkIfExists(path.resolve(qtHome, 'lib', 'libicuuc.so')), skipSetup: checkIfExists(path.resolve(qtHome, 'lib', 'libicuuc.so')),
}, },
], ],
@ -92,7 +76,7 @@ const miniQt = {
const useCustomQt = Boolean(process.env.QT_INSTALL_DIR); const useCustomQt = Boolean(process.env.QT_INSTALL_DIR);
const qtHome = useCustomQt ? process.env.QT_INSTALL_DIR : miniQt.qtHome; const qtHome = useCustomQt ? process.env.QT_INSTALL_DIR : miniQt.qtHome;
const qtCmakeDir = path.resolve(qtHome, 'lib', 'cmake', 'Qt6'); const qtCmakeDir = path.resolve(qtHome, 'lib', 'cmake', 'Qt5');
module.exports = { module.exports = {
qtHome, qtHome,

15102
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,71 +1,65 @@
{ {
"name": "@nodegui/nodegui", "name": "@nodegui/nodegui",
"version": "0.59.0", "version": "0.17.0",
"description": "A cross-platform library to build native desktop apps.", "description": "A cross platform library to build native desktop apps.",
"main": "dist/index.js", "main": "dist/index.js",
"typings": "dist/index.d.ts", "typings": "dist/index.d.ts",
"author": "Atul R <atulanand94@gmail.com>", "author": "Atul R <atulanand94@gmail.com>",
"license": "MIT", "license": "MIT",
"private": false, "private": false,
"bin": { "bin": {
"qode": "scripts/qode.js" "qode": "./scripts/qode.js"
}, },
"funding": { "funding": {
"url": "https://github.com/sponsors/a7ul" "url": "https://github.com/sponsors/master-atul"
}, },
"scripts": { "scripts": {
"dev": "npm run build && node ./scripts/qode.js dist/demo.js", "dev": "cross-env npm run build && node ./scripts/qode.js dist/demo.js",
"demo": "node ./scripts/qode.js dist/demo.js", "build": "cross-env tsc && npm run build:addon",
"build": "tsc && npm run build:addon", "postinstall": "cross-env npm run setupqt && (node ./scripts/skip.js || npm run prebuild:install || npm run build:addon)",
"install": "npm run setupqt && (node ./scripts/skip.js || npm run setupbinary || npm run build:addon)", "setupqt": "cross-env node ./scripts/setupMiniQt.js",
"setupqt": "node ./scripts/setupMiniQt.js",
"setupbinary": "node ./scripts/setupBinary.js",
"build:addon": "cross-env CMAKE_BUILD_PARALLEL_LEVEL=8 cmake-js compile", "build:addon": "cross-env CMAKE_BUILD_PARALLEL_LEVEL=8 cmake-js compile",
"prebuild:install": "prebuild-install --backend=cmake-js --runtime=napi --verbose",
"test": "node ./scripts/qode.js ./node_modules/jest/bin/jest -i", "test": "node ./scripts/qode.js ./node_modules/jest/bin/jest -i",
"lint:cpp": "clang-format -i --glob=src/cpp/**/*.[h,c]*", "lint:cpp": "cross-env clang-format -i --glob=src/cpp/**/*.[h,c]*",
"lint:ts": "tsc --noEmit && eslint ./src --fix", "lint:ts": "cross-env tsc --noEmit && cross-env eslint './src/**/*.{ts,tsx,js,jsx}' --fix",
"docs": "typedoc && node ./website/docs/scripts/fixdocs.js", "docs": "cross-env typedoc && node ./website/docs/scripts/fixdocs.js",
"qode": "node ./scripts/qode.js", "qode": "cross-env node ./scripts/qode.js"
"prepublishOnly": "npm run build"
}, },
"engines": {
"node": ">=14.x.x"
},
"engineStrict": false,
"dependencies": { "dependencies": {
"@nodegui/artifact-installer": "^1.1.0", "@nodegui/artifact-installer": "^1.1.0",
"@nodegui/qode": "^18.12.1", "@nodegui/qode": "^2.0.4",
"cmake-js": "^6.2.1", "cmake-js": "^6.1.0",
"cross-env": "^7.0.3", "cross-env": "^7.0.0",
"cuid": "^2.1.8", "cuid": "^2.1.6",
"manage-path": "^2.0.0", "manage-path": "^2.0.0",
"memoize-one": "^5.2.1", "memoize-one": "^5.1.1",
"node-addon-api": "^4.0.0", "node-addon-api": "^2.0.0",
"postcss": "^7.0.17",
"postcss-nodegui-autoprefixer": "0.0.7", "postcss-nodegui-autoprefixer": "0.0.7",
"tar": "^6.0.1" "prebuild-install": "^5.3.3"
}, },
"devDependencies": { "devDependencies": {
"@types/bindings": "^1.5.1", "@types/bindings": "^1.3.0",
"@types/jest": "29.2.4", "@types/jest": "^25.1.1",
"@types/node": "^16.4.13", "@types/node": "^13.9.1",
"@typescript-eslint/eslint-plugin": "^4.29.0", "@typescript-eslint/eslint-plugin": "^2.23.0",
"@typescript-eslint/parser": "^4.29.0", "@typescript-eslint/parser": "^2.23.0",
"clang-format": "^1.5.0", "clang-format": "^1.3.0",
"eslint": "^7.32.0", "eslint": "^6.6.0",
"eslint-config-prettier": "^8.3.0", "eslint-config-prettier": "^6.5.0",
"eslint-plugin-prettier": "^3.4.0", "eslint-plugin-prettier": "^3.1.1",
"husky": "^7.0.1", "husky": "^4.0.10",
"jest": "29.3.1", "jest": "^25.1.0",
"prettier": "^2.3.2", "prebuild": "^10.0.0",
"ts-jest": "29.0.3", "prettier": "^2.0.1",
"typedoc": "^0.17.8", "ts-jest": "^25.0.0",
"typedoc-plugin-markdown": "^2.4.2", "typedoc": "^0.17.0",
"typescript": "^4.3.5" "typedoc-plugin-markdown": "^2.2.14",
"typescript": "^3.8.3"
}, },
"binary": { "binary": {
"napi_versions": [ "napi_versions": [
4 3
] ]
}, },
"husky": { "husky": {

View File

@ -1,6 +1,5 @@
#!/usr/bin/env node #!/usr/bin/env node
var os = require('os');
var path = require('path'); var path = require('path');
var qodeConfig = require('@nodegui/qode'); var qodeConfig = require('@nodegui/qode');
var managePath = require('manage-path'); var managePath = require('manage-path');
@ -12,12 +11,6 @@ var proc = require('child_process');
var alterPath = managePath(process.env); var alterPath = managePath(process.env);
alterPath.unshift(path.join(qtConfig.qtHome, 'bin')); alterPath.unshift(path.join(qtConfig.qtHome, 'bin'));
// Add Qt's lib to LD_LIBRARY_PATH so linux can find the libs when bundled with webpack
if(os.platform == 'linux') {
var oldLD_PATH = process.env.LD_LIBRARY_PATH ?? "";
process.env.LD_LIBRARY_PATH = oldLD_PATH + ":" + path.join(qtConfig.qtHome, 'lib');
}
var child = proc.spawn(qodeConfig.qodePath, process.argv.slice(2), { var child = proc.spawn(qodeConfig.qodePath, process.argv.slice(2), {
stdio: 'inherit', stdio: 'inherit',
windowsHide: false, windowsHide: false,

View File

@ -1,39 +0,0 @@
#!/usr/bin/env node
const os = require('os');
const fs = require('fs');
const path = require('path');
const { setupArtifact } = require('@nodegui/artifact-installer');
const tar = require('tar');
const SETUP_DIR = path.resolve(__dirname, '..', 'build', 'Release');
const packageJson = require('../package');
async function setupBinary() {
const packageVersion = packageJson.version;
const tarballName = `nodegui-binary-v${packageVersion}-${os.platform()}-${os.arch()}.tar.gz`;
const url = `https://github.com/nodegui/nodegui/releases/download/v${packageVersion}/${tarballName}`;
await setupArtifact({
outDir: SETUP_DIR,
id: 'nodegui-core',
displayName: `Precompiled NodeGui binary`,
downloadLink: url,
skipSetup: () => false,
});
const tarPath = path.join(SETUP_DIR, tarballName.slice(0, -3));
tar.extract({
cwd: SETUP_DIR,
file: tarPath,
sync: true,
});
fs.unlinkSync(tarPath);
}
setupBinary()
.catch((err) => {
console.error(err);
process.exit(1);
})
.then(() => {
process.exit(0);
});

View File

@ -5,7 +5,7 @@ const { miniQt, useCustomQt, qtHome } = require('../config/qtConfig');
async function setupQt() { async function setupQt() {
return Promise.all( return Promise.all(
miniQt.artifacts.map(async (artifact) => miniQt.artifacts.map(async artifact =>
setupArtifact({ setupArtifact({
outDir: miniQt.setupDir, outDir: miniQt.setupDir,
id: 'nodegui-mini-qt', id: 'nodegui-mini-qt',
@ -20,7 +20,7 @@ async function setupQt() {
if (!useCustomQt) { if (!useCustomQt) {
console.log(`Minimal Qt ${miniQt.version} setup:`); console.log(`Minimal Qt ${miniQt.version} setup:`);
setupQt().catch((err) => { setupQt().catch(err => {
console.error(err); console.error(err);
process.exit(1); process.exit(1);
}); });

View File

@ -1,67 +0,0 @@
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <cstdint>
#include <cstdio>
#include "YGEnums.h"
namespace facebook {
namespace yoga {
namespace detail {
constexpr size_t log2ceilFn(size_t n) {
return n < 1 ? 0 : (1 + log2ceilFn(n / 2));
}
constexpr int mask(size_t bitWidth, size_t index) {
return ((1 << bitWidth) - 1) << index;
}
// The number of bits necessary to represent enums defined with YG_ENUM_SEQ_DECL
template <typename Enum>
constexpr size_t bitWidthFn() {
static_assert(enums::count<Enum>() > 0,
"Enums must have at least one entries");
return log2ceilFn(enums::count<Enum>() - 1);
}
template <typename Enum>
constexpr Enum getEnumData(int flags, size_t index) {
return static_cast<Enum>((flags & mask(bitWidthFn<Enum>(), index)) >> index);
}
template <typename Enum>
void setEnumData(uint32_t& flags, size_t index, int newValue) {
flags = (flags & ~mask(bitWidthFn<Enum>(), index)) |
((newValue << index) & (mask(bitWidthFn<Enum>(), index)));
}
template <typename Enum>
void setEnumData(uint8_t& flags, size_t index, int newValue) {
flags = (flags & ~mask(bitWidthFn<Enum>(), index)) |
((newValue << index) & (mask(bitWidthFn<Enum>(), index)));
}
constexpr bool getBooleanData(int flags, size_t index) {
return (flags >> index) & 1;
}
inline void setBooleanData(uint8_t& flags, size_t index, bool value) {
if (value) {
flags |= 1 << index;
} else {
flags &= ~(1 << index);
}
}
} // namespace detail
} // namespace yoga
} // namespace facebook

View File

@ -0,0 +1,144 @@
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <yoga/YGEnums.h>
#include <cstddef>
#include <limits>
#include <type_traits>
namespace facebook {
namespace yoga {
namespace detail {
constexpr size_t log2ceil(size_t n) {
return n < 1 ? 0 : (1 + log2ceil(n / 2));
}
// The number of bits necessary to represent enums defined with YG_ENUM_SEQ_DECL
template <typename Enum>
constexpr size_t bitWidth() {
static_assert(enums::count<Enum>() > 0,
"Enums must have at least one entries");
return log2ceil(enums::count<Enum>() - 1);
}
// Number of bits needed for a boolean
template <>
constexpr size_t bitWidth<bool>() {
return 1;
}
template <typename U, typename... Ts>
struct BitTraits {};
template <typename U>
struct BitTraits<U> {
// Base cases
static constexpr size_t width(size_t) { return 0; }
static constexpr size_t shift(size_t) { return 0; }
};
template <typename U, typename T, typename... Ts>
struct BitTraits<U, T, Ts...> {
using Rest = BitTraits<U, Ts...>;
static constexpr size_t width(size_t idx) {
return idx == 0 ? bitWidth<T>() : Rest::width(idx - 1);
}
static constexpr size_t shift(size_t idx) {
return idx == 0 ? Rest::width(0) + Rest::shift(0) : Rest::shift(idx - 1);
}
static constexpr U mask(size_t idx) {
return ((U{1} << width(idx)) - 1) << shift(idx);
}
};
template <size_t Idx, typename T, typename... Ts>
struct IndexedType {
using Type = typename IndexedType<Idx - 1, Ts...>::Type;
};
template <typename T, typename... Ts>
struct IndexedType<0, T, Ts...> {
using Type = T;
};
} // namespace detail
template <typename Storage, typename... Fields>
class Bitfield {
static_assert(std::is_integral<Storage>::value,
"Bitfield needs an integral storage type");
static_assert(std::is_unsigned<Storage>::value,
"Bitfield needs an unsigned storage type");
static_assert(sizeof...(Fields) > 0, "Bitfield needs at least one member");
using BitTraits = detail::BitTraits<Storage, Fields...>;
#if !defined(_MSC_VER) || _MSC_VER > 1914
static_assert(BitTraits::shift(0) + BitTraits::width(0) <=
std::numeric_limits<Storage>::digits,
"Specified storage type is too narrow to hold all types");
#endif
template <size_t Idx>
using TypeAt = typename detail::IndexedType<Idx, Fields...>::Type;
template <size_t Idx, typename Value, typename... Values>
static constexpr Storage initStorage(Value value, Values... values) {
return ((value << BitTraits::shift(Idx)) & BitTraits::mask(Idx)) |
initStorage<Idx + 1, Values...>(values...);
}
template <size_t Idx>
static constexpr Storage initStorage() {
return Storage{0};
}
Storage storage_ = 0;
public:
template <size_t Idx>
class Ref {
Bitfield& bitfield_;
public:
Ref(Bitfield& bitfield) : bitfield_(bitfield) {}
Ref& operator=(TypeAt<Idx> value) {
bitfield_.storage_ =
(bitfield_.storage_ & ~BitTraits::mask(Idx)) |
((value << BitTraits::shift(Idx)) & BitTraits::mask(Idx));
return *this;
}
operator TypeAt<Idx>() const {
return const_cast<const Bitfield&>(bitfield_).at<Idx>();
}
};
constexpr Bitfield() = default;
constexpr Bitfield(Fields... values) : storage_{initStorage<0>(values...)} {}
template <size_t Idx>
constexpr TypeAt<Idx> at() const {
return static_cast<TypeAt<Idx>>((storage_ & BitTraits::mask(Idx)) >>
BitTraits::shift(Idx));
}
template <size_t Idx>
Ref<Idx> at() {
return {*this};
}
};
} // namespace yoga
} // namespace facebook

View File

@ -7,8 +7,6 @@
#include "Utils.h" #include "Utils.h"
#include <stdexcept>
using namespace facebook; using namespace facebook;
YGFlexDirection YGFlexDirectionCross(const YGFlexDirection flexDirection, YGFlexDirection YGFlexDirectionCross(const YGFlexDirection flexDirection,
@ -53,13 +51,6 @@ bool YGFloatsEqual(const float a, const float b) {
return yoga::isUndefined(a) && yoga::isUndefined(b); return yoga::isUndefined(a) && yoga::isUndefined(b);
} }
bool YGDoubleEqual(const double a, const double b) {
if (!yoga::isUndefined(a) && !yoga::isUndefined(b)) {
return fabs(a - b) < 0.0001f;
}
return yoga::isUndefined(a) && yoga::isUndefined(b);
}
float YGFloatSanitize(const float val) { float YGFloatSanitize(const float val) {
return yoga::isUndefined(val) ? 0 : val; return yoga::isUndefined(val) ? 0 : val;
} }
@ -73,7 +64,3 @@ YGFloatOptional YGFloatOptionalMax(YGFloatOptional op1, YGFloatOptional op2) {
} }
return op1.isUndefined() ? op2 : op1; return op1.isUndefined() ? op2 : op1;
} }
void throwLogicalErrorWithMessage(const char* message) {
throw std::logic_error(message);
}

View File

@ -63,8 +63,6 @@ inline bool YGValueEqual(facebook::yoga::detail::CompactValue a,
// difference between two floats is less than 0.0001f or both are undefined. // difference between two floats is less than 0.0001f or both are undefined.
bool YGFloatsEqual(const float a, const float b); bool YGFloatsEqual(const float a, const float b);
bool YGDoubleEqual(const double a, const double b);
float YGFloatMax(const float a, const float b); float YGFloatMax(const float a, const float b);
YGFloatOptional YGFloatOptionalMax(const YGFloatOptional op1, YGFloatOptional YGFloatOptionalMax(const YGFloatOptional op1,
@ -135,5 +133,3 @@ inline YGFloatOptional YGResolveValueMargin(yoga::detail::CompactValue value,
const float ownerSize) { const float ownerSize) {
return value.isAuto() ? YGFloatOptional{0} : YGResolveValue(value, ownerSize); return value.isAuto() ? YGFloatOptional{0} : YGResolveValue(value, ownerSize);
} }
void throwLogicalErrorWithMessage(const char* message);

View File

@ -179,8 +179,6 @@ const char* YGOverflowToString(const YGOverflow value) {
const char* YGPositionTypeToString(const YGPositionType value) { const char* YGPositionTypeToString(const YGPositionType value) {
switch (value) { switch (value) {
case YGPositionTypeStatic:
return "static";
case YGPositionTypeRelative: case YGPositionTypeRelative:
return "relative"; return "relative";
case YGPositionTypeAbsolute: case YGPositionTypeAbsolute:

View File

@ -90,8 +90,7 @@ YG_ENUM_SEQ_DECL(YGNodeType, YGNodeTypeDefault, YGNodeTypeText)
YG_ENUM_SEQ_DECL(YGOverflow, YGOverflowVisible, YGOverflowHidden, YG_ENUM_SEQ_DECL(YGOverflow, YGOverflowVisible, YGOverflowHidden,
YGOverflowScroll) YGOverflowScroll)
YG_ENUM_SEQ_DECL(YGPositionType, YGPositionTypeStatic, YGPositionTypeRelative, YG_ENUM_SEQ_DECL(YGPositionType, YGPositionTypeRelative, YGPositionTypeAbsolute)
YGPositionTypeAbsolute)
YG_ENUM_DECL(YGPrintOptions, YGPrintOptionsLayout = 1, YGPrintOptionsStyle = 2, YG_ENUM_DECL(YGPrintOptions, YGPrintOptionsLayout = 1, YGPrintOptionsStyle = 2,
YGPrintOptionsChildren = 4) YGPrintOptionsChildren = 4)

View File

@ -6,12 +6,10 @@
*/ */
#pragma once #pragma once
#include "BitUtils.h" #include "Bitfield.h"
#include "YGFloatOptional.h" #include "YGFloatOptional.h"
#include "Yoga-internal.h" #include "Yoga-internal.h"
using namespace facebook::yoga;
struct YGLayout { struct YGLayout {
std::array<float, 4> position = {}; std::array<float, 4> position = {};
std::array<float, 2> dimensions = {{YGUndefined, YGUndefined}}; std::array<float, 2> dimensions = {{YGUndefined, YGUndefined}};
@ -20,14 +18,12 @@ struct YGLayout {
std::array<float, 4> padding = {}; std::array<float, 4> padding = {};
private: private:
static constexpr size_t directionOffset = 0; static constexpr size_t directionIdx = 0;
static constexpr size_t didUseLegacyFlagOffset = static constexpr size_t didUseLegacyFlagIdx = 1;
directionOffset + facebook::yoga::detail::bitWidthFn<YGDirection>(); static constexpr size_t doesLegacyStretchFlagAffectsLayoutIdx = 2;
static constexpr size_t doesLegacyStretchFlagAffectsLayoutOffset = static constexpr size_t hadOverflowIdx = 3;
didUseLegacyFlagOffset + 1; facebook::yoga::Bitfield<uint8_t, YGDirection, bool, bool, bool> flags_ = {
static constexpr size_t hadOverflowOffset = YGDirectionInherit, false, false, false};
doesLegacyStretchFlagAffectsLayoutOffset + 1;
uint8_t flags = 0;
public: public:
uint32_t computedFlexBasisGeneration = 0; uint32_t computedFlexBasisGeneration = 0;
@ -36,7 +32,7 @@ struct YGLayout {
// Instead of recomputing the entire layout every single time, we cache some // Instead of recomputing the entire layout every single time, we cache some
// information to break early when nothing changed // information to break early when nothing changed
uint32_t generationCount = 0; uint32_t generationCount = 0;
YGDirection lastOwnerDirection = YGDirectionInherit; YGDirection lastOwnerDirection = (YGDirection)-1;
uint32_t nextCachedMeasurementsIndex = 0; uint32_t nextCachedMeasurementsIndex = 0;
std::array<YGCachedMeasurement, YG_MAX_CACHED_RESULT_COUNT> std::array<YGCachedMeasurement, YG_MAX_CACHED_RESULT_COUNT>
@ -45,41 +41,27 @@ struct YGLayout {
YGCachedMeasurement cachedLayout = YGCachedMeasurement(); YGCachedMeasurement cachedLayout = YGCachedMeasurement();
YGDirection direction() const { YGDirection direction() const { return flags_.at<directionIdx>(); }
return facebook::yoga::detail::getEnumData<YGDirection>(flags, decltype(flags_)::Ref<directionIdx> direction() {
directionOffset); return flags_.at<directionIdx>();
} }
void setDirection(YGDirection direction) { bool didUseLegacyFlag() const { return flags_.at<didUseLegacyFlagIdx>(); }
facebook::yoga::detail::setEnumData<YGDirection>(flags, directionOffset, decltype(flags_)::Ref<didUseLegacyFlagIdx> didUseLegacyFlag() {
direction); return flags_.at<didUseLegacyFlagIdx>();
}
bool didUseLegacyFlag() const {
return facebook::yoga::detail::getBooleanData(flags,
didUseLegacyFlagOffset);
}
void setDidUseLegacyFlag(bool val) {
facebook::yoga::detail::setBooleanData(flags, didUseLegacyFlagOffset, val);
} }
bool doesLegacyStretchFlagAffectsLayout() const { bool doesLegacyStretchFlagAffectsLayout() const {
return facebook::yoga::detail::getBooleanData( return flags_.at<doesLegacyStretchFlagAffectsLayoutIdx>();
flags, doesLegacyStretchFlagAffectsLayoutOffset); }
decltype(flags_)::Ref<doesLegacyStretchFlagAffectsLayoutIdx>
doesLegacyStretchFlagAffectsLayout() {
return flags_.at<doesLegacyStretchFlagAffectsLayoutIdx>();
} }
void setDoesLegacyStretchFlagAffectsLayout(bool val) { bool hadOverflow() const { return flags_.at<hadOverflowIdx>(); }
facebook::yoga::detail::setBooleanData( decltype(flags_)::Ref<hadOverflowIdx> hadOverflow() {
flags, doesLegacyStretchFlagAffectsLayoutOffset, val); return flags_.at<hadOverflowIdx>();
}
bool hadOverflow() const {
return facebook::yoga::detail::getBooleanData(flags, hadOverflowOffset);
}
void setHadOverflow(bool hadOverflow) {
facebook::yoga::detail::setBooleanData(flags, hadOverflowOffset,
hadOverflow);
} }
bool operator==(YGLayout layout) const; bool operator==(YGLayout layout) const;

View File

@ -18,7 +18,7 @@ using facebook::yoga::detail::CompactValue;
YGNode::YGNode(YGNode&& node) { YGNode::YGNode(YGNode&& node) {
context_ = node.context_; context_ = node.context_;
flags = node.flags; flags_ = node.flags_;
measure_ = node.measure_; measure_ = node.measure_;
baseline_ = node.baseline_; baseline_ = node.baseline_;
print_ = node.print_; print_ = node.print_;
@ -31,7 +31,7 @@ YGNode::YGNode(YGNode&& node) {
config_ = node.config_; config_ = node.config_;
resolvedDimensions_ = node.resolvedDimensions_; resolvedDimensions_ = node.resolvedDimensions_;
for (auto c : children_) { for (auto c : children_) {
c->setOwner(this); c->setOwner(c);
} }
} }
@ -44,7 +44,7 @@ YGNode::YGNode(const YGNode& node, YGConfigRef config) : YGNode{node} {
void YGNode::print(void* printContext) { void YGNode::print(void* printContext) {
if (print_.noContext != nullptr) { if (print_.noContext != nullptr) {
if (facebook::yoga::detail::getBooleanData(flags, printUsesContext_)) { if (flags_.at<printUsesContext_>()) {
print_.withContext(this, printContext); print_.withContext(this, printContext);
} else { } else {
print_.noContext(this); print_.noContext(this);
@ -140,14 +140,14 @@ YGFloatOptional YGNode::getMarginForAxis(const YGFlexDirection axis,
YGSize YGNode::measure(float width, YGMeasureMode widthMode, float height, YGSize YGNode::measure(float width, YGMeasureMode widthMode, float height,
YGMeasureMode heightMode, void* layoutContext) { YGMeasureMode heightMode, void* layoutContext) {
return facebook::yoga::detail::getBooleanData(flags, measureUsesContext_) return flags_.at<measureUsesContext_>()
? measure_.withContext(this, width, widthMode, height, heightMode, ? measure_.withContext(this, width, widthMode, height, heightMode,
layoutContext) layoutContext)
: measure_.noContext(this, width, widthMode, height, heightMode); : measure_.noContext(this, width, widthMode, height, heightMode);
} }
float YGNode::baseline(float width, float height, void* layoutContext) { float YGNode::baseline(float width, float height, void* layoutContext) {
return facebook::yoga::detail::getBooleanData(flags, baselineUsesContext_) return flags_.at<baselineUsesContext_>()
? baseline_.withContext(this, width, height, layoutContext) ? baseline_.withContext(this, width, height, layoutContext)
: baseline_.noContext(this, width, height); : baseline_.noContext(this, width, height);
} }
@ -158,7 +158,7 @@ void YGNode::setMeasureFunc(decltype(YGNode::measure_) measureFunc) {
if (measureFunc.noContext == nullptr) { if (measureFunc.noContext == nullptr) {
// TODO: t18095186 Move nodeType to opt-in function and mark appropriate // TODO: t18095186 Move nodeType to opt-in function and mark appropriate
// places in Litho // places in Litho
setNodeType(YGNodeTypeDefault); flags_.at<nodeType_>() = YGNodeTypeDefault;
} else { } else {
YGAssertWithNode( YGAssertWithNode(
this, children_.size() == 0, this, children_.size() == 0,
@ -173,14 +173,14 @@ void YGNode::setMeasureFunc(decltype(YGNode::measure_) measureFunc) {
} }
void YGNode::setMeasureFunc(YGMeasureFunc measureFunc) { void YGNode::setMeasureFunc(YGMeasureFunc measureFunc) {
facebook::yoga::detail::setBooleanData(flags, measureUsesContext_, false); flags_.at<measureUsesContext_>() = false;
decltype(YGNode::measure_) m; decltype(YGNode::measure_) m;
m.noContext = measureFunc; m.noContext = measureFunc;
setMeasureFunc(m); setMeasureFunc(m);
} }
YOGA_EXPORT void YGNode::setMeasureFunc(MeasureWithContextFn measureFunc) { YOGA_EXPORT void YGNode::setMeasureFunc(MeasureWithContextFn measureFunc) {
facebook::yoga::detail::setBooleanData(flags, measureUsesContext_, true); flags_.at<measureUsesContext_>() = true;
decltype(YGNode::measure_) m; decltype(YGNode::measure_) m;
m.withContext = measureFunc; m.withContext = measureFunc;
setMeasureFunc(m); setMeasureFunc(m);
@ -199,10 +199,10 @@ void YGNode::insertChild(YGNodeRef child, uint32_t index) {
} }
void YGNode::setDirty(bool isDirty) { void YGNode::setDirty(bool isDirty) {
if (isDirty == facebook::yoga::detail::getBooleanData(flags, isDirty_)) { if (isDirty == flags_.at<isDirty_>()) {
return; return;
} }
facebook::yoga::detail::setBooleanData(flags, isDirty_, isDirty); flags_.at<isDirty_>() = isDirty;
if (isDirty && dirtied_) { if (isDirty && dirtied_) {
dirtied_(this); dirtied_(this);
} }
@ -223,7 +223,7 @@ void YGNode::removeChild(uint32_t index) {
} }
void YGNode::setLayoutDirection(YGDirection direction) { void YGNode::setLayoutDirection(YGDirection direction) {
layout_.setDirection(direction); layout_.direction() = direction;
} }
void YGNode::setLayoutMargin(float margin, int index) { void YGNode::setLayoutMargin(float margin, int index) {
@ -261,7 +261,7 @@ void YGNode::setLayoutMeasuredDimension(float measuredDimension, int index) {
} }
void YGNode::setLayoutHadOverflow(bool hadOverflow) { void YGNode::setLayoutHadOverflow(bool hadOverflow) {
layout_.setHadOverflow(hadOverflow); layout_.hadOverflow() = hadOverflow;
} }
void YGNode::setLayoutDimension(float dimension, int index) { void YGNode::setLayoutDimension(float dimension, int index) {
@ -294,9 +294,6 @@ void YGNode::setPosition(const YGDirection direction, const float mainSize,
const YGFlexDirection crossAxis = const YGFlexDirection crossAxis =
YGFlexDirectionCross(mainAxis, directionRespectingRoot); YGFlexDirectionCross(mainAxis, directionRespectingRoot);
// Here we should check for `YGPositionTypeStatic` and in this case zero inset
// properties (left, right, top, bottom, begin, end).
// https://www.w3.org/TR/css-position-3/#valdef-position-static
const YGFloatOptional relativePositionMain = const YGFloatOptional relativePositionMain =
relativePosition(mainAxis, mainSize); relativePosition(mainAxis, mainSize);
const YGFloatOptional relativePositionCross = const YGFloatOptional relativePositionCross =
@ -341,9 +338,7 @@ YGValue YGNode::resolveFlexBasisPtr() const {
return flexBasis; return flexBasis;
} }
if (!style_.flex().isUndefined() && style_.flex().unwrap() > 0.0f) { if (!style_.flex().isUndefined() && style_.flex().unwrap() > 0.0f) {
return facebook::yoga::detail::getBooleanData(flags, useWebDefaults_) return flags_.at<useWebDefaults_>() ? YGValueAuto : YGValueZero;
? YGValueAuto
: YGValueZero;
} }
return YGValueAuto; return YGValueAuto;
} }
@ -382,7 +377,7 @@ void YGNode::cloneChildrenIfNeeded(void* cloneContext) {
} }
void YGNode::markDirtyAndPropogate() { void YGNode::markDirtyAndPropogate() {
if (!facebook::yoga::detail::getBooleanData(flags, isDirty_)) { if (!flags_.at<isDirty_>()) {
setDirty(true); setDirty(true);
setLayoutComputedFlexBasis(YGFloatOptional()); setLayoutComputedFlexBasis(YGFloatOptional());
if (owner_) { if (owner_) {
@ -392,7 +387,7 @@ void YGNode::markDirtyAndPropogate() {
} }
void YGNode::markDirtyAndPropogateDownwards() { void YGNode::markDirtyAndPropogateDownwards() {
facebook::yoga::detail::setBooleanData(flags, isDirty_, true); flags_.at<isDirty_>() = true;
for_each(children_.begin(), children_.end(), [](YGNodeRef childNode) { for_each(children_.begin(), children_.end(), [](YGNodeRef childNode) {
childNode->markDirtyAndPropogateDownwards(); childNode->markDirtyAndPropogateDownwards();
}); });
@ -419,17 +414,16 @@ float YGNode::resolveFlexShrink() const {
if (!style_.flexShrink().isUndefined()) { if (!style_.flexShrink().isUndefined()) {
return style_.flexShrink().unwrap(); return style_.flexShrink().unwrap();
} }
if (!facebook::yoga::detail::getBooleanData(flags, useWebDefaults_) && if (!flags_.at<useWebDefaults_>() && !style_.flex().isUndefined() &&
!style_.flex().isUndefined() && style_.flex().unwrap() < 0.0f) { style_.flex().unwrap() < 0.0f) {
return -style_.flex().unwrap(); return -style_.flex().unwrap();
} }
return facebook::yoga::detail::getBooleanData(flags, useWebDefaults_) return flags_.at<useWebDefaults_>() ? kWebDefaultFlexShrink
? kWebDefaultFlexShrink : kDefaultFlexShrink;
: kDefaultFlexShrink;
} }
bool YGNode::isNodeFlexible() { bool YGNode::isNodeFlexible() {
return ((style_.positionType() != YGPositionTypeAbsolute) && return ((style_.positionType() == YGPositionTypeRelative) &&
(resolveFlexGrow() != 0 || resolveFlexShrink() != 0)); (resolveFlexGrow() != 0 || resolveFlexShrink() != 0));
} }
@ -524,11 +518,11 @@ bool YGNode::didUseLegacyFlag() {
void YGNode::setLayoutDoesLegacyFlagAffectsLayout( void YGNode::setLayoutDoesLegacyFlagAffectsLayout(
bool doesLegacyFlagAffectsLayout) { bool doesLegacyFlagAffectsLayout) {
layout_.setDoesLegacyStretchFlagAffectsLayout(doesLegacyFlagAffectsLayout); layout_.doesLegacyStretchFlagAffectsLayout() = doesLegacyFlagAffectsLayout;
} }
void YGNode::setLayoutDidUseLegacyFlag(bool didUseLegacyFlag) { void YGNode::setLayoutDidUseLegacyFlag(bool didUseLegacyFlag) {
layout_.setDidUseLegacyFlag(didUseLegacyFlag); layout_.didUseLegacyFlag() = didUseLegacyFlag;
} }
bool YGNode::isLayoutTreeEqualToNode(const YGNode& node) const { bool YGNode::isLayoutTreeEqualToNode(const YGNode& node) const {
@ -563,8 +557,7 @@ void YGNode::reset() {
clearChildren(); clearChildren();
auto webDefaults = auto webDefaults = flags_.at<useWebDefaults_>();
facebook::yoga::detail::getBooleanData(flags, useWebDefaults_);
*this = YGNode{getConfig()}; *this = YGNode{getConfig()};
if (webDefaults) { if (webDefaults) {
useWebDefaults(); useWebDefaults();

View File

@ -6,14 +6,11 @@
*/ */
#pragma once #pragma once
#ifdef __cplusplus
#include <stdio.h> #include <stdio.h>
#include <cstdint> #include <cstdint>
#include "BitUtils.h" #include "Bitfield.h"
#include "CompactValue.h" #include "CompactValue.h"
#include "YGConfig.h" #include "YGConfig.h"
#include "YGLayout.h" #include "YGLayout.h"
@ -40,7 +37,10 @@ struct YOGA_EXPORT YGNode {
static constexpr size_t useWebDefaults_ = 7; static constexpr size_t useWebDefaults_ = 7;
void* context_ = nullptr; void* context_ = nullptr;
uint8_t flags = 1; using Flags = facebook::yoga::Bitfield<uint8_t, bool, bool, bool, YGNodeType,
bool, bool, bool, bool>;
Flags flags_ = {true, false, false, YGNodeTypeDefault,
false, false, false, false};
uint8_t reserved_ = 0; uint8_t reserved_ = 0;
union { union {
YGMeasureFunc noContext; YGMeasureFunc noContext;
@ -71,13 +71,13 @@ struct YOGA_EXPORT YGNode {
void setBaselineFunc(decltype(baseline_)); void setBaselineFunc(decltype(baseline_));
void useWebDefaults() { void useWebDefaults() {
facebook::yoga::detail::setBooleanData(flags, useWebDefaults_, true); flags_.at<useWebDefaults_>() = true;
style_.flexDirection() = YGFlexDirectionRow; style_.flexDirection() = YGFlexDirectionRow;
style_.alignContent() = YGAlignStretch; style_.alignContent() = YGAlignStretch;
} }
// DANGER DANGER DANGER! // DANGER DANGER DANGER!
// If the node assigned to has children, we'd either have to deallocate // If the the node assigned to has children, we'd either have to deallocate
// them (potentially incorrect) or ignore them (danger of leaks). Only ever // them (potentially incorrect) or ignore them (danger of leaks). Only ever
// use this after checking that there are no children. // use this after checking that there are no children.
// DO NOT CHANGE THE VISIBILITY OF THIS METHOD! // DO NOT CHANGE THE VISIBILITY OF THIS METHOD!
@ -115,13 +115,9 @@ struct YOGA_EXPORT YGNode {
void print(void*); void print(void*);
bool getHasNewLayout() const { bool getHasNewLayout() const { return flags_.at<hasNewLayout_>(); }
return facebook::yoga::detail::getBooleanData(flags, hasNewLayout_);
}
YGNodeType getNodeType() const { YGNodeType getNodeType() const { return flags_.at<nodeType_>(); }
return facebook::yoga::detail::getEnumData<YGNodeType>(flags, nodeType_);
}
bool hasMeasureFunc() const noexcept { return measure_.noContext != nullptr; } bool hasMeasureFunc() const noexcept { return measure_.noContext != nullptr; }
@ -147,9 +143,7 @@ struct YOGA_EXPORT YGNode {
uint32_t getLineIndex() const { return lineIndex_; } uint32_t getLineIndex() const { return lineIndex_; }
bool isReferenceBaseline() { bool isReferenceBaseline() { return flags_.at<isReferenceBaseline_>(); }
return facebook::yoga::detail::getBooleanData(flags, isReferenceBaseline_);
}
// returns the YGNodeRef that owns this YGNode. An owner is used to identify // returns the YGNodeRef that owns this YGNode. An owner is used to identify
// the YogaTree that a YGNode belongs to. This method will return the parent // the YogaTree that a YGNode belongs to. This method will return the parent
@ -182,9 +176,7 @@ struct YOGA_EXPORT YGNode {
YGConfigRef getConfig() const { return config_; } YGConfigRef getConfig() const { return config_; }
bool isDirty() const { bool isDirty() const { return flags_.at<isDirty_>(); }
return facebook::yoga::detail::getBooleanData(flags, isDirty_);
}
std::array<YGValue, 2> getResolvedDimensions() const { std::array<YGValue, 2> getResolvedDimensions() const {
return resolvedDimensions_; return resolvedDimensions_;
@ -223,22 +215,19 @@ struct YOGA_EXPORT YGNode {
void setPrintFunc(YGPrintFunc printFunc) { void setPrintFunc(YGPrintFunc printFunc) {
print_.noContext = printFunc; print_.noContext = printFunc;
facebook::yoga::detail::setBooleanData(flags, printUsesContext_, false); flags_.at<printUsesContext_>() = false;
} }
void setPrintFunc(PrintWithContextFn printFunc) { void setPrintFunc(PrintWithContextFn printFunc) {
print_.withContext = printFunc; print_.withContext = printFunc;
facebook::yoga::detail::setBooleanData(flags, printUsesContext_, true); flags_.at<printUsesContext_>() = true;
} }
void setPrintFunc(std::nullptr_t) { setPrintFunc(YGPrintFunc{nullptr}); } void setPrintFunc(std::nullptr_t) { setPrintFunc(YGPrintFunc{nullptr}); }
void setHasNewLayout(bool hasNewLayout) { void setHasNewLayout(bool hasNewLayout) {
facebook::yoga::detail::setBooleanData(flags, hasNewLayout_, hasNewLayout); flags_.at<hasNewLayout_>() = hasNewLayout;
} }
void setNodeType(YGNodeType nodeType) { void setNodeType(YGNodeType nodeType) { flags_.at<nodeType_>() = nodeType; }
return facebook::yoga::detail::setEnumData<YGNodeType>(flags, nodeType_,
nodeType);
}
void setMeasureFunc(YGMeasureFunc measureFunc); void setMeasureFunc(YGMeasureFunc measureFunc);
void setMeasureFunc(MeasureWithContextFn); void setMeasureFunc(MeasureWithContextFn);
@ -247,11 +236,11 @@ struct YOGA_EXPORT YGNode {
} }
void setBaselineFunc(YGBaselineFunc baseLineFunc) { void setBaselineFunc(YGBaselineFunc baseLineFunc) {
facebook::yoga::detail::setBooleanData(flags, baselineUsesContext_, false); flags_.at<baselineUsesContext_>() = false;
baseline_.noContext = baseLineFunc; baseline_.noContext = baseLineFunc;
} }
void setBaselineFunc(BaselineWithContextFn baseLineFunc) { void setBaselineFunc(BaselineWithContextFn baseLineFunc) {
facebook::yoga::detail::setBooleanData(flags, baselineUsesContext_, true); flags_.at<baselineUsesContext_>() = true;
baseline_.withContext = baseLineFunc; baseline_.withContext = baseLineFunc;
} }
void setBaselineFunc(std::nullptr_t) { void setBaselineFunc(std::nullptr_t) {
@ -267,8 +256,7 @@ struct YOGA_EXPORT YGNode {
void setLineIndex(uint32_t lineIndex) { lineIndex_ = lineIndex; } void setLineIndex(uint32_t lineIndex) { lineIndex_ = lineIndex; }
void setIsReferenceBaseline(bool isReferenceBaseline) { void setIsReferenceBaseline(bool isReferenceBaseline) {
facebook::yoga::detail::setBooleanData(flags, isReferenceBaseline_, flags_.at<isReferenceBaseline_>() = isReferenceBaseline;
isReferenceBaseline);
} }
void setOwner(YGNodeRef owner) { owner_ = owner; } void setOwner(YGNodeRef owner) { owner_ = owner; }
@ -322,5 +310,3 @@ struct YOGA_EXPORT YGNode {
bool isLayoutTreeEqualToNode(const YGNode& node) const; bool isLayoutTreeEqualToNode(const YGNode& node) const;
void reset(); void reset();
}; };
#endif

View File

@ -6,15 +6,12 @@
*/ */
#pragma once #pragma once
#ifdef __cplusplus
#include <algorithm> #include <algorithm>
#include <array> #include <array>
#include <cstdint> #include <cstdint>
#include <type_traits> #include <type_traits>
#include "BitUtils.h" #include "Bitfield.h"
#include "CompactValue.h" #include "CompactValue.h"
#include "YGEnums.h" #include "YGEnums.h"
#include "YGFloatOptional.h" #include "YGFloatOptional.h"
@ -31,19 +28,6 @@ class YOGA_EXPORT YGStyle {
using Dimensions = Values<YGDimension>; using Dimensions = Values<YGDimension>;
using Edges = Values<YGEdge>; using Edges = Values<YGEdge>;
template <typename T>
struct BitfieldRef {
YGStyle& style;
size_t offset;
operator T() const {
return facebook::yoga::detail::getEnumData<T>(style.flags, offset);
}
BitfieldRef<T>& operator=(T x) {
facebook::yoga::detail::setEnumData<T>(style.flags, offset, x);
return *this;
}
};
template <typename T, T YGStyle::*Prop> template <typename T, T YGStyle::*Prop>
struct Ref { struct Ref {
YGStyle& style; YGStyle& style;
@ -77,36 +61,30 @@ class YOGA_EXPORT YGStyle {
CompactValue operator[](Idx idx) const { return (style.*Prop)[idx]; } CompactValue operator[](Idx idx) const { return (style.*Prop)[idx]; }
}; };
YGStyle() { YGStyle() = default;
alignContent() = YGAlignFlexStart;
alignItems() = YGAlignStretch;
}
~YGStyle() = default; ~YGStyle() = default;
private: private:
static constexpr size_t directionOffset = 0; static constexpr size_t directionIdx = 0;
static constexpr size_t flexdirectionOffset = static constexpr size_t flexDirectionIdx = 1;
directionOffset + facebook::yoga::detail::bitWidthFn<YGDirection>(); static constexpr size_t justifyContentIdx = 2;
static constexpr size_t justifyContentOffset = static constexpr size_t alignContentIdx = 3;
flexdirectionOffset + static constexpr size_t alignItemsIdx = 4;
facebook::yoga::detail::bitWidthFn<YGFlexDirection>(); static constexpr size_t alignSelfIdx = 5;
static constexpr size_t alignContentOffset = static constexpr size_t positionTypeIdx = 6;
justifyContentOffset + facebook::yoga::detail::bitWidthFn<YGJustify>(); static constexpr size_t flexWrapIdx = 7;
static constexpr size_t alignItemsOffset = static constexpr size_t overflowIdx = 8;
alignContentOffset + facebook::yoga::detail::bitWidthFn<YGAlign>(); static constexpr size_t displayIdx = 9;
static constexpr size_t alignSelfOffset = using Flags =
alignItemsOffset + facebook::yoga::detail::bitWidthFn<YGAlign>(); facebook::yoga::Bitfield<uint32_t, YGDirection, YGFlexDirection,
static constexpr size_t positionTypeOffset = YGJustify, YGAlign, YGAlign, YGAlign,
alignSelfOffset + facebook::yoga::detail::bitWidthFn<YGAlign>(); YGPositionType, YGWrap, YGOverflow, YGDisplay>;
static constexpr size_t flexWrapOffset =
positionTypeOffset + facebook::yoga::detail::bitWidthFn<YGPositionType>();
static constexpr size_t overflowOffset =
flexWrapOffset + facebook::yoga::detail::bitWidthFn<YGWrap>();
static constexpr size_t displayOffset =
overflowOffset + facebook::yoga::detail::bitWidthFn<YGOverflow>();
uint32_t flags = 0;
Flags flags_ = {YGDirectionInherit, YGFlexDirectionColumn,
YGJustifyFlexStart, YGAlignFlexStart,
YGAlignStretch, YGAlignAuto,
YGPositionTypeRelative, YGWrapNoWrap,
YGOverflowVisible, YGDisplayFlex};
YGFloatOptional flex_ = {}; YGFloatOptional flex_ = {};
YGFloatOptional flexGrow_ = {}; YGFloatOptional flexGrow_ = {};
YGFloatOptional flexShrink_ = {}; YGFloatOptional flexShrink_ = {};
@ -125,68 +103,45 @@ class YOGA_EXPORT YGStyle {
// for library users needing a type // for library users needing a type
using ValueRepr = std::remove_reference<decltype(margin_[0])>::type; using ValueRepr = std::remove_reference<decltype(margin_[0])>::type;
YGDirection direction() const { YGDirection direction() const { return flags_.at<directionIdx>(); }
return facebook::yoga::detail::getEnumData<YGDirection>(flags, Flags::Ref<directionIdx> direction() { return flags_.at<directionIdx>(); }
directionOffset);
}
BitfieldRef<YGDirection> direction() { return {*this, directionOffset}; }
YGFlexDirection flexDirection() const { YGFlexDirection flexDirection() const {
return facebook::yoga::detail::getEnumData<YGFlexDirection>( return flags_.at<flexDirectionIdx>();
flags, flexdirectionOffset);
} }
BitfieldRef<YGFlexDirection> flexDirection() { Flags::Ref<flexDirectionIdx> flexDirection() {
return {*this, flexdirectionOffset}; return flags_.at<flexDirectionIdx>();
} }
YGJustify justifyContent() const { YGJustify justifyContent() const { return flags_.at<justifyContentIdx>(); }
return facebook::yoga::detail::getEnumData<YGJustify>(flags, Flags::Ref<justifyContentIdx> justifyContent() {
justifyContentOffset); return flags_.at<justifyContentIdx>();
}
BitfieldRef<YGJustify> justifyContent() {
return {*this, justifyContentOffset};
} }
YGAlign alignContent() const { YGAlign alignContent() const { return flags_.at<alignContentIdx>(); }
return facebook::yoga::detail::getEnumData<YGAlign>(flags, Flags::Ref<alignContentIdx> alignContent() {
alignContentOffset); return flags_.at<alignContentIdx>();
}
BitfieldRef<YGAlign> alignContent() { return {*this, alignContentOffset}; }
YGAlign alignItems() const {
return facebook::yoga::detail::getEnumData<YGAlign>(flags,
alignItemsOffset);
}
BitfieldRef<YGAlign> alignItems() { return {*this, alignItemsOffset}; }
YGAlign alignSelf() const {
return facebook::yoga::detail::getEnumData<YGAlign>(flags, alignSelfOffset);
}
BitfieldRef<YGAlign> alignSelf() { return {*this, alignSelfOffset}; }
YGPositionType positionType() const {
return facebook::yoga::detail::getEnumData<YGPositionType>(
flags, positionTypeOffset);
}
BitfieldRef<YGPositionType> positionType() {
return {*this, positionTypeOffset};
} }
YGWrap flexWrap() const { YGAlign alignItems() const { return flags_.at<alignItemsIdx>(); }
return facebook::yoga::detail::getEnumData<YGWrap>(flags, flexWrapOffset); Flags::Ref<alignItemsIdx> alignItems() { return flags_.at<alignItemsIdx>(); }
}
BitfieldRef<YGWrap> flexWrap() { return {*this, flexWrapOffset}; }
YGOverflow overflow() const { YGAlign alignSelf() const { return flags_.at<alignSelfIdx>(); }
return facebook::yoga::detail::getEnumData<YGOverflow>(flags, Flags::Ref<alignSelfIdx> alignSelf() { return flags_.at<alignSelfIdx>(); }
overflowOffset);
}
BitfieldRef<YGOverflow> overflow() { return {*this, overflowOffset}; }
YGDisplay display() const { YGPositionType positionType() const { return flags_.at<positionTypeIdx>(); }
return facebook::yoga::detail::getEnumData<YGDisplay>(flags, displayOffset); Flags::Ref<positionTypeIdx> positionType() {
return flags_.at<positionTypeIdx>();
} }
BitfieldRef<YGDisplay> display() { return {*this, displayOffset}; }
YGWrap flexWrap() const { return flags_.at<flexWrapIdx>(); }
Flags::Ref<flexWrapIdx> flexWrap() { return flags_.at<flexWrapIdx>(); }
YGOverflow overflow() const { return flags_.at<overflowIdx>(); }
Flags::Ref<overflowIdx> overflow() { return flags_.at<overflowIdx>(); }
YGDisplay display() const { return flags_.at<displayIdx>(); }
Flags::Ref<displayIdx> display() { return flags_.at<displayIdx>(); }
YGFloatOptional flex() const { return flex_; } YGFloatOptional flex() const { return flex_; }
Ref<YGFloatOptional, &YGStyle::flex_> flex() { return {*this}; } Ref<YGFloatOptional, &YGStyle::flex_> flex() { return {*this}; }
@ -234,5 +189,3 @@ YOGA_EXPORT bool operator==(const YGStyle& lhs, const YGStyle& rhs);
YOGA_EXPORT inline bool operator!=(const YGStyle& lhs, const YGStyle& rhs) { YOGA_EXPORT inline bool operator!=(const YGStyle& lhs, const YGStyle& rhs) {
return !(lhs == rhs); return !(lhs == rhs);
} }
#endif

View File

@ -12,13 +12,6 @@
#include "YGEnums.h" #include "YGEnums.h"
#include "YGMacros.h" #include "YGMacros.h"
#if defined(_MSC_VER) && defined(__clang__)
#define COMPILING_WITH_CLANG_ON_WINDOWS
#endif
#if defined(COMPILING_WITH_CLANG_ON_WINDOWS)
#include <limits>
constexpr float YGUndefined = std::numeric_limits<float>::quiet_NaN();
#else
YG_EXTERN_C_BEGIN YG_EXTERN_C_BEGIN
// Not defined in MSVC++ // Not defined in MSVC++
@ -28,7 +21,6 @@ static const uint32_t __nan = 0x7fc00000;
#endif #endif
#define YGUndefined NAN #define YGUndefined NAN
#endif
typedef struct YGValue { typedef struct YGValue {
float value; float value;
@ -39,10 +31,7 @@ YOGA_EXPORT extern const YGValue YGValueAuto;
YOGA_EXPORT extern const YGValue YGValueUndefined; YOGA_EXPORT extern const YGValue YGValueUndefined;
YOGA_EXPORT extern const YGValue YGValueZero; YOGA_EXPORT extern const YGValue YGValueZero;
#if !defined(COMPILING_WITH_CLANG_ON_WINDOWS)
YG_EXTERN_C_END YG_EXTERN_C_END
#endif
#undef COMPILING_WITH_CLANG_ON_WINDOWS
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -51,10 +51,10 @@ struct YGCachedMeasurement {
float computedHeight; float computedHeight;
YGCachedMeasurement() YGCachedMeasurement()
: availableWidth(-1), : availableWidth(0),
availableHeight(-1), availableHeight(0),
widthMeasureMode(YGMeasureModeUndefined), widthMeasureMode((YGMeasureMode)-1),
heightMeasureMode(YGMeasureModeUndefined), heightMeasureMode((YGMeasureMode)-1),
computedWidth(-1), computedWidth(-1),
computedHeight(-1) {} computedHeight(-1) {}

View File

@ -228,6 +228,9 @@ YOGA_EXPORT YGNodeRef YGNodeClone(YGNodeRef oldNode) {
static YGConfigRef YGConfigClone(const YGConfig& oldConfig) { static YGConfigRef YGConfigClone(const YGConfig& oldConfig) {
const YGConfigRef config = new YGConfig(oldConfig); const YGConfigRef config = new YGConfig(oldConfig);
YGAssert(config != nullptr, "Could not allocate memory for config"); YGAssert(config != nullptr, "Could not allocate memory for config");
if (config == nullptr) {
abort();
}
gConfigInstanceCount++; gConfigInstanceCount++;
return config; return config;
} }
@ -351,12 +354,6 @@ YOGA_EXPORT void YGNodeInsertChild(const YGNodeRef owner, const YGNodeRef child,
owner->markDirtyAndPropogate(); owner->markDirtyAndPropogate();
} }
YOGA_EXPORT void YGNodeSwapChild(const YGNodeRef owner, const YGNodeRef child,
const uint32_t index) {
owner->replaceChild(child, index);
child->setOwner(owner);
}
YOGA_EXPORT void YGNodeRemoveChild(const YGNodeRef owner, YOGA_EXPORT void YGNodeRemoveChild(const YGNodeRef owner,
const YGNodeRef excludedChild) { const YGNodeRef excludedChild) {
if (YGNodeGetChildCount(owner) == 0) { if (YGNodeGetChildCount(owner) == 0) {
@ -1021,7 +1018,7 @@ static bool YGIsBaselineLayout(const YGNodeRef node) {
const uint32_t childCount = YGNodeGetChildCount(node); const uint32_t childCount = YGNodeGetChildCount(node);
for (uint32_t i = 0; i < childCount; i++) { for (uint32_t i = 0; i < childCount; i++) {
const YGNodeRef child = YGNodeGetChild(node, i); const YGNodeRef child = YGNodeGetChild(node, i);
if (child->getStyle().positionType() != YGPositionTypeAbsolute && if (child->getStyle().positionType() == YGPositionTypeRelative &&
child->getStyle().alignSelf() == YGAlignBaseline) { child->getStyle().alignSelf() == YGAlignBaseline) {
return true; return true;
} }
@ -1477,29 +1474,22 @@ static void YGNodeAbsoluteLayoutChild(
} }
static void YGNodeWithMeasureFuncSetMeasuredDimensions( static void YGNodeWithMeasureFuncSetMeasuredDimensions(
const YGNodeRef node, float availableWidth, float availableHeight, const YGNodeRef node, const float availableWidth,
const YGMeasureMode widthMeasureMode, const YGMeasureMode heightMeasureMode, const float availableHeight, const YGMeasureMode widthMeasureMode,
const float ownerWidth, const float ownerHeight, const YGMeasureMode heightMeasureMode, const float ownerWidth,
LayoutData& layoutMarkerData, void* const layoutContext, const float ownerHeight, LayoutData& layoutMarkerData,
const LayoutPassReason reason) { void* const layoutContext, const LayoutPassReason reason) {
YGAssertWithNode(node, node->hasMeasureFunc(), YGAssertWithNode(node, node->hasMeasureFunc(),
"Expected node to have custom measure function"); "Expected node to have custom measure function");
if (widthMeasureMode == YGMeasureModeUndefined) {
availableWidth = YGUndefined;
}
if (heightMeasureMode == YGMeasureModeUndefined) {
availableHeight = YGUndefined;
}
const float paddingAndBorderAxisRow = const float paddingAndBorderAxisRow =
YGNodePaddingAndBorderForAxis(node, YGFlexDirectionRow, ownerWidth); YGNodePaddingAndBorderForAxis(node, YGFlexDirectionRow, availableWidth);
const float paddingAndBorderAxisColumn = const float paddingAndBorderAxisColumn = YGNodePaddingAndBorderForAxis(
YGNodePaddingAndBorderForAxis(node, YGFlexDirectionColumn, ownerWidth); node, YGFlexDirectionColumn, availableWidth);
const float marginAxisRow = const float marginAxisRow =
node->getMarginForAxis(YGFlexDirectionRow, ownerWidth).unwrap(); node->getMarginForAxis(YGFlexDirectionRow, availableWidth).unwrap();
const float marginAxisColumn = const float marginAxisColumn =
node->getMarginForAxis(YGFlexDirectionColumn, ownerWidth).unwrap(); node->getMarginForAxis(YGFlexDirectionColumn, availableWidth).unwrap();
// We want to make sure we don't call measure with negative size // We want to make sure we don't call measure with negative size
const float innerWidth = YGFloatIsUndefined(availableWidth) const float innerWidth = YGFloatIsUndefined(availableWidth)
@ -1651,17 +1641,15 @@ static void YGZeroOutLayoutRecursivly(const YGNodeRef node,
static float YGNodeCalculateAvailableInnerDim(const YGNodeConstRef node, static float YGNodeCalculateAvailableInnerDim(const YGNodeConstRef node,
YGFlexDirection axis, YGFlexDirection axis,
float availableDim, float availableDim,
float ownerDim, float ownerDim) {
float ownerDimForMarginPadding) {
YGFlexDirection direction = YGFlexDirection direction =
YGFlexDirectionIsRow(axis) ? YGFlexDirectionRow : YGFlexDirectionColumn; YGFlexDirectionIsRow(axis) ? YGFlexDirectionRow : YGFlexDirectionColumn;
YGDimension dimension = YGDimension dimension =
YGFlexDirectionIsRow(axis) ? YGDimensionWidth : YGDimensionHeight; YGFlexDirectionIsRow(axis) ? YGDimensionWidth : YGDimensionHeight;
const float margin = const float margin = node->getMarginForAxis(direction, ownerDim).unwrap();
node->getMarginForAxis(direction, ownerDimForMarginPadding).unwrap();
const float paddingAndBorder = const float paddingAndBorder =
YGNodePaddingAndBorderForAxis(node, direction, ownerDimForMarginPadding); YGNodePaddingAndBorderForAxis(node, direction, ownerDim);
float availableInnerDim = availableDim - margin - paddingAndBorder; float availableInnerDim = availableDim - margin - paddingAndBorder;
// Max dimension overrides predefined dimension value; Min dimension in turn // Max dimension overrides predefined dimension value; Min dimension in turn
@ -2055,8 +2043,7 @@ static void YGDistributeFreeSpaceFirstPass(
// first and second passes. // first and second passes.
deltaFreeSpace += boundMainSize - childFlexBasis; deltaFreeSpace += boundMainSize - childFlexBasis;
collectedFlexItemsValues.totalFlexShrinkScaledFactors -= collectedFlexItemsValues.totalFlexShrinkScaledFactors -=
(-currentRelativeChild->resolveFlexShrink() * flexShrinkScaledFactor;
currentRelativeChild->getLayout().computedFlexBasis.unwrap());
} }
} }
} else if (!YGFloatIsUndefined( } else if (!YGFloatIsUndefined(
@ -2185,7 +2172,7 @@ static void YGJustifyMainAxis(
for (uint32_t i = startOfLineIndex; for (uint32_t i = startOfLineIndex;
i < collectedFlexItemsValues.endOfLineIndex; i++) { i < collectedFlexItemsValues.endOfLineIndex; i++) {
const YGNodeRef child = node->getChild(i); const YGNodeRef child = node->getChild(i);
if (child->getStyle().positionType() != YGPositionTypeAbsolute) { if (child->getStyle().positionType() == YGPositionTypeRelative) {
if (child->marginLeadingValue(mainAxis).unit == YGUnitAuto) { if (child->marginLeadingValue(mainAxis).unit == YGUnitAuto) {
numberOfAutoMarginsOnCurrentLine++; numberOfAutoMarginsOnCurrentLine++;
} }
@ -2268,7 +2255,7 @@ static void YGJustifyMainAxis(
// Now that we placed the element, we need to update the variables. // Now that we placed the element, we need to update the variables.
// We need to do that only for relative elements. Absolute elements do not // We need to do that only for relative elements. Absolute elements do not
// take part in that phase. // take part in that phase.
if (childStyle.positionType() != YGPositionTypeAbsolute) { if (childStyle.positionType() == YGPositionTypeRelative) {
if (child->marginLeadingValue(mainAxis).unit == YGUnitAuto) { if (child->marginLeadingValue(mainAxis).unit == YGUnitAuto) {
collectedFlexItemsValues.mainDim += collectedFlexItemsValues.mainDim +=
collectedFlexItemsValues.remainingFreeSpace / collectedFlexItemsValues.remainingFreeSpace /
@ -2562,9 +2549,9 @@ static void YGNodelayoutImpl(
// STEP 2: DETERMINE AVAILABLE SIZE IN MAIN AND CROSS DIRECTIONS // STEP 2: DETERMINE AVAILABLE SIZE IN MAIN AND CROSS DIRECTIONS
float availableInnerWidth = YGNodeCalculateAvailableInnerDim( float availableInnerWidth = YGNodeCalculateAvailableInnerDim(
node, YGFlexDirectionRow, availableWidth, ownerWidth, ownerWidth); node, YGFlexDirectionRow, availableWidth, ownerWidth);
float availableInnerHeight = YGNodeCalculateAvailableInnerDim( float availableInnerHeight = YGNodeCalculateAvailableInnerDim(
node, YGFlexDirectionColumn, availableHeight, ownerHeight, ownerWidth); node, YGFlexDirectionColumn, availableHeight, ownerHeight);
float availableInnerMainDim = float availableInnerMainDim =
isMainAxisRow ? availableInnerWidth : availableInnerHeight; isMainAxisRow ? availableInnerWidth : availableInnerHeight;
@ -2908,7 +2895,7 @@ static void YGNodelayoutImpl(
if (child->getStyle().display() == YGDisplayNone) { if (child->getStyle().display() == YGDisplayNone) {
continue; continue;
} }
if (child->getStyle().positionType() != YGPositionTypeAbsolute) { if (child->getStyle().positionType() == YGPositionTypeRelative) {
if (child->getLineIndex() != i) { if (child->getLineIndex() != i) {
break; break;
} }
@ -2950,7 +2937,7 @@ static void YGNodelayoutImpl(
if (child->getStyle().display() == YGDisplayNone) { if (child->getStyle().display() == YGDisplayNone) {
continue; continue;
} }
if (child->getStyle().positionType() != YGPositionTypeAbsolute) { if (child->getStyle().positionType() == YGPositionTypeRelative) {
switch (YGNodeAlignItem(node, child)) { switch (YGNodeAlignItem(node, child)) {
case YGAlignFlexStart: { case YGAlignFlexStart: {
child->setLayoutPosition( child->setLayoutPosition(
@ -3121,7 +3108,7 @@ static void YGNodelayoutImpl(
if (performLayout && node->getStyle().flexWrap() == YGWrapWrapReverse) { if (performLayout && node->getStyle().flexWrap() == YGWrapWrapReverse) {
for (uint32_t i = 0; i < childCount; i++) { for (uint32_t i = 0; i < childCount; i++) {
const YGNodeRef child = YGNodeGetChild(node, i); const YGNodeRef child = YGNodeGetChild(node, i);
if (child->getStyle().positionType() != YGPositionTypeAbsolute) { if (child->getStyle().positionType() == YGPositionTypeRelative) {
child->setLayoutPosition( child->setLayoutPosition(
node->getLayout().measuredDimensions[dim[crossAxis]] - node->getLayout().measuredDimensions[dim[crossAxis]] -
child->getLayout().position[pos[crossAxis]] - child->getLayout().position[pos[crossAxis]] -
@ -3223,14 +3210,14 @@ static inline bool YGMeasureModeNewMeasureSizeIsStricterAndStillValid(
(lastComputedSize <= size || YGFloatsEqual(size, lastComputedSize)); (lastComputedSize <= size || YGFloatsEqual(size, lastComputedSize));
} }
YOGA_EXPORT float YGRoundValueToPixelGrid(const double value, YOGA_EXPORT float YGRoundValueToPixelGrid(const float value,
const double pointScaleFactor, const float pointScaleFactor,
const bool forceCeil, const bool forceCeil,
const bool forceFloor) { const bool forceFloor) {
double scaledValue = ((double)value) * pointScaleFactor; double scaledValue = ((double)value) * pointScaleFactor;
// We want to calculate `fractial` such that `floor(scaledValue) = scaledValue // We want to calculate `fractial` such that `floor(scaledValue) = scaledValue
// - fractial`. // - fractial`.
double fractial = fmod(scaledValue, 1.0f); float fractial = fmodf(scaledValue, 1.0f);
if (fractial < 0) { if (fractial < 0) {
// This branch is for handling negative numbers for `value`. // This branch is for handling negative numbers for `value`.
// //
@ -3249,10 +3236,10 @@ YOGA_EXPORT float YGRoundValueToPixelGrid(const double value,
// - Finding the `floor`: -2.2 - fractial2 = -2.2 - 0.8 = -3 // - Finding the `floor`: -2.2 - fractial2 = -2.2 - 0.8 = -3
++fractial; ++fractial;
} }
if (YGDoubleEqual(fractial, 0)) { if (YGFloatsEqual(fractial, 0)) {
// First we check if the value is already rounded // First we check if the value is already rounded
scaledValue = scaledValue - fractial; scaledValue = scaledValue - fractial;
} else if (YGDoubleEqual(fractial, 1.0f)) { } else if (YGFloatsEqual(fractial, 1.0f)) {
scaledValue = scaledValue - fractial + 1.0f; scaledValue = scaledValue - fractial + 1.0f;
} else if (forceCeil) { } else if (forceCeil) {
// Next we check if we need to use forced rounding // Next we check if we need to use forced rounding
@ -3263,7 +3250,7 @@ YOGA_EXPORT float YGRoundValueToPixelGrid(const double value,
// Finally we just round the value // Finally we just round the value
scaledValue = scaledValue - fractial + scaledValue = scaledValue - fractial +
(!YGFloatIsUndefined(fractial) && (!YGFloatIsUndefined(fractial) &&
(fractial > 0.5f || YGDoubleEqual(fractial, 0.5f)) (fractial > 0.5f || YGFloatsEqual(fractial, 0.5f))
? 1.0f ? 1.0f
: 0.0f); : 0.0f);
} }
@ -3363,10 +3350,8 @@ bool YGLayoutNodeInternal(
if (needToVisitNode) { if (needToVisitNode) {
// Invalidate the cached results. // Invalidate the cached results.
layout->nextCachedMeasurementsIndex = 0; layout->nextCachedMeasurementsIndex = 0;
layout->cachedLayout.availableWidth = -1; layout->cachedLayout.widthMeasureMode = (YGMeasureMode)-1;
layout->cachedLayout.availableHeight = -1; layout->cachedLayout.heightMeasureMode = (YGMeasureMode)-1;
layout->cachedLayout.widthMeasureMode = YGMeasureModeUndefined;
layout->cachedLayout.heightMeasureMode = YGMeasureModeUndefined;
layout->cachedLayout.computedWidth = -1; layout->cachedLayout.computedWidth = -1;
layout->cachedLayout.computedHeight = -1; layout->cachedLayout.computedHeight = -1;
} }
@ -3567,24 +3552,24 @@ YOGA_EXPORT void YGConfigSetPointScaleFactor(const YGConfigRef config,
} }
static void YGRoundToPixelGrid(const YGNodeRef node, static void YGRoundToPixelGrid(const YGNodeRef node,
const double pointScaleFactor, const float pointScaleFactor,
const double absoluteLeft, const float absoluteLeft,
const double absoluteTop) { const float absoluteTop) {
if (pointScaleFactor == 0.0f) { if (pointScaleFactor == 0.0f) {
return; return;
} }
const double nodeLeft = node->getLayout().position[YGEdgeLeft]; const float nodeLeft = node->getLayout().position[YGEdgeLeft];
const double nodeTop = node->getLayout().position[YGEdgeTop]; const float nodeTop = node->getLayout().position[YGEdgeTop];
const double nodeWidth = node->getLayout().dimensions[YGDimensionWidth]; const float nodeWidth = node->getLayout().dimensions[YGDimensionWidth];
const double nodeHeight = node->getLayout().dimensions[YGDimensionHeight]; const float nodeHeight = node->getLayout().dimensions[YGDimensionHeight];
const double absoluteNodeLeft = absoluteLeft + nodeLeft; const float absoluteNodeLeft = absoluteLeft + nodeLeft;
const double absoluteNodeTop = absoluteTop + nodeTop; const float absoluteNodeTop = absoluteTop + nodeTop;
const double absoluteNodeRight = absoluteNodeLeft + nodeWidth; const float absoluteNodeRight = absoluteNodeLeft + nodeWidth;
const double absoluteNodeBottom = absoluteNodeTop + nodeHeight; const float absoluteNodeBottom = absoluteNodeTop + nodeHeight;
// If a node has a custom measure function we never want to round down its // If a node has a custom measure function we never want to round down its
// size as this could lead to unwanted text truncation. // size as this could lead to unwanted text truncation.
@ -3602,11 +3587,11 @@ static void YGRoundToPixelGrid(const YGNodeRef node,
// whole number, we don't have any fraction To verify if the result is close // whole number, we don't have any fraction To verify if the result is close
// to whole number we want to check both floor and ceil numbers // to whole number we want to check both floor and ceil numbers
const bool hasFractionalWidth = const bool hasFractionalWidth =
!YGDoubleEqual(fmod(nodeWidth * pointScaleFactor, 1.0), 0) && !YGFloatsEqual(fmodf(nodeWidth * pointScaleFactor, 1.0), 0) &&
!YGDoubleEqual(fmod(nodeWidth * pointScaleFactor, 1.0), 1.0); !YGFloatsEqual(fmodf(nodeWidth * pointScaleFactor, 1.0), 1.0);
const bool hasFractionalHeight = const bool hasFractionalHeight =
!YGDoubleEqual(fmod(nodeHeight * pointScaleFactor, 1.0), 0) && !YGFloatsEqual(fmodf(nodeHeight * pointScaleFactor, 1.0), 0) &&
!YGDoubleEqual(fmod(nodeHeight * pointScaleFactor, 1.0), 1.0); !YGFloatsEqual(fmodf(nodeHeight * pointScaleFactor, 1.0), 1.0);
node->setLayoutDimension( node->setLayoutDimension(
YGRoundValueToPixelGrid(absoluteNodeRight, pointScaleFactor, YGRoundValueToPixelGrid(absoluteNodeRight, pointScaleFactor,
@ -3788,7 +3773,6 @@ YOGA_EXPORT void YGConfigSetShouldDiffLayoutWithoutLegacyStretchBehaviour(
void YGAssert(const bool condition, const char* message) { void YGAssert(const bool condition, const char* message) {
if (!condition) { if (!condition) {
Log::log(YGNodeRef{nullptr}, YGLogLevelFatal, nullptr, "%s\n", message); Log::log(YGNodeRef{nullptr}, YGLogLevelFatal, nullptr, "%s\n", message);
throwLogicalErrorWithMessage(message);
} }
} }
@ -3796,7 +3780,6 @@ void YGAssertWithNode(const YGNodeRef node, const bool condition,
const char* message) { const char* message) {
if (!condition) { if (!condition) {
Log::log(node, YGLogLevelFatal, nullptr, "%s\n", message); Log::log(node, YGLogLevelFatal, nullptr, "%s\n", message);
throwLogicalErrorWithMessage(message);
} }
} }
@ -3804,7 +3787,6 @@ void YGAssertWithConfig(const YGConfigRef config, const bool condition,
const char* message) { const char* message) {
if (!condition) { if (!condition) {
Log::log(config, YGLogLevelFatal, nullptr, "%s\n", message); Log::log(config, YGLogLevelFatal, nullptr, "%s\n", message);
throwLogicalErrorWithMessage(message);
} }
} }

View File

@ -4,7 +4,7 @@
* This source code is licensed under the MIT license found in the * This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
// v1.18.0
#pragma once #pragma once
#include <assert.h> #include <assert.h>
@ -59,9 +59,6 @@ WIN_EXPORT void YGNodeReset(YGNodeRef node);
WIN_EXPORT void YGNodeInsertChild(YGNodeRef node, YGNodeRef child, WIN_EXPORT void YGNodeInsertChild(YGNodeRef node, YGNodeRef child,
uint32_t index); uint32_t index);
WIN_EXPORT void YGNodeSwapChild(YGNodeRef node, YGNodeRef child,
uint32_t index);
WIN_EXPORT void YGNodeRemoveChild(YGNodeRef node, YGNodeRef child); WIN_EXPORT void YGNodeRemoveChild(YGNodeRef node, YGNodeRef child);
WIN_EXPORT void YGNodeRemoveAllChildren(YGNodeRef node); WIN_EXPORT void YGNodeRemoveAllChildren(YGNodeRef node);
WIN_EXPORT YGNodeRef YGNodeGetChild(YGNodeRef node, uint32_t index); WIN_EXPORT YGNodeRef YGNodeGetChild(YGNodeRef node, uint32_t index);
@ -301,7 +298,7 @@ WIN_EXPORT YGConfigRef YGConfigGetDefault(void);
WIN_EXPORT void YGConfigSetContext(YGConfigRef config, void* context); WIN_EXPORT void YGConfigSetContext(YGConfigRef config, void* context);
WIN_EXPORT void* YGConfigGetContext(YGConfigRef config); WIN_EXPORT void* YGConfigGetContext(YGConfigRef config);
WIN_EXPORT float YGRoundValueToPixelGrid(double value, double pointScaleFactor, WIN_EXPORT float YGRoundValueToPixelGrid(float value, float pointScaleFactor,
bool forceCeil, bool forceFloor); bool forceCeil, bool forceFloor);
YG_EXTERN_C_END YG_EXTERN_C_END

View File

@ -9,6 +9,7 @@
#include <atomic> #include <atomic>
#include <memory> #include <memory>
#include <stdexcept>
namespace facebook { namespace facebook {
namespace yoga { namespace yoga {

View File

@ -7,7 +7,6 @@
#pragma once #pragma once
#include <stdint.h>
#include <yoga/YGEnums.h> #include <yoga/YGEnums.h>
#include <array> #include <array>

View File

@ -21,6 +21,10 @@ void vlog(YGConfig* config, YGNode* node, YGLogLevel level, void* context,
const char* format, va_list args) { const char* format, va_list args) {
YGConfig* logConfig = config != nullptr ? config : YGConfigGetDefault(); YGConfig* logConfig = config != nullptr ? config : YGConfigGetDefault();
logConfig->log(logConfig, node, level, context, format, args); logConfig->log(logConfig, node, level, context, format, args);
if (level == YGLogLevelFatal) {
abort();
}
} }
} // namespace } // namespace

View File

@ -13,14 +13,14 @@ namespace extrautils {
DLL_EXPORT QVariant* convertToQVariant(Napi::Env& env, Napi::Value& value); DLL_EXPORT QVariant* convertToQVariant(Napi::Env& env, Napi::Value& value);
DLL_EXPORT bool isNapiValueInt(Napi::Env& env, Napi::Value& num); DLL_EXPORT bool isNapiValueInt(Napi::Env& env, Napi::Value& num);
DLL_EXPORT std::string getNapiObjectClassName(Napi::Object& object); DLL_EXPORT std::string getNapiObjectClassName(Napi::Object& object);
DLL_EXPORT void* configureQWidget(QWidget* widget, bool isLeafNode = false); DLL_EXPORT void* configureQWidget(QWidget* widget, YGNodeRef node,
bool isLeafNode = false);
DLL_EXPORT void* configureQObject(QObject* object); DLL_EXPORT void* configureQObject(QObject* object);
DLL_EXPORT void* configureComponent(void* component); DLL_EXPORT void* configureComponent(void* component);
DLL_EXPORT uint64_t hashPointerTo53bit(const void* input);
template <typename T> template <typename T>
void safeDelete(QPointer<T>& component) { void safeDelete(QPointer<T>& component) {
if (!component.isNull() && component->QObject::parent() == nullptr) { if (!component.isNull()) {
delete component; delete component;
} }
} }

View File

@ -1,217 +0,0 @@
#pragma once
#include <QAbstractItemModel>
#include "Extras/Export/export.h"
#include "QtCore/QModelIndex/qmodelindex_wrap.h"
#include "QtCore/QObject/qobject_macro.h"
#include "core/NodeWidget/nodewidget.h"
#include "napi.h"
class DLL_EXPORT NAbstractItemModel : public QAbstractItemModel,
public EventWidget {
Q_OBJECT
EVENTWIDGET_IMPLEMENTATIONS(QAbstractItemModel)
public:
Napi::FunctionReference dispatchOnNode;
virtual void connectSignalsToEventEmitter(){
// Qt Connects: Implement all signal connects here
QOBJECT_SIGNALS}
QModelIndex index(int row, int column,
const QModelIndex& parent = QModelIndex()) const override {
Napi::Env env = this->dispatchOnNode.Env();
Napi::HandleScope scope(env);
auto parentModelIndexWrap = QModelIndexWrap::constructor.New(
{Napi::External<QModelIndex>::New(env, new QModelIndex(parent))});
Napi::Value modelIndexNapiWrap = this->dispatchOnNode.Call(
{Napi::String::New(env, "index"), Napi::Value::From(env, row),
Napi::Value::From(env, column), parentModelIndexWrap});
QModelIndexWrap* modelIndexWrap = Napi::ObjectWrap<QModelIndexWrap>::Unwrap(
modelIndexNapiWrap.As<Napi::Object>());
QModelIndex* newIndex = modelIndexWrap->getInternalInstance();
return *newIndex;
}
QObject* parent() const { return nullptr; }
QModelIndex parent(const QModelIndex& child) const override {
Napi::Env env = this->dispatchOnNode.Env();
Napi::HandleScope scope(env);
auto childModelIndexWrap = QModelIndexWrap::constructor.New(
{Napi::External<QModelIndex>::New(env, new QModelIndex(child))});
Napi::Value modelIndexNapiWrap = this->dispatchOnNode.Call(
{Napi::String::New(env, "parent"), childModelIndexWrap});
QModelIndexWrap* modelIndexWrap = Napi::ObjectWrap<QModelIndexWrap>::Unwrap(
modelIndexNapiWrap.As<Napi::Object>());
QModelIndex* parentIndex = modelIndexWrap->getInternalInstance();
return *parentIndex;
}
int rowCount(const QModelIndex& parent = QModelIndex()) const override {
Napi::Env env = this->dispatchOnNode.Env();
Napi::HandleScope scope(env);
auto modelIndexWrap = QModelIndexWrap::constructor.New(
{Napi::External<QModelIndex>::New(env, new QModelIndex(parent))});
Napi::Value result = this->dispatchOnNode.Call(
{Napi::String::New(env, "rowCount"), modelIndexWrap});
return result.As<Napi::Number>().Int32Value();
}
int columnCount(const QModelIndex& parent = QModelIndex()) const override {
Napi::Env env = this->dispatchOnNode.Env();
Napi::HandleScope scope(env);
auto modelIndexWrap = QModelIndexWrap::constructor.New(
{Napi::External<QModelIndex>::New(env, new QModelIndex(parent))});
Napi::Value result = this->dispatchOnNode.Call(
{Napi::String::New(env, "columnCount"), modelIndexWrap});
return result.As<Napi::Number>().Int32Value();
}
QVariant data(const QModelIndex& index,
int role = Qt::DisplayRole) const override {
Napi::Env env = this->dispatchOnNode.Env();
Napi::HandleScope scope(env);
auto modelIndexWrap = QModelIndexWrap::constructor.New(
{Napi::External<QModelIndex>::New(env, new QModelIndex(index))});
auto roleValue = Napi::Value::From(env, role);
Napi::Value variantJsObject = this->dispatchOnNode.Call(
{Napi::String::New(env, "data"), modelIndexWrap, roleValue});
QVariantWrap* variantWrap = Napi::ObjectWrap<QVariantWrap>::Unwrap(
variantJsObject.As<Napi::Object>());
QVariant* variant = variantWrap->getInternalInstance();
return *variant;
}
Qt::ItemFlags flags(const QModelIndex& index) const override {
Napi::Env env = this->dispatchOnNode.Env();
Napi::HandleScope scope(env);
auto modelIndexWrap = QModelIndexWrap::constructor.New(
{Napi::External<QModelIndex>::New(env, new QModelIndex(index))});
Napi::Value numberJs = this->dispatchOnNode.Call(
{Napi::String::New(env, "flags"), modelIndexWrap});
auto result =
static_cast<Qt::ItemFlags>(numberJs.As<Napi::Number>().Uint32Value());
return result;
}
QVariant headerData(int section, Qt::Orientation orientation,
int role = Qt::DisplayRole) const override {
Napi::Env env = this->dispatchOnNode.Env();
Napi::HandleScope scope(env);
auto sectionValue = Napi::Value::From(env, static_cast<int>(section));
auto orientationValue =
Napi::Value::From(env, static_cast<int>(orientation));
auto roleValue = Napi::Value::From(env, static_cast<int>(role));
Napi::Value variantJsObject =
this->dispatchOnNode.Call({Napi::String::New(env, "headerData"),
sectionValue, orientationValue, roleValue});
QVariantWrap* variantWrap = Napi::ObjectWrap<QVariantWrap>::Unwrap(
variantJsObject.As<Napi::Object>());
QVariant* variant = variantWrap->getInternalInstance();
return *variant;
}
bool setData(const QModelIndex& index, const QVariant& value,
int role = Qt::EditRole) override {
Napi::Env env = this->dispatchOnNode.Env();
Napi::HandleScope scope(env);
auto modelIndexWrap = QModelIndexWrap::constructor.New(
{Napi::External<QModelIndex>::New(env, new QModelIndex(index))});
auto valueWrap = QVariantWrap::constructor.New(
{Napi::External<QVariant>::New(env, new QVariant(value))});
auto roleValue = Napi::Value::From(env, role);
Napi::Value booleanJs =
this->dispatchOnNode.Call({Napi::String::New(env, "setData"),
modelIndexWrap, valueWrap, roleValue});
return booleanJs.As<Napi::Boolean>().Value();
}
QModelIndex _protected_createIndex(int row, int column) const {
return createIndex(row, column);
}
QModelIndex buddy(const QModelIndex& index) const override {
Napi::Env env = this->dispatchOnNode.Env();
Napi::HandleScope scope(env);
auto indexWrap = QModelIndexWrap::constructor.New(
{Napi::External<QModelIndex>::New(env, new QModelIndex(index))});
Napi::Value buddyIndexNapiWrap =
this->dispatchOnNode.Call({Napi::String::New(env, "buddy"), indexWrap});
QModelIndexWrap* buddyIndexWrap = Napi::ObjectWrap<QModelIndexWrap>::Unwrap(
buddyIndexNapiWrap.As<Napi::Object>());
QModelIndex* buddyIndex = buddyIndexWrap->getInternalInstance();
return *buddyIndex;
}
void _protected_beginResetModel() { beginResetModel(); }
void _protected_endResetModel() { endResetModel(); }
void _protected_beginInsertColumns(const QModelIndex& parent, int first,
int last) {
beginInsertColumns(parent, first, last);
}
void _protected_beginInsertRows(const QModelIndex& parent, int first,
int last) {
beginInsertRows(parent, first, last);
}
bool _protected_beginMoveColumns(const QModelIndex& sourceParent,
int sourceFirst, int sourceLast,
const QModelIndex& destinationParent,
int destinationChild) {
return beginMoveColumns(sourceParent, sourceFirst, sourceLast,
destinationParent, destinationChild);
}
bool _protected_beginMoveRows(const QModelIndex& sourceParent,
int sourceFirst, int sourceLast,
const QModelIndex& destinationParent,
int destinationChild) {
return beginMoveRows(sourceParent, sourceFirst, sourceLast,
destinationParent, destinationChild);
}
void _protected_beginRemoveColumns(const QModelIndex& parent, int first,
int last) {
beginRemoveColumns(parent, first, last);
}
void _protected_beginRemoveRows(const QModelIndex& parent, int first,
int last) {
beginRemoveRows(parent, first, last);
}
void _protected_endInsertColumns() { endInsertColumns(); }
void _protected_endInsertRows() { endInsertRows(); }
void _protected_endMoveColumns() { endMoveColumns(); }
void _protected_endMoveRows() { endMoveRows(); }
void _protected_endRemoveColumns() { endRemoveColumns(); }
void _protected_endRemoveRows() { endRemoveRows(); }
};

View File

@ -1,48 +0,0 @@
#pragma once
#include <napi.h>
#include <QPointer>
#include "Extras/Export/export.h"
#include "QtCore/QObject/qobject_macro.h"
#include "nabstractitemmodel.hpp"
class DLL_EXPORT QAbstractItemModelWrap
: public Napi::ObjectWrap<QAbstractItemModelWrap> {
QOBJECT_WRAPPED_METHODS_DECLARATION
private:
QPointer<NAbstractItemModel> instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QAbstractItemModelWrap(const Napi::CallbackInfo& info);
~QAbstractItemModelWrap();
NAbstractItemModel* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
// wrapped methods
Napi::Value initNodeDispatcher(const Napi::CallbackInfo& info);
Napi::Value hasIndex(const Napi::CallbackInfo& info);
Napi::Value createIndex(const Napi::CallbackInfo& info);
Napi::Value _super_flags(const Napi::CallbackInfo& info);
Napi::Value emitDataChanged(const Napi::CallbackInfo& info);
Napi::Value checkIndex(const Napi::CallbackInfo& info);
Napi::Value _super_buddy(const Napi::CallbackInfo& info);
Napi::Value beginInsertColumns(const Napi::CallbackInfo& info);
Napi::Value beginInsertRows(const Napi::CallbackInfo& info);
Napi::Value beginMoveColumns(const Napi::CallbackInfo& info);
Napi::Value beginMoveRows(const Napi::CallbackInfo& info);
Napi::Value beginRemoveColumns(const Napi::CallbackInfo& info);
Napi::Value beginRemoveRows(const Napi::CallbackInfo& info);
Napi::Value beginResetModel(const Napi::CallbackInfo& info);
Napi::Value endResetModel(const Napi::CallbackInfo& info);
Napi::Value endInsertColumns(const Napi::CallbackInfo& info);
Napi::Value endInsertRows(const Napi::CallbackInfo& info);
Napi::Value endMoveColumns(const Napi::CallbackInfo& info);
Napi::Value endMoveRows(const Napi::CallbackInfo& info);
Napi::Value endRemoveColumns(const Napi::CallbackInfo& info);
Napi::Value endRemoveRows(const Napi::CallbackInfo& info);
};

View File

@ -43,6 +43,5 @@ DLL_EXPORT Napi::Value currentDate(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value fromJulianDay(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value fromJulianDay(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value isLeapYear(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value isLeapYear(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value isValid(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value isValid(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value fromString(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value fromQVariant(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value fromQVariant(const Napi::CallbackInfo& info);
} // namespace StaticDateWrapMethods } // namespace StaticDateWrapMethods

View File

@ -55,6 +55,5 @@ DLL_EXPORT Napi::Value currentDateTime(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value currentDateTimeUtc(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value currentDateTimeUtc(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value currentMSecsSinceEpoch(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value currentMSecsSinceEpoch(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value currentSecsSinceEpoch(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value currentSecsSinceEpoch(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value fromString(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value fromQVariant(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value fromQVariant(const Napi::CallbackInfo& info);
} // namespace StaticDateTimeWrapMethods } // namespace StaticDateTimeWrapMethods

View File

@ -1,20 +0,0 @@
#pragma once
#include <QItemSelectionModel>
#include "Extras/Export/export.h"
#include "QtCore/QObject/qobject_macro.h"
#include "core/NodeWidget/nodewidget.h"
#include "napi.h"
class DLL_EXPORT NItemSelectionModel : public QItemSelectionModel,
public EventWidget {
Q_OBJECT
EVENTWIDGET_IMPLEMENTATIONS(QItemSelectionModel)
public:
Napi::FunctionReference dispatchOnNode;
virtual void connectSignalsToEventEmitter() {
// Qt Connects: Implement all signal connects here
QOBJECT_SIGNALS
}
};

View File

@ -1,43 +0,0 @@
#pragma once
#include <napi.h>
#include <QPointer>
#include "Extras/Export/export.h"
#include "QtCore/QObject/qobject_macro.h"
#include "nitemselectionmodel.hpp"
class DLL_EXPORT QItemSelectionModelWrap
: public Napi::ObjectWrap<QItemSelectionModelWrap> {
QOBJECT_WRAPPED_METHODS_DECLARATION
private:
QPointer<QItemSelectionModel> instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QItemSelectionModelWrap(const Napi::CallbackInfo& info);
~QItemSelectionModelWrap();
QItemSelectionModel* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
// wrapped methods
Napi::Value columnIntersectsSelection(const Napi::CallbackInfo& info);
Napi::Value currentIndex(const Napi::CallbackInfo& info);
Napi::Value hasSelection(const Napi::CallbackInfo& info);
Napi::Value isColumnSelected(const Napi::CallbackInfo& info);
Napi::Value isRowSelected(const Napi::CallbackInfo& info);
Napi::Value isSelected(const Napi::CallbackInfo& info);
Napi::Value rowIntersectsSelection(const Napi::CallbackInfo& info);
Napi::Value clear(const Napi::CallbackInfo& info);
Napi::Value clearCurrentIndex(const Napi::CallbackInfo& info);
Napi::Value clearSelection(const Napi::CallbackInfo& info);
Napi::Value reset(const Napi::CallbackInfo& info);
Napi::Value select(const Napi::CallbackInfo& info);
Napi::Value setCurrentIndex(const Napi::CallbackInfo& info);
Napi::Value selectedColumns(const Napi::CallbackInfo& info);
Napi::Value selectedIndexes(const Napi::CallbackInfo& info);
Napi::Value selectedRows(const Napi::CallbackInfo& info);
};

View File

@ -1,43 +0,0 @@
#pragma once
#include <napi.h>
#include <QMimeData>
#include "Extras/Export/export.h"
#include "QtCore/QObject/qobject_macro.h"
class DLL_EXPORT QMimeDataWrap : public Napi::ObjectWrap<QMimeDataWrap> {
QOBJECT_WRAPPED_METHODS_DECLARATION
private:
QPointer<QMimeData> instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QMimeDataWrap(const Napi::CallbackInfo& info);
~QMimeDataWrap();
QMimeData* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
static void cloneFromMimeDataToData(QMimeData* fromData, QMimeData* toData);
void cloneFromMimeData(QMimeData* data);
// wrapped methods
Napi::Value clear(const Napi::CallbackInfo& info);
Napi::Value hasColor(const Napi::CallbackInfo& info);
Napi::Value hasHtml(const Napi::CallbackInfo& info);
Napi::Value hasImage(const Napi::CallbackInfo& info);
Napi::Value hasText(const Napi::CallbackInfo& info);
Napi::Value hasUrls(const Napi::CallbackInfo& info);
Napi::Value html(const Napi::CallbackInfo& info);
Napi::Value removeFormat(const Napi::CallbackInfo& info);
// Will need implementation with Buffer or UInt8Array
// Napi::Value setData(const Napi::CallbackInfo& info);
Napi::Value setHtml(const Napi::CallbackInfo& info);
Napi::Value setText(const Napi::CallbackInfo& info);
Napi::Value setUrls(const Napi::CallbackInfo& info);
Napi::Value text(const Napi::CallbackInfo& info);
Napi::Value urls(const Napi::CallbackInfo& info);
};

View File

@ -12,5 +12,5 @@ class DLL_EXPORT NObject : public QObject, public EventWidget {
public: public:
using QObject::QObject; using QObject::QObject;
virtual void connectSignalsToEventEmitter() { QOBJECT_SIGNALS } void connectSignalsToEventEmitter() { QOBJECT_SIGNALS }
}; };

View File

@ -5,33 +5,28 @@
#include "Extras/Utils/nutils.h" #include "Extras/Utils/nutils.h"
#include "QtCore/QVariant/qvariant_wrap.h" #include "QtCore/QVariant/qvariant_wrap.h"
#include "core/Events/eventwidget_macro.h" #include "core/Events/eventwidget_macro.h"
#include "core/WrapperCache/wrappercache.h"
/* /*
This macro adds common QObject exported methods
The exported methods are taken into this macro to avoid writing them in each This macro adds common QObject exported methods
and every widget we export. The exported methods are taken into this macro to avoid writing them in each
and every widget we export.
*/ */
#ifndef QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE #ifndef QOBJECT_WRAPPED_METHODS_DECLARATION
#define QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(source) \ #define QOBJECT_WRAPPED_METHODS_DECLARATION \
\ \
EVENTWIDGET_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(source) \ EVENTWIDGET_WRAPPED_METHODS_DECLARATION \
\ \
Napi::Value __id__(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
return Napi::Value::From( \
env, extrautils::hashPointerTo53bit( \
static_cast<QObject*>(this->instance.data()))); \
} \
Napi::Value inherits(const Napi::CallbackInfo& info) { \ Napi::Value inherits(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \ Napi::Env env = info.Env(); \
Napi::HandleScope scope(env); \
Napi::String className = info[0].As<Napi::String>(); \ Napi::String className = info[0].As<Napi::String>(); \
bool doesIt = this->instance->inherits(className.Utf8Value().c_str()); \ bool doesIt = this->instance->inherits(className.Utf8Value().c_str()); \
return Napi::Value::From(env, doesIt); \ return Napi::Value::From(env, doesIt); \
} \ } \
Napi::Value setProperty(const Napi::CallbackInfo& info) { \ Napi::Value setProperty(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \ Napi::Env env = info.Env(); \
Napi::HandleScope scope(env); \
Napi::String name = info[0].As<Napi::String>(); \ Napi::String name = info[0].As<Napi::String>(); \
Napi::Value value = info[1]; \ Napi::Value value = info[1]; \
auto variant = \ auto variant = \
@ -42,6 +37,7 @@
} \ } \
Napi::Value property(const Napi::CallbackInfo& info) { \ Napi::Value property(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \ Napi::Env env = info.Env(); \
Napi::HandleScope scope(env); \
Napi::String name = info[0].As<Napi::String>(); \ Napi::String name = info[0].As<Napi::String>(); \
Napi::Value value = info[1]; \ Napi::Value value = info[1]; \
QVariant* variant = \ QVariant* variant = \
@ -52,6 +48,7 @@
} \ } \
Napi::Value setObjectName(const Napi::CallbackInfo& info) { \ Napi::Value setObjectName(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \ Napi::Env env = info.Env(); \
Napi::HandleScope scope(env); \
Napi::String objectName = info[0].As<Napi::String>(); \ Napi::String objectName = info[0].As<Napi::String>(); \
this->instance->setObjectName( \ this->instance->setObjectName( \
QString::fromStdString(objectName.Utf8Value())); \ QString::fromStdString(objectName.Utf8Value())); \
@ -59,120 +56,29 @@
} \ } \
Napi::Value objectName(const Napi::CallbackInfo& info) { \ Napi::Value objectName(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \ Napi::Env env = info.Env(); \
Napi::HandleScope scope(env); \
QString objectName = this->instance->objectName(); \ QString objectName = this->instance->objectName(); \
return Napi::String::New(env, objectName.toStdString()); \ return Napi::String::New(env, objectName.toStdString()); \
} \
Napi::Value dumpObjectTree(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
this->instance->dumpObjectTree(); \
return env.Null(); \
} \
Napi::Value dumpObjectInfo(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
this->instance->dumpObjectInfo(); \
return env.Null(); \
} \
Napi::Value __external_qobject__(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
return Napi::External<QObject>::New( \
env, static_cast<QObject*>(this->instance)); \
} \
Napi::Value startTimer(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
int interval = info[0].As<Napi::Number>().Int32Value(); \
Qt::TimerType timerType = \
static_cast<Qt::TimerType>(info[1].As<Napi::Number>().Int32Value()); \
int result = this->instance->startTimer(interval, timerType); \
return Napi::Value::From(env, result); \
} \
Napi::Value killTimer(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
int id = info[0].As<Napi::Number>().Int32Value(); \
this->instance->killTimer(id); \
return env.Null(); \
} \
Napi::Value parent(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
QObject* parent = this->instance->parent(); \
if (parent) { \
return WrapperCache::instance.getWrapper(env, parent); \
} else { \
return env.Null(); \
} \
} \
Napi::Value deleteLater(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
this->instance->deleteLater(); \
return env.Null(); \
} \
Napi::Value deleteObject(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
delete static_cast<QObject*>(this->instance); \
return env.Null(); \
} \
Napi::Value children(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
QObjectList children = this->instance->children(); \
Napi::Array resultArrayNapi = Napi::Array::New(env, children.size()); \
for (int i = 0; i < children.size(); i++) { \
resultArrayNapi[i] = \
WrapperCache::instance.getWrapper(env, children[i]); \
} \
return resultArrayNapi; \
} }
// Ideally this macro below should go in
// QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE but some wrappers
// need their own setParent()` implementation which handles different
// arguments.
#define QOBJECT_SET_PARENT_IMPL \
Napi::Value setParent(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
if (info[0].IsNull()) { \
this->instance->setParent(nullptr); \
} else { \
QObject* parentObject = info[0].As<Napi::External<QObject>>().Data(); \
this->instance->setParent(parentObject); \
} \
return env.Null(); \
}
#endif // QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE
#ifndef QOBJECT_WRAPPED_METHODS_DECLARATION
#define QOBJECT_WRAPPED_METHODS_DECLARATION \
QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(this->instance.data()) \
QOBJECT_SET_PARENT_IMPL
#endif // QOBJECT_WRAPPED_METHODS_DECLARATION #endif // QOBJECT_WRAPPED_METHODS_DECLARATION
#ifndef QOBJECT_WRAPPED_METHODS_EXPORT_DEFINE #ifndef QOBJECT_WRAPPED_METHODS_EXPORT_DEFINE
#define QOBJECT_WRAPPED_METHODS_EXPORT_DEFINE(ComponentWrapName) \ #define QOBJECT_WRAPPED_METHODS_EXPORT_DEFINE(ComponentWrapName) \
\ \
EVENTWIDGET_WRAPPED_METHODS_EXPORT_DEFINE(ComponentWrapName) \ EVENTWIDGET_WRAPPED_METHODS_EXPORT_DEFINE(ComponentWrapName) \
\ \
InstanceMethod("__id__", &ComponentWrapName::__id__), \ InstanceMethod("inherits", &ComponentWrapName::inherits), \
InstanceMethod("__external_qobject__", \ InstanceMethod("setProperty", &ComponentWrapName::setProperty), \
&ComponentWrapName::__external_qobject__), \ InstanceMethod("property", &ComponentWrapName::property), \
InstanceMethod("inherits", &ComponentWrapName::inherits), \ InstanceMethod("setObjectName", &ComponentWrapName::setObjectName), \
InstanceMethod("setProperty", &ComponentWrapName::setProperty), \ InstanceMethod("objectName", &ComponentWrapName::objectName),
InstanceMethod("property", &ComponentWrapName::property), \
InstanceMethod("setObjectName", &ComponentWrapName::setObjectName), \
InstanceMethod("objectName", &ComponentWrapName::objectName), \
InstanceMethod("dumpObjectTree", &ComponentWrapName::dumpObjectTree), \
InstanceMethod("dumpObjectInfo", &ComponentWrapName::dumpObjectInfo), \
InstanceMethod("setParent", &ComponentWrapName::setParent), \
InstanceMethod("startTimer", &ComponentWrapName::startTimer), \
InstanceMethod("killTimer", &ComponentWrapName::killTimer), \
InstanceMethod("parent", &ComponentWrapName::parent), \
InstanceMethod("deleteLater", &ComponentWrapName::deleteLater), \
InstanceMethod("delete", &ComponentWrapName::deleteObject), \
InstanceMethod("children", &ComponentWrapName::children),
#endif // QOBJECT_WRAPPED_METHODS_EXPORT_DEFINE #endif // QOBJECT_WRAPPED_METHODS_EXPORT_DEFINE
#ifndef QOBJECT_SIGNALS_ON_TARGET #ifndef QOBJECT_SIGNALS
#define QOBJECT_SIGNALS_ON_TARGET(target) \ #define QOBJECT_SIGNALS \
QObject::connect(target, &QObject::objectNameChanged, \ QObject::connect(this, &QObject::objectNameChanged, \
[=](const QString& objectName) { \ [=](const QString& objectName) { \
Napi::Env env = this->emitOnNode.Env(); \ Napi::Env env = this->emitOnNode.Env(); \
Napi::HandleScope scope(env); \ Napi::HandleScope scope(env); \
@ -180,28 +86,5 @@
{Napi::String::New(env, "objectNameChanged"), \ {Napi::String::New(env, "objectNameChanged"), \
Napi::Value::From(env, objectName.toStdString())}); \ Napi::Value::From(env, objectName.toStdString())}); \
}); });
#endif // QOBJECT_SIGNALS_ON_TARGET
#ifndef QOBJECT_SIGNALS
#define QOBJECT_SIGNALS QOBJECT_SIGNALS_ON_TARGET(this)
#endif // QOBJECT_SIGNALS #endif // QOBJECT_SIGNALS
/*
Macro to register a function to wrap QObject pointers of a
given subclass to wrapper instances. First parameter is the
plain name of the QObject subclass (no quotes), seconds is the
name of the wrapper class.
*/
#ifndef QOBJECT_REGISTER_WRAPPER
#define QOBJECT_REGISTER_WRAPPER(qobjectType, ComponentWrapName) \
WrapperCache::instance.registerWrapper( \
QString(#qobjectType), \
[](Napi::Env env, QObject* qobject) -> Napi::Object { \
qobjectType* exactQObject = dynamic_cast<qobjectType*>(qobject); \
Napi::Object wrapper = ComponentWrapName::constructor.New( \
{Napi::External<QObject>::New(env, exactQObject)}); \
return wrapper; \
});
#endif // QOBJECT_REGISTER_WRAPPER
#include "QtCore/QObject/qobject_wrap.h"

View File

@ -11,15 +11,14 @@
class DLL_EXPORT QObjectWrap : public Napi::ObjectWrap<QObjectWrap> { class DLL_EXPORT QObjectWrap : public Napi::ObjectWrap<QObjectWrap> {
QOBJECT_WRAPPED_METHODS_DECLARATION QOBJECT_WRAPPED_METHODS_DECLARATION
private: private:
QPointer<QObject> instance; QPointer<NObject> instance;
public: public:
static Napi::Object init(Napi::Env env, Napi::Object exports); static Napi::Object init(Napi::Env env, Napi::Object exports);
QObjectWrap(const Napi::CallbackInfo& info); QObjectWrap(const Napi::CallbackInfo& info);
~QObjectWrap(); ~QObjectWrap();
QObject* getInternalInstance(); NObject* getInternalInstance();
// class constructor // class constructor
static Napi::FunctionReference constructor; static Napi::FunctionReference constructor;
static Napi::Object wrapFunc(Napi::Env env, QObject* qobject);
// wrapped methods // wrapped methods
}; };

View File

@ -23,9 +23,6 @@ class DLL_EXPORT QPointWrap : public Napi::ObjectWrap<QPointWrap> {
Napi::Value setY(const Napi::CallbackInfo& info); Napi::Value setY(const Napi::CallbackInfo& info);
Napi::Value x(const Napi::CallbackInfo& info); Napi::Value x(const Napi::CallbackInfo& info);
Napi::Value y(const Napi::CallbackInfo& info); Napi::Value y(const Napi::CallbackInfo& info);
Napi::Value isNull(const Napi::CallbackInfo& info);
Napi::Value manhattanLength(const Napi::CallbackInfo& info);
Napi::Value transposed(const Napi::CallbackInfo& info);
}; };
namespace StaticQPointWrapMethods { namespace StaticQPointWrapMethods {

View File

@ -1,38 +0,0 @@
#pragma once
#include <napi.h>
#include <QPointF>
#include "Extras/Export/export.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QPointFWrap : public Napi::ObjectWrap<QPointFWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
private:
std::unique_ptr<QPointF> instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QPointFWrap(const Napi::CallbackInfo& info);
~QPointFWrap();
QPointF* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
// wrapped methods
Napi::Value dotProduct(const Napi::CallbackInfo& info);
Napi::Value isNull(const Napi::CallbackInfo& info);
Napi::Value manhattanLength(const Napi::CallbackInfo& info);
Napi::Value setX(const Napi::CallbackInfo& info);
Napi::Value setY(const Napi::CallbackInfo& info);
Napi::Value toPoint(const Napi::CallbackInfo& info);
Napi::Value transposed(const Napi::CallbackInfo& info);
Napi::Value x(const Napi::CallbackInfo& info);
Napi::Value y(const Napi::CallbackInfo& info);
};
namespace StaticQPointFWrapMethods {
DLL_EXPORT Napi::Value dotProduct(const Napi::CallbackInfo& info);
} // namespace StaticQPointFWrapMethods

View File

@ -1,82 +0,0 @@
#pragma once
#include <napi.h>
#include <QRectF>
#include "Extras/Export/export.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QRectFWrap : public Napi::ObjectWrap<QRectFWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
private:
std::unique_ptr<QRectF> instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QRectFWrap(const Napi::CallbackInfo& info);
~QRectFWrap();
QRectF* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
// wrapped methods
Napi::Value adjust(const Napi::CallbackInfo& info);
Napi::Value adjusted(const Napi::CallbackInfo& info);
Napi::Value bottom(const Napi::CallbackInfo& info);
Napi::Value bottomLeft(const Napi::CallbackInfo& info);
Napi::Value bottomRight(const Napi::CallbackInfo& info);
Napi::Value center(const Napi::CallbackInfo& info);
Napi::Value contains(const Napi::CallbackInfo& info);
Napi::Value contains_QRect(const Napi::CallbackInfo& info);
Napi::Value contains_QPoint(const Napi::CallbackInfo& info);
Napi::Value height(const Napi::CallbackInfo& info);
Napi::Value intersected(const Napi::CallbackInfo& info);
Napi::Value intersects(const Napi::CallbackInfo& info);
Napi::Value isEmpty(const Napi::CallbackInfo& info);
Napi::Value isNull(const Napi::CallbackInfo& info);
Napi::Value isValid(const Napi::CallbackInfo& info);
Napi::Value left(const Napi::CallbackInfo& info);
Napi::Value moveBottom(const Napi::CallbackInfo& info);
Napi::Value moveBottomLeft(const Napi::CallbackInfo& info);
Napi::Value moveBottomRight(const Napi::CallbackInfo& info);
Napi::Value moveCenter(const Napi::CallbackInfo& info);
Napi::Value moveLeft(const Napi::CallbackInfo& info);
Napi::Value moveRight(const Napi::CallbackInfo& info);
Napi::Value moveTo(const Napi::CallbackInfo& info);
Napi::Value moveTo_QPoint(const Napi::CallbackInfo& info);
Napi::Value moveTop(const Napi::CallbackInfo& info);
Napi::Value moveTopLeft(const Napi::CallbackInfo& info);
Napi::Value moveTopRight(const Napi::CallbackInfo& info);
Napi::Value normalized(const Napi::CallbackInfo& info);
Napi::Value right(const Napi::CallbackInfo& info);
Napi::Value setBottom(const Napi::CallbackInfo& info);
Napi::Value setBottomLeft(const Napi::CallbackInfo& info);
Napi::Value setBottomRight(const Napi::CallbackInfo& info);
Napi::Value setCoords(const Napi::CallbackInfo& info);
Napi::Value setHeight(const Napi::CallbackInfo& info);
Napi::Value setLeft(const Napi::CallbackInfo& info);
Napi::Value setRect(const Napi::CallbackInfo& info);
Napi::Value setRight(const Napi::CallbackInfo& info);
Napi::Value setTop(const Napi::CallbackInfo& info);
Napi::Value setTopLeft(const Napi::CallbackInfo& info);
Napi::Value setTopRight(const Napi::CallbackInfo& info);
Napi::Value setWidth(const Napi::CallbackInfo& info);
Napi::Value setX(const Napi::CallbackInfo& info);
Napi::Value setY(const Napi::CallbackInfo& info);
Napi::Value toAlignedRect(const Napi::CallbackInfo& info);
Napi::Value toRect(const Napi::CallbackInfo& info);
Napi::Value top(const Napi::CallbackInfo& info);
Napi::Value topLeft(const Napi::CallbackInfo& info);
Napi::Value topRight(const Napi::CallbackInfo& info);
Napi::Value translate(const Napi::CallbackInfo& info);
Napi::Value translate_QPoint(const Napi::CallbackInfo& info);
Napi::Value translated(const Napi::CallbackInfo& info);
Napi::Value translated_QPoint(const Napi::CallbackInfo& info);
Napi::Value transposed(const Napi::CallbackInfo& info);
Napi::Value united(const Napi::CallbackInfo& info);
Napi::Value width(const Napi::CallbackInfo& info);
Napi::Value x(const Napi::CallbackInfo& info);
Napi::Value y(const Napi::CallbackInfo& info);
};

View File

@ -19,18 +19,9 @@ class DLL_EXPORT QSizeWrap : public Napi::ObjectWrap<QSizeWrap> {
~QSizeWrap(); ~QSizeWrap();
QSize* getInternalInstance(); QSize* getInternalInstance();
// Wrapped methods // Wrapped methods
Napi::Value boundedTo(const Napi::CallbackInfo& info);
Napi::Value expandedTo(const Napi::CallbackInfo& info);
Napi::Value height(const Napi::CallbackInfo& info);
Napi::Value isEmpty(const Napi::CallbackInfo& info);
Napi::Value isNull(const Napi::CallbackInfo& info);
Napi::Value isValid(const Napi::CallbackInfo& info);
Napi::Value scale(const Napi::CallbackInfo& info);
Napi::Value scaled(const Napi::CallbackInfo& info);
Napi::Value setHeight(const Napi::CallbackInfo& info); Napi::Value setHeight(const Napi::CallbackInfo& info);
Napi::Value setWidth(const Napi::CallbackInfo& info); Napi::Value setWidth(const Napi::CallbackInfo& info);
Napi::Value transpose(const Napi::CallbackInfo& info); Napi::Value height(const Napi::CallbackInfo& info);
Napi::Value transposed(const Napi::CallbackInfo& info);
Napi::Value width(const Napi::CallbackInfo& info); Napi::Value width(const Napi::CallbackInfo& info);
}; };

View File

@ -1,40 +0,0 @@
#pragma once
#include <napi.h>
#include <QSizeF>
#include "Extras/Export/export.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QSizeFWrap : public Napi::ObjectWrap<QSizeFWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
private:
std::unique_ptr<QSizeF> instance;
public:
static Napi::FunctionReference constructor;
static Napi::Object init(Napi::Env env, Napi::Object exports);
QSizeFWrap(const Napi::CallbackInfo& info);
~QSizeFWrap();
QSizeF* getInternalInstance();
// Wrapped methods
Napi::Value boundedTo(const Napi::CallbackInfo& info);
Napi::Value expandedTo(const Napi::CallbackInfo& info);
Napi::Value height(const Napi::CallbackInfo& info);
Napi::Value isEmpty(const Napi::CallbackInfo& info);
Napi::Value isNull(const Napi::CallbackInfo& info);
Napi::Value isValid(const Napi::CallbackInfo& info);
Napi::Value scale(const Napi::CallbackInfo& info);
Napi::Value scaled(const Napi::CallbackInfo& info);
Napi::Value setHeight(const Napi::CallbackInfo& info);
Napi::Value setWidth(const Napi::CallbackInfo& info);
Napi::Value toSize(const Napi::CallbackInfo& info);
Napi::Value transpose(const Napi::CallbackInfo& info);
Napi::Value transposed(const Napi::CallbackInfo& info);
Napi::Value width(const Napi::CallbackInfo& info);
};
namespace StaticQSizeFWrapMethods {
DLL_EXPORT Napi::Value fromQVariant(const Napi::CallbackInfo& info);
} // namespace StaticQSizeFWrapMethods

View File

@ -42,6 +42,5 @@ namespace StaticTimeWrapMethods {
DLL_EXPORT Napi::Value currentTime(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value currentTime(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value fromMSecsSinceStartOfDay(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value fromMSecsSinceStartOfDay(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value isValid(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value isValid(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value fromString(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value fromQVariant(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value fromQVariant(const Napi::CallbackInfo& info);
} // namespace StaticTimeWrapMethods } // namespace StaticTimeWrapMethods

View File

@ -21,49 +21,8 @@ class DLL_EXPORT QUrlWrap : public Napi::ObjectWrap<QUrlWrap> {
// Wrapped methods // Wrapped methods
Napi::Value setUrl(const Napi::CallbackInfo& info); Napi::Value setUrl(const Napi::CallbackInfo& info);
Napi::Value toString(const Napi::CallbackInfo& info); Napi::Value toString(const Napi::CallbackInfo& info);
Napi::Value adjusted(const Napi::CallbackInfo& info);
Napi::Value authority(const Napi::CallbackInfo& info);
Napi::Value clear(const Napi::CallbackInfo& info);
Napi::Value errorString(const Napi::CallbackInfo& info);
Napi::Value fileName(const Napi::CallbackInfo& info);
Napi::Value fragment(const Napi::CallbackInfo& info);
Napi::Value hasFragment(const Napi::CallbackInfo& info);
Napi::Value hasQuery(const Napi::CallbackInfo& info);
Napi::Value host(const Napi::CallbackInfo& info);
Napi::Value isEmpty(const Napi::CallbackInfo& info);
Napi::Value isLocalFile(const Napi::CallbackInfo& info);
Napi::Value isParentOf(const Napi::CallbackInfo& info);
Napi::Value isRelative(const Napi::CallbackInfo& info);
Napi::Value isValid(const Napi::CallbackInfo& info);
Napi::Value matches(const Napi::CallbackInfo& info);
Napi::Value password(const Napi::CallbackInfo& info);
Napi::Value path(const Napi::CallbackInfo& info);
Napi::Value port(const Napi::CallbackInfo& info);
Napi::Value query(const Napi::CallbackInfo& info);
Napi::Value resolved(const Napi::CallbackInfo& info);
Napi::Value scheme(const Napi::CallbackInfo& info);
Napi::Value setAuthority(const Napi::CallbackInfo& info);
Napi::Value setFragment(const Napi::CallbackInfo& info);
Napi::Value setHost(const Napi::CallbackInfo& info);
Napi::Value setPassword(const Napi::CallbackInfo& info);
Napi::Value setPath(const Napi::CallbackInfo& info);
Napi::Value setPort(const Napi::CallbackInfo& info);
Napi::Value setQuery(const Napi::CallbackInfo& info);
Napi::Value setScheme(const Napi::CallbackInfo& info);
Napi::Value setUserInfo(const Napi::CallbackInfo& info);
Napi::Value setUserName(const Napi::CallbackInfo& info);
Napi::Value swap(const Napi::CallbackInfo& info);
Napi::Value toDisplayString(const Napi::CallbackInfo& info);
Napi::Value toLocalFile(const Napi::CallbackInfo& info);
Napi::Value toString_withOpts(const Napi::CallbackInfo& info);
Napi::Value url(const Napi::CallbackInfo& info);
Napi::Value userInfo(const Napi::CallbackInfo& info);
Napi::Value userName(const Napi::CallbackInfo& info);
}; };
namespace StaticQUrlWrapMethods { namespace StaticQUrlWrapMethods {
DLL_EXPORT Napi::Value fromQVariant(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value fromQVariant(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value fromLocalFile(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value fromUserInput(const Napi::CallbackInfo& info);
} // namespace StaticQUrlWrapMethods } // namespace StaticQUrlWrapMethods

View File

@ -22,10 +22,9 @@ class DLL_EXPORT QVariantWrap : public Napi::ObjectWrap<QVariantWrap> {
Napi::Value toInt(const Napi::CallbackInfo& info); Napi::Value toInt(const Napi::CallbackInfo& info);
Napi::Value toDouble(const Napi::CallbackInfo& info); Napi::Value toDouble(const Napi::CallbackInfo& info);
Napi::Value toBool(const Napi::CallbackInfo& info); Napi::Value toBool(const Napi::CallbackInfo& info);
Napi::Value toStringList(const Napi::CallbackInfo& info);
// wrapped methods // wrapped methods
}; };
namespace StaticQVariantWrapMethods { namespace StaticQVariantWrapMethods {
DLL_EXPORT Napi::Value convertToQVariant(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value converToQVariant(const Napi::CallbackInfo& info);
} // namespace StaticQVariantWrapMethods } // namespace StaticQVariantWrapMethods

View File

@ -1,12 +1,8 @@
#pragma once #pragma once
#include <QApplication> #include <QApplication>
#include <QGuiApplication>
#include <QWindow>
#include "Extras/Export/export.h" #include "Extras/Export/export.h"
#include "QtCore/QObject/qobject_macro.h" #include "QtCore/QObject/qobject_macro.h"
#include "QtGui/QScreen/qscreen_wrap.h"
#include "core/WrapperCache/wrappercache.h"
#include "napi.h" #include "napi.h"
class DLL_EXPORT NApplication : public QApplication, public EventWidget { class DLL_EXPORT NApplication : public QApplication, public EventWidget {
@ -14,54 +10,8 @@ class DLL_EXPORT NApplication : public QApplication, public EventWidget {
EVENTWIDGET_IMPLEMENTATIONS(QApplication) EVENTWIDGET_IMPLEMENTATIONS(QApplication)
public: public:
using QApplication::QApplication; // inherit all constructors of QApplication using QApplication::QApplication; // inherit all constructors of QApplication
virtual void connectSignalsToEventEmitter() { void connectSignalsToEventEmitter() {
// Qt Connects: Implement all signal connects here // Qt Connects: Implement all signal connects here
QOBJECT_SIGNALS QOBJECT_SIGNALS
QObject::connect(
this, &QGuiApplication::applicationDisplayNameChanged, [=]() {
Napi::Env env = this->emitOnNode.Env();
Napi::HandleScope scope(env);
this->emitOnNode.Call(
{Napi::String::New(env, "applicationDisplayNameChanged")});
});
QObject::connect(
this, &QGuiApplication::focusWindowChanged, [=](QWindow* focusWindow) {
Napi::Env env = this->emitOnNode.Env();
Napi::HandleScope scope(env);
this->emitOnNode.Call({Napi::String::New(env, "focusWindowChanged")});
});
QObject::connect(this, &QGuiApplication::lastWindowClosed, [=]() {
Napi::Env env = this->emitOnNode.Env();
Napi::HandleScope scope(env);
this->emitOnNode.Call({Napi::String::New(env, "lastWindowClosed")});
});
QObject::connect(
this, &QGuiApplication::primaryScreenChanged, [=](QScreen* screen) {
Napi::Env env = this->emitOnNode.Env();
Napi::HandleScope scope(env);
auto instance = WrapperCache::instance.getWrapper(env, screen, true);
this->emitOnNode.Call(
{Napi::String::New(env, "primaryScreenChanged"), instance});
});
QObject::connect(this, &QGuiApplication::screenAdded, [=](QScreen* screen) {
Napi::Env env = this->emitOnNode.Env();
Napi::HandleScope scope(env);
auto instance = WrapperCache::instance.getWrapper(env, screen, true);
this->emitOnNode.Call({Napi::String::New(env, "screenAdded"), instance});
});
QObject::connect(
this, &QGuiApplication::screenRemoved, [=](QScreen* screen) {
Napi::Env env = this->emitOnNode.Env();
Napi::HandleScope scope(env);
auto instance = WrapperCache::instance.getWrapper(env, screen, true);
this->emitOnNode.Call(
{Napi::String::New(env, "screenRemoved"), instance});
});
} }
}; };

View File

@ -28,16 +28,10 @@ class DLL_EXPORT QApplicationWrap : public Napi::ObjectWrap<QApplicationWrap> {
Napi::Value exit(const Napi::CallbackInfo& info); Napi::Value exit(const Napi::CallbackInfo& info);
Napi::Value setQuitOnLastWindowClosed(const Napi::CallbackInfo& info); Napi::Value setQuitOnLastWindowClosed(const Napi::CallbackInfo& info);
Napi::Value quitOnLastWindowClosed(const Napi::CallbackInfo& info); Napi::Value quitOnLastWindowClosed(const Napi::CallbackInfo& info);
Napi::Value palette(const Napi::CallbackInfo& info);
Napi::Value setStyleSheet(const Napi::CallbackInfo& info);
Napi::Value devicePixelRatio(const Napi::CallbackInfo& info);
}; };
namespace StaticQApplicationWrapMethods { namespace StaticQApplicationWrapMethods {
DLL_EXPORT Napi::Value clipboard(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value instance(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value instance(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value primaryScreen(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value clipboard(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value screens(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value setStyle(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value style(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value style(const Napi::CallbackInfo& info);
} // namespace StaticQApplicationWrapMethods } // namespace StaticQApplicationWrapMethods

View File

@ -1,33 +0,0 @@
#pragma once
#include <napi.h>
#include <QBrush>
#include "Extras/Export/export.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QBrushWrap : public Napi::ObjectWrap<QBrushWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
private:
std::unique_ptr<QBrush> instance;
public:
static Napi::FunctionReference constructor;
static Napi::Object init(Napi::Env env, Napi::Object exports);
QBrushWrap(const Napi::CallbackInfo& info);
~QBrushWrap();
QBrush* getInternalInstance();
// Wrapped methods
Napi::Value isOpaque(const Napi::CallbackInfo& info);
Napi::Value setColor(const Napi::CallbackInfo& info);
Napi::Value color(const Napi::CallbackInfo& info);
Napi::Value setStyle(const Napi::CallbackInfo& info);
Napi::Value style(const Napi::CallbackInfo& info);
Napi::Value setTexture(const Napi::CallbackInfo& info);
Napi::Value texture(const Napi::CallbackInfo& info);
};
namespace StaticQBrushWrapMethods {
Napi::Value fromQVariant(const Napi::CallbackInfo& info);
} // namespace StaticQBrushWrapMethods

View File

@ -3,30 +3,21 @@
#include <napi.h> #include <napi.h>
#include <QClipboard> #include <QClipboard>
#include <QPointer>
#include "Extras/Export/export.h" #include "Extras/Export/export.h"
#include "QtCore/QObject/qobject_macro.h" #include "core/Component/component_macro.h"
class DLL_EXPORT QClipboardWrap : public Napi::ObjectWrap<QClipboardWrap>, class DLL_EXPORT QClipboardWrap : public Napi::ObjectWrap<QClipboardWrap> {
public EventWidget { COMPONENT_WRAPPED_METHODS_DECLARATION
QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(this)
// Note: We don't use EVENTWIDGET_IMPLEMENTATIONS() here because this class
// doesn't handle any QEvents.
QOBJECT_SET_PARENT_IMPL
private: private:
QPointer<QClipboard> instance; QClipboard* instance;
public: public:
static Napi::FunctionReference constructor; static Napi::FunctionReference constructor;
static Napi::Object init(Napi::Env env, Napi::Object exports); static Napi::Object init(Napi::Env env, Napi::Object exports);
QClipboardWrap(const Napi::CallbackInfo& info); QClipboardWrap(const Napi::CallbackInfo& info);
QClipboard* getInternalInstance(); QClipboard* getInternalInstance();
virtual void connectSignalsToEventEmitter();
// Wrapped methods // Wrapped methods
Napi::Value clear(const Napi::CallbackInfo& info); Napi::Value clear(const Napi::CallbackInfo& info);
Napi::Value setText(const Napi::CallbackInfo& info); Napi::Value setText(const Napi::CallbackInfo& info);

View File

@ -27,8 +27,6 @@ class DLL_EXPORT QColorWrap : public Napi::ObjectWrap<QColorWrap> {
Napi::Value blue(const Napi::CallbackInfo& info); Napi::Value blue(const Napi::CallbackInfo& info);
Napi::Value setAlpha(const Napi::CallbackInfo& info); Napi::Value setAlpha(const Napi::CallbackInfo& info);
Napi::Value alpha(const Napi::CallbackInfo& info); Napi::Value alpha(const Napi::CallbackInfo& info);
Napi::Value rgb(const Napi::CallbackInfo& info);
Napi::Value rgba(const Napi::CallbackInfo& info);
}; };
namespace StaticQColorWrapMethods { namespace StaticQColorWrapMethods {

View File

@ -1,25 +0,0 @@
#pragma once
#include <QDrag>
#include "Extras/Export/export.h"
#include "QtCore/QObject/qobject_macro.h"
#include "core/Events/eventwidget.h"
#include "core/Events/eventwidget_macro.h"
class DLL_EXPORT NDrag : public QDrag, public EventWidget {
Q_OBJECT
EVENTWIDGET_IMPLEMENTATIONS(QDrag)
public:
using QDrag::QDrag;
virtual void connectSignalsToEventEmitter() {
QOBJECT_SIGNALS
QObject::connect(this, &QDrag::actionChanged, [=](Qt::DropAction action) {
Napi::Env env = this->emitOnNode.Env();
Napi::HandleScope scope(env);
this->emitOnNode.Call(
{Napi::String::New(env, "actionChanged"),
Napi::Number::From(env, static_cast<int>(action))});
});
}
};

View File

@ -1,53 +0,0 @@
#pragma once
#include <napi.h>
#include <QDrag>
#include "Extras/Export/export.h"
#include "QtGui/QDrag/ndrag.hpp"
#include "core/Component/component_macro.h"
/*
- Note that setMimeData() assigns ownership of the QMimeData object to the QDrag
object.
- The QDrag must be constructed on the heap with a parent QObject to ensure that
Qt can clean up after the drag and drop operation has been completed
*/
class DLL_EXPORT QDragWrap : public Napi::ObjectWrap<QDragWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
private:
// A guarded pointer, QPointer<T>, behaves like a normal C++ pointer T *,
// except that it is automatically cleared when the referenced object is
// destroyed (unlike normal C++ pointers, which become "dangling pointers" in
// such cases). T must be a subclass of QObject.
QPointer<QDrag> instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QDragWrap(const Napi::CallbackInfo& info);
~QDragWrap();
QDrag* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
// wrapped methods
Napi::Value defaultAction(const Napi::CallbackInfo& info);
Napi::Value dragCursor(const Napi::CallbackInfo& info);
Napi::Value exec(const Napi::CallbackInfo& info);
Napi::Value hotSpot(const Napi::CallbackInfo& info);
Napi::Value pixmap(const Napi::CallbackInfo& info);
Napi::Value setDragCursor(const Napi::CallbackInfo& info);
Napi::Value setHotSpot(const Napi::CallbackInfo& info);
Napi::Value setPixmap(const Napi::CallbackInfo& info);
Napi::Value supportedActions(const Napi::CallbackInfo& info);
Napi::Value mimeData(const Napi::CallbackInfo& info);
Napi::Value setMimeData(const Napi::CallbackInfo& info);
Napi::Value source(const Napi::CallbackInfo& info);
Napi::Value target(const Napi::CallbackInfo& info);
};
namespace StaticQDragWrapMethods {
DLL_EXPORT Napi::Value cancel(const Napi::CallbackInfo& info);
}

View File

@ -1,27 +0,0 @@
#pragma once
#include <napi.h>
#include <QDragLeaveEvent>
#include "Extras/Export/export.h"
#include "QtGui/QEvent/QEvent/qevent_macro.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QDragLeaveEventWrap
: public Napi::ObjectWrap<QDragLeaveEventWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
QEVENT_WRAPPED_METHODS_DECLARATION
private:
QDragLeaveEvent* instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QDragLeaveEventWrap(const Napi::CallbackInfo& info);
~QDragLeaveEventWrap();
QDragLeaveEvent* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
// wrapped methods (none)
};

View File

@ -1,49 +0,0 @@
#pragma once
#include <napi.h>
#include <QDragMoveEvent>
#include "Extras/Export/export.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QDragMoveEventWrap
: public Napi::ObjectWrap<QDragMoveEventWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
private:
QDragMoveEvent* instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QDragMoveEventWrap(const Napi::CallbackInfo& info);
~QDragMoveEventWrap();
QDragMoveEvent* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
// methods of QDragMoveEvent itself
// Napi::Value accept(const Napi::CallbackInfo& info); //already in qevent
Napi::Value answerRect(const Napi::CallbackInfo& info);
// Napi::Value ignore(const Napi::CallbackInfo& info); //already in qevent
// methods copied from QDropEvent
Napi::Value acceptProposedAction(const Napi::CallbackInfo& info);
Napi::Value dropAction(const Napi::CallbackInfo& info);
Napi::Value keyboardModifiers(const Napi::CallbackInfo& info);
Napi::Value mouseButtons(const Napi::CallbackInfo& info);
Napi::Value mimeData(const Napi::CallbackInfo& info);
Napi::Value pos(const Napi::CallbackInfo& info);
Napi::Value possibleActions(const Napi::CallbackInfo& info);
Napi::Value proposedAction(const Napi::CallbackInfo& info);
Napi::Value setDropAction(const Napi::CallbackInfo& info);
// Methods from QEvent (Not using macro because accept and ignore are
// overloaded)
Napi::Value accept(const Napi::CallbackInfo& info);
Napi::Value ignore(const Napi::CallbackInfo& info);
Napi::Value isAccepted(const Napi::CallbackInfo& info);
Napi::Value setAccepted(const Napi::CallbackInfo& info);
Napi::Value spontaneous(const Napi::CallbackInfo& info);
Napi::Value _type(const Napi::CallbackInfo& info);
};

View File

@ -1,37 +0,0 @@
#pragma once
#include <napi.h>
#include <QDropEvent>
#include "Extras/Export/export.h"
#include "QtGui/QEvent/QEvent/qevent_macro.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QDropEventWrap : public Napi::ObjectWrap<QDropEventWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
private:
QDropEvent* instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QDropEventWrap(const Napi::CallbackInfo& info);
~QDropEventWrap();
QDropEvent* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
// wrapped methods
Napi::Value acceptProposedAction(const Napi::CallbackInfo& info);
Napi::Value dropAction(const Napi::CallbackInfo& info);
Napi::Value keyboardModifiers(const Napi::CallbackInfo& info);
Napi::Value mouseButtons(const Napi::CallbackInfo& info);
Napi::Value mimeData(const Napi::CallbackInfo& info);
Napi::Value pos(const Napi::CallbackInfo& info);
Napi::Value possibleActions(const Napi::CallbackInfo& info);
Napi::Value proposedAction(const Napi::CallbackInfo& info);
Napi::Value setDropAction(const Napi::CallbackInfo& info);
// Methods from QEvent
QEVENT_WRAPPED_METHODS_DECLARATION
};

View File

@ -1,46 +0,0 @@
#ifndef QEVENT_WRAPPED_METHODS_DECLARATION
#define QEVENT_WRAPPED_METHODS_DECLARATION \
Napi::Value accept(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
this->instance->accept(); \
return env.Null(); \
} \
Napi::Value ignore(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
this->instance->ignore(); \
return env.Null(); \
} \
Napi::Value isAccepted(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
bool v = this->instance->isAccepted(); \
return Napi::Boolean::From(env, v); \
} \
Napi::Value setAccepted(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
bool v = info[0].As<Napi::Boolean>().Value(); \
this->instance->setAccepted(v); \
return env.Null(); \
} \
Napi::Value spontaneous(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
bool v = this->instance->spontaneous(); \
return Napi::Boolean::From(env, v); \
} \
Napi::Value _type(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
int v = static_cast<int>(this->instance->type()); \
return Napi::Number::From(env, v); \
}
#endif
#ifndef QEVENT_WRAPPED_METHODS_EXPORT_DEFINE
#define QEVENT_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \
InstanceMethod("accept", &WidgetWrapName::accept), \
InstanceMethod("ignore", &WidgetWrapName::ignore), \
InstanceMethod("isAccepted", &WidgetWrapName::isAccepted), \
InstanceMethod("setAccepted", &WidgetWrapName::setAccepted), \
InstanceMethod("spontaneous", &WidgetWrapName::spontaneous), \
InstanceMethod( \
"_type", \
&WidgetWrapName::_type), // Rename to _type to prevent conflict
#endif

View File

@ -1,19 +0,0 @@
#ifndef QINPUTEVENT_WRAPPED_METHODS_DECLARATION
#define QINPUTEVENT_WRAPPED_METHODS_DECLARATION \
Napi::Value modifiers(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
uint v = static_cast<uint>(this->instance->modifiers()); \
return Napi::Number::From(env, v); \
} \
Napi::Value timestamp(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
ulong timestamp = this->instance->timestamp(); \
return Napi::Number::From(env, timestamp); \
}
#endif
#ifndef QINPUTEVENT_WRAPPED_METHODS_EXPORT_DEFINE
#define QINPUTEVENT_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \
InstanceMethod("modifiers", &WidgetWrapName::modifiers), \
InstanceMethod("timestamp", &WidgetWrapName::timestamp),
#endif

View File

@ -1,32 +0,0 @@
#pragma once
#include <napi.h>
#include <QInputMethodEvent>
#include "Extras/Export/export.h"
#include "QtGui/QEvent/QEvent/qevent_macro.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QInputMethodEventWrap
: public Napi::ObjectWrap<QInputMethodEventWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
QEVENT_WRAPPED_METHODS_DECLARATION
private:
QInputMethodEvent* instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QInputMethodEventWrap(const Napi::CallbackInfo& info);
~QInputMethodEventWrap();
QInputMethodEvent* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
// wrapped methods
Napi::Value commitString(const Napi::CallbackInfo& info);
Napi::Value preeditString(const Napi::CallbackInfo& info);
Napi::Value replacementLength(const Napi::CallbackInfo& info);
Napi::Value replacementStart(const Napi::CallbackInfo& info);
Napi::Value setCommitString(const Napi::CallbackInfo& info);
};

View File

@ -1,30 +0,0 @@
#pragma once
#include <napi.h>
#include <QInputMethodQueryEvent>
#include "Extras/Export/export.h"
#include "QtGui/QEvent/QEvent/qevent_macro.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QInputMethodQueryEventWrap
: public Napi::ObjectWrap<QInputMethodQueryEventWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
QEVENT_WRAPPED_METHODS_DECLARATION
private:
QInputMethodQueryEvent* instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QInputMethodQueryEventWrap(const Napi::CallbackInfo& info);
~QInputMethodQueryEventWrap();
QInputMethodQueryEvent* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
// wrapped methods
Napi::Value queries(const Napi::CallbackInfo& info);
Napi::Value setValue(const Napi::CallbackInfo& info);
Napi::Value value(const Napi::CallbackInfo& info);
};

View File

@ -5,14 +5,10 @@
#include <QKeyEvent> #include <QKeyEvent>
#include "Extras/Export/export.h" #include "Extras/Export/export.h"
#include "QtGui/QEvent/QEvent/qevent_macro.h"
#include "QtGui/QEvent/QInputEvent/qinputevent_macro.h"
#include "core/Component/component_macro.h" #include "core/Component/component_macro.h"
class DLL_EXPORT QKeyEventWrap : public Napi::ObjectWrap<QKeyEventWrap> { class DLL_EXPORT QKeyEventWrap : public Napi::ObjectWrap<QKeyEventWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION COMPONENT_WRAPPED_METHODS_DECLARATION
QEVENT_WRAPPED_METHODS_DECLARATION
QINPUTEVENT_WRAPPED_METHODS_DECLARATION
private: private:
QKeyEvent* instance; QKeyEvent* instance;
@ -27,6 +23,7 @@ class DLL_EXPORT QKeyEventWrap : public Napi::ObjectWrap<QKeyEventWrap> {
// wrapped methods // wrapped methods
Napi::Value text(const Napi::CallbackInfo& info); Napi::Value text(const Napi::CallbackInfo& info);
Napi::Value key(const Napi::CallbackInfo& info); Napi::Value key(const Napi::CallbackInfo& info);
Napi::Value modifiers(const Napi::CallbackInfo& info);
Napi::Value count(const Napi::CallbackInfo& info); Napi::Value count(const Napi::CallbackInfo& info);
Napi::Value isAutoRepeat(const Napi::CallbackInfo& info); Napi::Value isAutoRepeat(const Napi::CallbackInfo& info);
}; };

View File

@ -5,14 +5,10 @@
#include <QMouseEvent> #include <QMouseEvent>
#include "Extras/Export/export.h" #include "Extras/Export/export.h"
#include "QtGui/QEvent/QEvent/qevent_macro.h"
#include "QtGui/QEvent/QInputEvent/qinputevent_macro.h"
#include "core/Component/component_macro.h" #include "core/Component/component_macro.h"
class DLL_EXPORT QMouseEventWrap : public Napi::ObjectWrap<QMouseEventWrap> { class DLL_EXPORT QMouseEventWrap : public Napi::ObjectWrap<QMouseEventWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION COMPONENT_WRAPPED_METHODS_DECLARATION
QEVENT_WRAPPED_METHODS_DECLARATION
QINPUTEVENT_WRAPPED_METHODS_DECLARATION
private: private:
QMouseEvent* instance; QMouseEvent* instance;
@ -26,7 +22,6 @@ class DLL_EXPORT QMouseEventWrap : public Napi::ObjectWrap<QMouseEventWrap> {
static Napi::FunctionReference constructor; static Napi::FunctionReference constructor;
// wrapped methods // wrapped methods
Napi::Value button(const Napi::CallbackInfo& info); Napi::Value button(const Napi::CallbackInfo& info);
Napi::Value buttons(const Napi::CallbackInfo& info);
Napi::Value x(const Napi::CallbackInfo& info); Napi::Value x(const Napi::CallbackInfo& info);
Napi::Value y(const Napi::CallbackInfo& info); Napi::Value y(const Napi::CallbackInfo& info);
Napi::Value globalX(const Napi::CallbackInfo& info); Napi::Value globalX(const Napi::CallbackInfo& info);

View File

@ -1,28 +0,0 @@
#pragma once
#include <napi.h>
#include <QMoveEvent>
#include "Extras/Export/export.h"
#include "QtGui/QEvent/QEvent/qevent_macro.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QMoveEventWrap : public Napi::ObjectWrap<QMoveEventWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
QEVENT_WRAPPED_METHODS_DECLARATION
private:
QMoveEvent* instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QMoveEventWrap(const Napi::CallbackInfo& info);
~QMoveEventWrap();
QMoveEvent* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
// wrapped methods
Napi::Value oldPos(const Napi::CallbackInfo& info);
Napi::Value pos(const Napi::CallbackInfo& info);
};

View File

@ -1,36 +0,0 @@
#pragma once
#include <napi.h>
#include <QNativeGestureEvent>
#include "Extras/Export/export.h"
#include "QtGui/QEvent/QEvent/qevent_macro.h"
#include "QtGui/QEvent/QInputEvent/qinputevent_macro.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QNativeGestureEventWrap
: public Napi::ObjectWrap<QNativeGestureEventWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
QEVENT_WRAPPED_METHODS_DECLARATION
QINPUTEVENT_WRAPPED_METHODS_DECLARATION
private:
QNativeGestureEvent* instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QNativeGestureEventWrap(const Napi::CallbackInfo& info);
~QNativeGestureEventWrap();
QNativeGestureEvent* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
// wrapped methods
Napi::Value gestureType(const Napi::CallbackInfo& info);
Napi::Value globalPos(const Napi::CallbackInfo& info);
Napi::Value localPos(const Napi::CallbackInfo& info);
Napi::Value pos(const Napi::CallbackInfo& info);
Napi::Value screenPos(const Napi::CallbackInfo& info);
Napi::Value windowPos(const Napi::CallbackInfo& info);
Napi::Value value(const Napi::CallbackInfo& info);
};

View File

@ -1,25 +0,0 @@
#pragma once
#include <napi.h>
#include <QPaintEvent>
#include "Extras/Export/export.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QPaintEventWrap : public Napi::ObjectWrap<QPaintEventWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
private:
QPaintEvent* instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QPaintEventWrap(const Napi::CallbackInfo& info);
~QPaintEventWrap();
QPaintEvent* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
// wrapped methods
Napi::Value rect(const Napi::CallbackInfo& info);
};

View File

@ -1,28 +0,0 @@
#pragma once
#include <napi.h>
#include <QResizeEvent>
#include "Extras/Export/export.h"
#include "QtGui/QEvent/QEvent/qevent_macro.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QResizeEventWrap : public Napi::ObjectWrap<QResizeEventWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
QEVENT_WRAPPED_METHODS_DECLARATION
private:
QResizeEvent* instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QResizeEventWrap(const Napi::CallbackInfo& info);
~QResizeEventWrap();
QResizeEvent* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
// wrapped methods
Napi::Value oldSize(const Napi::CallbackInfo& info);
Napi::Value size(const Napi::CallbackInfo& info);
};

View File

@ -1,48 +0,0 @@
#pragma once
#include <napi.h>
#include <QTabletEvent>
#include "Extras/Export/export.h"
#include "QtGui/QEvent/QEvent/qevent_macro.h"
#include "QtGui/QEvent/QInputEvent/qinputevent_macro.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QTabletEventWrap : public Napi::ObjectWrap<QTabletEventWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
QEVENT_WRAPPED_METHODS_DECLARATION
QINPUTEVENT_WRAPPED_METHODS_DECLARATION
private:
QTabletEvent* instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QTabletEventWrap(const Napi::CallbackInfo& info);
~QTabletEventWrap();
QTabletEvent* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
// wrapped methods
Napi::Value button(const Napi::CallbackInfo& info);
Napi::Value buttons(const Napi::CallbackInfo& info);
// Somehow this method isn't found on build?
// Napi::Value deviceType(const Napi::CallbackInfo& info);
Napi::Value globalPos(const Napi::CallbackInfo& info);
Napi::Value globalPosF(const Napi::CallbackInfo& info);
Napi::Value globalX(const Napi::CallbackInfo& info);
Napi::Value globalY(const Napi::CallbackInfo& info);
Napi::Value pointerType(const Napi::CallbackInfo& info);
Napi::Value pos(const Napi::CallbackInfo& info);
Napi::Value posF(const Napi::CallbackInfo& info);
Napi::Value pressure(const Napi::CallbackInfo& info);
Napi::Value rotation(const Napi::CallbackInfo& info);
Napi::Value tangentialPressure(const Napi::CallbackInfo& info);
Napi::Value uniqueId(const Napi::CallbackInfo& info);
Napi::Value x(const Napi::CallbackInfo& info);
Napi::Value xTilt(const Napi::CallbackInfo& info);
Napi::Value y(const Napi::CallbackInfo& info);
Napi::Value yTilt(const Napi::CallbackInfo& info);
Napi::Value z(const Napi::CallbackInfo& info);
};

View File

@ -1,27 +0,0 @@
#pragma once
#include <napi.h>
#include <QTimerEvent>
#include "Extras/Export/export.h"
#include "QtGui/QEvent/QEvent/qevent_macro.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QTimerEventWrap : public Napi::ObjectWrap<QTimerEventWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
QEVENT_WRAPPED_METHODS_DECLARATION
private:
QTimerEvent* instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QTimerEventWrap(const Napi::CallbackInfo& info);
~QTimerEventWrap();
QTimerEvent* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
// wrapped methods
Napi::Value timerId(const Napi::CallbackInfo& info);
};

View File

@ -1,35 +0,0 @@
#pragma once
#include <napi.h>
#include <QWheelEvent>
#include "Extras/Export/export.h"
#include "QtGui/QEvent/QEvent/qevent_macro.h"
#include "QtGui/QEvent/QInputEvent/qinputevent_macro.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QWheelEventWrap : public Napi::ObjectWrap<QWheelEventWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
QEVENT_WRAPPED_METHODS_DECLARATION
QINPUTEVENT_WRAPPED_METHODS_DECLARATION
private:
QWheelEvent* instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QWheelEventWrap(const Napi::CallbackInfo& info);
~QWheelEventWrap();
QWheelEvent* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
// wrapped methods
Napi::Value angleDelta(const Napi::CallbackInfo& info);
Napi::Value buttons(const Napi::CallbackInfo& info);
Napi::Value globalPosition(const Napi::CallbackInfo& info);
Napi::Value inverted(const Napi::CallbackInfo& info);
Napi::Value phase(const Napi::CallbackInfo& info);
Napi::Value pixelDelta(const Napi::CallbackInfo& info);
Napi::Value position(const Napi::CallbackInfo& info);
};

View File

@ -18,15 +18,11 @@ class DLL_EXPORT QFontWrap : public Napi::ObjectWrap<QFontWrap> {
~QFontWrap(); ~QFontWrap();
QFont* getInternalInstance(); QFont* getInternalInstance();
// Wrapped methods // Wrapped methods
Napi::Value bold(const Napi::CallbackInfo& info);
Napi::Value setBold(const Napi::CallbackInfo& info);
Napi::Value setCapitalization(const Napi::CallbackInfo& info); Napi::Value setCapitalization(const Napi::CallbackInfo& info);
Napi::Value capitalization(const Napi::CallbackInfo& info); Napi::Value capitalization(const Napi::CallbackInfo& info);
Napi::Value setFamily(const Napi::CallbackInfo& info); Napi::Value setFamily(const Napi::CallbackInfo& info);
Napi::Value family(const Napi::CallbackInfo& info); Napi::Value family(const Napi::CallbackInfo& info);
Napi::Value setPixelSize(const Napi::CallbackInfo& info);
Napi::Value setPointSize(const Napi::CallbackInfo& info); Napi::Value setPointSize(const Napi::CallbackInfo& info);
Napi::Value pixelSize(const Napi::CallbackInfo& info);
Napi::Value pointSize(const Napi::CallbackInfo& info); Napi::Value pointSize(const Napi::CallbackInfo& info);
Napi::Value setStretch(const Napi::CallbackInfo& info); Napi::Value setStretch(const Napi::CallbackInfo& info);
Napi::Value stretch(const Napi::CallbackInfo& info); Napi::Value stretch(const Napi::CallbackInfo& info);
@ -34,7 +30,6 @@ class DLL_EXPORT QFontWrap : public Napi::ObjectWrap<QFontWrap> {
Napi::Value weight(const Napi::CallbackInfo& info); Napi::Value weight(const Napi::CallbackInfo& info);
Napi::Value setItalic(const Napi::CallbackInfo& info); Napi::Value setItalic(const Napi::CallbackInfo& info);
Napi::Value italic(const Napi::CallbackInfo& info); Napi::Value italic(const Napi::CallbackInfo& info);
Napi::Value setStyleName(const Napi::CallbackInfo& info);
Napi::Value toString(const Napi::CallbackInfo& info); Napi::Value toString(const Napi::CallbackInfo& info);
COMPONENT_WRAPPED_METHODS_DECLARATION COMPONENT_WRAPPED_METHODS_DECLARATION
}; };

View File

@ -22,14 +22,11 @@ class DLL_EXPORT QFontDatabaseWrap
// Wrapped methods // Wrapped methods
Napi::Value bold(const Napi::CallbackInfo& info); Napi::Value bold(const Napi::CallbackInfo& info);
Napi::Value families(const Napi::CallbackInfo& info); Napi::Value families(const Napi::CallbackInfo& info);
Napi::Value isFixedPitch(const Napi::CallbackInfo& info);
Napi::Value italic(const Napi::CallbackInfo& info); Napi::Value italic(const Napi::CallbackInfo& info);
Napi::Value styles(const Napi::CallbackInfo& info);
Napi::Value weight(const Napi::CallbackInfo& info); Napi::Value weight(const Napi::CallbackInfo& info);
}; };
namespace StaticQFontDatabaseWrapMethods { namespace StaticQFontDatabaseWrapMethods {
DLL_EXPORT Napi::Value addApplicationFont(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value addApplicationFont(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value applicationFontFamilies(const Napi::CallbackInfo& info);
DLL_EXPORT Napi::Value removeApplicationFont(const Napi::CallbackInfo& info); DLL_EXPORT Napi::Value removeApplicationFont(const Napi::CallbackInfo& info);
} // namespace StaticQFontDatabaseWrapMethods } // namespace StaticQFontDatabaseWrapMethods

View File

@ -1,48 +0,0 @@
#pragma once
#include <napi.h>
#include <QFontMetrics>
#include "Extras/Export/export.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QFontMetricsWrap : public Napi::ObjectWrap<QFontMetricsWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
private:
std::unique_ptr<QFontMetrics> instance;
public:
static Napi::FunctionReference constructor;
static Napi::Object init(Napi::Env env, Napi::Object exports);
QFontMetricsWrap(const Napi::CallbackInfo& info);
QFontMetrics* getInternalInstance();
// Wrapped methods
Napi::Value ascent(const Napi::CallbackInfo& info);
Napi::Value averageCharWidth(const Napi::CallbackInfo& info);
Napi::Value capHeight(const Napi::CallbackInfo& info);
Napi::Value descent(const Napi::CallbackInfo& info);
Napi::Value fontDpi(const Napi::CallbackInfo& info);
Napi::Value height(const Napi::CallbackInfo& info);
Napi::Value horizontalAdvance(const Napi::CallbackInfo& info);
Napi::Value inFont(const Napi::CallbackInfo& info);
Napi::Value leading(const Napi::CallbackInfo& info);
Napi::Value leftBearing(const Napi::CallbackInfo& info);
Napi::Value lineSpacing(const Napi::CallbackInfo& info);
Napi::Value lineWidth(const Napi::CallbackInfo& info);
Napi::Value overlinePos(const Napi::CallbackInfo& info);
Napi::Value rightBearing(const Napi::CallbackInfo& info);
Napi::Value size(const Napi::CallbackInfo& info);
Napi::Value strikeOutPos(const Napi::CallbackInfo& info);
Napi::Value swap(const Napi::CallbackInfo& info);
Napi::Value underlinePos(const Napi::CallbackInfo& info);
Napi::Value xHeight(const Napi::CallbackInfo& info);
Napi::Value maxWidth(const Napi::CallbackInfo& info);
Napi::Value minLeftBearing(const Napi::CallbackInfo& info);
Napi::Value minRightBearing(const Napi::CallbackInfo& info);
Napi::Value inFontUcs4(const Napi::CallbackInfo& info);
Napi::Value boundingRect(const Napi::CallbackInfo& info);
Napi::Value tightBoundingRect(const Napi::CallbackInfo& info);
Napi::Value elidedText(const Napi::CallbackInfo& info);
};

View File

@ -1,49 +0,0 @@
#pragma once
#include <napi.h>
#include <QFontMetricsF>
#include "Extras/Export/export.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QFontMetricsFWrap
: public Napi::ObjectWrap<QFontMetricsFWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
private:
std::unique_ptr<QFontMetricsF> instance;
public:
static Napi::FunctionReference constructor;
static Napi::Object init(Napi::Env env, Napi::Object exports);
QFontMetricsFWrap(const Napi::CallbackInfo& info);
QFontMetricsF* getInternalInstance();
// Wrapped methods
Napi::Value ascent(const Napi::CallbackInfo& info);
Napi::Value averageCharWidth(const Napi::CallbackInfo& info);
Napi::Value capHeight(const Napi::CallbackInfo& info);
Napi::Value descent(const Napi::CallbackInfo& info);
Napi::Value fontDpi(const Napi::CallbackInfo& info);
Napi::Value height(const Napi::CallbackInfo& info);
Napi::Value horizontalAdvance(const Napi::CallbackInfo& info);
Napi::Value inFont(const Napi::CallbackInfo& info);
Napi::Value leading(const Napi::CallbackInfo& info);
Napi::Value leftBearing(const Napi::CallbackInfo& info);
Napi::Value lineSpacing(const Napi::CallbackInfo& info);
Napi::Value lineWidth(const Napi::CallbackInfo& info);
Napi::Value overlinePos(const Napi::CallbackInfo& info);
Napi::Value rightBearing(const Napi::CallbackInfo& info);
Napi::Value size(const Napi::CallbackInfo& info);
Napi::Value strikeOutPos(const Napi::CallbackInfo& info);
Napi::Value swap(const Napi::CallbackInfo& info);
Napi::Value underlinePos(const Napi::CallbackInfo& info);
Napi::Value xHeight(const Napi::CallbackInfo& info);
Napi::Value maxWidth(const Napi::CallbackInfo& info);
Napi::Value minLeftBearing(const Napi::CallbackInfo& info);
Napi::Value minRightBearing(const Napi::CallbackInfo& info);
Napi::Value inFontUcs4(const Napi::CallbackInfo& info);
Napi::Value boundingRect(const Napi::CallbackInfo& info);
Napi::Value tightBoundingRect(const Napi::CallbackInfo& info);
Napi::Value elidedText(const Napi::CallbackInfo& info);
};

View File

@ -20,18 +20,10 @@ class DLL_EXPORT QIconWrap : public Napi::ObjectWrap<QIconWrap> {
~QIconWrap(); ~QIconWrap();
QIcon* getInternalInstance(); QIcon* getInternalInstance();
// Wrapped methods // Wrapped methods
Napi::Value actualSize(const Napi::CallbackInfo& info);
Napi::Value addFile(const Napi::CallbackInfo& info);
Napi::Value addPixmap(const Napi::CallbackInfo& info);
Napi::Value availableSizes(const Napi::CallbackInfo& info);
Napi::Value pixmap(const Napi::CallbackInfo& info); Napi::Value pixmap(const Napi::CallbackInfo& info);
Napi::Value isMask(const Napi::CallbackInfo& info); Napi::Value isMask(const Napi::CallbackInfo& info);
Napi::Value isNull(const Napi::CallbackInfo& info);
Napi::Value name(const Napi::CallbackInfo& info);
Napi::Value paint(const Napi::CallbackInfo& info);
Napi::Value setIsMask(const Napi::CallbackInfo& info); Napi::Value setIsMask(const Napi::CallbackInfo& info);
Napi::Value cacheKey(const Napi::CallbackInfo& info); Napi::Value cacheKey(const Napi::CallbackInfo& info);
Napi::Value swap(const Napi::CallbackInfo& info);
}; };
namespace StaticQIconWrapMethods { namespace StaticQIconWrapMethods {

View File

@ -1,78 +0,0 @@
#pragma once
#include <napi.h>
#include <QImage>
#include "Extras/Export/export.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QImageWrap : public Napi::ObjectWrap<QImageWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
private:
std::unique_ptr<QImage> instance;
public:
static Napi::FunctionReference constructor;
static Napi::Object init(Napi::Env env, Napi::Object exports);
QImageWrap(const Napi::CallbackInfo& info);
~QImageWrap();
QImage* getInternalInstance();
Napi::Value allGray(const Napi::CallbackInfo& info);
Napi::Value bitPlaneCount(const Napi::CallbackInfo& info);
Napi::Value bytesPerLine(const Napi::CallbackInfo& info);
Napi::Value cacheKey(const Napi::CallbackInfo& info);
Napi::Value color(const Napi::CallbackInfo& info);
Napi::Value colorCount(const Napi::CallbackInfo& info);
void convertTo(const Napi::CallbackInfo& info);
Napi::Value convertToFormat(const Napi::CallbackInfo& info);
Napi::Value copy(const Napi::CallbackInfo& info);
Napi::Value createAlphaMask(const Napi::CallbackInfo& info);
Napi::Value createHeuristicMask(const Napi::CallbackInfo& info);
Napi::Value depth(const Napi::CallbackInfo& info);
Napi::Value devicePixelRatio(const Napi::CallbackInfo& info);
Napi::Value dotsPerMeterX(const Napi::CallbackInfo& info);
Napi::Value dotsPerMeterY(const Napi::CallbackInfo& info);
void fill(const Napi::CallbackInfo& info);
Napi::Value format(const Napi::CallbackInfo& info);
Napi::Value hasAlphaChannel(const Napi::CallbackInfo& info);
Napi::Value height(const Napi::CallbackInfo& info);
void invertPixels(const Napi::CallbackInfo& info);
Napi::Value isGrayscale(const Napi::CallbackInfo& info);
Napi::Value isNull(const Napi::CallbackInfo& info);
Napi::Value load(const Napi::CallbackInfo& info);
Napi::Value loadFromData(const Napi::CallbackInfo& info);
Napi::Value mirrored(const Napi::CallbackInfo& info);
Napi::Value offset(const Napi::CallbackInfo& info);
Napi::Value pixelColor(const Napi::CallbackInfo& info);
Napi::Value pixelIndex(const Napi::CallbackInfo& info);
Napi::Value rect(const Napi::CallbackInfo& info);
Napi::Value reinterpretAsFormat(const Napi::CallbackInfo& info);
Napi::Value save(const Napi::CallbackInfo& info);
Napi::Value scaled(const Napi::CallbackInfo& info);
Napi::Value scaledToHeight(const Napi::CallbackInfo& info);
Napi::Value scaledToWidth(const Napi::CallbackInfo& info);
void setAlphaChannel(const Napi::CallbackInfo& info);
void setColor(const Napi::CallbackInfo& info);
void setColorCount(const Napi::CallbackInfo& info);
void setDevicePixelRatio(const Napi::CallbackInfo& info);
void setDotsPerMeterX(const Napi::CallbackInfo& info);
void setDotsPerMeterY(const Napi::CallbackInfo& info);
void setOffset(const Napi::CallbackInfo& info);
void setPixel(const Napi::CallbackInfo& info);
void setPixelColor(const Napi::CallbackInfo& info);
void setText(const Napi::CallbackInfo& info);
Napi::Value size(const Napi::CallbackInfo& info);
Napi::Value sizeInBytes(const Napi::CallbackInfo& info);
void swap(const Napi::CallbackInfo& info);
Napi::Value text(const Napi::CallbackInfo& info);
Napi::Value textKeys(const Napi::CallbackInfo& info);
Napi::Value valid(const Napi::CallbackInfo& info);
Napi::Value width(const Napi::CallbackInfo& info);
};
namespace StaticQImageWrapMethods {
DLL_EXPORT Napi::Value fromQVariant(const Napi::CallbackInfo& info);
} // namespace StaticQImageWrapMethods

View File

@ -14,7 +14,7 @@ class DLL_EXPORT NMovie : public QMovie, public EventWidget {
public: public:
using QMovie::QMovie; using QMovie::QMovie;
virtual void connectSignalsToEventEmitter() { void connectSignalsToEventEmitter() {
QOBJECT_SIGNALS QOBJECT_SIGNALS
// Qt Connects: Implement all signal connects here // Qt Connects: Implement all signal connects here
QObject::connect(this, &QMovie::error, QObject::connect(this, &QMovie::error,

View File

@ -1,24 +0,0 @@
#pragma once
#include <napi.h>
#include <QPalette>
#include "Extras/Export/export.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QPaletteWrap : public Napi::ObjectWrap<QPaletteWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
private:
std::unique_ptr<QPalette> instance;
public:
static Napi::FunctionReference constructor;
static Napi::Object init(Napi::Env env, Napi::Object exports);
QPaletteWrap(const Napi::CallbackInfo& info);
~QPaletteWrap();
QPalette* getInternalInstance();
// Wrapped methods
Napi::Value color(const Napi::CallbackInfo& info);
};

View File

@ -1,28 +0,0 @@
#pragma once
#include <napi.h>
#include <QPen>
#include "Extras/Export/export.h"
#include "core/Component/component_macro.h"
class DLL_EXPORT QPenWrap : public Napi::ObjectWrap<QPenWrap> {
COMPONENT_WRAPPED_METHODS_DECLARATION
private:
std::unique_ptr<QPen> instance;
public:
static Napi::FunctionReference constructor;
static Napi::Object init(Napi::Env env, Napi::Object exports);
QPenWrap(const Napi::CallbackInfo& info);
~QPenWrap();
QPen* getInternalInstance();
// Wrapped methods
Napi::Value setColor(const Napi::CallbackInfo& info);
Napi::Value color(const Napi::CallbackInfo& info);
Napi::Value setStyle(const Napi::CallbackInfo& info);
Napi::Value style(const Napi::CallbackInfo& info);
Napi::Value setCapStyle(const Napi::CallbackInfo& info);
Napi::Value setWidth(const Napi::CallbackInfo& info);
};

View File

@ -26,7 +26,6 @@ class DLL_EXPORT QPixmapWrap : public Napi::ObjectWrap<QPixmapWrap> {
Napi::Value scaled(const Napi::CallbackInfo& info); Napi::Value scaled(const Napi::CallbackInfo& info);
Napi::Value height(const Napi::CallbackInfo& info); Napi::Value height(const Napi::CallbackInfo& info);
Napi::Value width(const Napi::CallbackInfo& info); Napi::Value width(const Napi::CallbackInfo& info);
static Napi::Value fromImage(const Napi::CallbackInfo& info);
}; };
namespace StaticQPixmapWrapMethods { namespace StaticQPixmapWrapMethods {

View File

@ -1,34 +0,0 @@
#pragma once
#include <napi.h>
#include <QPointer>
#include <QScreen>
#include "Extras/Export/export.h"
#include "QtCore/QObject/qobject_macro.h"
class DLL_EXPORT QScreenWrap : public Napi::ObjectWrap<QScreenWrap>,
public EventWidget {
QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(this)
QOBJECT_SET_PARENT_IMPL
// Note: We don't use EVENTWIDGET_IMPLEMENTATIONS() here because this class
// doesn't handle any QEvents.
private:
QPointer<QScreen> instance;
public:
// class constructor
static Napi::FunctionReference constructor;
static Napi::Object init(Napi::Env env, Napi::Object exports);
QScreenWrap(const Napi::CallbackInfo& info);
QScreen* getInternalInstance();
virtual void connectSignalsToEventEmitter();
// Wrapped methods
Napi::Value grabWindow(const Napi::CallbackInfo& info);
};

View File

@ -20,6 +20,4 @@ class DLL_EXPORT QStyleWrap : public Napi::ObjectWrap<QStyleWrap> {
QStyle* getInternalInstance(); QStyle* getInternalInstance();
// Wrapped methods // Wrapped methods
Napi::Value pixelMetric(const Napi::CallbackInfo& info); Napi::Value pixelMetric(const Napi::CallbackInfo& info);
Napi::Value polish(const Napi::CallbackInfo& info);
Napi::Value unpolish(const Napi::CallbackInfo& info);
}; };

View File

@ -1,58 +0,0 @@
#pragma once
#include <napi.h>
#include <QPointer>
#include <QWindow>
#include "Extras/Export/export.h"
#include "QtCore/QObject/qobject_macro.h"
class DLL_EXPORT QWindowWrap : public Napi::ObjectWrap<QWindowWrap>,
public EventWidget,
public QObject {
QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(this)
// Note: We don't use EVENTWIDGET_IMPLEMENTATIONS() here because this class
// doesn't handle any QEvents.
// `QWindow` has a special setParent() which only accepts `QWindow`s
Napi::Value setParent(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
QObject* parentObject = info[0].As<Napi::External<QObject>>().Data();
QWindow* parentWindow = qobject_cast<QWindow*>(parentObject);
if (parentWindow) {
this->instance->setParent(parentWindow);
}
return env.Null();
}
private:
QPointer<QWindow> instance;
public:
// class constructor
static Napi::FunctionReference constructor;
static Napi::Object init(Napi::Env env, Napi::Object exports);
QWindowWrap(const Napi::CallbackInfo& info);
~QWindowWrap();
QWindow* getInternalInstance();
virtual void connectSignalsToEventEmitter();
// wrapped methods
Napi::Value screen(const Napi::CallbackInfo& info);
Napi::Value showFullScreen(const Napi::CallbackInfo& info);
Napi::Value showMaximized(const Napi::CallbackInfo& info);
Napi::Value showMinimized(const Napi::CallbackInfo& info);
Napi::Value showNormal(const Napi::CallbackInfo& info);
Napi::Value startSystemMove(const Napi::CallbackInfo& info);
Napi::Value startSystemResize(const Napi::CallbackInfo& info);
Napi::Value setWindowState(const Napi::CallbackInfo& info);
Napi::Value windowState(const Napi::CallbackInfo& info);
Napi::Value visibility(const Napi::CallbackInfo& info);
Napi::Value setVisibility(const Napi::CallbackInfo& info);
protected:
bool eventFilter(QObject* watched, QEvent* event) override;
};

View File

@ -16,16 +16,20 @@
QWIDGET_WRAPPED_METHODS_DECLARATION \ QWIDGET_WRAPPED_METHODS_DECLARATION \
Napi::Value animateClick(const Napi::CallbackInfo& info) { \ Napi::Value animateClick(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \ Napi::Env env = info.Env(); \
this->instance->animateClick(); \ Napi::HandleScope scope(env); \
int msec = info[0].As<Napi::Number>().Int32Value(); \
this->instance->animateClick(msec); \
return env.Null(); \ return env.Null(); \
} \ } \
Napi::Value click(const Napi::CallbackInfo& info) { \ Napi::Value click(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \ Napi::Env env = info.Env(); \
Napi::HandleScope scope(env); \
this->instance->click(); \ this->instance->click(); \
return env.Null(); \ return env.Null(); \
} \ } \
Napi::Value toggle(const Napi::CallbackInfo& info) { \ Napi::Value toggle(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \ Napi::Env env = info.Env(); \
Napi::HandleScope scope(env); \
this->instance->toggle(); \ this->instance->toggle(); \
return env.Null(); \ return env.Null(); \
} }

View File

@ -1,21 +0,0 @@
#pragma once
#include "QtCore/QObject/qobject_macro.h"
/*
This macro adds common QAbstractItemDelete exported methods
*/
#ifndef QABSTRACTITEMDELEGATE_WRAPPED_METHODS_DECLARATION
#define QABSTRACTITEMDELEGATE_WRAPPED_METHODS_DECLARATION \
QOBJECT_WRAPPED_METHODS_DECLARATION
#endif
#ifndef QABSTRACTITEMDELEGATE_WRAPPED_METHODS_EXPORT_DEFINE
#define QABSTRACTITEMDELEGATE_WRAPPED_METHODS_EXPORT_DEFINE(WrapName) \
QOBJECT_WRAPPED_METHODS_EXPORT_DEFINE(WrapName)
#endif // QABSTRACTITEMDELEGATE_WRAPPED_METHODS_EXPORT_DEFINE
#ifndef QABSTRACTITEMDELEGATE_SIGNALS
#define QABSTRACTITEMDELEGATE_SIGNALS QOBJECT_SIGNALS
#endif // QABSTRACTITEMDELEGATE_SIGNALS

View File

@ -1,25 +0,0 @@
#pragma once
#include <napi.h>
#include <QAbstractItemDelegate>
#include <QPointer>
#include "Extras/Utils/nutils.h"
#include "QtWidgets/QAbstractItemDelegate/qabstractitemdelegate_macro.h"
class DLL_EXPORT QAbstractItemDelegateWrap
: public Napi::ObjectWrap<QAbstractItemDelegateWrap> {
QABSTRACTITEMDELEGATE_WRAPPED_METHODS_DECLARATION
private:
QPointer<QAbstractItemDelegate> instance;
public:
static Napi::Object init(Napi::Env env, Napi::Object exports);
QAbstractItemDelegateWrap(const Napi::CallbackInfo& info);
~QAbstractItemDelegateWrap();
QAbstractItemDelegate* getInternalInstance();
// class constructor
static Napi::FunctionReference constructor;
// wrapped methods
};

View File

@ -1,9 +1,6 @@
#pragma once #pragma once
#include "QtCore/QAbstractItemModel/qabstractitemmodel_wrap.h"
#include "QtCore/QItemSelectionModel/qitemselectionmodel_wrap.h"
#include "QtCore/QModelIndex/qmodelindex_wrap.h" #include "QtCore/QModelIndex/qmodelindex_wrap.h"
#include "QtWidgets/QAbstractItemDelegate/qabstractitemdelegate_wrap.h"
#include "QtWidgets/QAbstractScrollArea/qabstractscrollarea_macro.h" #include "QtWidgets/QAbstractScrollArea/qabstractscrollarea_macro.h"
#include "QtWidgets/QWidget/qwidget_wrap.h" #include "QtWidgets/QWidget/qwidget_wrap.h"
@ -15,353 +12,110 @@
*/ */
#ifndef QABSTRACTITEMVIEW_WRAPPED_METHODS_DECLARATION #ifndef QABSTRACTITEMVIEW_WRAPPED_METHODS_DECLARATION
#define QABSTRACTITEMVIEW_WRAPPED_METHODS_DECLARATION \
// This silly *WITHOUT_INDEXAT nonsense is for the benefit of QHeaderView and QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION \
// its redefinition of `indexAt()` as protected(!) instead of plain public. Napi::Value setCurrentIndex(const Napi::CallbackInfo& info) { \
// *sigh* Napi::Env env = info.Env(); \
#define QABSTRACTITEMVIEW_WRAPPED_METHODS_DECLARATION_NO_QHEADERVIEW_PROTECTED \ Napi::HandleScope scope(env); \
QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION \ Napi::Object indexObject = info[0].As<Napi::Object>(); \
Napi::Value setCurrentIndex(const Napi::CallbackInfo& info) { \ QModelIndexWrap* indexWrap = \
Napi::Env env = info.Env(); \ Napi::ObjectWrap<QModelIndexWrap>::Unwrap(indexObject); \
Napi::Object indexObject = info[0].As<Napi::Object>(); \ this->instance->setCurrentIndex(*indexWrap->getInternalInstance()); \
QModelIndexWrap* indexWrap = \ return env.Null(); \
Napi::ObjectWrap<QModelIndexWrap>::Unwrap(indexObject); \ } \
this->instance->setCurrentIndex(*indexWrap->getInternalInstance()); \ Napi::Value currentIndex(const Napi::CallbackInfo& info) { \
return env.Null(); \ Napi::Env env = info.Env(); \
} \ Napi::HandleScope scope(env); \
Napi::Value currentIndex(const Napi::CallbackInfo& info) { \ QModelIndex current = this->instance->currentIndex(); \
Napi::Env env = info.Env(); \ auto instance = QModelIndexWrap::constructor.New( \
QModelIndex current = this->instance->currentIndex(); \ {Napi::External<QModelIndex>::New(env, new QModelIndex(current))}); \
auto instance = QModelIndexWrap::constructor.New( \ return instance; \
{Napi::External<QModelIndex>::New(env, new QModelIndex(current))}); \ } \
return instance; \ Napi::Value setIndexWidget(const Napi::CallbackInfo& info) { \
} \ Napi::Env env = info.Env(); \
Napi::Value setIndexWidget(const Napi::CallbackInfo& info) { \ Napi::HandleScope scope(env); \
Napi::Env env = info.Env(); \ Napi::Object indexObject = info[0].As<Napi::Object>(); \
Napi::Object indexObject = info[0].As<Napi::Object>(); \ Napi::Object widgetObject = info[1].As<Napi::Object>(); \
Napi::Object widgetObject = info[1].As<Napi::Object>(); \ QModelIndexWrap* indexWrap = \
QModelIndexWrap* indexWrap = \ Napi::ObjectWrap<QModelIndexWrap>::Unwrap(indexObject); \
Napi::ObjectWrap<QModelIndexWrap>::Unwrap(indexObject); \ NodeWidgetWrap* widgetWrap = \
NodeWidgetWrap* widgetWrap = \ Napi::ObjectWrap<NodeWidgetWrap>::Unwrap(widgetObject); \
Napi::ObjectWrap<NodeWidgetWrap>::Unwrap(widgetObject); \ this->instance->setIndexWidget(*indexWrap->getInternalInstance(), \
this->instance->setIndexWidget(*indexWrap->getInternalInstance(), \ widgetWrap->getInternalInstance()); \
widgetWrap->getInternalInstance()); \ return env.Null(); \
return env.Null(); \ } \
} \ Napi::Value indexWidget(const Napi::CallbackInfo& info) { \
Napi::Value indexWidget(const Napi::CallbackInfo& info) { \ Napi::Env env = info.Env(); \
Napi::Env env = info.Env(); \ Napi::HandleScope scope(env); \
Napi::Object indexObject = info[0].As<Napi::Object>(); \ Napi::Object indexObject = info[0].As<Napi::Object>(); \
QModelIndexWrap* indexWrap = \ QModelIndexWrap* indexWrap = \
Napi::ObjectWrap<QModelIndexWrap>::Unwrap(indexObject); \ Napi::ObjectWrap<QModelIndexWrap>::Unwrap(indexObject); \
QWidget* widget = \ QWidget* widget = \
this->instance->indexWidget(*indexWrap->getInternalInstance()); \ this->instance->indexWidget(*indexWrap->getInternalInstance()); \
auto instance = QWidgetWrap::constructor.New( \ auto instance = QWidgetWrap::constructor.New( \
{Napi::External<QWidget>::New(env, widget), \ {Napi::External<QWidget>::New(env, widget), \
Napi::Boolean::New(env, true)}); \ Napi::Boolean::New(env, true)}); \
return instance; \ return instance; \
} \ } \
Napi::Value resetHorizontalScrollMode(const Napi::CallbackInfo& info) { \ Napi::Value resetHorizontalScrollMode(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \ Napi::Env env = info.Env(); \
this->instance->resetHorizontalScrollMode(); \ Napi::HandleScope scope(env); \
return env.Null(); \ this->instance->resetHorizontalScrollMode(); \
} \ return env.Null(); \
Napi::Value resetVerticalScrollMode(const Napi::CallbackInfo& info) { \ } \
Napi::Env env = info.Env(); \ Napi::Value resetVerticalScrollMode(const Napi::CallbackInfo& info) { \
this->instance->resetVerticalScrollMode(); \ Napi::Env env = info.Env(); \
return env.Null(); \ Napi::HandleScope scope(env); \
} \ this->instance->resetVerticalScrollMode(); \
Napi::Value rootIndex(const Napi::CallbackInfo& info) { \ return env.Null(); \
Napi::Env env = info.Env(); \ } \
QModelIndex root = this->instance->rootIndex(); \ Napi::Value rootIndex(const Napi::CallbackInfo& info) { \
auto instance = QModelIndexWrap::constructor.New( \ Napi::Env env = info.Env(); \
{Napi::External<QModelIndex>::New(env, new QModelIndex(root))}); \ Napi::HandleScope scope(env); \
return instance; \ QModelIndex root = this->instance->rootIndex(); \
} \ auto instance = QModelIndexWrap::constructor.New( \
Napi::Value scrollToBottom(const Napi::CallbackInfo& info) { \ {Napi::External<QModelIndex>::New(env, new QModelIndex(root))}); \
Napi::Env env = info.Env(); \ return instance; \
this->instance->scrollToBottom(); \ } \
return env.Null(); \ Napi::Value scrollToBottom(const Napi::CallbackInfo& info) { \
} \ Napi::Env env = info.Env(); \
Napi::Value scrollToTop(const Napi::CallbackInfo& info) { \ Napi::HandleScope scope(env); \
Napi::Env env = info.Env(); \ this->instance->scrollToBottom(); \
this->instance->scrollToTop(); \ return env.Null(); \
return env.Null(); \ } \
} \ Napi::Value scrollToTop(const Napi::CallbackInfo& info) { \
Napi::Value setModel(const Napi::CallbackInfo& info) { \ Napi::Env env = info.Env(); \
Napi::Env env = info.Env(); \ Napi::HandleScope scope(env); \
Napi::Object modelObject = info[0].As<Napi::Object>(); \ this->instance->scrollToTop(); \
QAbstractItemModelWrap* modelWrap = \ return env.Null(); \
Napi::ObjectWrap<QAbstractItemModelWrap>::Unwrap(modelObject); \
QAbstractItemView* instance = this->instance; \
instance->setModel(modelWrap->getInternalInstance()); \
return env.Null(); \
} \
Napi::Value closePersistentEditor(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
QModelIndexWrap* indexWrap = \
Napi::ObjectWrap<QModelIndexWrap>::Unwrap(info[0].As<Napi::Object>()); \
QModelIndex* index = indexWrap->getInternalInstance(); \
this->instance->QAbstractItemView::closePersistentEditor(*index); \
return env.Null(); \
} \
Napi::Value clearSelection(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
this->instance->clearSelection(); \
return env.Null(); \
} \
Napi::Value edit(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
QModelIndexWrap* indexWrap = \
Napi::ObjectWrap<QModelIndexWrap>::Unwrap(info[0].As<Napi::Object>()); \
QModelIndex* index = indexWrap->getInternalInstance(); \
this->instance->edit(*index); \
return env.Null(); \
} \
Napi::Value reset(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
this->instance->reset(); \
return env.Null(); \
} \
Napi::Value selectAll(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
this->instance->selectAll(); \
return env.Null(); \
} \
Napi::Value setRootIndex(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
QModelIndexWrap* indexWrap = \
Napi::ObjectWrap<QModelIndexWrap>::Unwrap(info[0].As<Napi::Object>()); \
QModelIndex* index = indexWrap->getInternalInstance(); \
this->instance->setRootIndex(*index); \
return env.Null(); \
} \
Napi::Value update_QModelIndex(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
QModelIndexWrap* indexWrap = \
Napi::ObjectWrap<QModelIndexWrap>::Unwrap(info[0].As<Napi::Object>()); \
QModelIndex* index = indexWrap->getInternalInstance(); \
this->instance->update(*index); \
return env.Null(); \
} \
Napi::Value selectionModel(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
QItemSelectionModel* model = this->instance->selectionModel(); \
return WrapperCache::instance.getWrapper(env, model); \
} \
Napi::Value isPersistentEditorOpen(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
QModelIndexWrap* indexWrap = \
Napi::ObjectWrap<QModelIndexWrap>::Unwrap(info[0].As<Napi::Object>()); \
QModelIndex* index = indexWrap->getInternalInstance(); \
bool result = this->instance->isPersistentEditorOpen(*index); \
return Napi::Boolean::New(env, result); \
} \
Napi::Value openPersistentEditor(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
QModelIndexWrap* indexWrap = \
Napi::ObjectWrap<QModelIndexWrap>::Unwrap(info[0].As<Napi::Object>()); \
QModelIndex* index = indexWrap->getInternalInstance(); \
this->instance->QAbstractItemView::openPersistentEditor(*index); \
return env.Null(); \
} \
Napi::Value keyboardSearch(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
std::string searchNapiText = info[0].As<Napi::String>().Utf8Value(); \
QString search = QString::fromUtf8(searchNapiText.c_str()); \
this->instance->keyboardSearch(search); \
return env.Null(); \
} \
Napi::Value setItemDelegate(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
if (info[0].IsNull()) { \
this->instance->setItemDelegate(nullptr); \
} else { \
QAbstractItemDelegateWrap* delegateWrap = \
Napi::ObjectWrap<QAbstractItemDelegateWrap>::Unwrap( \
info[0].As<Napi::Object>()); \
QAbstractItemDelegate* delegate = delegateWrap->getInternalInstance(); \
this->instance->setItemDelegate(delegate); \
} \
return env.Null(); \
} \
Napi::Value setItemDelegateForColumn(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
int column = info[0].As<Napi::Number>().Int32Value(); \
if (info[1].IsNull()) { \
this->instance->setItemDelegateForColumn(column, nullptr); \
} else { \
QAbstractItemDelegateWrap* delegateWrap = \
Napi::ObjectWrap<QAbstractItemDelegateWrap>::Unwrap( \
info[1].As<Napi::Object>()); \
QAbstractItemDelegate* delegate = delegateWrap->getInternalInstance(); \
this->instance->setItemDelegateForColumn(column, delegate); \
} \
return env.Null(); \
} \
Napi::Value setItemDelegateForRow(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
int row = info[0].As<Napi::Number>().Int32Value(); \
if (info[1].IsNull()) { \
this->instance->setItemDelegateForRow(row, nullptr); \
} else { \
QAbstractItemDelegateWrap* delegateWrap = \
Napi::ObjectWrap<QAbstractItemDelegateWrap>::Unwrap( \
info[1].As<Napi::Object>()); \
QAbstractItemDelegate* delegate = delegateWrap->getInternalInstance(); \
this->instance->setItemDelegateForRow(row, delegate); \
} \
return env.Null(); \
} \
Napi::Value sizeHintForIndex(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
QModelIndexWrap* indexWrap = \
Napi::ObjectWrap<QModelIndexWrap>::Unwrap(info[0].As<Napi::Object>()); \
QModelIndex* index = indexWrap->getInternalInstance(); \
QSize result = this->instance->sizeHintForIndex(*index); \
auto resultInstance = QSizeWrap::constructor.New( \
{Napi::External<QSize>::New(env, new QSize(result))}); \
return resultInstance; \
}
#define QABSTRACTITEMVIEW_WRAPPED_METHODS_DECLARATION \
QABSTRACTITEMVIEW_WRAPPED_METHODS_DECLARATION_NO_QHEADERVIEW_PROTECTED \
Napi::Value indexAt(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
QPointWrap* pointWrap = \
Napi::ObjectWrap<QPointWrap>::Unwrap(info[0].As<Napi::Object>()); \
QPoint* point = pointWrap->getInternalInstance(); \
QModelIndex result = this->instance->indexAt(*point); \
auto resultInstance = QModelIndexWrap::constructor.New( \
{Napi::External<QModelIndex>::New(env, new QModelIndex(result))}); \
return resultInstance; \
} \
Napi::Value scrollTo(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
QModelIndexWrap* indexWrap = \
Napi::ObjectWrap<QModelIndexWrap>::Unwrap(info[0].As<Napi::Object>()); \
QModelIndex* index = indexWrap->getInternalInstance(); \
QAbstractItemView::ScrollHint hint = \
static_cast<QAbstractItemView::ScrollHint>( \
info[1].As<Napi::Number>().Int32Value()); \
this->instance->scrollTo(*index, hint); \
return env.Null(); \
} \
Napi::Value visualRect(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
QModelIndexWrap* indexWrap = \
Napi::ObjectWrap<QModelIndexWrap>::Unwrap(info[0].As<Napi::Object>()); \
QModelIndex* index = indexWrap->getInternalInstance(); \
QRect ret = this->instance->visualRect(*index); \
auto instance = QRectWrap::constructor.New( \
{Napi::External<QRect>::New(env, new QRect(ret))}); \
return instance; \
} }
#endif // QABSTRACTITEMVIEW_WRAPPED_METHODS_DECLARATION #endif // QABSTRACTITEMVIEW_WRAPPED_METHODS_DECLARATION
#ifndef QABSTRACTITEMVIEW_WRAPPED_METHODS_EXPORT_DEFINE #ifndef QABSTRACTITEMVIEW_WRAPPED_METHODS_EXPORT_DEFINE
#define QABSTRACTITEMVIEW_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \ #define QABSTRACTITEMVIEW_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \
QABSTRACTSCROLLAREA_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \ QABSTRACTSCROLLAREA_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \
InstanceMethod("setCurrentIndex", &WidgetWrapName::setCurrentIndex), \ InstanceMethod("setCurrentIndex", &WidgetWrapName::setCurrentIndex), \
InstanceMethod("currentIndex", &WidgetWrapName::currentIndex), \ InstanceMethod("currentIndex", &WidgetWrapName::currentIndex), \
InstanceMethod("setIndexWidget", &WidgetWrapName::setIndexWidget), \ InstanceMethod("setIndexWidget", &WidgetWrapName::setIndexWidget), \
InstanceMethod("indexWidget", &WidgetWrapName::indexWidget), \ InstanceMethod("indexWidget", &WidgetWrapName::indexWidget), \
InstanceMethod("resetHorizontalScrollMode", \ InstanceMethod("resetHorizontalScrollMode", \
&WidgetWrapName::resetHorizontalScrollMode), \ &WidgetWrapName::resetHorizontalScrollMode), \
InstanceMethod("resetVerticalScrollMode", \ InstanceMethod("resetVerticalScrollMode", \
&WidgetWrapName::resetVerticalScrollMode), \ &WidgetWrapName::resetVerticalScrollMode), \
InstanceMethod("rootIndex", &WidgetWrapName::rootIndex), \ InstanceMethod("rootIndex", &WidgetWrapName::rootIndex), \
InstanceMethod("scrollToBottom", &WidgetWrapName::scrollToBottom), \ InstanceMethod("scrollToBottom", &WidgetWrapName::scrollToBottom), \
InstanceMethod("scrollToTop", &WidgetWrapName::scrollToTop), \ InstanceMethod("scrollToTop", &WidgetWrapName::scrollToTop),
InstanceMethod("setModel", &WidgetWrapName::setModel), \
InstanceMethod("closePersistentEditor", \
&WidgetWrapName::closePersistentEditor), \
InstanceMethod("clearSelection", &WidgetWrapName::clearSelection), \
InstanceMethod("edit", &WidgetWrapName::edit), \
InstanceMethod("reset", &WidgetWrapName::reset), \
InstanceMethod("selectAll", &WidgetWrapName::selectAll), \
InstanceMethod("setRootIndex", &WidgetWrapName::setRootIndex), \
InstanceMethod("update_QModelIndex", \
&WidgetWrapName::update_QModelIndex), \
InstanceMethod("indexAt", &WidgetWrapName::indexAt), \
InstanceMethod("selectionModel", &WidgetWrapName::selectionModel), \
InstanceMethod("scrollTo", &WidgetWrapName::scrollTo), \
InstanceMethod("isPersistentEditorOpen", \
&WidgetWrapName::isPersistentEditorOpen), \
InstanceMethod("openPersistentEditor", \
&WidgetWrapName::openPersistentEditor), \
InstanceMethod("keyboardSearch", &WidgetWrapName::keyboardSearch), \
InstanceMethod("setItemDelegate", &WidgetWrapName::setItemDelegate), \
InstanceMethod("setItemDelegateForColumn", \
&WidgetWrapName::setItemDelegateForColumn), \
InstanceMethod("setItemDelegateForRow", \
&WidgetWrapName::setItemDelegateForRow), \
InstanceMethod("visualRect", &WidgetWrapName::visualRect), \
InstanceMethod("sizeHintForIndex", &WidgetWrapName::sizeHintForIndex),
#endif // QABSTRACTITEMVIEW_WRAPPED_METHODS_EXPORT_DEFINE #endif // QABSTRACTITEMVIEW_WRAPPED_METHODS_EXPORT_DEFINE
#ifndef QABSTRACTITEMVIEW_SIGNALS #ifndef QABSTRACTITEMVIEW_SIGNALS
#define QABSTRACTITEMVIEW_SIGNALS \ #define QABSTRACTITEMVIEW_SIGNALS \
QABSTRACTSCROLLAREA_SIGNALS \ QABSTRACTSCROLLAREA_SIGNALS \
QObject::connect( \ QObject::connect(this, &QAbstractItemView::viewportEntered, [=]() { \
this, &QAbstractItemView::activated, [=](const QModelIndex& index) { \ Napi::Env env = this->emitOnNode.Env(); \
Napi::Env env = this->emitOnNode.Env(); \ Napi::HandleScope scope(env); \
Napi::HandleScope scope(env); \ this->emitOnNode.Call({Napi::String::New(env, "viewportEntered")}); \
auto indexInstance = QModelIndexWrap::constructor.New( \
{Napi::External<QModelIndex>::New(env, new QModelIndex(index))}); \
this->emitOnNode.Call( \
{Napi::String::New(env, "activated"), indexInstance}); \
}); \
QObject::connect( \
this, &QAbstractItemView::clicked, [=](const QModelIndex& index) { \
Napi::Env env = this->emitOnNode.Env(); \
Napi::HandleScope scope(env); \
auto indexInstance = QModelIndexWrap::constructor.New( \
{Napi::External<QModelIndex>::New(env, new QModelIndex(index))}); \
this->emitOnNode.Call( \
{Napi::String::New(env, "clicked"), indexInstance}); \
}); \
QObject::connect( \
this, &QAbstractItemView::doubleClicked, [=](const QModelIndex& index) { \
Napi::Env env = this->emitOnNode.Env(); \
Napi::HandleScope scope(env); \
auto indexInstance = QModelIndexWrap::constructor.New( \
{Napi::External<QModelIndex>::New(env, new QModelIndex(index))}); \
this->emitOnNode.Call( \
{Napi::String::New(env, "doubleClicked"), indexInstance}); \
}); \
QObject::connect( \
this, &QAbstractItemView::entered, [=](const QModelIndex& index) { \
Napi::Env env = this->emitOnNode.Env(); \
Napi::HandleScope scope(env); \
auto indexInstance = QModelIndexWrap::constructor.New( \
{Napi::External<QModelIndex>::New(env, new QModelIndex(index))}); \
this->emitOnNode.Call( \
{Napi::String::New(env, "entered"), indexInstance}); \
}); \
QObject::connect( \
this, &QAbstractItemView::iconSizeChanged, [=](const QSize& size) { \
Napi::Env env = this->emitOnNode.Env(); \
Napi::HandleScope scope(env); \
auto sizeInstance = QSizeWrap::constructor.New( \
{Napi::External<QSize>::New(env, new QSize(size))}); \
this->emitOnNode.Call( \
{Napi::String::New(env, "iconSizeChanged"), sizeInstance}); \
}); \
QObject::connect( \
this, &QAbstractItemView::pressed, [=](const QModelIndex& index) { \
Napi::Env env = this->emitOnNode.Env(); \
Napi::HandleScope scope(env); \
auto indexInstance = QModelIndexWrap::constructor.New( \
{Napi::External<QModelIndex>::New(env, new QModelIndex(index))}); \
this->emitOnNode.Call( \
{Napi::String::New(env, "pressed"), indexInstance}); \
}); \
QObject::connect(this, &QAbstractItemView::viewportEntered, [=]() { \
Napi::Env env = this->emitOnNode.Env(); \
Napi::HandleScope scope(env); \
this->emitOnNode.Call({Napi::String::New(env, "viewportEntered")}); \
}); });
#endif // QABSTRACTITEMVIEW_SIGNALS #endif // QABSTRACTITEMVIEW_SIGNALS

View File

@ -1,8 +1,6 @@
#pragma once #pragma once
#include "QtCore/QSize/qsize_wrap.h"
#include "QtWidgets/QFrame/qframe_macro.h" #include "QtWidgets/QFrame/qframe_macro.h"
#include "QtWidgets/QScrollBar/qscrollbar_wrap.h"
#include "QtWidgets/QWidget/qwidget_wrap.h" #include "QtWidgets/QWidget/qwidget_wrap.h"
/* /*
@ -13,86 +11,40 @@
*/ */
#ifndef QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION #ifndef QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION
#define QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION \ #define QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION \
\ \
QFRAME_WRAPPED_METHODS_DECLARATION \ QFRAME_WRAPPED_METHODS_DECLARATION \
\ \
Napi::Value maximumViewportSize(const Napi::CallbackInfo& info) { \ Napi::Value setViewport(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \ Napi::Env env = info.Env(); \
QSize size = this->instance->maximumViewportSize(); \ Napi::HandleScope scope(env); \
auto instance = QSizeWrap::constructor.New( \ Napi::Object viewPortObject = info[0].As<Napi::Object>(); \
{Napi::External<QSize>::New(env, new QSize(size))}); \ NodeWidgetWrap* viewPortWidgetWrap = \
return instance; \ Napi::ObjectWrap<NodeWidgetWrap>::Unwrap(viewPortObject); \
} \ QWidget* viewPort = viewPortWidgetWrap->getInternalInstance(); \
\ this->instance->setViewport(viewPort); \
Napi::Value setHorizontalScrollBar(const Napi::CallbackInfo& info) { \ return env.Null(); \
Napi::Env env = info.Env(); \ } \
Napi::Object scrollBarObject = info[0].As<Napi::Object>(); \ \
QScrollBarWrap* scrollBarWrap = \ Napi::Value viewport(const Napi::CallbackInfo& info) { \
Napi::ObjectWrap<QScrollBarWrap>::Unwrap(scrollBarObject); \ Napi::Env env = info.Env(); \
QScrollBar* scrollBar = scrollBarWrap->getInternalInstance(); \ Napi::HandleScope scope(env); \
this->instance->setHorizontalScrollBar(scrollBar); \ QWidget* viewPort = this->instance->viewport(); \
return env.Null(); \ NWidget* nviewPort = reinterpret_cast<NWidget*>(viewPort); \
} \ auto instance = QWidgetWrap::constructor.New( \
\ {Napi::External<NWidget>::New(env, nviewPort)}); \
Napi::Value setVerticalScrollBar(const Napi::CallbackInfo& info) { \ return instance; \
Napi::Env env = info.Env(); \
Napi::Object scrollBarObject = info[0].As<Napi::Object>(); \
QScrollBarWrap* scrollBarWrap = \
Napi::ObjectWrap<QScrollBarWrap>::Unwrap(scrollBarObject); \
QScrollBar* scrollBar = scrollBarWrap->getInternalInstance(); \
this->instance->setVerticalScrollBar(scrollBar); \
return env.Null(); \
} \
\
Napi::Value setViewport(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
Napi::Object viewPortObject = info[0].As<Napi::Object>(); \
NodeWidgetWrap* viewPortWidgetWrap = \
Napi::ObjectWrap<NodeWidgetWrap>::Unwrap(viewPortObject); \
QWidget* viewPort = viewPortWidgetWrap->getInternalInstance(); \
this->instance->setViewport(viewPort); \
return env.Null(); \
} \
\
Napi::Value viewport(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
QWidget* viewPort = this->instance->viewport(); \
auto instance = WrapperCache::instance.getWrapper(env, viewPort); \
return instance; \
} \
\
Napi::Value horizontalScrollBar(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
QScrollBar* scrollBar = this->instance->horizontalScrollBar(); \
auto instance = WrapperCache::instance.getWrapper(env, scrollBar); \
return instance; \
} \
\
Napi::Value verticalScrollBar(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \
QScrollBar* scrollBar = this->instance->verticalScrollBar(); \
auto instance = WrapperCache::instance.getWrapper(env, scrollBar); \
return instance; \
} }
#endif // QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION #endif // QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION
#ifndef QABSTRACTSCROLLAREA_WRAPPED_METHODS_EXPORT_DEFINE #ifndef QABSTRACTSCROLLAREA_WRAPPED_METHODS_EXPORT_DEFINE
#define QABSTRACTSCROLLAREA_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \ #define QABSTRACTSCROLLAREA_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \
\ \
QFRAME_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \ QFRAME_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \
\ \
InstanceMethod("maximumViewportSize", &WidgetWrapName::maximumViewportSize), \ InstanceMethod("setViewport", &WidgetWrapName::setViewport), \
InstanceMethod("setHorizontalScrollBar", \ InstanceMethod("viewport", &WidgetWrapName::viewport),
&WidgetWrapName::setVerticalScrollBar), \
InstanceMethod("setVerticalScrollBar", \
&WidgetWrapName::setVerticalScrollBar), \
InstanceMethod("setViewport", &WidgetWrapName::setViewport), \
InstanceMethod("viewport", &WidgetWrapName::viewport), \
InstanceMethod("horizontalScrollBar", \
&WidgetWrapName::horizontalScrollBar), \
InstanceMethod("verticalScrollBar", &WidgetWrapName::verticalScrollBar),
#endif // QABSTRACTSCROLLAREA_WRAPPED_METHODS_EXPORT_DEFINE #endif // QABSTRACTSCROLLAREA_WRAPPED_METHODS_EXPORT_DEFINE

View File

@ -14,6 +14,7 @@
QWIDGET_WRAPPED_METHODS_DECLARATION \ QWIDGET_WRAPPED_METHODS_DECLARATION \
Napi::Value triggerAction(const Napi::CallbackInfo& info) { \ Napi::Value triggerAction(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \ Napi::Env env = info.Env(); \
Napi::HandleScope scope(env); \
int action = info[0].As<Napi::Number>().Int32Value(); \ int action = info[0].As<Napi::Number>().Int32Value(); \
this->instance->triggerAction( \ this->instance->triggerAction( \
static_cast<QAbstractSlider::SliderAction>(action)); \ static_cast<QAbstractSlider::SliderAction>(action)); \
@ -21,6 +22,7 @@
} \ } \
Napi::Value setRange(const Napi::CallbackInfo& info) { \ Napi::Value setRange(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \ Napi::Env env = info.Env(); \
Napi::HandleScope scope(env); \
int min = info[0].As<Napi::Number>().Int32Value(); \ int min = info[0].As<Napi::Number>().Int32Value(); \
int max = info[1].As<Napi::Number>().Int32Value(); \ int max = info[1].As<Napi::Number>().Int32Value(); \
this->instance->setRange(min, max); \ this->instance->setRange(min, max); \

View File

@ -15,16 +15,19 @@
QWIDGET_WRAPPED_METHODS_DECLARATION \ QWIDGET_WRAPPED_METHODS_DECLARATION \
Napi::Value selectAll(const Napi::CallbackInfo& info) { \ Napi::Value selectAll(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \ Napi::Env env = info.Env(); \
Napi::HandleScope scope(env); \
this->instance->selectAll(); \ this->instance->selectAll(); \
return env.Null(); \ return env.Null(); \
} \ } \
Napi::Value stepDown(const Napi::CallbackInfo& info) { \ Napi::Value stepDown(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \ Napi::Env env = info.Env(); \
Napi::HandleScope scope(env); \
this->instance->stepDown(); \ this->instance->stepDown(); \
return env.Null(); \ return env.Null(); \
} \ } \
Napi::Value stepUp(const Napi::CallbackInfo& info) { \ Napi::Value stepUp(const Napi::CallbackInfo& info) { \
Napi::Env env = info.Env(); \ Napi::Env env = info.Env(); \
Napi::HandleScope scope(env); \
this->instance->stepUp(); \ this->instance->stepUp(); \
return env.Null(); \ return env.Null(); \
} }

View File

@ -11,7 +11,7 @@ class DLL_EXPORT NAction : public QAction, public EventWidget {
EVENTWIDGET_IMPLEMENTATIONS(QAction) EVENTWIDGET_IMPLEMENTATIONS(QAction)
public: public:
using QAction::QAction; // inherit all constructors of QAction using QAction::QAction; // inherit all constructors of QAction
virtual void connectSignalsToEventEmitter() { void connectSignalsToEventEmitter() {
// Qt Connects: Implement all signal connects here // Qt Connects: Implement all signal connects here
QOBJECT_SIGNALS QOBJECT_SIGNALS
QObject::connect(this, &QAction::triggered, [=](bool checked) { QObject::connect(this, &QAction::triggered, [=](bool checked) {

Some files were not shown because too many files have changed in this diff Show More