Compare commits
273 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f41edc2ea4 | ||
|
|
30ab4442cf | ||
|
|
90e556be6e | ||
|
|
e9ff6a93fb | ||
|
|
5879ad7ec4 | ||
|
|
731d186b01 | ||
|
|
47d98500cf | ||
|
|
2561fd92f9 | ||
|
|
9129cdef0d | ||
|
|
613ee337aa | ||
|
|
bd6595e40a | ||
|
|
d827e51ba4 | ||
|
|
77fd5c5a3f | ||
|
|
a2e5b73107 | ||
|
|
4e42f61faa | ||
|
|
3a04d14872 | ||
|
|
e18e912d11 | ||
|
|
15478751db | ||
|
|
d715a4299d | ||
|
|
09d450aef4 | ||
|
|
e5fd79e4c1 | ||
|
|
86fc6689fb | ||
|
|
d6ba15df55 | ||
|
|
86e9447dd0 | ||
|
|
29e919caad | ||
|
|
88e5149a9f | ||
|
|
33c0b24731 | ||
|
|
d4c443607e | ||
|
|
6422d7faca | ||
|
|
1468612a78 | ||
|
|
bbb0951525 | ||
|
|
47083b4a86 | ||
|
|
5a51e2748b | ||
|
|
93dbf25938 | ||
|
|
898c7f58c9 | ||
|
|
b7d503fd39 | ||
|
|
95da509b83 | ||
|
|
34c8f511d9 | ||
|
|
3f0d00c83c | ||
|
|
79433a5c83 | ||
|
|
abc1d2cf64 | ||
|
|
f7c4d5dfae | ||
|
|
2305b7072b | ||
|
|
643eff4a90 | ||
|
|
e2e06ca027 | ||
|
|
a7df290d58 | ||
|
|
123524d126 | ||
|
|
28b98b055a | ||
|
|
76743cd414 | ||
|
|
9fcc5e99d3 | ||
|
|
4a55d9ec45 | ||
|
|
7d690dc75d | ||
|
|
2ece6d5375 | ||
|
|
421929c147 | ||
|
|
755156c19a | ||
|
|
43deec1c9e | ||
|
|
e20517430e | ||
|
|
16940eca53 | ||
|
|
37d000ee44 | ||
|
|
0db724d40c | ||
|
|
1da7ae6de3 | ||
|
|
1b3478e0cb | ||
|
|
11bf45466d | ||
|
|
b36caeddd2 | ||
|
|
f606ebdd72 | ||
|
|
0f9ad1e028 | ||
|
|
fcdbfb07c3 | ||
|
|
06637c6c0f | ||
|
|
c28fd5d5c3 | ||
|
|
d450841001 | ||
|
|
5191892950 | ||
|
|
bfa531f1f4 | ||
|
|
6aa3f00fa3 | ||
|
|
f3d7d73acc | ||
|
|
880ea7c998 | ||
|
|
bc9bf12e11 | ||
|
|
02f901ddf1 | ||
|
|
cbb3f99dfa | ||
|
|
7bf97ef618 | ||
|
|
1d92cc8f3e | ||
|
|
9faf63d5d3 | ||
|
|
7dcbc32540 | ||
|
|
387555f3c0 | ||
|
|
10ebd00cde | ||
|
|
fda93e9dd5 | ||
|
|
23759b1aaa | ||
|
|
165bb820bc | ||
|
|
83e9c09690 | ||
|
|
b7476a4ea1 | ||
|
|
38b12759c6 | ||
|
|
c6d30f8f9f | ||
|
|
4f40510248 | ||
|
|
c733a41d10 | ||
|
|
81c31f4de3 | ||
|
|
ac1c118ae3 | ||
|
|
7d2dfc1cf2 | ||
|
|
0c2cf50362 | ||
|
|
a485be9c1e | ||
|
|
e2ccec9ba3 | ||
|
|
7d8fb77481 | ||
|
|
4c5ccadfc7 | ||
|
|
69d0e2e3cd | ||
|
|
733c24e6cd | ||
|
|
4155a1f586 | ||
|
|
34ce565bb8 | ||
|
|
d805c7c66d | ||
|
|
3291216bbb | ||
|
|
eb6754fe8a | ||
|
|
b4c9c0d51b | ||
|
|
8058433031 | ||
|
|
c877a2814e | ||
|
|
2865212937 | ||
|
|
ed7da32952 | ||
|
|
a0b53f2e0c | ||
|
|
714bdcbdbb | ||
|
|
a2fd884543 | ||
|
|
93c6c121f6 | ||
|
|
dab7eee4ad | ||
|
|
f90ae67864 | ||
|
|
ddb560abbf | ||
|
|
5de4210cfb | ||
|
|
daf730efd5 | ||
|
|
c61c9c085d | ||
|
|
e0dfc94363 | ||
|
|
9b451ecac3 | ||
|
|
26736d06c8 | ||
|
|
01d3c03fb2 | ||
|
|
b783bbe6d6 | ||
|
|
640c77dd56 | ||
|
|
b6ae8ad1cc | ||
|
|
c5e2485e0e | ||
|
|
de2ce99fdd | ||
|
|
0867b96302 | ||
|
|
78895a002f | ||
|
|
9f9e61289b | ||
|
|
69dea9c4c8 | ||
|
|
94ce790891 | ||
|
|
21ed97037a | ||
|
|
1ab7d13b96 | ||
|
|
47b3d514bb | ||
|
|
e653c3ad1d | ||
|
|
0e33e39759 | ||
|
|
d11ed993ee | ||
|
|
8d4a7f2d00 | ||
|
|
06528cdd67 | ||
|
|
0d71db9b24 | ||
|
|
05a5fdd539 | ||
|
|
b35f386e46 | ||
|
|
59a4f4abb4 | ||
|
|
7ae4a5cb7e | ||
|
|
2dc8319b50 | ||
|
|
eea4f6fe30 | ||
|
|
c44d40b2e5 | ||
|
|
88b2fcbcd1 | ||
|
|
f7f86d5cfa | ||
|
|
2b2d2a65b2 | ||
|
|
123123605c | ||
|
|
710cfa3d31 | ||
|
|
05c690dcd9 | ||
|
|
fa52c674ef | ||
|
|
8ce6dde45b | ||
|
|
bfd45b3a54 | ||
|
|
8ddc4172cd | ||
|
|
81eeaa3a20 | ||
|
|
47c00fabc1 | ||
|
|
3bbb7da6e7 | ||
|
|
c4d9a93e56 | ||
|
|
f92bd65407 | ||
|
|
c91856641c | ||
|
|
3479606f83 | ||
|
|
797835ad79 | ||
|
|
96b3cbe594 | ||
|
|
3ada99b201 | ||
|
|
bd6b127358 | ||
|
|
481062423e | ||
|
|
328dcea8c8 | ||
|
|
f8ed7d3a78 | ||
|
|
12d79a62da | ||
|
|
c7b2e4c8b7 | ||
|
|
91d652ed84 | ||
|
|
590385339c | ||
|
|
44bb1e5f0e | ||
|
|
a4a961666a | ||
|
|
7af718b834 | ||
|
|
8060a631b1 | ||
|
|
01096abede | ||
|
|
8110982412 | ||
|
|
4429959fed | ||
|
|
920e64404d | ||
|
|
87af1db2bc | ||
|
|
391971f80b | ||
|
|
5aab3ed97d | ||
|
|
e6f838375a | ||
|
|
907acb5ad2 | ||
|
|
b6fc24d6e0 | ||
|
|
1b399ef5be | ||
|
|
c3c597df4d | ||
|
|
25f529757e | ||
|
|
edf437f056 | ||
|
|
8c79f3d093 | ||
|
|
55217146ae | ||
|
|
456824c504 | ||
|
|
4f0f64884d | ||
|
|
1f11f1cf8b | ||
|
|
d81b781d1f | ||
|
|
053fc9dc65 | ||
|
|
11c33771c2 | ||
|
|
5fd23f0ba3 | ||
|
|
c209fe2adc | ||
|
|
940351acbe | ||
|
|
f7a4a4d3d1 | ||
|
|
e81b5ae658 | ||
|
|
588093519a | ||
|
|
3a83a7fe62 | ||
|
|
b5a9f30d34 | ||
|
|
25026a55f7 | ||
|
|
467231d4b7 | ||
|
|
3aeb4b09bf | ||
|
|
9eed41ecd8 | ||
|
|
25e0d61e01 | ||
|
|
080bb3626d | ||
|
|
c26a194694 | ||
|
|
a577689cd4 | ||
|
|
d3f6d6d092 | ||
|
|
87e6531c65 | ||
|
|
faa6adcb23 | ||
|
|
880a8433cb | ||
|
|
f319a24ad3 | ||
|
|
17462abae7 | ||
|
|
978526c4e6 | ||
|
|
2901d09d01 | ||
|
|
af64c4820f | ||
|
|
0d01354737 | ||
|
|
d04364a186 | ||
|
|
4a66c65034 | ||
|
|
4eebad6f5f | ||
|
|
281a89508b | ||
|
|
f38c50724d | ||
|
|
76d737340e | ||
|
|
6edf90ee97 | ||
|
|
1b1647892d | ||
|
|
7863875641 | ||
|
|
39edc4e382 | ||
|
|
3f26303d6e | ||
|
|
37fed9dde7 | ||
|
|
d5800fd92f | ||
|
|
a1070a7c26 | ||
|
|
8549a4e1de | ||
|
|
06d735fe89 | ||
|
|
bcd1f8ea0b | ||
|
|
e6d01fc7f5 | ||
|
|
4adef0a280 | ||
|
|
b8a94d8db5 | ||
|
|
1bc346d22c | ||
|
|
1d2a0a6f47 | ||
|
|
f4e0ca1677 | ||
|
|
b5d7e957cf | ||
|
|
2b26ea4ddd | ||
|
|
52d122583e | ||
|
|
8e0e4568fe | ||
|
|
a59274c371 | ||
|
|
d0e9f67a25 | ||
|
|
b2485f6133 | ||
|
|
953b553089 | ||
|
|
4db29780e0 | ||
|
|
69e6d8d6e2 | ||
|
|
5b8eef255d | ||
|
|
a77d2d67f6 | ||
|
|
8f7bde6e0a | ||
|
|
b7ad6ed815 | ||
|
|
99978de2ab | ||
|
|
37cefe6d61 | ||
|
|
6c016c5913 |
@ -384,6 +384,24 @@
|
||||
"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,
|
||||
|
||||
@ -12,7 +12,6 @@ module.exports = {
|
||||
parser: '@typescript-eslint/parser', // Specifies the ESLint parser
|
||||
extends: [
|
||||
'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.
|
||||
],
|
||||
parserOptions: {
|
||||
@ -23,6 +22,7 @@ module.exports = {
|
||||
'@typescript-eslint/camelcase': 0,
|
||||
'@typescript-eslint/no-var-requires': 0,
|
||||
'@typescript-eslint/no-explicit-any': 0,
|
||||
'@typescript-eslint/no-unused-vars': ['warn', { args: 'none' }],
|
||||
},
|
||||
},
|
||||
],
|
||||
|
||||
8
.github/workflows/docs.yml
vendored
8
.github/workflows/docs.yml
vendored
@ -9,10 +9,10 @@ jobs:
|
||||
gh-release:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/setup-node@v1
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: '14.x'
|
||||
node-version: '16.x'
|
||||
- name: Add key to allow access to repository
|
||||
env:
|
||||
SSH_AUTH_SOCK: /tmp/ssh_agent.sock
|
||||
@ -33,7 +33,7 @@ jobs:
|
||||
run: |
|
||||
git config --global user.email "actions@gihub.com"
|
||||
git config --global user.name "gh-actions"
|
||||
npm install --ignore-scripts
|
||||
yarn install --ignore-scripts
|
||||
npm run docs
|
||||
cd website
|
||||
if [ -e yarn.lock ]; then
|
||||
|
||||
21
.github/workflows/latest.yml
vendored
21
.github/workflows/latest.yml
vendored
@ -7,17 +7,20 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-18.04]
|
||||
os: [ubuntu-20.04]
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
- uses: actions/setup-node@master
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: '13.x'
|
||||
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 --ignore-scripts
|
||||
run: npm install
|
||||
- name: Build nodegui
|
||||
run: npx tsc
|
||||
run: npm run build
|
||||
- name: Archive using npm pack
|
||||
run: npm --no-git-tag-version version 0.0.0-latest-master && npm pack
|
||||
- uses: actions/upload-artifact@v1
|
||||
@ -30,10 +33,10 @@ jobs:
|
||||
code: v0.0.0-latest-master
|
||||
name: Latest Master Release
|
||||
body: >
|
||||
Latest auto release corresponding to commit ${{github.sha}} 🔥.
|
||||
To install do:
|
||||
Latest auto release corresponding to commit ${{github.sha}} 🔥.
|
||||
To install do:
|
||||
`npm install https://github.com/nodegui/nodegui/releases/download/v0.0.0-latest-master/nodegui-master.tgz`
|
||||
or
|
||||
or
|
||||
`npm install http://master-release.nodegui.org`
|
||||
assets: >
|
||||
nodegui-nodegui-0.0.0-latest-master.tgz:nodegui-master.tgz:application/tar+gzip
|
||||
|
||||
38
.github/workflows/prebuild.yml
vendored
38
.github/workflows/prebuild.yml
vendored
@ -1,38 +0,0 @@
|
||||
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 }}
|
||||
97
.github/workflows/release.yml
vendored
Normal file
97
.github/workflows/release.yml
vendored
Normal file
@ -0,0 +1,97 @@
|
||||
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
|
||||
14
.github/workflows/test.yml
vendored
14
.github/workflows/test.yml
vendored
@ -6,20 +6,22 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-18.04, windows-latest, macos-latest]
|
||||
os: [ubuntu-20.04, windows-latest, macos-latest]
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
- uses: actions/setup-node@master
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: '13.x'
|
||||
node-version: '16.x'
|
||||
- name: Install ubuntu deps
|
||||
if: contains(matrix.os, 'ubuntu')
|
||||
run: sudo apt install mesa-common-dev libglu1-mesa-dev
|
||||
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: Run tests
|
||||
run: npm run test
|
||||
- name: Run linters for cpp
|
||||
|
||||
@ -11,6 +11,10 @@ set(CORE_WIDGETS_ADDON "nodegui_core")
|
||||
|
||||
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
|
||||
"${CMAKE_JS_SRC}"
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/main.cpp"
|
||||
@ -24,6 +28,8 @@ add_library(${CORE_WIDGETS_ADDON} SHARED
|
||||
"${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/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
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/include/deps/yoga/log.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/include/deps/yoga/Utils.cpp"
|
||||
@ -46,14 +52,21 @@ add_library(${CORE_WIDGETS_ADDON} SHARED
|
||||
"${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/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/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/QPixmap/qpixmap_wrap.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QIcon/qicon_wrap.cpp"
|
||||
@ -62,13 +75,19 @@ add_library(${CORE_WIDGETS_ADDON} SHARED
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QCursor/qcursor_wrap.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QKeySequence/qkeysequence_wrap.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/QMovie/qmovie_wrap.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtGui/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/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/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/QObject/qobject_wrap.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QVariant/qvariant_wrap.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QSize/qsize_wrap.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/lib/QtCore/QSizeF/qsizef_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/QRectF/qrectf_wrap.cpp"
|
||||
@ -92,6 +111,7 @@ add_library(${CORE_WIDGETS_ADDON} SHARED
|
||||
"${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/QListWidgetItem/qlistwidgetitem_wrap.cpp"
|
||||
@ -140,8 +160,12 @@ add_library(${CORE_WIDGETS_ADDON} SHARED
|
||||
"${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/QDesktopWidget/qdesktopwidget_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)
|
||||
"${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/core/FlexLayout/flexlayout.hpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/cpp/include/nodegui/QtGui/QMovie/nmovie.hpp"
|
||||
@ -203,7 +227,13 @@ add_library(${CORE_WIDGETS_ADDON} SHARED
|
||||
"${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/QDesktopWidget/nqdesktopwidget.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})
|
||||
@ -226,14 +256,28 @@ if (WIN32)
|
||||
target_compile_definitions(${CORE_WIDGETS_ADDON} PRIVATE
|
||||
ENABLE_DLL_EXPORT=1
|
||||
)
|
||||
target_compile_options(${CORE_WIDGETS_ADDON} PRIVATE "/MP4")
|
||||
target_compile_options(${CORE_WIDGETS_ADDON} PRIVATE "/MP")
|
||||
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()
|
||||
|
||||
target_link_libraries(${CORE_WIDGETS_ADDON} PRIVATE
|
||||
"${CMAKE_JS_LIB}"
|
||||
Qt5::Widgets
|
||||
Qt5::Core
|
||||
Qt5::Gui
|
||||
Qt5::Svg
|
||||
Qt6::Widgets
|
||||
Qt6::Core
|
||||
Qt6::Gui
|
||||
Qt6::Svg
|
||||
Qt6::SvgWidgets
|
||||
)
|
||||
|
||||
184
README.md
184
README.md
@ -1,20 +1,21 @@
|
||||
# NodeGui
|
||||
|
||||
[](https://spectrum.chat/nodegui)
|
||||
[](#contributors)
|
||||
[](#contributors)
|
||||
[](https://changelog.com/jsparty/96)
|
||||
|
||||
[](https://github.com/nodegui/nodegui/actions)
|
||||
[](https://github.com/nodegui/nodegui/discussions)
|
||||
|
||||
Build **performant**, **native** and **cross-platform** desktop applications with **Node.js** and **CSS like styling**.🚀
|
||||
|
||||
NodeGUI is powered by **Qt5** 💚 which makes it CPU and memory efficient as compared to other chromium based solutions like electron.
|
||||
NodeGUI is powered by **Qt6** 💚 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)**.
|
||||
|
||||
<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" />
|
||||
|
||||
@ -29,9 +30,7 @@ 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>
|
||||
|
||||
**More screenshots?**
|
||||
|
||||
### More Examples:
|
||||
### Code Examples
|
||||
|
||||
https://github.com/nodegui/examples
|
||||
|
||||
@ -39,17 +38,17 @@ https://github.com/nodegui/examples
|
||||
|
||||
## Features
|
||||
|
||||
- 🧬 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.
|
||||
- 💅 Styling with CSS (includes actual cascading). Also has full support for Flexbox layout (thanks to Yoga).
|
||||
- ✅ 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.
|
||||
- 💸 Can be used for Commercial applications.
|
||||
- 🕵️♂️ Good Devtools support.
|
||||
- 📚 Good documentation and website.
|
||||
- 🧙♂️ Good documentation for contributors.
|
||||
- 🦹🏻♀️ Good support for dark mode (Thanks to Qt).
|
||||
- 🏅First class Typescript support. (Works on regular JS projects too 😉).
|
||||
- 🧬 **Cross platform.** Works 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.
|
||||
- 💅 **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.
|
||||
- 🎪 **Native widget event listener support.** Supports all events available from Qt / NodeJs.
|
||||
- 💸 **Can be used for Commercial applications.**
|
||||
- 🕵️♂️ **Good Devtools support.**
|
||||
- 📚 **Good documentation and website.**
|
||||
- 🧙♂️ **Good documentation for contributors.**
|
||||
- 🦹🏻♀️ **Good support for dark mode (Thanks to Qt).**
|
||||
- 🏅**First class Typescript support.** (Works on regular JS projects too 😉).
|
||||
|
||||
## Getting Started
|
||||
|
||||
@ -58,47 +57,16 @@ 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/)
|
||||
|
||||
|
||||
## Installation
|
||||
|
||||
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
|
||||
```
|
||||
|
||||
Then install NodeGui from your command line:
|
||||
|
||||
#### To install latest stable release:
|
||||
To install latest stable release:
|
||||
|
||||
```
|
||||
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
|
||||
@ -120,13 +88,15 @@ 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**
|
||||
|
||||
|
||||
## 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/)
|
||||
- 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).
|
||||
|
||||
**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)
|
||||
|
||||
@ -142,11 +112,104 @@ 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
|
||||
|
||||
## Building
|
||||
|
||||
`npm run build`
|
||||
## Building from source
|
||||
|
||||
Optionally set `QT_INSTALL_DIR='/path/to/qt'` environment variable to build using your own version of Qt.
|
||||
This section is useful for those wanting to work on NodeGui itself.
|
||||
|
||||
### 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
|
||||
|
||||
@ -200,6 +263,7 @@ People maintaining this project.
|
||||
<table>
|
||||
<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://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>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@ -265,6 +329,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
||||
<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>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
|
||||
@ -5,24 +5,26 @@ if(CCACHE_PROGRAM)
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
|
||||
endif()
|
||||
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "Minimum OS X deployment version")
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "Minimum OS X deployment version")
|
||||
|
||||
function(AddCommonConfig addonName)
|
||||
target_compile_features(${addonName} PRIVATE
|
||||
cxx_constexpr
|
||||
cxx_inheriting_constructors
|
||||
cxx_lambdas
|
||||
cxx_auto_type
|
||||
cxx_variadic_templates
|
||||
cxx_variable_templates
|
||||
cxx_std_17
|
||||
)
|
||||
|
||||
|
||||
if(napi_build_version)
|
||||
target_compile_definitions(${addonName} PRIVATE
|
||||
NAPI_VERSION=${napi_build_version}
|
||||
)
|
||||
endif()
|
||||
|
||||
if (WIN32)
|
||||
|
||||
if (WIN32)
|
||||
target_compile_definitions(${addonName} PRIVATE
|
||||
ENUM_BITFIELDS_NOT_SUPPORTED
|
||||
)
|
||||
|
||||
@ -16,7 +16,7 @@ macro(AddQodeSupport addonName)
|
||||
message(STATUS "Using Qode installation for ${addonName} QODE_BINARY_DIR:${QODE_BINARY_DIR}")
|
||||
|
||||
target_link_libraries(${CORE_WIDGETS_ADDON} PRIVATE
|
||||
"${QODE_BINARY_DIR}\\qode.lib"
|
||||
"${QODE_BINARY_DIR}\\node.lib"
|
||||
)
|
||||
|
||||
endif()
|
||||
|
||||
@ -8,7 +8,7 @@ set(CMAKE_AUTOUIC ON)
|
||||
|
||||
set(QTCONFIG_FILE ${CMAKE_CURRENT_LIST_DIR}/qtConfig.js)
|
||||
|
||||
macro(AddQtSupport addonName)
|
||||
macro(AddQtSupport addonName)
|
||||
execute_process(COMMAND node -p "require('${QTCONFIG_FILE}').qtCmakeDir"
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
OUTPUT_VARIABLE QT_CMAKE_HOME_DIR
|
||||
@ -16,10 +16,10 @@ macro(AddQtSupport addonName)
|
||||
|
||||
string(REPLACE "\n" "" 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}")
|
||||
|
||||
set(Qt5_DIR ${QT_CMAKE_HOME_DIR})
|
||||
find_package(Qt5 COMPONENTS Widgets Gui Core Svg REQUIRED)
|
||||
|
||||
message(STATUS "Using Qt installation for ${addonName} QT_CMAKE_HOME_DIR:${QT_CMAKE_HOME_DIR}")
|
||||
|
||||
list(APPEND CMAKE_PREFIX_PATH "${QT_CMAKE_HOME_DIR}/../../..")
|
||||
find_package(Qt6 REQUIRED COMPONENTS Widgets Gui Core Svg SvgWidgets)
|
||||
|
||||
endmacro(AddQtSupport addonName)
|
||||
|
||||
@ -3,56 +3,56 @@ const path = require('path');
|
||||
const fs = require('fs');
|
||||
|
||||
const SETUP_DIR = path.resolve(__dirname, '..', 'miniqt');
|
||||
const QT_VERSION = '5.14.1';
|
||||
const MIRROR = Boolean(process.env.QT_LINK_MIRROR) ? process.env.QT_LINK_MIRROR : "https://download.qt.io";
|
||||
const QT_VERSION = '6.4.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);
|
||||
};
|
||||
|
||||
function getMiniQtConfig() {
|
||||
switch (os.platform()) {
|
||||
case 'darwin': {
|
||||
const qtHome = path.resolve(SETUP_DIR, QT_VERSION, 'clang_64');
|
||||
const qtHome = path.resolve(SETUP_DIR, QT_VERSION, 'macos');
|
||||
return {
|
||||
qtHome,
|
||||
artifacts: [
|
||||
{
|
||||
name: 'Qt Base',
|
||||
link: `${MIRROR}/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`,
|
||||
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`,
|
||||
skipSetup: checkIfExists(path.resolve(qtHome, 'plugins', 'platforms', 'libqcocoa.dylib')),
|
||||
},
|
||||
{
|
||||
name: 'Qt Svg',
|
||||
link: `${MIRROR}/online/qtsdkrepository/mac_x64/desktop/qt5_5141/qt.qt5.5141.clang_64/5.14.1-0-202001241000qtsvg-MacOS-MacOS_10_13-Clang-MacOS-MacOS_10_13-X86_64.7z`,
|
||||
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',
|
||||
link: `${MIRROR}/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`,
|
||||
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`,
|
||||
skipSetup: checkIfExists(path.resolve(qtHome, 'bin', 'macdeployqt')),
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
case 'win32': {
|
||||
const qtHome = path.resolve(SETUP_DIR, QT_VERSION, 'msvc2017_64');
|
||||
const qtHome = path.resolve(SETUP_DIR, QT_VERSION, 'msvc2019_64');
|
||||
return {
|
||||
qtHome,
|
||||
artifacts: [
|
||||
{
|
||||
name: 'Qt Base',
|
||||
link: `${MIRROR}/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', 'Qt5Core.dll')),
|
||||
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`,
|
||||
skipSetup: checkIfExists(path.resolve(qtHome, 'bin', 'Qt6Core.dll')),
|
||||
},
|
||||
{
|
||||
name: 'Qt SVG',
|
||||
link: `${MIRROR}/online/qtsdkrepository/windows_x86/desktop/qt5_5141/qt.qt5.5141.win64_msvc2017_64/5.14.1-0-202001240957qtsvg-Windows-Windows_10-MSVC2017-Windows-Windows_10-X86_64.7z`,
|
||||
skipSetup: checkIfExists(path.resolve(qtHome, 'bin', 'Qt5Svg.dll')),
|
||||
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',
|
||||
link: `${MIRROR}/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`,
|
||||
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`,
|
||||
skipSetup: checkIfExists(path.resolve(qtHome, 'bin', 'windeployqt.exe')),
|
||||
},
|
||||
],
|
||||
@ -65,17 +65,17 @@ function getMiniQtConfig() {
|
||||
artifacts: [
|
||||
{
|
||||
name: 'Qt Base',
|
||||
link: `${MIRROR}/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`,
|
||||
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`,
|
||||
skipSetup: checkIfExists(path.resolve(qtHome, 'bin', 'moc')),
|
||||
},
|
||||
{
|
||||
name: 'Qt SVG',
|
||||
link: `${MIRROR}/online/qtsdkrepository/linux_x64/desktop/qt5_5141/qt.qt5.5141.gcc_64/5.14.1-0-202001240953qtsvg-Linux-RHEL_7_6-GCC-Linux-RHEL_7_6-X86_64.7z`,
|
||||
skipSetup: checkIfExists(path.resolve(qtHome, 'lib', 'libQt5Svg.so')),
|
||||
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',
|
||||
link: `${MIRROR}/online/qtsdkrepository/linux_x64/desktop/qt5_5141/qt.qt5.5141.gcc_64/5.14.1-0-202001240953icu-linux-Rhel7.2-x64.7z`,
|
||||
link: `${MIRROR}/online/qtsdkrepository/linux_x64/desktop/qt6_641/qt.qt6.641.gcc_64/6.4.1-0-202211101305icu-linux-Rhel7.2-x64.7z`,
|
||||
skipSetup: checkIfExists(path.resolve(qtHome, 'lib', 'libicuuc.so')),
|
||||
},
|
||||
],
|
||||
@ -92,7 +92,7 @@ const miniQt = {
|
||||
|
||||
const useCustomQt = Boolean(process.env.QT_INSTALL_DIR);
|
||||
const qtHome = useCustomQt ? process.env.QT_INSTALL_DIR : miniQt.qtHome;
|
||||
const qtCmakeDir = path.resolve(qtHome, 'lib', 'cmake', 'Qt5');
|
||||
const qtCmakeDir = path.resolve(qtHome, 'lib', 'cmake', 'Qt6');
|
||||
|
||||
module.exports = {
|
||||
qtHome,
|
||||
|
||||
15946
package-lock.json
generated
15946
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
72
package.json
72
package.json
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@nodegui/nodegui",
|
||||
"version": "0.30.0",
|
||||
"description": "A cross platform library to build native desktop apps.",
|
||||
"version": "0.59.0",
|
||||
"description": "A cross-platform library to build native desktop apps.",
|
||||
"main": "dist/index.js",
|
||||
"typings": "dist/index.d.ts",
|
||||
"author": "Atul R <atulanand94@gmail.com>",
|
||||
@ -11,55 +11,61 @@
|
||||
"qode": "scripts/qode.js"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/master-atul"
|
||||
"url": "https://github.com/sponsors/a7ul"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "cross-env npm run build && node ./scripts/qode.js dist/demo.js",
|
||||
"build": "cross-env tsc && npm run build:addon",
|
||||
"postinstall": "cross-env npm run setupqt && (node ./scripts/skip.js || npm run prebuild:install || npm run build:addon)",
|
||||
"setupqt": "cross-env node ./scripts/setupMiniQt.js",
|
||||
"dev": "npm run build && node ./scripts/qode.js dist/demo.js",
|
||||
"demo": "node ./scripts/qode.js dist/demo.js",
|
||||
"build": "tsc && npm run build:addon",
|
||||
"install": "npm run setupqt && (node ./scripts/skip.js || npm run setupbinary || npm run build:addon)",
|
||||
"setupqt": "node ./scripts/setupMiniQt.js",
|
||||
"setupbinary": "node ./scripts/setupBinary.js",
|
||||
"build:addon": "cross-env CMAKE_BUILD_PARALLEL_LEVEL=8 cmake-js compile",
|
||||
"prebuild:install": "cross-env echo 'skipping prebuild' # prebuild-install --backend=cmake-js --runtime=napi --verbose",
|
||||
"test": "node ./scripts/qode.js ./node_modules/jest/bin/jest -i",
|
||||
"lint:cpp": "cross-env clang-format -i --glob=src/cpp/**/*.[h,c]*",
|
||||
"lint:ts": "cross-env tsc --noEmit && cross-env eslint './src/**/*.{ts,tsx,js,jsx}' --fix",
|
||||
"docs": "cross-env typedoc && node ./website/docs/scripts/fixdocs.js",
|
||||
"qode": "cross-env node ./scripts/qode.js"
|
||||
"lint:cpp": "clang-format -i --glob=src/cpp/**/*.[h,c]*",
|
||||
"lint:ts": "tsc --noEmit && eslint ./src --fix",
|
||||
"docs": "typedoc && node ./website/docs/scripts/fixdocs.js",
|
||||
"qode": "node ./scripts/qode.js",
|
||||
"prepublishOnly": "npm run build"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.x.x"
|
||||
},
|
||||
"engineStrict": false,
|
||||
"dependencies": {
|
||||
"@nodegui/artifact-installer": "^1.1.0",
|
||||
"@nodegui/qode": "^2.1.0",
|
||||
"cmake-js": "^6.1.0",
|
||||
"@nodegui/qode": "^18.12.1",
|
||||
"cmake-js": "^6.2.1",
|
||||
"cross-env": "^7.0.3",
|
||||
"cuid": "^2.1.6",
|
||||
"cuid": "^2.1.8",
|
||||
"manage-path": "^2.0.0",
|
||||
"memoize-one": "^5.1.1",
|
||||
"node-addon-api": "^3.1.0",
|
||||
"memoize-one": "^5.2.1",
|
||||
"node-addon-api": "^4.0.0",
|
||||
"postcss": "^7.0.17",
|
||||
"postcss-nodegui-autoprefixer": "0.0.7",
|
||||
"prebuild-install": "^5.3.6"
|
||||
"tar": "^6.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/bindings": "^1.5.0",
|
||||
"@types/jest": "^26.0.20",
|
||||
"@types/node": "^14.14.22",
|
||||
"@typescript-eslint/eslint-plugin": "^4.13.0",
|
||||
"@typescript-eslint/parser": "^4.13.0",
|
||||
"@types/bindings": "^1.5.1",
|
||||
"@types/jest": "29.2.4",
|
||||
"@types/node": "^16.4.13",
|
||||
"@typescript-eslint/eslint-plugin": "^4.29.0",
|
||||
"@typescript-eslint/parser": "^4.29.0",
|
||||
"clang-format": "^1.5.0",
|
||||
"eslint": "^6.6.0",
|
||||
"eslint-config-prettier": "^6.15.0",
|
||||
"eslint-plugin-prettier": "^3.3.1",
|
||||
"husky": "^4.3.8",
|
||||
"jest": "^25.5.4",
|
||||
"prebuild": "^10.0.1",
|
||||
"prettier": "^2.2.1",
|
||||
"ts-jest": "^25.5.1",
|
||||
"eslint": "^7.32.0",
|
||||
"eslint-config-prettier": "^8.3.0",
|
||||
"eslint-plugin-prettier": "^3.4.0",
|
||||
"husky": "^7.0.1",
|
||||
"jest": "29.3.1",
|
||||
"prettier": "^2.3.2",
|
||||
"ts-jest": "29.0.3",
|
||||
"typedoc": "^0.17.8",
|
||||
"typedoc-plugin-markdown": "^2.4.2",
|
||||
"typescript": "^4.1.3"
|
||||
"typescript": "^4.3.5"
|
||||
},
|
||||
"binary": {
|
||||
"napi_versions": [
|
||||
3
|
||||
4
|
||||
]
|
||||
},
|
||||
"husky": {
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
var os = require('os');
|
||||
var path = require('path');
|
||||
var qodeConfig = require('@nodegui/qode');
|
||||
var managePath = require('manage-path');
|
||||
@ -11,6 +12,12 @@ var proc = require('child_process');
|
||||
var alterPath = managePath(process.env);
|
||||
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), {
|
||||
stdio: 'inherit',
|
||||
windowsHide: false,
|
||||
|
||||
39
scripts/setupBinary.js
Normal file
39
scripts/setupBinary.js
Normal file
@ -0,0 +1,39 @@
|
||||
#!/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);
|
||||
});
|
||||
@ -5,7 +5,7 @@ const { miniQt, useCustomQt, qtHome } = require('../config/qtConfig');
|
||||
|
||||
async function setupQt() {
|
||||
return Promise.all(
|
||||
miniQt.artifacts.map(async artifact =>
|
||||
miniQt.artifacts.map(async (artifact) =>
|
||||
setupArtifact({
|
||||
outDir: miniQt.setupDir,
|
||||
id: 'nodegui-mini-qt',
|
||||
@ -20,7 +20,7 @@ async function setupQt() {
|
||||
if (!useCustomQt) {
|
||||
console.log(`Minimal Qt ${miniQt.version} setup:`);
|
||||
|
||||
setupQt().catch(err => {
|
||||
setupQt().catch((err) => {
|
||||
console.error(err);
|
||||
process.exit(1);
|
||||
});
|
||||
|
||||
67
src/cpp/include/deps/yoga/BitUtils.h
Normal file
67
src/cpp/include/deps/yoga/BitUtils.h
Normal file
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* 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
|
||||
@ -1,144 +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 <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
|
||||
@ -7,6 +7,8 @@
|
||||
|
||||
#include "Utils.h"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
using namespace facebook;
|
||||
|
||||
YGFlexDirection YGFlexDirectionCross(const YGFlexDirection flexDirection,
|
||||
@ -51,6 +53,13 @@ bool YGFloatsEqual(const float a, const float 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) {
|
||||
return yoga::isUndefined(val) ? 0 : val;
|
||||
}
|
||||
@ -64,3 +73,7 @@ YGFloatOptional YGFloatOptionalMax(YGFloatOptional op1, YGFloatOptional op2) {
|
||||
}
|
||||
return op1.isUndefined() ? op2 : op1;
|
||||
}
|
||||
|
||||
void throwLogicalErrorWithMessage(const char* message) {
|
||||
throw std::logic_error(message);
|
||||
}
|
||||
|
||||
@ -63,6 +63,8 @@ inline bool YGValueEqual(facebook::yoga::detail::CompactValue a,
|
||||
// difference between two floats is less than 0.0001f or both are undefined.
|
||||
bool YGFloatsEqual(const float a, const float b);
|
||||
|
||||
bool YGDoubleEqual(const double a, const double b);
|
||||
|
||||
float YGFloatMax(const float a, const float b);
|
||||
|
||||
YGFloatOptional YGFloatOptionalMax(const YGFloatOptional op1,
|
||||
@ -133,3 +135,5 @@ inline YGFloatOptional YGResolveValueMargin(yoga::detail::CompactValue value,
|
||||
const float ownerSize) {
|
||||
return value.isAuto() ? YGFloatOptional{0} : YGResolveValue(value, ownerSize);
|
||||
}
|
||||
|
||||
void throwLogicalErrorWithMessage(const char* message);
|
||||
|
||||
@ -179,6 +179,8 @@ const char* YGOverflowToString(const YGOverflow value) {
|
||||
|
||||
const char* YGPositionTypeToString(const YGPositionType value) {
|
||||
switch (value) {
|
||||
case YGPositionTypeStatic:
|
||||
return "static";
|
||||
case YGPositionTypeRelative:
|
||||
return "relative";
|
||||
case YGPositionTypeAbsolute:
|
||||
|
||||
@ -90,7 +90,8 @@ YG_ENUM_SEQ_DECL(YGNodeType, YGNodeTypeDefault, YGNodeTypeText)
|
||||
YG_ENUM_SEQ_DECL(YGOverflow, YGOverflowVisible, YGOverflowHidden,
|
||||
YGOverflowScroll)
|
||||
|
||||
YG_ENUM_SEQ_DECL(YGPositionType, YGPositionTypeRelative, YGPositionTypeAbsolute)
|
||||
YG_ENUM_SEQ_DECL(YGPositionType, YGPositionTypeStatic, YGPositionTypeRelative,
|
||||
YGPositionTypeAbsolute)
|
||||
|
||||
YG_ENUM_DECL(YGPrintOptions, YGPrintOptionsLayout = 1, YGPrintOptionsStyle = 2,
|
||||
YGPrintOptionsChildren = 4)
|
||||
|
||||
@ -6,10 +6,12 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include "Bitfield.h"
|
||||
#include "BitUtils.h"
|
||||
#include "YGFloatOptional.h"
|
||||
#include "Yoga-internal.h"
|
||||
|
||||
using namespace facebook::yoga;
|
||||
|
||||
struct YGLayout {
|
||||
std::array<float, 4> position = {};
|
||||
std::array<float, 2> dimensions = {{YGUndefined, YGUndefined}};
|
||||
@ -18,12 +20,14 @@ struct YGLayout {
|
||||
std::array<float, 4> padding = {};
|
||||
|
||||
private:
|
||||
static constexpr size_t directionIdx = 0;
|
||||
static constexpr size_t didUseLegacyFlagIdx = 1;
|
||||
static constexpr size_t doesLegacyStretchFlagAffectsLayoutIdx = 2;
|
||||
static constexpr size_t hadOverflowIdx = 3;
|
||||
facebook::yoga::Bitfield<uint8_t, YGDirection, bool, bool, bool> flags_ = {
|
||||
YGDirectionInherit, false, false, false};
|
||||
static constexpr size_t directionOffset = 0;
|
||||
static constexpr size_t didUseLegacyFlagOffset =
|
||||
directionOffset + facebook::yoga::detail::bitWidthFn<YGDirection>();
|
||||
static constexpr size_t doesLegacyStretchFlagAffectsLayoutOffset =
|
||||
didUseLegacyFlagOffset + 1;
|
||||
static constexpr size_t hadOverflowOffset =
|
||||
doesLegacyStretchFlagAffectsLayoutOffset + 1;
|
||||
uint8_t flags = 0;
|
||||
|
||||
public:
|
||||
uint32_t computedFlexBasisGeneration = 0;
|
||||
@ -32,7 +36,7 @@ struct YGLayout {
|
||||
// Instead of recomputing the entire layout every single time, we cache some
|
||||
// information to break early when nothing changed
|
||||
uint32_t generationCount = 0;
|
||||
YGDirection lastOwnerDirection = (YGDirection)-1;
|
||||
YGDirection lastOwnerDirection = YGDirectionInherit;
|
||||
|
||||
uint32_t nextCachedMeasurementsIndex = 0;
|
||||
std::array<YGCachedMeasurement, YG_MAX_CACHED_RESULT_COUNT>
|
||||
@ -41,27 +45,41 @@ struct YGLayout {
|
||||
|
||||
YGCachedMeasurement cachedLayout = YGCachedMeasurement();
|
||||
|
||||
YGDirection direction() const { return flags_.at<directionIdx>(); }
|
||||
decltype(flags_)::Ref<directionIdx> direction() {
|
||||
return flags_.at<directionIdx>();
|
||||
YGDirection direction() const {
|
||||
return facebook::yoga::detail::getEnumData<YGDirection>(flags,
|
||||
directionOffset);
|
||||
}
|
||||
|
||||
bool didUseLegacyFlag() const { return flags_.at<didUseLegacyFlagIdx>(); }
|
||||
decltype(flags_)::Ref<didUseLegacyFlagIdx> didUseLegacyFlag() {
|
||||
return flags_.at<didUseLegacyFlagIdx>();
|
||||
void setDirection(YGDirection direction) {
|
||||
facebook::yoga::detail::setEnumData<YGDirection>(flags, directionOffset,
|
||||
direction);
|
||||
}
|
||||
|
||||
bool didUseLegacyFlag() const {
|
||||
return facebook::yoga::detail::getBooleanData(flags,
|
||||
didUseLegacyFlagOffset);
|
||||
}
|
||||
|
||||
void setDidUseLegacyFlag(bool val) {
|
||||
facebook::yoga::detail::setBooleanData(flags, didUseLegacyFlagOffset, val);
|
||||
}
|
||||
|
||||
bool doesLegacyStretchFlagAffectsLayout() const {
|
||||
return flags_.at<doesLegacyStretchFlagAffectsLayoutIdx>();
|
||||
}
|
||||
decltype(flags_)::Ref<doesLegacyStretchFlagAffectsLayoutIdx>
|
||||
doesLegacyStretchFlagAffectsLayout() {
|
||||
return flags_.at<doesLegacyStretchFlagAffectsLayoutIdx>();
|
||||
return facebook::yoga::detail::getBooleanData(
|
||||
flags, doesLegacyStretchFlagAffectsLayoutOffset);
|
||||
}
|
||||
|
||||
bool hadOverflow() const { return flags_.at<hadOverflowIdx>(); }
|
||||
decltype(flags_)::Ref<hadOverflowIdx> hadOverflow() {
|
||||
return flags_.at<hadOverflowIdx>();
|
||||
void setDoesLegacyStretchFlagAffectsLayout(bool val) {
|
||||
facebook::yoga::detail::setBooleanData(
|
||||
flags, doesLegacyStretchFlagAffectsLayoutOffset, val);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
@ -18,7 +18,7 @@ using facebook::yoga::detail::CompactValue;
|
||||
|
||||
YGNode::YGNode(YGNode&& node) {
|
||||
context_ = node.context_;
|
||||
flags_ = node.flags_;
|
||||
flags = node.flags;
|
||||
measure_ = node.measure_;
|
||||
baseline_ = node.baseline_;
|
||||
print_ = node.print_;
|
||||
@ -31,7 +31,7 @@ YGNode::YGNode(YGNode&& node) {
|
||||
config_ = node.config_;
|
||||
resolvedDimensions_ = node.resolvedDimensions_;
|
||||
for (auto c : children_) {
|
||||
c->setOwner(c);
|
||||
c->setOwner(this);
|
||||
}
|
||||
}
|
||||
|
||||
@ -44,7 +44,7 @@ YGNode::YGNode(const YGNode& node, YGConfigRef config) : YGNode{node} {
|
||||
|
||||
void YGNode::print(void* printContext) {
|
||||
if (print_.noContext != nullptr) {
|
||||
if (flags_.at<printUsesContext_>()) {
|
||||
if (facebook::yoga::detail::getBooleanData(flags, printUsesContext_)) {
|
||||
print_.withContext(this, printContext);
|
||||
} else {
|
||||
print_.noContext(this);
|
||||
@ -140,14 +140,14 @@ YGFloatOptional YGNode::getMarginForAxis(const YGFlexDirection axis,
|
||||
|
||||
YGSize YGNode::measure(float width, YGMeasureMode widthMode, float height,
|
||||
YGMeasureMode heightMode, void* layoutContext) {
|
||||
return flags_.at<measureUsesContext_>()
|
||||
return facebook::yoga::detail::getBooleanData(flags, measureUsesContext_)
|
||||
? measure_.withContext(this, width, widthMode, height, heightMode,
|
||||
layoutContext)
|
||||
: measure_.noContext(this, width, widthMode, height, heightMode);
|
||||
}
|
||||
|
||||
float YGNode::baseline(float width, float height, void* layoutContext) {
|
||||
return flags_.at<baselineUsesContext_>()
|
||||
return facebook::yoga::detail::getBooleanData(flags, baselineUsesContext_)
|
||||
? baseline_.withContext(this, width, height, layoutContext)
|
||||
: baseline_.noContext(this, width, height);
|
||||
}
|
||||
@ -158,7 +158,7 @@ void YGNode::setMeasureFunc(decltype(YGNode::measure_) measureFunc) {
|
||||
if (measureFunc.noContext == nullptr) {
|
||||
// TODO: t18095186 Move nodeType to opt-in function and mark appropriate
|
||||
// places in Litho
|
||||
flags_.at<nodeType_>() = YGNodeTypeDefault;
|
||||
setNodeType(YGNodeTypeDefault);
|
||||
} else {
|
||||
YGAssertWithNode(
|
||||
this, children_.size() == 0,
|
||||
@ -173,14 +173,14 @@ void YGNode::setMeasureFunc(decltype(YGNode::measure_) measureFunc) {
|
||||
}
|
||||
|
||||
void YGNode::setMeasureFunc(YGMeasureFunc measureFunc) {
|
||||
flags_.at<measureUsesContext_>() = false;
|
||||
facebook::yoga::detail::setBooleanData(flags, measureUsesContext_, false);
|
||||
decltype(YGNode::measure_) m;
|
||||
m.noContext = measureFunc;
|
||||
setMeasureFunc(m);
|
||||
}
|
||||
|
||||
YOGA_EXPORT void YGNode::setMeasureFunc(MeasureWithContextFn measureFunc) {
|
||||
flags_.at<measureUsesContext_>() = true;
|
||||
facebook::yoga::detail::setBooleanData(flags, measureUsesContext_, true);
|
||||
decltype(YGNode::measure_) m;
|
||||
m.withContext = measureFunc;
|
||||
setMeasureFunc(m);
|
||||
@ -199,10 +199,10 @@ void YGNode::insertChild(YGNodeRef child, uint32_t index) {
|
||||
}
|
||||
|
||||
void YGNode::setDirty(bool isDirty) {
|
||||
if (isDirty == flags_.at<isDirty_>()) {
|
||||
if (isDirty == facebook::yoga::detail::getBooleanData(flags, isDirty_)) {
|
||||
return;
|
||||
}
|
||||
flags_.at<isDirty_>() = isDirty;
|
||||
facebook::yoga::detail::setBooleanData(flags, isDirty_, isDirty);
|
||||
if (isDirty && dirtied_) {
|
||||
dirtied_(this);
|
||||
}
|
||||
@ -223,7 +223,7 @@ void YGNode::removeChild(uint32_t index) {
|
||||
}
|
||||
|
||||
void YGNode::setLayoutDirection(YGDirection direction) {
|
||||
layout_.direction() = direction;
|
||||
layout_.setDirection(direction);
|
||||
}
|
||||
|
||||
void YGNode::setLayoutMargin(float margin, int index) {
|
||||
@ -261,7 +261,7 @@ void YGNode::setLayoutMeasuredDimension(float measuredDimension, int index) {
|
||||
}
|
||||
|
||||
void YGNode::setLayoutHadOverflow(bool hadOverflow) {
|
||||
layout_.hadOverflow() = hadOverflow;
|
||||
layout_.setHadOverflow(hadOverflow);
|
||||
}
|
||||
|
||||
void YGNode::setLayoutDimension(float dimension, int index) {
|
||||
@ -294,6 +294,9 @@ void YGNode::setPosition(const YGDirection direction, const float mainSize,
|
||||
const YGFlexDirection crossAxis =
|
||||
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 =
|
||||
relativePosition(mainAxis, mainSize);
|
||||
const YGFloatOptional relativePositionCross =
|
||||
@ -338,7 +341,9 @@ YGValue YGNode::resolveFlexBasisPtr() const {
|
||||
return flexBasis;
|
||||
}
|
||||
if (!style_.flex().isUndefined() && style_.flex().unwrap() > 0.0f) {
|
||||
return flags_.at<useWebDefaults_>() ? YGValueAuto : YGValueZero;
|
||||
return facebook::yoga::detail::getBooleanData(flags, useWebDefaults_)
|
||||
? YGValueAuto
|
||||
: YGValueZero;
|
||||
}
|
||||
return YGValueAuto;
|
||||
}
|
||||
@ -377,7 +382,7 @@ void YGNode::cloneChildrenIfNeeded(void* cloneContext) {
|
||||
}
|
||||
|
||||
void YGNode::markDirtyAndPropogate() {
|
||||
if (!flags_.at<isDirty_>()) {
|
||||
if (!facebook::yoga::detail::getBooleanData(flags, isDirty_)) {
|
||||
setDirty(true);
|
||||
setLayoutComputedFlexBasis(YGFloatOptional());
|
||||
if (owner_) {
|
||||
@ -387,7 +392,7 @@ void YGNode::markDirtyAndPropogate() {
|
||||
}
|
||||
|
||||
void YGNode::markDirtyAndPropogateDownwards() {
|
||||
flags_.at<isDirty_>() = true;
|
||||
facebook::yoga::detail::setBooleanData(flags, isDirty_, true);
|
||||
for_each(children_.begin(), children_.end(), [](YGNodeRef childNode) {
|
||||
childNode->markDirtyAndPropogateDownwards();
|
||||
});
|
||||
@ -414,16 +419,17 @@ float YGNode::resolveFlexShrink() const {
|
||||
if (!style_.flexShrink().isUndefined()) {
|
||||
return style_.flexShrink().unwrap();
|
||||
}
|
||||
if (!flags_.at<useWebDefaults_>() && !style_.flex().isUndefined() &&
|
||||
style_.flex().unwrap() < 0.0f) {
|
||||
if (!facebook::yoga::detail::getBooleanData(flags, useWebDefaults_) &&
|
||||
!style_.flex().isUndefined() && style_.flex().unwrap() < 0.0f) {
|
||||
return -style_.flex().unwrap();
|
||||
}
|
||||
return flags_.at<useWebDefaults_>() ? kWebDefaultFlexShrink
|
||||
: kDefaultFlexShrink;
|
||||
return facebook::yoga::detail::getBooleanData(flags, useWebDefaults_)
|
||||
? kWebDefaultFlexShrink
|
||||
: kDefaultFlexShrink;
|
||||
}
|
||||
|
||||
bool YGNode::isNodeFlexible() {
|
||||
return ((style_.positionType() == YGPositionTypeRelative) &&
|
||||
return ((style_.positionType() != YGPositionTypeAbsolute) &&
|
||||
(resolveFlexGrow() != 0 || resolveFlexShrink() != 0));
|
||||
}
|
||||
|
||||
@ -518,11 +524,11 @@ bool YGNode::didUseLegacyFlag() {
|
||||
|
||||
void YGNode::setLayoutDoesLegacyFlagAffectsLayout(
|
||||
bool doesLegacyFlagAffectsLayout) {
|
||||
layout_.doesLegacyStretchFlagAffectsLayout() = doesLegacyFlagAffectsLayout;
|
||||
layout_.setDoesLegacyStretchFlagAffectsLayout(doesLegacyFlagAffectsLayout);
|
||||
}
|
||||
|
||||
void YGNode::setLayoutDidUseLegacyFlag(bool didUseLegacyFlag) {
|
||||
layout_.didUseLegacyFlag() = didUseLegacyFlag;
|
||||
layout_.setDidUseLegacyFlag(didUseLegacyFlag);
|
||||
}
|
||||
|
||||
bool YGNode::isLayoutTreeEqualToNode(const YGNode& node) const {
|
||||
@ -557,7 +563,8 @@ void YGNode::reset() {
|
||||
|
||||
clearChildren();
|
||||
|
||||
auto webDefaults = flags_.at<useWebDefaults_>();
|
||||
auto webDefaults =
|
||||
facebook::yoga::detail::getBooleanData(flags, useWebDefaults_);
|
||||
*this = YGNode{getConfig()};
|
||||
if (webDefaults) {
|
||||
useWebDefaults();
|
||||
|
||||
@ -6,11 +6,14 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
#include "Bitfield.h"
|
||||
#include "BitUtils.h"
|
||||
#include "CompactValue.h"
|
||||
#include "YGConfig.h"
|
||||
#include "YGLayout.h"
|
||||
@ -37,10 +40,7 @@ struct YOGA_EXPORT YGNode {
|
||||
static constexpr size_t useWebDefaults_ = 7;
|
||||
|
||||
void* context_ = nullptr;
|
||||
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 flags = 1;
|
||||
uint8_t reserved_ = 0;
|
||||
union {
|
||||
YGMeasureFunc noContext;
|
||||
@ -71,13 +71,13 @@ struct YOGA_EXPORT YGNode {
|
||||
void setBaselineFunc(decltype(baseline_));
|
||||
|
||||
void useWebDefaults() {
|
||||
flags_.at<useWebDefaults_>() = true;
|
||||
facebook::yoga::detail::setBooleanData(flags, useWebDefaults_, true);
|
||||
style_.flexDirection() = YGFlexDirectionRow;
|
||||
style_.alignContent() = YGAlignStretch;
|
||||
}
|
||||
|
||||
// DANGER DANGER DANGER!
|
||||
// If the the node assigned to has children, we'd either have to deallocate
|
||||
// If the node assigned to has children, we'd either have to deallocate
|
||||
// them (potentially incorrect) or ignore them (danger of leaks). Only ever
|
||||
// use this after checking that there are no children.
|
||||
// DO NOT CHANGE THE VISIBILITY OF THIS METHOD!
|
||||
@ -115,9 +115,13 @@ struct YOGA_EXPORT YGNode {
|
||||
|
||||
void print(void*);
|
||||
|
||||
bool getHasNewLayout() const { return flags_.at<hasNewLayout_>(); }
|
||||
bool getHasNewLayout() const {
|
||||
return facebook::yoga::detail::getBooleanData(flags, hasNewLayout_);
|
||||
}
|
||||
|
||||
YGNodeType getNodeType() const { return flags_.at<nodeType_>(); }
|
||||
YGNodeType getNodeType() const {
|
||||
return facebook::yoga::detail::getEnumData<YGNodeType>(flags, nodeType_);
|
||||
}
|
||||
|
||||
bool hasMeasureFunc() const noexcept { return measure_.noContext != nullptr; }
|
||||
|
||||
@ -143,7 +147,9 @@ struct YOGA_EXPORT YGNode {
|
||||
|
||||
uint32_t getLineIndex() const { return lineIndex_; }
|
||||
|
||||
bool isReferenceBaseline() { return flags_.at<isReferenceBaseline_>(); }
|
||||
bool isReferenceBaseline() {
|
||||
return facebook::yoga::detail::getBooleanData(flags, isReferenceBaseline_);
|
||||
}
|
||||
|
||||
// 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
|
||||
@ -176,7 +182,9 @@ struct YOGA_EXPORT YGNode {
|
||||
|
||||
YGConfigRef getConfig() const { return config_; }
|
||||
|
||||
bool isDirty() const { return flags_.at<isDirty_>(); }
|
||||
bool isDirty() const {
|
||||
return facebook::yoga::detail::getBooleanData(flags, isDirty_);
|
||||
}
|
||||
|
||||
std::array<YGValue, 2> getResolvedDimensions() const {
|
||||
return resolvedDimensions_;
|
||||
@ -215,19 +223,22 @@ struct YOGA_EXPORT YGNode {
|
||||
|
||||
void setPrintFunc(YGPrintFunc printFunc) {
|
||||
print_.noContext = printFunc;
|
||||
flags_.at<printUsesContext_>() = false;
|
||||
facebook::yoga::detail::setBooleanData(flags, printUsesContext_, false);
|
||||
}
|
||||
void setPrintFunc(PrintWithContextFn printFunc) {
|
||||
print_.withContext = printFunc;
|
||||
flags_.at<printUsesContext_>() = true;
|
||||
facebook::yoga::detail::setBooleanData(flags, printUsesContext_, true);
|
||||
}
|
||||
void setPrintFunc(std::nullptr_t) { setPrintFunc(YGPrintFunc{nullptr}); }
|
||||
|
||||
void setHasNewLayout(bool hasNewLayout) {
|
||||
flags_.at<hasNewLayout_>() = hasNewLayout;
|
||||
facebook::yoga::detail::setBooleanData(flags, hasNewLayout_, hasNewLayout);
|
||||
}
|
||||
|
||||
void setNodeType(YGNodeType nodeType) { flags_.at<nodeType_>() = nodeType; }
|
||||
void setNodeType(YGNodeType nodeType) {
|
||||
return facebook::yoga::detail::setEnumData<YGNodeType>(flags, nodeType_,
|
||||
nodeType);
|
||||
}
|
||||
|
||||
void setMeasureFunc(YGMeasureFunc measureFunc);
|
||||
void setMeasureFunc(MeasureWithContextFn);
|
||||
@ -236,11 +247,11 @@ struct YOGA_EXPORT YGNode {
|
||||
}
|
||||
|
||||
void setBaselineFunc(YGBaselineFunc baseLineFunc) {
|
||||
flags_.at<baselineUsesContext_>() = false;
|
||||
facebook::yoga::detail::setBooleanData(flags, baselineUsesContext_, false);
|
||||
baseline_.noContext = baseLineFunc;
|
||||
}
|
||||
void setBaselineFunc(BaselineWithContextFn baseLineFunc) {
|
||||
flags_.at<baselineUsesContext_>() = true;
|
||||
facebook::yoga::detail::setBooleanData(flags, baselineUsesContext_, true);
|
||||
baseline_.withContext = baseLineFunc;
|
||||
}
|
||||
void setBaselineFunc(std::nullptr_t) {
|
||||
@ -256,7 +267,8 @@ struct YOGA_EXPORT YGNode {
|
||||
void setLineIndex(uint32_t lineIndex) { lineIndex_ = lineIndex; }
|
||||
|
||||
void setIsReferenceBaseline(bool isReferenceBaseline) {
|
||||
flags_.at<isReferenceBaseline_>() = isReferenceBaseline;
|
||||
facebook::yoga::detail::setBooleanData(flags, isReferenceBaseline_,
|
||||
isReferenceBaseline);
|
||||
}
|
||||
|
||||
void setOwner(YGNodeRef owner) { owner_ = owner; }
|
||||
@ -310,3 +322,5 @@ struct YOGA_EXPORT YGNode {
|
||||
bool isLayoutTreeEqualToNode(const YGNode& node) const;
|
||||
void reset();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@ -6,12 +6,15 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <cstdint>
|
||||
#include <type_traits>
|
||||
|
||||
#include "Bitfield.h"
|
||||
#include "BitUtils.h"
|
||||
#include "CompactValue.h"
|
||||
#include "YGEnums.h"
|
||||
#include "YGFloatOptional.h"
|
||||
@ -28,6 +31,19 @@ class YOGA_EXPORT YGStyle {
|
||||
using Dimensions = Values<YGDimension>;
|
||||
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>
|
||||
struct Ref {
|
||||
YGStyle& style;
|
||||
@ -61,30 +77,36 @@ class YOGA_EXPORT YGStyle {
|
||||
CompactValue operator[](Idx idx) const { return (style.*Prop)[idx]; }
|
||||
};
|
||||
|
||||
YGStyle() = default;
|
||||
YGStyle() {
|
||||
alignContent() = YGAlignFlexStart;
|
||||
alignItems() = YGAlignStretch;
|
||||
}
|
||||
~YGStyle() = default;
|
||||
|
||||
private:
|
||||
static constexpr size_t directionIdx = 0;
|
||||
static constexpr size_t flexDirectionIdx = 1;
|
||||
static constexpr size_t justifyContentIdx = 2;
|
||||
static constexpr size_t alignContentIdx = 3;
|
||||
static constexpr size_t alignItemsIdx = 4;
|
||||
static constexpr size_t alignSelfIdx = 5;
|
||||
static constexpr size_t positionTypeIdx = 6;
|
||||
static constexpr size_t flexWrapIdx = 7;
|
||||
static constexpr size_t overflowIdx = 8;
|
||||
static constexpr size_t displayIdx = 9;
|
||||
using Flags =
|
||||
facebook::yoga::Bitfield<uint32_t, YGDirection, YGFlexDirection,
|
||||
YGJustify, YGAlign, YGAlign, YGAlign,
|
||||
YGPositionType, YGWrap, YGOverflow, YGDisplay>;
|
||||
static constexpr size_t directionOffset = 0;
|
||||
static constexpr size_t flexdirectionOffset =
|
||||
directionOffset + facebook::yoga::detail::bitWidthFn<YGDirection>();
|
||||
static constexpr size_t justifyContentOffset =
|
||||
flexdirectionOffset +
|
||||
facebook::yoga::detail::bitWidthFn<YGFlexDirection>();
|
||||
static constexpr size_t alignContentOffset =
|
||||
justifyContentOffset + facebook::yoga::detail::bitWidthFn<YGJustify>();
|
||||
static constexpr size_t alignItemsOffset =
|
||||
alignContentOffset + facebook::yoga::detail::bitWidthFn<YGAlign>();
|
||||
static constexpr size_t alignSelfOffset =
|
||||
alignItemsOffset + facebook::yoga::detail::bitWidthFn<YGAlign>();
|
||||
static constexpr size_t positionTypeOffset =
|
||||
alignSelfOffset + facebook::yoga::detail::bitWidthFn<YGAlign>();
|
||||
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 flexGrow_ = {};
|
||||
YGFloatOptional flexShrink_ = {};
|
||||
@ -103,45 +125,68 @@ class YOGA_EXPORT YGStyle {
|
||||
// for library users needing a type
|
||||
using ValueRepr = std::remove_reference<decltype(margin_[0])>::type;
|
||||
|
||||
YGDirection direction() const { return flags_.at<directionIdx>(); }
|
||||
Flags::Ref<directionIdx> direction() { return flags_.at<directionIdx>(); }
|
||||
YGDirection direction() const {
|
||||
return facebook::yoga::detail::getEnumData<YGDirection>(flags,
|
||||
directionOffset);
|
||||
}
|
||||
BitfieldRef<YGDirection> direction() { return {*this, directionOffset}; }
|
||||
|
||||
YGFlexDirection flexDirection() const {
|
||||
return flags_.at<flexDirectionIdx>();
|
||||
return facebook::yoga::detail::getEnumData<YGFlexDirection>(
|
||||
flags, flexdirectionOffset);
|
||||
}
|
||||
Flags::Ref<flexDirectionIdx> flexDirection() {
|
||||
return flags_.at<flexDirectionIdx>();
|
||||
BitfieldRef<YGFlexDirection> flexDirection() {
|
||||
return {*this, flexdirectionOffset};
|
||||
}
|
||||
|
||||
YGJustify justifyContent() const { return flags_.at<justifyContentIdx>(); }
|
||||
Flags::Ref<justifyContentIdx> justifyContent() {
|
||||
return flags_.at<justifyContentIdx>();
|
||||
YGJustify justifyContent() const {
|
||||
return facebook::yoga::detail::getEnumData<YGJustify>(flags,
|
||||
justifyContentOffset);
|
||||
}
|
||||
BitfieldRef<YGJustify> justifyContent() {
|
||||
return {*this, justifyContentOffset};
|
||||
}
|
||||
|
||||
YGAlign alignContent() const { return flags_.at<alignContentIdx>(); }
|
||||
Flags::Ref<alignContentIdx> alignContent() {
|
||||
return flags_.at<alignContentIdx>();
|
||||
YGAlign alignContent() const {
|
||||
return facebook::yoga::detail::getEnumData<YGAlign>(flags,
|
||||
alignContentOffset);
|
||||
}
|
||||
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};
|
||||
}
|
||||
|
||||
YGAlign alignItems() const { return flags_.at<alignItemsIdx>(); }
|
||||
Flags::Ref<alignItemsIdx> alignItems() { return flags_.at<alignItemsIdx>(); }
|
||||
|
||||
YGAlign alignSelf() const { return flags_.at<alignSelfIdx>(); }
|
||||
Flags::Ref<alignSelfIdx> alignSelf() { return flags_.at<alignSelfIdx>(); }
|
||||
|
||||
YGPositionType positionType() const { return flags_.at<positionTypeIdx>(); }
|
||||
Flags::Ref<positionTypeIdx> positionType() {
|
||||
return flags_.at<positionTypeIdx>();
|
||||
YGWrap flexWrap() const {
|
||||
return facebook::yoga::detail::getEnumData<YGWrap>(flags, flexWrapOffset);
|
||||
}
|
||||
BitfieldRef<YGWrap> flexWrap() { return {*this, flexWrapOffset}; }
|
||||
|
||||
YGWrap flexWrap() const { return flags_.at<flexWrapIdx>(); }
|
||||
Flags::Ref<flexWrapIdx> flexWrap() { return flags_.at<flexWrapIdx>(); }
|
||||
YGOverflow overflow() const {
|
||||
return facebook::yoga::detail::getEnumData<YGOverflow>(flags,
|
||||
overflowOffset);
|
||||
}
|
||||
BitfieldRef<YGOverflow> overflow() { return {*this, overflowOffset}; }
|
||||
|
||||
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>(); }
|
||||
YGDisplay display() const {
|
||||
return facebook::yoga::detail::getEnumData<YGDisplay>(flags, displayOffset);
|
||||
}
|
||||
BitfieldRef<YGDisplay> display() { return {*this, displayOffset}; }
|
||||
|
||||
YGFloatOptional flex() const { return flex_; }
|
||||
Ref<YGFloatOptional, &YGStyle::flex_> flex() { return {*this}; }
|
||||
@ -189,3 +234,5 @@ YOGA_EXPORT bool operator==(const YGStyle& lhs, const YGStyle& rhs);
|
||||
YOGA_EXPORT inline bool operator!=(const YGStyle& lhs, const YGStyle& rhs) {
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@ -12,6 +12,13 @@
|
||||
#include "YGEnums.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
|
||||
|
||||
// Not defined in MSVC++
|
||||
@ -21,6 +28,7 @@ static const uint32_t __nan = 0x7fc00000;
|
||||
#endif
|
||||
|
||||
#define YGUndefined NAN
|
||||
#endif
|
||||
|
||||
typedef struct YGValue {
|
||||
float value;
|
||||
@ -31,7 +39,10 @@ YOGA_EXPORT extern const YGValue YGValueAuto;
|
||||
YOGA_EXPORT extern const YGValue YGValueUndefined;
|
||||
YOGA_EXPORT extern const YGValue YGValueZero;
|
||||
|
||||
#if !defined(COMPILING_WITH_CLANG_ON_WINDOWS)
|
||||
YG_EXTERN_C_END
|
||||
#endif
|
||||
#undef COMPILING_WITH_CLANG_ON_WINDOWS
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
|
||||
@ -51,10 +51,10 @@ struct YGCachedMeasurement {
|
||||
float computedHeight;
|
||||
|
||||
YGCachedMeasurement()
|
||||
: availableWidth(0),
|
||||
availableHeight(0),
|
||||
widthMeasureMode((YGMeasureMode)-1),
|
||||
heightMeasureMode((YGMeasureMode)-1),
|
||||
: availableWidth(-1),
|
||||
availableHeight(-1),
|
||||
widthMeasureMode(YGMeasureModeUndefined),
|
||||
heightMeasureMode(YGMeasureModeUndefined),
|
||||
computedWidth(-1),
|
||||
computedHeight(-1) {}
|
||||
|
||||
|
||||
@ -228,9 +228,6 @@ YOGA_EXPORT YGNodeRef YGNodeClone(YGNodeRef oldNode) {
|
||||
static YGConfigRef YGConfigClone(const YGConfig& oldConfig) {
|
||||
const YGConfigRef config = new YGConfig(oldConfig);
|
||||
YGAssert(config != nullptr, "Could not allocate memory for config");
|
||||
if (config == nullptr) {
|
||||
abort();
|
||||
}
|
||||
gConfigInstanceCount++;
|
||||
return config;
|
||||
}
|
||||
@ -354,6 +351,12 @@ YOGA_EXPORT void YGNodeInsertChild(const YGNodeRef owner, const YGNodeRef child,
|
||||
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,
|
||||
const YGNodeRef excludedChild) {
|
||||
if (YGNodeGetChildCount(owner) == 0) {
|
||||
@ -1018,7 +1021,7 @@ static bool YGIsBaselineLayout(const YGNodeRef node) {
|
||||
const uint32_t childCount = YGNodeGetChildCount(node);
|
||||
for (uint32_t i = 0; i < childCount; i++) {
|
||||
const YGNodeRef child = YGNodeGetChild(node, i);
|
||||
if (child->getStyle().positionType() == YGPositionTypeRelative &&
|
||||
if (child->getStyle().positionType() != YGPositionTypeAbsolute &&
|
||||
child->getStyle().alignSelf() == YGAlignBaseline) {
|
||||
return true;
|
||||
}
|
||||
@ -1474,22 +1477,29 @@ static void YGNodeAbsoluteLayoutChild(
|
||||
}
|
||||
|
||||
static void YGNodeWithMeasureFuncSetMeasuredDimensions(
|
||||
const YGNodeRef node, const float availableWidth,
|
||||
const float availableHeight, const YGMeasureMode widthMeasureMode,
|
||||
const YGMeasureMode heightMeasureMode, const float ownerWidth,
|
||||
const float ownerHeight, LayoutData& layoutMarkerData,
|
||||
void* const layoutContext, const LayoutPassReason reason) {
|
||||
const YGNodeRef node, float availableWidth, float availableHeight,
|
||||
const YGMeasureMode widthMeasureMode, const YGMeasureMode heightMeasureMode,
|
||||
const float ownerWidth, const float ownerHeight,
|
||||
LayoutData& layoutMarkerData, void* const layoutContext,
|
||||
const LayoutPassReason reason) {
|
||||
YGAssertWithNode(node, node->hasMeasureFunc(),
|
||||
"Expected node to have custom measure function");
|
||||
|
||||
if (widthMeasureMode == YGMeasureModeUndefined) {
|
||||
availableWidth = YGUndefined;
|
||||
}
|
||||
if (heightMeasureMode == YGMeasureModeUndefined) {
|
||||
availableHeight = YGUndefined;
|
||||
}
|
||||
|
||||
const float paddingAndBorderAxisRow =
|
||||
YGNodePaddingAndBorderForAxis(node, YGFlexDirectionRow, availableWidth);
|
||||
const float paddingAndBorderAxisColumn = YGNodePaddingAndBorderForAxis(
|
||||
node, YGFlexDirectionColumn, availableWidth);
|
||||
YGNodePaddingAndBorderForAxis(node, YGFlexDirectionRow, ownerWidth);
|
||||
const float paddingAndBorderAxisColumn =
|
||||
YGNodePaddingAndBorderForAxis(node, YGFlexDirectionColumn, ownerWidth);
|
||||
const float marginAxisRow =
|
||||
node->getMarginForAxis(YGFlexDirectionRow, availableWidth).unwrap();
|
||||
node->getMarginForAxis(YGFlexDirectionRow, ownerWidth).unwrap();
|
||||
const float marginAxisColumn =
|
||||
node->getMarginForAxis(YGFlexDirectionColumn, availableWidth).unwrap();
|
||||
node->getMarginForAxis(YGFlexDirectionColumn, ownerWidth).unwrap();
|
||||
|
||||
// We want to make sure we don't call measure with negative size
|
||||
const float innerWidth = YGFloatIsUndefined(availableWidth)
|
||||
@ -1641,15 +1651,17 @@ static void YGZeroOutLayoutRecursivly(const YGNodeRef node,
|
||||
static float YGNodeCalculateAvailableInnerDim(const YGNodeConstRef node,
|
||||
YGFlexDirection axis,
|
||||
float availableDim,
|
||||
float ownerDim) {
|
||||
float ownerDim,
|
||||
float ownerDimForMarginPadding) {
|
||||
YGFlexDirection direction =
|
||||
YGFlexDirectionIsRow(axis) ? YGFlexDirectionRow : YGFlexDirectionColumn;
|
||||
YGDimension dimension =
|
||||
YGFlexDirectionIsRow(axis) ? YGDimensionWidth : YGDimensionHeight;
|
||||
|
||||
const float margin = node->getMarginForAxis(direction, ownerDim).unwrap();
|
||||
const float margin =
|
||||
node->getMarginForAxis(direction, ownerDimForMarginPadding).unwrap();
|
||||
const float paddingAndBorder =
|
||||
YGNodePaddingAndBorderForAxis(node, direction, ownerDim);
|
||||
YGNodePaddingAndBorderForAxis(node, direction, ownerDimForMarginPadding);
|
||||
|
||||
float availableInnerDim = availableDim - margin - paddingAndBorder;
|
||||
// Max dimension overrides predefined dimension value; Min dimension in turn
|
||||
@ -2043,7 +2055,8 @@ static void YGDistributeFreeSpaceFirstPass(
|
||||
// first and second passes.
|
||||
deltaFreeSpace += boundMainSize - childFlexBasis;
|
||||
collectedFlexItemsValues.totalFlexShrinkScaledFactors -=
|
||||
flexShrinkScaledFactor;
|
||||
(-currentRelativeChild->resolveFlexShrink() *
|
||||
currentRelativeChild->getLayout().computedFlexBasis.unwrap());
|
||||
}
|
||||
}
|
||||
} else if (!YGFloatIsUndefined(
|
||||
@ -2172,7 +2185,7 @@ static void YGJustifyMainAxis(
|
||||
for (uint32_t i = startOfLineIndex;
|
||||
i < collectedFlexItemsValues.endOfLineIndex; i++) {
|
||||
const YGNodeRef child = node->getChild(i);
|
||||
if (child->getStyle().positionType() == YGPositionTypeRelative) {
|
||||
if (child->getStyle().positionType() != YGPositionTypeAbsolute) {
|
||||
if (child->marginLeadingValue(mainAxis).unit == YGUnitAuto) {
|
||||
numberOfAutoMarginsOnCurrentLine++;
|
||||
}
|
||||
@ -2255,7 +2268,7 @@ static void YGJustifyMainAxis(
|
||||
// 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
|
||||
// take part in that phase.
|
||||
if (childStyle.positionType() == YGPositionTypeRelative) {
|
||||
if (childStyle.positionType() != YGPositionTypeAbsolute) {
|
||||
if (child->marginLeadingValue(mainAxis).unit == YGUnitAuto) {
|
||||
collectedFlexItemsValues.mainDim +=
|
||||
collectedFlexItemsValues.remainingFreeSpace /
|
||||
@ -2549,9 +2562,9 @@ static void YGNodelayoutImpl(
|
||||
// STEP 2: DETERMINE AVAILABLE SIZE IN MAIN AND CROSS DIRECTIONS
|
||||
|
||||
float availableInnerWidth = YGNodeCalculateAvailableInnerDim(
|
||||
node, YGFlexDirectionRow, availableWidth, ownerWidth);
|
||||
node, YGFlexDirectionRow, availableWidth, ownerWidth, ownerWidth);
|
||||
float availableInnerHeight = YGNodeCalculateAvailableInnerDim(
|
||||
node, YGFlexDirectionColumn, availableHeight, ownerHeight);
|
||||
node, YGFlexDirectionColumn, availableHeight, ownerHeight, ownerWidth);
|
||||
|
||||
float availableInnerMainDim =
|
||||
isMainAxisRow ? availableInnerWidth : availableInnerHeight;
|
||||
@ -2895,7 +2908,7 @@ static void YGNodelayoutImpl(
|
||||
if (child->getStyle().display() == YGDisplayNone) {
|
||||
continue;
|
||||
}
|
||||
if (child->getStyle().positionType() == YGPositionTypeRelative) {
|
||||
if (child->getStyle().positionType() != YGPositionTypeAbsolute) {
|
||||
if (child->getLineIndex() != i) {
|
||||
break;
|
||||
}
|
||||
@ -2937,7 +2950,7 @@ static void YGNodelayoutImpl(
|
||||
if (child->getStyle().display() == YGDisplayNone) {
|
||||
continue;
|
||||
}
|
||||
if (child->getStyle().positionType() == YGPositionTypeRelative) {
|
||||
if (child->getStyle().positionType() != YGPositionTypeAbsolute) {
|
||||
switch (YGNodeAlignItem(node, child)) {
|
||||
case YGAlignFlexStart: {
|
||||
child->setLayoutPosition(
|
||||
@ -3108,7 +3121,7 @@ static void YGNodelayoutImpl(
|
||||
if (performLayout && node->getStyle().flexWrap() == YGWrapWrapReverse) {
|
||||
for (uint32_t i = 0; i < childCount; i++) {
|
||||
const YGNodeRef child = YGNodeGetChild(node, i);
|
||||
if (child->getStyle().positionType() == YGPositionTypeRelative) {
|
||||
if (child->getStyle().positionType() != YGPositionTypeAbsolute) {
|
||||
child->setLayoutPosition(
|
||||
node->getLayout().measuredDimensions[dim[crossAxis]] -
|
||||
child->getLayout().position[pos[crossAxis]] -
|
||||
@ -3210,14 +3223,14 @@ static inline bool YGMeasureModeNewMeasureSizeIsStricterAndStillValid(
|
||||
(lastComputedSize <= size || YGFloatsEqual(size, lastComputedSize));
|
||||
}
|
||||
|
||||
YOGA_EXPORT float YGRoundValueToPixelGrid(const float value,
|
||||
const float pointScaleFactor,
|
||||
YOGA_EXPORT float YGRoundValueToPixelGrid(const double value,
|
||||
const double pointScaleFactor,
|
||||
const bool forceCeil,
|
||||
const bool forceFloor) {
|
||||
double scaledValue = ((double)value) * pointScaleFactor;
|
||||
// We want to calculate `fractial` such that `floor(scaledValue) = scaledValue
|
||||
// - fractial`.
|
||||
float fractial = fmodf(scaledValue, 1.0f);
|
||||
double fractial = fmod(scaledValue, 1.0f);
|
||||
if (fractial < 0) {
|
||||
// This branch is for handling negative numbers for `value`.
|
||||
//
|
||||
@ -3236,10 +3249,10 @@ YOGA_EXPORT float YGRoundValueToPixelGrid(const float value,
|
||||
// - Finding the `floor`: -2.2 - fractial2 = -2.2 - 0.8 = -3
|
||||
++fractial;
|
||||
}
|
||||
if (YGFloatsEqual(fractial, 0)) {
|
||||
if (YGDoubleEqual(fractial, 0)) {
|
||||
// First we check if the value is already rounded
|
||||
scaledValue = scaledValue - fractial;
|
||||
} else if (YGFloatsEqual(fractial, 1.0f)) {
|
||||
} else if (YGDoubleEqual(fractial, 1.0f)) {
|
||||
scaledValue = scaledValue - fractial + 1.0f;
|
||||
} else if (forceCeil) {
|
||||
// Next we check if we need to use forced rounding
|
||||
@ -3250,7 +3263,7 @@ YOGA_EXPORT float YGRoundValueToPixelGrid(const float value,
|
||||
// Finally we just round the value
|
||||
scaledValue = scaledValue - fractial +
|
||||
(!YGFloatIsUndefined(fractial) &&
|
||||
(fractial > 0.5f || YGFloatsEqual(fractial, 0.5f))
|
||||
(fractial > 0.5f || YGDoubleEqual(fractial, 0.5f))
|
||||
? 1.0f
|
||||
: 0.0f);
|
||||
}
|
||||
@ -3350,8 +3363,10 @@ bool YGLayoutNodeInternal(
|
||||
if (needToVisitNode) {
|
||||
// Invalidate the cached results.
|
||||
layout->nextCachedMeasurementsIndex = 0;
|
||||
layout->cachedLayout.widthMeasureMode = (YGMeasureMode)-1;
|
||||
layout->cachedLayout.heightMeasureMode = (YGMeasureMode)-1;
|
||||
layout->cachedLayout.availableWidth = -1;
|
||||
layout->cachedLayout.availableHeight = -1;
|
||||
layout->cachedLayout.widthMeasureMode = YGMeasureModeUndefined;
|
||||
layout->cachedLayout.heightMeasureMode = YGMeasureModeUndefined;
|
||||
layout->cachedLayout.computedWidth = -1;
|
||||
layout->cachedLayout.computedHeight = -1;
|
||||
}
|
||||
@ -3552,24 +3567,24 @@ YOGA_EXPORT void YGConfigSetPointScaleFactor(const YGConfigRef config,
|
||||
}
|
||||
|
||||
static void YGRoundToPixelGrid(const YGNodeRef node,
|
||||
const float pointScaleFactor,
|
||||
const float absoluteLeft,
|
||||
const float absoluteTop) {
|
||||
const double pointScaleFactor,
|
||||
const double absoluteLeft,
|
||||
const double absoluteTop) {
|
||||
if (pointScaleFactor == 0.0f) {
|
||||
return;
|
||||
}
|
||||
|
||||
const float nodeLeft = node->getLayout().position[YGEdgeLeft];
|
||||
const float nodeTop = node->getLayout().position[YGEdgeTop];
|
||||
const double nodeLeft = node->getLayout().position[YGEdgeLeft];
|
||||
const double nodeTop = node->getLayout().position[YGEdgeTop];
|
||||
|
||||
const float nodeWidth = node->getLayout().dimensions[YGDimensionWidth];
|
||||
const float nodeHeight = node->getLayout().dimensions[YGDimensionHeight];
|
||||
const double nodeWidth = node->getLayout().dimensions[YGDimensionWidth];
|
||||
const double nodeHeight = node->getLayout().dimensions[YGDimensionHeight];
|
||||
|
||||
const float absoluteNodeLeft = absoluteLeft + nodeLeft;
|
||||
const float absoluteNodeTop = absoluteTop + nodeTop;
|
||||
const double absoluteNodeLeft = absoluteLeft + nodeLeft;
|
||||
const double absoluteNodeTop = absoluteTop + nodeTop;
|
||||
|
||||
const float absoluteNodeRight = absoluteNodeLeft + nodeWidth;
|
||||
const float absoluteNodeBottom = absoluteNodeTop + nodeHeight;
|
||||
const double absoluteNodeRight = absoluteNodeLeft + nodeWidth;
|
||||
const double absoluteNodeBottom = absoluteNodeTop + nodeHeight;
|
||||
|
||||
// If a node has a custom measure function we never want to round down its
|
||||
// size as this could lead to unwanted text truncation.
|
||||
@ -3587,11 +3602,11 @@ static void YGRoundToPixelGrid(const YGNodeRef node,
|
||||
// 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
|
||||
const bool hasFractionalWidth =
|
||||
!YGFloatsEqual(fmodf(nodeWidth * pointScaleFactor, 1.0), 0) &&
|
||||
!YGFloatsEqual(fmodf(nodeWidth * pointScaleFactor, 1.0), 1.0);
|
||||
!YGDoubleEqual(fmod(nodeWidth * pointScaleFactor, 1.0), 0) &&
|
||||
!YGDoubleEqual(fmod(nodeWidth * pointScaleFactor, 1.0), 1.0);
|
||||
const bool hasFractionalHeight =
|
||||
!YGFloatsEqual(fmodf(nodeHeight * pointScaleFactor, 1.0), 0) &&
|
||||
!YGFloatsEqual(fmodf(nodeHeight * pointScaleFactor, 1.0), 1.0);
|
||||
!YGDoubleEqual(fmod(nodeHeight * pointScaleFactor, 1.0), 0) &&
|
||||
!YGDoubleEqual(fmod(nodeHeight * pointScaleFactor, 1.0), 1.0);
|
||||
|
||||
node->setLayoutDimension(
|
||||
YGRoundValueToPixelGrid(absoluteNodeRight, pointScaleFactor,
|
||||
@ -3773,6 +3788,7 @@ YOGA_EXPORT void YGConfigSetShouldDiffLayoutWithoutLegacyStretchBehaviour(
|
||||
void YGAssert(const bool condition, const char* message) {
|
||||
if (!condition) {
|
||||
Log::log(YGNodeRef{nullptr}, YGLogLevelFatal, nullptr, "%s\n", message);
|
||||
throwLogicalErrorWithMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3780,6 +3796,7 @@ void YGAssertWithNode(const YGNodeRef node, const bool condition,
|
||||
const char* message) {
|
||||
if (!condition) {
|
||||
Log::log(node, YGLogLevelFatal, nullptr, "%s\n", message);
|
||||
throwLogicalErrorWithMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3787,6 +3804,7 @@ void YGAssertWithConfig(const YGConfigRef config, const bool condition,
|
||||
const char* message) {
|
||||
if (!condition) {
|
||||
Log::log(config, YGLogLevelFatal, nullptr, "%s\n", message);
|
||||
throwLogicalErrorWithMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
// v1.18.0
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <assert.h>
|
||||
@ -59,6 +59,9 @@ WIN_EXPORT void YGNodeReset(YGNodeRef node);
|
||||
WIN_EXPORT void YGNodeInsertChild(YGNodeRef node, YGNodeRef child,
|
||||
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 YGNodeRemoveAllChildren(YGNodeRef node);
|
||||
WIN_EXPORT YGNodeRef YGNodeGetChild(YGNodeRef node, uint32_t index);
|
||||
@ -298,7 +301,7 @@ WIN_EXPORT YGConfigRef YGConfigGetDefault(void);
|
||||
WIN_EXPORT void YGConfigSetContext(YGConfigRef config, void* context);
|
||||
WIN_EXPORT void* YGConfigGetContext(YGConfigRef config);
|
||||
|
||||
WIN_EXPORT float YGRoundValueToPixelGrid(float value, float pointScaleFactor,
|
||||
WIN_EXPORT float YGRoundValueToPixelGrid(double value, double pointScaleFactor,
|
||||
bool forceCeil, bool forceFloor);
|
||||
|
||||
YG_EXTERN_C_END
|
||||
|
||||
@ -9,7 +9,6 @@
|
||||
|
||||
#include <atomic>
|
||||
#include <memory>
|
||||
#include <stdexcept>
|
||||
|
||||
namespace facebook {
|
||||
namespace yoga {
|
||||
|
||||
@ -7,10 +7,10 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <yoga/YGEnums.h>
|
||||
|
||||
#include <array>
|
||||
#include <cstdint>
|
||||
#include <functional>
|
||||
#include <vector>
|
||||
|
||||
|
||||
@ -21,10 +21,6 @@ void vlog(YGConfig* config, YGNode* node, YGLogLevel level, void* context,
|
||||
const char* format, va_list args) {
|
||||
YGConfig* logConfig = config != nullptr ? config : YGConfigGetDefault();
|
||||
logConfig->log(logConfig, node, level, context, format, args);
|
||||
|
||||
if (level == YGLogLevelFatal) {
|
||||
abort();
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
||||
|
||||
@ -13,14 +13,14 @@ namespace extrautils {
|
||||
DLL_EXPORT QVariant* convertToQVariant(Napi::Env& env, Napi::Value& value);
|
||||
DLL_EXPORT bool isNapiValueInt(Napi::Env& env, Napi::Value& num);
|
||||
DLL_EXPORT std::string getNapiObjectClassName(Napi::Object& object);
|
||||
DLL_EXPORT void* configureQWidget(QWidget* widget, YGNodeRef node,
|
||||
bool isLeafNode = false);
|
||||
DLL_EXPORT void* configureQWidget(QWidget* widget, bool isLeafNode = false);
|
||||
DLL_EXPORT void* configureQObject(QObject* object);
|
||||
DLL_EXPORT void* configureComponent(void* component);
|
||||
DLL_EXPORT uint64_t hashPointerTo53bit(const void* input);
|
||||
|
||||
template <typename T>
|
||||
void safeDelete(QPointer<T>& component) {
|
||||
if (!component.isNull()) {
|
||||
if (!component.isNull() && component->QObject::parent() == nullptr) {
|
||||
delete component;
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,217 @@
|
||||
#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(); }
|
||||
};
|
||||
@ -0,0 +1,48 @@
|
||||
#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);
|
||||
};
|
||||
@ -0,0 +1,20 @@
|
||||
#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
|
||||
}
|
||||
};
|
||||
@ -0,0 +1,43 @@
|
||||
#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);
|
||||
};
|
||||
@ -5,13 +5,13 @@
|
||||
#include <QMimeData>
|
||||
|
||||
#include "Extras/Export/export.h"
|
||||
#include "core/Component/component_macro.h"
|
||||
#include "QtCore/QObject/qobject_macro.h"
|
||||
|
||||
class DLL_EXPORT QMimeDataWrap : public Napi::ObjectWrap<QMimeDataWrap> {
|
||||
COMPONENT_WRAPPED_METHODS_DECLARATION
|
||||
QOBJECT_WRAPPED_METHODS_DECLARATION
|
||||
|
||||
private:
|
||||
std::unique_ptr<QMimeData> instance;
|
||||
QPointer<QMimeData> instance;
|
||||
|
||||
public:
|
||||
static Napi::Object init(Napi::Env env, Napi::Object exports);
|
||||
|
||||
@ -12,5 +12,5 @@ class DLL_EXPORT NObject : public QObject, public EventWidget {
|
||||
public:
|
||||
using QObject::QObject;
|
||||
|
||||
void connectSignalsToEventEmitter() { QOBJECT_SIGNALS }
|
||||
virtual void connectSignalsToEventEmitter() { QOBJECT_SIGNALS }
|
||||
};
|
||||
|
||||
@ -5,28 +5,33 @@
|
||||
#include "Extras/Utils/nutils.h"
|
||||
#include "QtCore/QVariant/qvariant_wrap.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
|
||||
and every widget we export.
|
||||
/*
|
||||
This macro adds common QObject exported methods
|
||||
The exported methods are taken into this macro to avoid writing them in each
|
||||
and every widget we export.
|
||||
*/
|
||||
|
||||
#ifndef QOBJECT_WRAPPED_METHODS_DECLARATION
|
||||
#define QOBJECT_WRAPPED_METHODS_DECLARATION \
|
||||
#ifndef QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE
|
||||
#define QOBJECT_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(source) \
|
||||
\
|
||||
EVENTWIDGET_WRAPPED_METHODS_DECLARATION \
|
||||
EVENTWIDGET_WRAPPED_METHODS_DECLARATION_WITH_EVENT_SOURCE(source) \
|
||||
\
|
||||
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::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
Napi::String className = info[0].As<Napi::String>(); \
|
||||
bool doesIt = this->instance->inherits(className.Utf8Value().c_str()); \
|
||||
return Napi::Value::From(env, doesIt); \
|
||||
} \
|
||||
Napi::Value setProperty(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
Napi::String name = info[0].As<Napi::String>(); \
|
||||
Napi::Value value = info[1]; \
|
||||
auto variant = \
|
||||
@ -37,7 +42,6 @@
|
||||
} \
|
||||
Napi::Value property(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
Napi::String name = info[0].As<Napi::String>(); \
|
||||
Napi::Value value = info[1]; \
|
||||
QVariant* variant = \
|
||||
@ -48,7 +52,6 @@
|
||||
} \
|
||||
Napi::Value setObjectName(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
Napi::String objectName = info[0].As<Napi::String>(); \
|
||||
this->instance->setObjectName( \
|
||||
QString::fromStdString(objectName.Utf8Value())); \
|
||||
@ -56,29 +59,120 @@
|
||||
} \
|
||||
Napi::Value objectName(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
QString objectName = this->instance->objectName(); \
|
||||
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
|
||||
|
||||
#ifndef QOBJECT_WRAPPED_METHODS_EXPORT_DEFINE
|
||||
#define QOBJECT_WRAPPED_METHODS_EXPORT_DEFINE(ComponentWrapName) \
|
||||
\
|
||||
EVENTWIDGET_WRAPPED_METHODS_EXPORT_DEFINE(ComponentWrapName) \
|
||||
\
|
||||
InstanceMethod("inherits", &ComponentWrapName::inherits), \
|
||||
InstanceMethod("setProperty", &ComponentWrapName::setProperty), \
|
||||
InstanceMethod("property", &ComponentWrapName::property), \
|
||||
InstanceMethod("setObjectName", &ComponentWrapName::setObjectName), \
|
||||
InstanceMethod("objectName", &ComponentWrapName::objectName),
|
||||
#define QOBJECT_WRAPPED_METHODS_EXPORT_DEFINE(ComponentWrapName) \
|
||||
\
|
||||
EVENTWIDGET_WRAPPED_METHODS_EXPORT_DEFINE(ComponentWrapName) \
|
||||
\
|
||||
InstanceMethod("__id__", &ComponentWrapName::__id__), \
|
||||
InstanceMethod("__external_qobject__", \
|
||||
&ComponentWrapName::__external_qobject__), \
|
||||
InstanceMethod("inherits", &ComponentWrapName::inherits), \
|
||||
InstanceMethod("setProperty", &ComponentWrapName::setProperty), \
|
||||
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
|
||||
|
||||
#ifndef QOBJECT_SIGNALS
|
||||
#define QOBJECT_SIGNALS \
|
||||
QObject::connect(this, &QObject::objectNameChanged, \
|
||||
#ifndef QOBJECT_SIGNALS_ON_TARGET
|
||||
#define QOBJECT_SIGNALS_ON_TARGET(target) \
|
||||
QObject::connect(target, &QObject::objectNameChanged, \
|
||||
[=](const QString& objectName) { \
|
||||
Napi::Env env = this->emitOnNode.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
@ -86,5 +180,28 @@
|
||||
{Napi::String::New(env, "objectNameChanged"), \
|
||||
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
|
||||
|
||||
/*
|
||||
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"
|
||||
|
||||
@ -11,14 +11,15 @@
|
||||
class DLL_EXPORT QObjectWrap : public Napi::ObjectWrap<QObjectWrap> {
|
||||
QOBJECT_WRAPPED_METHODS_DECLARATION
|
||||
private:
|
||||
QPointer<NObject> instance;
|
||||
QPointer<QObject> instance;
|
||||
|
||||
public:
|
||||
static Napi::Object init(Napi::Env env, Napi::Object exports);
|
||||
QObjectWrap(const Napi::CallbackInfo& info);
|
||||
~QObjectWrap();
|
||||
NObject* getInternalInstance();
|
||||
QObject* getInternalInstance();
|
||||
// class constructor
|
||||
static Napi::FunctionReference constructor;
|
||||
static Napi::Object wrapFunc(Napi::Env env, QObject* qobject);
|
||||
// wrapped methods
|
||||
};
|
||||
|
||||
@ -19,9 +19,18 @@ class DLL_EXPORT QSizeWrap : public Napi::ObjectWrap<QSizeWrap> {
|
||||
~QSizeWrap();
|
||||
QSize* 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 height(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);
|
||||
};
|
||||
|
||||
|
||||
40
src/cpp/include/nodegui/QtCore/QSizeF/qsizef_wrap.h
Normal file
40
src/cpp/include/nodegui/QtCore/QSizeF/qsizef_wrap.h
Normal file
@ -0,0 +1,40 @@
|
||||
#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
|
||||
@ -22,9 +22,10 @@ class DLL_EXPORT QVariantWrap : public Napi::ObjectWrap<QVariantWrap> {
|
||||
Napi::Value toInt(const Napi::CallbackInfo& info);
|
||||
Napi::Value toDouble(const Napi::CallbackInfo& info);
|
||||
Napi::Value toBool(const Napi::CallbackInfo& info);
|
||||
Napi::Value toStringList(const Napi::CallbackInfo& info);
|
||||
// wrapped methods
|
||||
};
|
||||
|
||||
namespace StaticQVariantWrapMethods {
|
||||
DLL_EXPORT Napi::Value converToQVariant(const Napi::CallbackInfo& info);
|
||||
DLL_EXPORT Napi::Value convertToQVariant(const Napi::CallbackInfo& info);
|
||||
} // namespace StaticQVariantWrapMethods
|
||||
@ -1,8 +1,12 @@
|
||||
#pragma once
|
||||
#include <QApplication>
|
||||
#include <QGuiApplication>
|
||||
#include <QWindow>
|
||||
|
||||
#include "Extras/Export/export.h"
|
||||
#include "QtCore/QObject/qobject_macro.h"
|
||||
#include "QtGui/QScreen/qscreen_wrap.h"
|
||||
#include "core/WrapperCache/wrappercache.h"
|
||||
#include "napi.h"
|
||||
|
||||
class DLL_EXPORT NApplication : public QApplication, public EventWidget {
|
||||
@ -10,8 +14,54 @@ class DLL_EXPORT NApplication : public QApplication, public EventWidget {
|
||||
EVENTWIDGET_IMPLEMENTATIONS(QApplication)
|
||||
public:
|
||||
using QApplication::QApplication; // inherit all constructors of QApplication
|
||||
void connectSignalsToEventEmitter() {
|
||||
virtual void connectSignalsToEventEmitter() {
|
||||
// Qt Connects: Implement all signal connects here
|
||||
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});
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
@ -28,10 +28,16 @@ class DLL_EXPORT QApplicationWrap : public Napi::ObjectWrap<QApplicationWrap> {
|
||||
Napi::Value exit(const Napi::CallbackInfo& info);
|
||||
Napi::Value setQuitOnLastWindowClosed(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 {
|
||||
DLL_EXPORT Napi::Value instance(const Napi::CallbackInfo& info);
|
||||
DLL_EXPORT Napi::Value clipboard(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 screens(const Napi::CallbackInfo& info);
|
||||
DLL_EXPORT Napi::Value setStyle(const Napi::CallbackInfo& info);
|
||||
DLL_EXPORT Napi::Value style(const Napi::CallbackInfo& info);
|
||||
} // namespace StaticQApplicationWrapMethods
|
||||
|
||||
@ -3,21 +3,30 @@
|
||||
#include <napi.h>
|
||||
|
||||
#include <QClipboard>
|
||||
#include <QPointer>
|
||||
|
||||
#include "Extras/Export/export.h"
|
||||
#include "core/Component/component_macro.h"
|
||||
#include "QtCore/QObject/qobject_macro.h"
|
||||
|
||||
class DLL_EXPORT QClipboardWrap : public Napi::ObjectWrap<QClipboardWrap> {
|
||||
COMPONENT_WRAPPED_METHODS_DECLARATION
|
||||
class DLL_EXPORT QClipboardWrap : public Napi::ObjectWrap<QClipboardWrap>,
|
||||
public EventWidget {
|
||||
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:
|
||||
QClipboard* instance;
|
||||
QPointer<QClipboard> instance;
|
||||
|
||||
public:
|
||||
static Napi::FunctionReference constructor;
|
||||
|
||||
static Napi::Object init(Napi::Env env, Napi::Object exports);
|
||||
QClipboardWrap(const Napi::CallbackInfo& info);
|
||||
QClipboard* getInternalInstance();
|
||||
|
||||
virtual void connectSignalsToEventEmitter();
|
||||
|
||||
// Wrapped methods
|
||||
Napi::Value clear(const Napi::CallbackInfo& info);
|
||||
Napi::Value setText(const Napi::CallbackInfo& info);
|
||||
|
||||
@ -27,6 +27,8 @@ class DLL_EXPORT QColorWrap : public Napi::ObjectWrap<QColorWrap> {
|
||||
Napi::Value blue(const Napi::CallbackInfo& info);
|
||||
Napi::Value setAlpha(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 {
|
||||
|
||||
@ -12,7 +12,7 @@ class DLL_EXPORT NDrag : public QDrag, public EventWidget {
|
||||
public:
|
||||
using QDrag::QDrag;
|
||||
|
||||
void connectSignalsToEventEmitter() {
|
||||
virtual void connectSignalsToEventEmitter() {
|
||||
QOBJECT_SIGNALS
|
||||
QObject::connect(this, &QDrag::actionChanged, [=](Qt::DropAction action) {
|
||||
Napi::Env env = this->emitOnNode.Env();
|
||||
|
||||
@ -22,13 +22,13 @@ class DLL_EXPORT QDragWrap : public Napi::ObjectWrap<QDragWrap> {
|
||||
// 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<NDrag> instance;
|
||||
QPointer<QDrag> instance;
|
||||
|
||||
public:
|
||||
static Napi::Object init(Napi::Env env, Napi::Object exports);
|
||||
QDragWrap(const Napi::CallbackInfo& info);
|
||||
~QDragWrap();
|
||||
NDrag* getInternalInstance();
|
||||
QDrag* getInternalInstance();
|
||||
// class constructor
|
||||
static Napi::FunctionReference constructor;
|
||||
|
||||
|
||||
@ -11,6 +11,7 @@
|
||||
class DLL_EXPORT QDragLeaveEventWrap
|
||||
: public Napi::ObjectWrap<QDragLeaveEventWrap> {
|
||||
COMPONENT_WRAPPED_METHODS_DECLARATION
|
||||
QEVENT_WRAPPED_METHODS_DECLARATION
|
||||
|
||||
private:
|
||||
QDragLeaveEvent* instance;
|
||||
@ -23,6 +24,4 @@ class DLL_EXPORT QDragLeaveEventWrap
|
||||
// class constructor
|
||||
static Napi::FunctionReference constructor;
|
||||
// wrapped methods (none)
|
||||
// Methods from QEvent
|
||||
QEVENT_WRAPPED_METHODS_DECLARATION
|
||||
};
|
||||
@ -7,11 +7,6 @@
|
||||
#include "Extras/Export/export.h"
|
||||
#include "core/Component/component_macro.h"
|
||||
|
||||
/*
|
||||
NOTE : QDragMoveEvent inherits from QDropEvent
|
||||
- Is it possible to inherit from QDropEventWrap directly?
|
||||
*/
|
||||
|
||||
class DLL_EXPORT QDragMoveEventWrap
|
||||
: public Napi::ObjectWrap<QDragMoveEventWrap> {
|
||||
COMPONENT_WRAPPED_METHODS_DECLARATION
|
||||
@ -51,4 +46,4 @@ class DLL_EXPORT QDragMoveEventWrap
|
||||
Napi::Value setAccepted(const Napi::CallbackInfo& info);
|
||||
Napi::Value spontaneous(const Napi::CallbackInfo& info);
|
||||
Napi::Value _type(const Napi::CallbackInfo& info);
|
||||
};
|
||||
};
|
||||
|
||||
@ -0,0 +1,19 @@
|
||||
#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
|
||||
@ -0,0 +1,32 @@
|
||||
#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);
|
||||
};
|
||||
@ -0,0 +1,30 @@
|
||||
#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);
|
||||
};
|
||||
@ -5,10 +5,14 @@
|
||||
#include <QKeyEvent>
|
||||
|
||||
#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 QKeyEventWrap : public Napi::ObjectWrap<QKeyEventWrap> {
|
||||
COMPONENT_WRAPPED_METHODS_DECLARATION
|
||||
QEVENT_WRAPPED_METHODS_DECLARATION
|
||||
QINPUTEVENT_WRAPPED_METHODS_DECLARATION
|
||||
|
||||
private:
|
||||
QKeyEvent* instance;
|
||||
@ -23,7 +27,6 @@ class DLL_EXPORT QKeyEventWrap : public Napi::ObjectWrap<QKeyEventWrap> {
|
||||
// wrapped methods
|
||||
Napi::Value text(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 isAutoRepeat(const Napi::CallbackInfo& info);
|
||||
};
|
||||
};
|
||||
|
||||
@ -5,10 +5,14 @@
|
||||
#include <QMouseEvent>
|
||||
|
||||
#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 QMouseEventWrap : public Napi::ObjectWrap<QMouseEventWrap> {
|
||||
COMPONENT_WRAPPED_METHODS_DECLARATION
|
||||
QEVENT_WRAPPED_METHODS_DECLARATION
|
||||
QINPUTEVENT_WRAPPED_METHODS_DECLARATION
|
||||
|
||||
private:
|
||||
QMouseEvent* instance;
|
||||
@ -22,6 +26,7 @@ class DLL_EXPORT QMouseEventWrap : public Napi::ObjectWrap<QMouseEventWrap> {
|
||||
static Napi::FunctionReference constructor;
|
||||
// wrapped methods
|
||||
Napi::Value button(const Napi::CallbackInfo& info);
|
||||
Napi::Value buttons(const Napi::CallbackInfo& info);
|
||||
Napi::Value x(const Napi::CallbackInfo& info);
|
||||
Napi::Value y(const Napi::CallbackInfo& info);
|
||||
Napi::Value globalX(const Napi::CallbackInfo& info);
|
||||
|
||||
@ -0,0 +1,28 @@
|
||||
#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);
|
||||
};
|
||||
@ -5,11 +5,15 @@
|
||||
#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;
|
||||
|
||||
@ -0,0 +1,25 @@
|
||||
#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);
|
||||
};
|
||||
@ -0,0 +1,28 @@
|
||||
#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);
|
||||
};
|
||||
@ -5,10 +5,14 @@
|
||||
#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;
|
||||
|
||||
@ -0,0 +1,27 @@
|
||||
#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);
|
||||
};
|
||||
@ -5,10 +5,14 @@
|
||||
#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;
|
||||
|
||||
@ -18,11 +18,15 @@ class DLL_EXPORT QFontWrap : public Napi::ObjectWrap<QFontWrap> {
|
||||
~QFontWrap();
|
||||
QFont* getInternalInstance();
|
||||
// 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 capitalization(const Napi::CallbackInfo& info);
|
||||
Napi::Value setFamily(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 pixelSize(const Napi::CallbackInfo& info);
|
||||
Napi::Value pointSize(const Napi::CallbackInfo& info);
|
||||
Napi::Value setStretch(const Napi::CallbackInfo& info);
|
||||
Napi::Value stretch(const Napi::CallbackInfo& info);
|
||||
@ -30,6 +34,7 @@ class DLL_EXPORT QFontWrap : public Napi::ObjectWrap<QFontWrap> {
|
||||
Napi::Value weight(const Napi::CallbackInfo& info);
|
||||
Napi::Value setItalic(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);
|
||||
COMPONENT_WRAPPED_METHODS_DECLARATION
|
||||
};
|
||||
|
||||
@ -22,11 +22,14 @@ class DLL_EXPORT QFontDatabaseWrap
|
||||
// Wrapped methods
|
||||
Napi::Value bold(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 styles(const Napi::CallbackInfo& info);
|
||||
Napi::Value weight(const Napi::CallbackInfo& info);
|
||||
};
|
||||
|
||||
namespace StaticQFontDatabaseWrapMethods {
|
||||
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);
|
||||
} // namespace StaticQFontDatabaseWrapMethods
|
||||
|
||||
@ -37,4 +37,12 @@ class DLL_EXPORT QFontMetricsWrap : public Napi::ObjectWrap<QFontMetricsWrap> {
|
||||
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);
|
||||
};
|
||||
|
||||
@ -0,0 +1,49 @@
|
||||
#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);
|
||||
};
|
||||
@ -20,10 +20,18 @@ class DLL_EXPORT QIconWrap : public Napi::ObjectWrap<QIconWrap> {
|
||||
~QIconWrap();
|
||||
QIcon* getInternalInstance();
|
||||
// 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 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 cacheKey(const Napi::CallbackInfo& info);
|
||||
Napi::Value swap(const Napi::CallbackInfo& info);
|
||||
};
|
||||
|
||||
namespace StaticQIconWrapMethods {
|
||||
|
||||
@ -14,7 +14,7 @@ class DLL_EXPORT NMovie : public QMovie, public EventWidget {
|
||||
public:
|
||||
using QMovie::QMovie;
|
||||
|
||||
void connectSignalsToEventEmitter() {
|
||||
virtual void connectSignalsToEventEmitter() {
|
||||
QOBJECT_SIGNALS
|
||||
// Qt Connects: Implement all signal connects here
|
||||
QObject::connect(this, &QMovie::error,
|
||||
|
||||
24
src/cpp/include/nodegui/QtGui/QPalette/qpalette_wrap.h
Normal file
24
src/cpp/include/nodegui/QtGui/QPalette/qpalette_wrap.h
Normal file
@ -0,0 +1,24 @@
|
||||
#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);
|
||||
};
|
||||
34
src/cpp/include/nodegui/QtGui/QScreen/qscreen_wrap.h
Normal file
34
src/cpp/include/nodegui/QtGui/QScreen/qscreen_wrap.h
Normal file
@ -0,0 +1,34 @@
|
||||
#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);
|
||||
};
|
||||
@ -20,4 +20,6 @@ class DLL_EXPORT QStyleWrap : public Napi::ObjectWrap<QStyleWrap> {
|
||||
QStyle* getInternalInstance();
|
||||
// Wrapped methods
|
||||
Napi::Value pixelMetric(const Napi::CallbackInfo& info);
|
||||
Napi::Value polish(const Napi::CallbackInfo& info);
|
||||
Napi::Value unpolish(const Napi::CallbackInfo& info);
|
||||
};
|
||||
|
||||
58
src/cpp/include/nodegui/QtGui/QWindow/qwindow_wrap.h
Normal file
58
src/cpp/include/nodegui/QtGui/QWindow/qwindow_wrap.h
Normal file
@ -0,0 +1,58 @@
|
||||
#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;
|
||||
};
|
||||
@ -16,20 +16,16 @@
|
||||
QWIDGET_WRAPPED_METHODS_DECLARATION \
|
||||
Napi::Value animateClick(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
int msec = info[0].As<Napi::Number>().Int32Value(); \
|
||||
this->instance->animateClick(msec); \
|
||||
this->instance->animateClick(); \
|
||||
return env.Null(); \
|
||||
} \
|
||||
Napi::Value click(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
this->instance->click(); \
|
||||
return env.Null(); \
|
||||
} \
|
||||
Napi::Value toggle(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
this->instance->toggle(); \
|
||||
return env.Null(); \
|
||||
}
|
||||
|
||||
@ -0,0 +1,21 @@
|
||||
#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
|
||||
@ -0,0 +1,25 @@
|
||||
#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
|
||||
};
|
||||
@ -1,6 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#include "QtCore/QAbstractItemModel/qabstractitemmodel_wrap.h"
|
||||
#include "QtCore/QItemSelectionModel/qitemselectionmodel_wrap.h"
|
||||
#include "QtCore/QModelIndex/qmodelindex_wrap.h"
|
||||
#include "QtWidgets/QAbstractItemDelegate/qabstractitemdelegate_wrap.h"
|
||||
#include "QtWidgets/QAbstractScrollArea/qabstractscrollarea_macro.h"
|
||||
#include "QtWidgets/QWidget/qwidget_wrap.h"
|
||||
|
||||
@ -12,110 +15,353 @@
|
||||
*/
|
||||
|
||||
#ifndef QABSTRACTITEMVIEW_WRAPPED_METHODS_DECLARATION
|
||||
#define QABSTRACTITEMVIEW_WRAPPED_METHODS_DECLARATION \
|
||||
QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION \
|
||||
Napi::Value setCurrentIndex(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
Napi::Object indexObject = info[0].As<Napi::Object>(); \
|
||||
QModelIndexWrap* indexWrap = \
|
||||
Napi::ObjectWrap<QModelIndexWrap>::Unwrap(indexObject); \
|
||||
this->instance->setCurrentIndex(*indexWrap->getInternalInstance()); \
|
||||
return env.Null(); \
|
||||
} \
|
||||
Napi::Value currentIndex(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
QModelIndex current = this->instance->currentIndex(); \
|
||||
auto instance = QModelIndexWrap::constructor.New( \
|
||||
{Napi::External<QModelIndex>::New(env, new QModelIndex(current))}); \
|
||||
return instance; \
|
||||
} \
|
||||
Napi::Value setIndexWidget(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
Napi::Object indexObject = info[0].As<Napi::Object>(); \
|
||||
Napi::Object widgetObject = info[1].As<Napi::Object>(); \
|
||||
QModelIndexWrap* indexWrap = \
|
||||
Napi::ObjectWrap<QModelIndexWrap>::Unwrap(indexObject); \
|
||||
NodeWidgetWrap* widgetWrap = \
|
||||
Napi::ObjectWrap<NodeWidgetWrap>::Unwrap(widgetObject); \
|
||||
this->instance->setIndexWidget(*indexWrap->getInternalInstance(), \
|
||||
widgetWrap->getInternalInstance()); \
|
||||
return env.Null(); \
|
||||
} \
|
||||
Napi::Value indexWidget(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
Napi::Object indexObject = info[0].As<Napi::Object>(); \
|
||||
QModelIndexWrap* indexWrap = \
|
||||
Napi::ObjectWrap<QModelIndexWrap>::Unwrap(indexObject); \
|
||||
QWidget* widget = \
|
||||
this->instance->indexWidget(*indexWrap->getInternalInstance()); \
|
||||
auto instance = QWidgetWrap::constructor.New( \
|
||||
{Napi::External<QWidget>::New(env, widget), \
|
||||
Napi::Boolean::New(env, true)}); \
|
||||
return instance; \
|
||||
} \
|
||||
Napi::Value resetHorizontalScrollMode(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
this->instance->resetHorizontalScrollMode(); \
|
||||
return env.Null(); \
|
||||
} \
|
||||
Napi::Value resetVerticalScrollMode(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
this->instance->resetVerticalScrollMode(); \
|
||||
return env.Null(); \
|
||||
} \
|
||||
Napi::Value rootIndex(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
QModelIndex root = this->instance->rootIndex(); \
|
||||
auto instance = QModelIndexWrap::constructor.New( \
|
||||
{Napi::External<QModelIndex>::New(env, new QModelIndex(root))}); \
|
||||
return instance; \
|
||||
} \
|
||||
Napi::Value scrollToBottom(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
this->instance->scrollToBottom(); \
|
||||
return env.Null(); \
|
||||
} \
|
||||
Napi::Value scrollToTop(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
this->instance->scrollToTop(); \
|
||||
return env.Null(); \
|
||||
|
||||
// This silly *WITHOUT_INDEXAT nonsense is for the benefit of QHeaderView and
|
||||
// its redefinition of `indexAt()` as protected(!) instead of plain public.
|
||||
// *sigh*
|
||||
#define QABSTRACTITEMVIEW_WRAPPED_METHODS_DECLARATION_NO_QHEADERVIEW_PROTECTED \
|
||||
QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION \
|
||||
Napi::Value setCurrentIndex(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::Object indexObject = info[0].As<Napi::Object>(); \
|
||||
QModelIndexWrap* indexWrap = \
|
||||
Napi::ObjectWrap<QModelIndexWrap>::Unwrap(indexObject); \
|
||||
this->instance->setCurrentIndex(*indexWrap->getInternalInstance()); \
|
||||
return env.Null(); \
|
||||
} \
|
||||
Napi::Value currentIndex(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
QModelIndex current = this->instance->currentIndex(); \
|
||||
auto instance = QModelIndexWrap::constructor.New( \
|
||||
{Napi::External<QModelIndex>::New(env, new QModelIndex(current))}); \
|
||||
return instance; \
|
||||
} \
|
||||
Napi::Value setIndexWidget(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::Object indexObject = info[0].As<Napi::Object>(); \
|
||||
Napi::Object widgetObject = info[1].As<Napi::Object>(); \
|
||||
QModelIndexWrap* indexWrap = \
|
||||
Napi::ObjectWrap<QModelIndexWrap>::Unwrap(indexObject); \
|
||||
NodeWidgetWrap* widgetWrap = \
|
||||
Napi::ObjectWrap<NodeWidgetWrap>::Unwrap(widgetObject); \
|
||||
this->instance->setIndexWidget(*indexWrap->getInternalInstance(), \
|
||||
widgetWrap->getInternalInstance()); \
|
||||
return env.Null(); \
|
||||
} \
|
||||
Napi::Value indexWidget(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::Object indexObject = info[0].As<Napi::Object>(); \
|
||||
QModelIndexWrap* indexWrap = \
|
||||
Napi::ObjectWrap<QModelIndexWrap>::Unwrap(indexObject); \
|
||||
QWidget* widget = \
|
||||
this->instance->indexWidget(*indexWrap->getInternalInstance()); \
|
||||
auto instance = QWidgetWrap::constructor.New( \
|
||||
{Napi::External<QWidget>::New(env, widget), \
|
||||
Napi::Boolean::New(env, true)}); \
|
||||
return instance; \
|
||||
} \
|
||||
Napi::Value resetHorizontalScrollMode(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
this->instance->resetHorizontalScrollMode(); \
|
||||
return env.Null(); \
|
||||
} \
|
||||
Napi::Value resetVerticalScrollMode(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
this->instance->resetVerticalScrollMode(); \
|
||||
return env.Null(); \
|
||||
} \
|
||||
Napi::Value rootIndex(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
QModelIndex root = this->instance->rootIndex(); \
|
||||
auto instance = QModelIndexWrap::constructor.New( \
|
||||
{Napi::External<QModelIndex>::New(env, new QModelIndex(root))}); \
|
||||
return instance; \
|
||||
} \
|
||||
Napi::Value scrollToBottom(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
this->instance->scrollToBottom(); \
|
||||
return env.Null(); \
|
||||
} \
|
||||
Napi::Value scrollToTop(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
this->instance->scrollToTop(); \
|
||||
return env.Null(); \
|
||||
} \
|
||||
Napi::Value setModel(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::Object modelObject = info[0].As<Napi::Object>(); \
|
||||
QAbstractItemModelWrap* modelWrap = \
|
||||
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
|
||||
|
||||
#ifndef QABSTRACTITEMVIEW_WRAPPED_METHODS_EXPORT_DEFINE
|
||||
#define QABSTRACTITEMVIEW_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \
|
||||
QABSTRACTSCROLLAREA_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \
|
||||
InstanceMethod("setCurrentIndex", &WidgetWrapName::setCurrentIndex), \
|
||||
InstanceMethod("currentIndex", &WidgetWrapName::currentIndex), \
|
||||
InstanceMethod("setIndexWidget", &WidgetWrapName::setIndexWidget), \
|
||||
InstanceMethod("indexWidget", &WidgetWrapName::indexWidget), \
|
||||
InstanceMethod("resetHorizontalScrollMode", \
|
||||
&WidgetWrapName::resetHorizontalScrollMode), \
|
||||
InstanceMethod("resetVerticalScrollMode", \
|
||||
&WidgetWrapName::resetVerticalScrollMode), \
|
||||
InstanceMethod("rootIndex", &WidgetWrapName::rootIndex), \
|
||||
InstanceMethod("scrollToBottom", &WidgetWrapName::scrollToBottom), \
|
||||
InstanceMethod("scrollToTop", &WidgetWrapName::scrollToTop),
|
||||
#define QABSTRACTITEMVIEW_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \
|
||||
QABSTRACTSCROLLAREA_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \
|
||||
InstanceMethod("setCurrentIndex", &WidgetWrapName::setCurrentIndex), \
|
||||
InstanceMethod("currentIndex", &WidgetWrapName::currentIndex), \
|
||||
InstanceMethod("setIndexWidget", &WidgetWrapName::setIndexWidget), \
|
||||
InstanceMethod("indexWidget", &WidgetWrapName::indexWidget), \
|
||||
InstanceMethod("resetHorizontalScrollMode", \
|
||||
&WidgetWrapName::resetHorizontalScrollMode), \
|
||||
InstanceMethod("resetVerticalScrollMode", \
|
||||
&WidgetWrapName::resetVerticalScrollMode), \
|
||||
InstanceMethod("rootIndex", &WidgetWrapName::rootIndex), \
|
||||
InstanceMethod("scrollToBottom", &WidgetWrapName::scrollToBottom), \
|
||||
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
|
||||
|
||||
#ifndef QABSTRACTITEMVIEW_SIGNALS
|
||||
#define QABSTRACTITEMVIEW_SIGNALS \
|
||||
QABSTRACTSCROLLAREA_SIGNALS \
|
||||
QObject::connect(this, &QAbstractItemView::viewportEntered, [=]() { \
|
||||
Napi::Env env = this->emitOnNode.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
this->emitOnNode.Call({Napi::String::New(env, "viewportEntered")}); \
|
||||
#define QABSTRACTITEMVIEW_SIGNALS \
|
||||
QABSTRACTSCROLLAREA_SIGNALS \
|
||||
QObject::connect( \
|
||||
this, &QAbstractItemView::activated, [=](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, "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
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
#include "QtCore/QSize/qsize_wrap.h"
|
||||
#include "QtWidgets/QFrame/qframe_macro.h"
|
||||
#include "QtWidgets/QScrollBar/qscrollbar_wrap.h"
|
||||
#include "QtWidgets/QWidget/qwidget_wrap.h"
|
||||
|
||||
/*
|
||||
@ -11,40 +13,86 @@
|
||||
*/
|
||||
|
||||
#ifndef QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION
|
||||
#define QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION \
|
||||
\
|
||||
QFRAME_WRAPPED_METHODS_DECLARATION \
|
||||
\
|
||||
Napi::Value setViewport(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(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(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
QWidget* viewPort = this->instance->viewport(); \
|
||||
NWidget* nviewPort = reinterpret_cast<NWidget*>(viewPort); \
|
||||
auto instance = QWidgetWrap::constructor.New( \
|
||||
{Napi::External<NWidget>::New(env, nviewPort)}); \
|
||||
return instance; \
|
||||
#define QABSTRACTSCROLLAREA_WRAPPED_METHODS_DECLARATION \
|
||||
\
|
||||
QFRAME_WRAPPED_METHODS_DECLARATION \
|
||||
\
|
||||
Napi::Value maximumViewportSize(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
QSize size = this->instance->maximumViewportSize(); \
|
||||
auto instance = QSizeWrap::constructor.New( \
|
||||
{Napi::External<QSize>::New(env, new QSize(size))}); \
|
||||
return instance; \
|
||||
} \
|
||||
\
|
||||
Napi::Value setHorizontalScrollBar(const Napi::CallbackInfo& info) { \
|
||||
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->setHorizontalScrollBar(scrollBar); \
|
||||
return env.Null(); \
|
||||
} \
|
||||
\
|
||||
Napi::Value setVerticalScrollBar(const Napi::CallbackInfo& info) { \
|
||||
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
|
||||
|
||||
#ifndef QABSTRACTSCROLLAREA_WRAPPED_METHODS_EXPORT_DEFINE
|
||||
#define QABSTRACTSCROLLAREA_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \
|
||||
\
|
||||
QFRAME_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \
|
||||
\
|
||||
InstanceMethod("setViewport", &WidgetWrapName::setViewport), \
|
||||
InstanceMethod("viewport", &WidgetWrapName::viewport),
|
||||
#define QABSTRACTSCROLLAREA_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \
|
||||
\
|
||||
QFRAME_WRAPPED_METHODS_EXPORT_DEFINE(WidgetWrapName) \
|
||||
\
|
||||
InstanceMethod("maximumViewportSize", &WidgetWrapName::maximumViewportSize), \
|
||||
InstanceMethod("setHorizontalScrollBar", \
|
||||
&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
|
||||
|
||||
|
||||
@ -14,7 +14,6 @@
|
||||
QWIDGET_WRAPPED_METHODS_DECLARATION \
|
||||
Napi::Value triggerAction(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
int action = info[0].As<Napi::Number>().Int32Value(); \
|
||||
this->instance->triggerAction( \
|
||||
static_cast<QAbstractSlider::SliderAction>(action)); \
|
||||
@ -22,7 +21,6 @@
|
||||
} \
|
||||
Napi::Value setRange(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
int min = info[0].As<Napi::Number>().Int32Value(); \
|
||||
int max = info[1].As<Napi::Number>().Int32Value(); \
|
||||
this->instance->setRange(min, max); \
|
||||
|
||||
@ -15,19 +15,16 @@
|
||||
QWIDGET_WRAPPED_METHODS_DECLARATION \
|
||||
Napi::Value selectAll(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
this->instance->selectAll(); \
|
||||
return env.Null(); \
|
||||
} \
|
||||
Napi::Value stepDown(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
this->instance->stepDown(); \
|
||||
return env.Null(); \
|
||||
} \
|
||||
Napi::Value stepUp(const Napi::CallbackInfo& info) { \
|
||||
Napi::Env env = info.Env(); \
|
||||
Napi::HandleScope scope(env); \
|
||||
this->instance->stepUp(); \
|
||||
return env.Null(); \
|
||||
}
|
||||
|
||||
@ -11,7 +11,7 @@ class DLL_EXPORT NAction : public QAction, public EventWidget {
|
||||
EVENTWIDGET_IMPLEMENTATIONS(QAction)
|
||||
public:
|
||||
using QAction::QAction; // inherit all constructors of QAction
|
||||
void connectSignalsToEventEmitter() {
|
||||
virtual void connectSignalsToEventEmitter() {
|
||||
// Qt Connects: Implement all signal connects here
|
||||
QOBJECT_SIGNALS
|
||||
QObject::connect(this, &QAction::triggered, [=](bool checked) {
|
||||
|
||||
@ -11,14 +11,13 @@ class DLL_EXPORT QActionWrap : public Napi::ObjectWrap<QActionWrap> {
|
||||
QOBJECT_WRAPPED_METHODS_DECLARATION
|
||||
|
||||
private:
|
||||
QPointer<NAction> instance;
|
||||
bool disableDeletion;
|
||||
QPointer<QAction> instance;
|
||||
|
||||
public:
|
||||
static Napi::Object init(Napi::Env env, Napi::Object exports);
|
||||
QActionWrap(const Napi::CallbackInfo& info);
|
||||
~QActionWrap();
|
||||
NAction* getInternalInstance();
|
||||
QAction* getInternalInstance();
|
||||
// class constructor
|
||||
static Napi::FunctionReference constructor;
|
||||
// wrapped methods
|
||||
@ -35,4 +34,6 @@ class DLL_EXPORT QActionWrap : public Napi::ObjectWrap<QActionWrap> {
|
||||
Napi::Value isSeparator(const Napi::CallbackInfo& info);
|
||||
Napi::Value setSeparator(const Napi::CallbackInfo& info);
|
||||
Napi::Value setFont(const Napi::CallbackInfo& info);
|
||||
Napi::Value data(const Napi::CallbackInfo& info);
|
||||
Napi::Value setData(const Napi::CallbackInfo& info);
|
||||
};
|
||||
|
||||
@ -10,5 +10,5 @@ class DLL_EXPORT NBoxLayout : public QBoxLayout, public EventWidget {
|
||||
public:
|
||||
EVENTWIDGET_IMPLEMENTATIONS(QBoxLayout)
|
||||
using QBoxLayout::QBoxLayout;
|
||||
void connectSignalsToEventEmitter() { QLAYOUT_SIGNALS }
|
||||
virtual void connectSignalsToEventEmitter() { QLAYOUT_SIGNALS }
|
||||
};
|
||||
|
||||
@ -12,13 +12,13 @@
|
||||
class DLL_EXPORT QBoxLayoutWrap : public Napi::ObjectWrap<QBoxLayoutWrap> {
|
||||
QLAYOUT_WRAPPED_METHODS_DECLARATION
|
||||
private:
|
||||
QPointer<NBoxLayout> instance;
|
||||
QPointer<QBoxLayout> instance;
|
||||
|
||||
public:
|
||||
static Napi::Object init(Napi::Env env, Napi::Object exports);
|
||||
QBoxLayoutWrap(const Napi::CallbackInfo& info);
|
||||
~QBoxLayoutWrap();
|
||||
NBoxLayout* getInternalInstance();
|
||||
QBoxLayout* getInternalInstance();
|
||||
// class constructor
|
||||
static Napi::FunctionReference constructor;
|
||||
// wrapped methods
|
||||
|
||||
@ -12,15 +12,33 @@ class DLL_EXPORT NButtonGroup : public QButtonGroup, public EventWidget {
|
||||
EVENTWIDGET_IMPLEMENTATIONS(QButtonGroup)
|
||||
public:
|
||||
using QButtonGroup::QButtonGroup; // inherit all constructors of QButtonGroup
|
||||
void connectSignalsToEventEmitter() {
|
||||
virtual void connectSignalsToEventEmitter() {
|
||||
QOBJECT_SIGNALS
|
||||
// Qt Connects: Implement all signal connects here
|
||||
connect(this, QOverload<int>::of(&QButtonGroup::buttonClicked),
|
||||
[=](int id) {
|
||||
Napi::Env env = this->emitOnNode.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
this->emitOnNode.Call({Napi::String::New(env, "buttonClicked"),
|
||||
Napi::Number::New(env, id)});
|
||||
});
|
||||
connect(this, &QButtonGroup::idClicked, [=](int id) {
|
||||
Napi::Env env = this->emitOnNode.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
this->emitOnNode.Call(
|
||||
{Napi::String::New(env, "idClicked"), Napi::Number::New(env, id)});
|
||||
});
|
||||
connect(this, &QButtonGroup::idPressed, [=](int id) {
|
||||
Napi::Env env = this->emitOnNode.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
this->emitOnNode.Call(
|
||||
{Napi::String::New(env, "idPressed"), Napi::Number::New(env, id)});
|
||||
});
|
||||
connect(this, &QButtonGroup::idReleased, [=](int id) {
|
||||
Napi::Env env = this->emitOnNode.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
this->emitOnNode.Call(
|
||||
{Napi::String::New(env, "idReleased"), Napi::Number::New(env, id)});
|
||||
});
|
||||
connect(this, &QButtonGroup::idToggled, [=](int id, bool checked) {
|
||||
Napi::Env env = this->emitOnNode.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
this->emitOnNode.Call({Napi::String::New(env, "idToggled"),
|
||||
Napi::Number::New(env, id),
|
||||
Napi::Boolean::New(env, checked)});
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
@ -9,13 +9,13 @@
|
||||
#include "nbuttongroup.hpp"
|
||||
class DLL_EXPORT QButtonGroupWrap : public Napi::ObjectWrap<QButtonGroupWrap> {
|
||||
private:
|
||||
QPointer<NButtonGroup> instance;
|
||||
QPointer<QButtonGroup> instance;
|
||||
|
||||
public:
|
||||
static Napi::Object init(Napi::Env env, Napi::Object exports);
|
||||
QButtonGroupWrap(const Napi::CallbackInfo& info);
|
||||
~QButtonGroupWrap();
|
||||
NButtonGroup* getInternalInstance();
|
||||
QButtonGroup* getInternalInstance();
|
||||
// class constructor
|
||||
static Napi::FunctionReference constructor;
|
||||
// wrapped methods
|
||||
|
||||
@ -14,7 +14,7 @@ class DLL_EXPORT NCalendarWidget : public QCalendarWidget, public NodeWidget {
|
||||
// inherit all constructors of QCalendarWidget
|
||||
using QCalendarWidget::QCalendarWidget;
|
||||
|
||||
void connectSignalsToEventEmitter() {
|
||||
virtual void connectSignalsToEventEmitter() {
|
||||
// Qt Connects: Implement all signal connects here
|
||||
QWIDGET_SIGNALS
|
||||
QObject::connect(this, &QCalendarWidget::activated, [=](const QDate &date) {
|
||||
|
||||
@ -11,13 +11,13 @@
|
||||
class DLL_EXPORT QCalendarWidgetWrap
|
||||
: public Napi::ObjectWrap<QCalendarWidgetWrap> {
|
||||
private:
|
||||
QPointer<NCalendarWidget> instance;
|
||||
QPointer<QCalendarWidget> instance;
|
||||
|
||||
public:
|
||||
static Napi::Object init(Napi::Env env, Napi::Object exports);
|
||||
QCalendarWidgetWrap(const Napi::CallbackInfo &info);
|
||||
~QCalendarWidgetWrap();
|
||||
NCalendarWidget *getInternalInstance();
|
||||
QCalendarWidget *getInternalInstance();
|
||||
// class constructor
|
||||
static Napi::FunctionReference constructor;
|
||||
// wrapped methods
|
||||
|
||||
@ -13,7 +13,7 @@ class DLL_EXPORT NCheckBox : public QCheckBox, public NodeWidget {
|
||||
public:
|
||||
using QCheckBox::QCheckBox; // inherit all constructors of QCheckBox
|
||||
|
||||
void connectSignalsToEventEmitter() {
|
||||
virtual void connectSignalsToEventEmitter() {
|
||||
QABSTRACT_BUTTON_SIGNALS
|
||||
QObject::connect(this, &QCheckBox::stateChanged, [=](int state) {
|
||||
Napi::Env env = this->emitOnNode.Env();
|
||||
|
||||
@ -12,14 +12,13 @@
|
||||
class DLL_EXPORT QCheckBoxWrap : public Napi::ObjectWrap<QCheckBoxWrap> {
|
||||
QABSTRACTBUTTON_WRAPPED_METHODS_DECLARATION
|
||||
private:
|
||||
QPointer<NCheckBox> instance;
|
||||
bool disableDeletion;
|
||||
QPointer<QCheckBox> instance;
|
||||
|
||||
public:
|
||||
static Napi::Object init(Napi::Env env, Napi::Object exports);
|
||||
QCheckBoxWrap(const Napi::CallbackInfo& info);
|
||||
~QCheckBoxWrap();
|
||||
NCheckBox* getInternalInstance();
|
||||
QCheckBox* getInternalInstance();
|
||||
// class constructor
|
||||
static Napi::FunctionReference constructor;
|
||||
// wrapped methods
|
||||
|
||||
@ -14,7 +14,7 @@ class DLL_EXPORT NColorDialog : public QColorDialog, public NodeWidget {
|
||||
public:
|
||||
using QColorDialog::QColorDialog;
|
||||
|
||||
void connectSignalsToEventEmitter() {
|
||||
virtual void connectSignalsToEventEmitter() {
|
||||
QDIALOG_SIGNALS
|
||||
// Qt Connects: Implement all signal connects here
|
||||
QObject::connect(
|
||||
|
||||
@ -9,21 +9,23 @@
|
||||
#include "QtWidgets/QDialog/qdialog_macro.h"
|
||||
|
||||
class DLL_EXPORT QColorDialogWrap : public Napi::ObjectWrap<QColorDialogWrap> {
|
||||
QDIALOG_WRAPPED_METHODS_DECLARATION
|
||||
QDIALOG_WRAPPED_METHODS_DECLARATION_NO_ACCEPT_OR_DONE
|
||||
private:
|
||||
QPointer<NColorDialog> instance;
|
||||
QPointer<QColorDialog> instance;
|
||||
|
||||
public:
|
||||
static Napi::Object init(Napi::Env env, Napi::Object exports);
|
||||
QColorDialogWrap(const Napi::CallbackInfo& info);
|
||||
~QColorDialogWrap();
|
||||
NColorDialog* getInternalInstance();
|
||||
QColorDialog* getInternalInstance();
|
||||
// class constructor
|
||||
static Napi::FunctionReference constructor;
|
||||
// wrapped methods
|
||||
Napi::Value selectedColor(const Napi::CallbackInfo& info);
|
||||
Napi::Value setOption(const Napi::CallbackInfo& info);
|
||||
Napi::Value testOption(const Napi::CallbackInfo& info);
|
||||
Napi::Value accept(const Napi::CallbackInfo& info);
|
||||
Napi::Value done(const Napi::CallbackInfo& info);
|
||||
};
|
||||
|
||||
namespace StaticQColorDialogWrapMethods {
|
||||
|
||||
@ -12,9 +12,16 @@ class DLL_EXPORT NComboBox : public QComboBox, public NodeWidget {
|
||||
NODEWIDGET_IMPLEMENTATIONS(QComboBox)
|
||||
using QComboBox::QComboBox;
|
||||
|
||||
void connectSignalsToEventEmitter() {
|
||||
virtual void connectSignalsToEventEmitter() {
|
||||
QWIDGET_SIGNALS
|
||||
// Qt Connects: Implement all signal connects here
|
||||
QObject::connect(
|
||||
this, QOverload<int>::of(&QComboBox::activated), [=](int index) {
|
||||
Napi::Env env = this->emitOnNode.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
this->emitOnNode.Call({Napi::String::New(env, "activated"),
|
||||
Napi::Number::From(env, index)});
|
||||
});
|
||||
QObject::connect(
|
||||
this, QOverload<int>::of(&QComboBox::currentIndexChanged),
|
||||
[=](int index) {
|
||||
@ -38,5 +45,25 @@ class DLL_EXPORT NComboBox : public QComboBox, public NodeWidget {
|
||||
this->emitOnNode.Call({Napi::String::New(env, "editTextChanged"),
|
||||
Napi::String::New(env, text.toStdString())});
|
||||
});
|
||||
QObject::connect(
|
||||
this, QOverload<int>::of(&QComboBox::highlighted), [=](int index) {
|
||||
Napi::Env env = this->emitOnNode.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
this->emitOnNode.Call({Napi::String::New(env, "highlighted"),
|
||||
Napi::Number::From(env, index)});
|
||||
});
|
||||
QObject::connect(this, &QComboBox::textActivated, [=](const QString &text) {
|
||||
Napi::Env env = this->emitOnNode.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
this->emitOnNode.Call({Napi::String::New(env, "textActivated"),
|
||||
Napi::String::New(env, text.toStdString())});
|
||||
});
|
||||
QObject::connect(
|
||||
this, &QComboBox::textHighlighted, [=](const QString &text) {
|
||||
Napi::Env env = this->emitOnNode.Env();
|
||||
Napi::HandleScope scope(env);
|
||||
this->emitOnNode.Call({Napi::String::New(env, "textHighlighted"),
|
||||
Napi::String::New(env, text.toStdString())});
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
@ -11,13 +11,13 @@
|
||||
class DLL_EXPORT QComboBoxWrap : public Napi::ObjectWrap<QComboBoxWrap> {
|
||||
QWIDGET_WRAPPED_METHODS_DECLARATION
|
||||
private:
|
||||
QPointer<NComboBox> instance;
|
||||
QPointer<QComboBox> instance;
|
||||
|
||||
public:
|
||||
static Napi::Object init(Napi::Env env, Napi::Object exports);
|
||||
QComboBoxWrap(const Napi::CallbackInfo& info);
|
||||
~QComboBoxWrap();
|
||||
NComboBox* getInternalInstance();
|
||||
QComboBox* getInternalInstance();
|
||||
// class constructor
|
||||
static Napi::FunctionReference constructor;
|
||||
// wrapped methods
|
||||
@ -40,4 +40,25 @@ class DLL_EXPORT QComboBoxWrap : public Napi::ObjectWrap<QComboBoxWrap> {
|
||||
Napi::Value clear(const Napi::CallbackInfo& info);
|
||||
Napi::Value setModel(const Napi::CallbackInfo& info);
|
||||
Napi::Value setEditText(const Napi::CallbackInfo& info);
|
||||
Napi::Value count(const Napi::CallbackInfo& info);
|
||||
Napi::Value duplicatesEnabled(const Napi::CallbackInfo& info);
|
||||
Napi::Value hasFrame(const Napi::CallbackInfo& info);
|
||||
Napi::Value hidePopup(const Napi::CallbackInfo& info);
|
||||
Napi::Value iconSize(const Napi::CallbackInfo& info);
|
||||
Napi::Value maxCount(const Napi::CallbackInfo& info);
|
||||
Napi::Value minimumContentsLength(const Napi::CallbackInfo& info);
|
||||
Napi::Value modelColumn(const Napi::CallbackInfo& info);
|
||||
Napi::Value rootModelIndex(const Napi::CallbackInfo& info);
|
||||
Napi::Value setDuplicatesEnabled(const Napi::CallbackInfo& info);
|
||||
Napi::Value setMinimumContentsLength(const Napi::CallbackInfo& info);
|
||||
Napi::Value setModelColumn(const Napi::CallbackInfo& info);
|
||||
Napi::Value setRootModelIndex(const Napi::CallbackInfo& info);
|
||||
Napi::Value clearEditText(const Napi::CallbackInfo& info);
|
||||
Napi::Value setFrame(const Napi::CallbackInfo& info);
|
||||
Napi::Value setItemText(const Napi::CallbackInfo& info);
|
||||
Napi::Value setMaxCount(const Napi::CallbackInfo& info);
|
||||
Napi::Value showPopup(const Napi::CallbackInfo& info);
|
||||
Napi::Value insertPolicy(const Napi::CallbackInfo& info);
|
||||
Napi::Value setInsertPolicy(const Napi::CallbackInfo& info);
|
||||
Napi::Value setIconSize(const Napi::CallbackInfo& info);
|
||||
};
|
||||
|
||||
@ -13,7 +13,7 @@ class DLL_EXPORT NDateEdit : public QDateEdit, public NodeWidget {
|
||||
// inherit all constructors of QDateEdit
|
||||
using QDateEdit::QDateEdit;
|
||||
|
||||
void connectSignalsToEventEmitter() {
|
||||
virtual void connectSignalsToEventEmitter() {
|
||||
// Qt Connects: Implement all signal connects here
|
||||
QDATETIMEEDIT_SIGNALS
|
||||
}
|
||||
|
||||
@ -11,13 +11,13 @@
|
||||
class DLL_EXPORT QDateEditWrap : public Napi::ObjectWrap<QDateEditWrap> {
|
||||
QDATETIMEEDIT_WRAPPED_METHODS_DECLARATION
|
||||
private:
|
||||
QPointer<NDateEdit> instance;
|
||||
QPointer<QDateEdit> instance;
|
||||
|
||||
public:
|
||||
static Napi::Object init(Napi::Env env, Napi::Object exports);
|
||||
QDateEditWrap(const Napi::CallbackInfo &info);
|
||||
~QDateEditWrap();
|
||||
NDateEdit *getInternalInstance();
|
||||
QDateEdit *getInternalInstance();
|
||||
// class constructor
|
||||
static Napi::FunctionReference constructor;
|
||||
// wrapped methods
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user