From c15470f7237035f8d3f038f1b3703ffc47abb235 Mon Sep 17 00:00:00 2001 From: zhuzihcu Date: Thu, 27 Apr 2023 09:38:57 +0800 Subject: [PATCH] update --- .github/workflows/macos.yml | 40 ++-- .github/workflows/ubuntu.yml | 47 +++-- .github/workflows/windows-mingw.yml | 35 +++- .github/workflows/windows.yml | 48 +++-- .gitignore | 3 +- .../mingw/libcrypto-1_1-x64.dll | Bin {third => 3rdparty}/mingw/libgcc_s_seh-1.dll | Bin {third => 3rdparty}/mingw/libssl-1_1-x64.dll | Bin {third => 3rdparty}/mingw/libstdc++-6.dll | Bin {third => 3rdparty}/mingw/libwinpthread-1.dll | Bin .../msvc/libcrypto-1_1-x64.dll | Bin {third => 3rdparty}/msvc/libssl-1_1-x64.dll | Bin FluentUI.pro | 6 - example/CMakeLists.txt | 123 ++++++------- example/Info.plist | 29 --- example/example.pro | 59 ------ example/favicon.ico | Bin 119074 -> 0 bytes example/qml.qrc | 173 ------------------ example/qml/App.qml | 16 +- example/qml/global/ItemsFooter.qml | 2 +- example/qml/global/ItemsOriginal.qml | 84 ++++----- example/qml/page/T_Carousel.qml | 4 +- example/qml/page/T_FlipView.qml | 24 +-- example/qml/page/T_Home.qml | 6 +- example/qml/page/T_Rectangle.qml | 12 +- example/qml/page/T_Settings.qml | 2 +- example/qml/page/T_TabView.qml | 4 +- example/qml/window/AboutWindow.qml | 4 +- example/qml/window/ChatWindow.qml | 2 +- example/qml/window/MainWindow.qml | 7 +- example/src/main.cpp | 2 +- scripts/windows-mingw-publish.ps1 | 2 +- scripts/windows-publish.ps1 | 2 +- src/CMakeLists.txt | 100 +++++----- src/Def.h | 3 + src/FluApp.cpp | 33 ++-- src/FluApp.h | 30 +-- src/FluColors.cpp | 10 - src/FluColors.h | 8 +- src/FluRegister.cpp | 2 +- src/FluTheme.cpp | 14 +- src/FluTheme.h | 5 +- src/Fluent.cpp | 121 ------------ src/Fluent.h | 27 --- src/FluentUI.cpp | 15 -- src/FluentUI.h | 15 -- src/FluentUI.pro | 51 ------ src/NativeEventFilter.cpp | 6 +- src/WindowHelper.cpp | 4 +- src/WindowHelper.h | 4 +- src/build-preset/qmldir | 4 - src/build_macos.cmake | 32 ---- src/build_macos.pri | 17 -- src/build_windows.cmake | 27 --- src/build_windows.pri | 20 -- .../Controls/ColorPicker}/ColorPicker.qml | 2 +- .../ColorPicker/Content}/Checkerboard.qml | 0 .../ColorPicker/Content}/ColorSlider.qml | 0 .../ColorPicker/Content}/NumberBox.qml | 0 .../ColorPicker/Content}/PanelBorder.qml | 0 .../ColorPicker/Content}/SBPicker.qml | 0 .../FluentUI/Controls}/FluAppBar.qml | 0 .../FluentUI/Controls}/FluArea.qml | 0 .../FluentUI/Controls}/FluAutoSuggestBox.qml | 0 .../FluentUI/Controls}/FluBadge.qml | 2 + .../FluentUI/Controls}/FluBreadcrumbBar.qml | 0 .../FluentUI/Controls}/FluButton.qml | 0 .../FluentUI/Controls}/FluCalendarPicker.qml | 0 .../FluentUI/Controls}/FluCalendarView.qml | 0 .../FluentUI/Controls}/FluCarousel.qml | 0 .../FluentUI/Controls}/FluCheckBox.qml | 0 .../FluentUI/Controls}/FluColorPicker.qml | 0 .../FluentUI/Controls}/FluColorView.qml | 4 +- .../FluentUI/Controls}/FluComboBox.qml | 1 + .../FluentUI/Controls}/FluContentDialog.qml | 1 + .../FluentUI/Controls}/FluContentPage.qml | 0 .../FluentUI/Controls}/FluDatePicker.qml | 0 .../FluentUI/Controls}/FluDivider.qml | 0 .../FluentUI/Controls}/FluDropDownButton.qml | 0 .../FluentUI/Controls}/FluExpander.qml | 0 .../FluentUI/Controls}/FluFilledButton.qml | 0 .../FluentUI/Controls}/FluFlipView.qml | 0 .../FluentUI/Controls}/FluFocusRectangle.qml | 1 + .../FluentUI/Controls}/FluIcon.qml | 2 + .../FluentUI/Controls}/FluIconButton.qml | 0 .../FluentUI/Controls}/FluInfoBar.qml | 1 + .../FluentUI/Controls}/FluItem.qml | 0 .../FluentUI/Controls}/FluMediaPlayer.qml | 0 .../FluentUI/Controls}/FluMenu.qml | 1 + .../FluentUI/Controls}/FluMenuItem.qml | 2 +- .../Controls}/FluMultilineTextBox.qml | 0 .../FluentUI/Controls}/FluNavigationView.qml | 0 .../FluentUI/Controls}/FluObject.qml | 2 + .../FluentUI/Controls}/FluPagination.qml | 0 .../FluentUI/Controls}/FluPaneItem.qml | 1 + .../FluentUI/Controls}/FluPaneItemEmpty.qml | 2 + .../Controls}/FluPaneItemExpander.qml | 1 + .../FluentUI/Controls}/FluPaneItemHeader.qml | 2 + .../Controls}/FluPaneItemSeparator.qml | 2 + .../FluentUI/Controls}/FluPasswordBox.qml | 0 .../FluentUI/Controls}/FluPivot.qml | 0 .../FluentUI/Controls}/FluPivotItem.qml | 1 + .../FluentUI/Controls}/FluProgressBar.qml | 1 + .../FluentUI/Controls}/FluProgressRing.qml | 1 + .../FluentUI/Controls}/FluRadioButton.qml | 0 .../FluentUI/Controls}/FluRatingControl.qml | 0 .../FluentUI/Controls}/FluRectangle.qml | 1 + .../FluentUI/Controls}/FluScrollBar.qml | 0 .../FluentUI/Controls}/FluScrollablePage.qml | 0 .../FluentUI/Controls}/FluShadow.qml | 2 + .../FluentUI/Controls/FluSingleton.qml | 15 ++ .../FluentUI/Controls}/FluSlider.qml | 1 + .../FluentUI/Controls}/FluStatusView.qml | 0 .../FluentUI/Controls}/FluTabView.qml | 0 .../FluentUI/Controls}/FluTableView.qml | 0 .../FluentUI/Controls}/FluText.qml | 1 + .../FluentUI/Controls}/FluTextBox.qml | 0 .../Controls}/FluTextBoxBackground.qml | 2 + .../FluentUI/Controls}/FluTextBoxMenu.qml | 0 .../FluentUI/Controls}/FluTextButton.qml | 0 .../FluentUI/Controls}/FluTimePicker.qml | 0 .../FluentUI/Controls}/FluToggleButton.qml | 0 .../FluentUI/Controls}/FluToggleSwitch.qml | 0 .../FluentUI/Controls}/FluTooltip.qml | 0 .../FluentUI/Controls}/FluTreeView.qml | 0 .../FluentUI/Controls}/FluWindow.qml | 0 .../FluentUI/Controls}/FluWindowResize.qml | 2 + .../FluentUI/Font}/Segoe_Fluent_Icons.ttf | Bin src/imports/FluentUI/qmldir | 68 +++++++ src/macos_install.sh | 14 -- src/qml_plugin.cpp | 12 -- src/qml_plugin.h | 14 -- src/res.qrc | 76 -------- src/styles/Theme.qml | 0 src/styles/Typography.qml | 0 src/win_install.bat | 29 --- 136 files changed, 471 insertions(+), 1080 deletions(-) rename {third => 3rdparty}/mingw/libcrypto-1_1-x64.dll (100%) rename {third => 3rdparty}/mingw/libgcc_s_seh-1.dll (100%) rename {third => 3rdparty}/mingw/libssl-1_1-x64.dll (100%) rename {third => 3rdparty}/mingw/libstdc++-6.dll (100%) rename {third => 3rdparty}/mingw/libwinpthread-1.dll (100%) rename {third => 3rdparty}/msvc/libcrypto-1_1-x64.dll (100%) rename {third => 3rdparty}/msvc/libssl-1_1-x64.dll (100%) delete mode 100644 FluentUI.pro delete mode 100644 example/Info.plist delete mode 100644 example/example.pro delete mode 100644 example/favicon.ico delete mode 100644 example/qml.qrc delete mode 100644 src/Fluent.cpp delete mode 100644 src/Fluent.h delete mode 100644 src/FluentUI.cpp delete mode 100644 src/FluentUI.h delete mode 100644 src/FluentUI.pro delete mode 100644 src/build-preset/qmldir delete mode 100644 src/build_macos.cmake delete mode 100644 src/build_macos.pri delete mode 100644 src/build_windows.cmake delete mode 100644 src/build_windows.pri rename src/{colorpicker => imports/FluentUI/Controls/ColorPicker}/ColorPicker.qml (99%) rename src/{colorpicker/content => imports/FluentUI/Controls/ColorPicker/Content}/Checkerboard.qml (100%) rename src/{colorpicker/content => imports/FluentUI/Controls/ColorPicker/Content}/ColorSlider.qml (100%) rename src/{colorpicker/content => imports/FluentUI/Controls/ColorPicker/Content}/NumberBox.qml (100%) rename src/{colorpicker/content => imports/FluentUI/Controls/ColorPicker/Content}/PanelBorder.qml (100%) rename src/{colorpicker/content => imports/FluentUI/Controls/ColorPicker/Content}/SBPicker.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluAppBar.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluArea.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluAutoSuggestBox.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluBadge.qml (97%) rename src/{controls => imports/FluentUI/Controls}/FluBreadcrumbBar.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluButton.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluCalendarPicker.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluCalendarView.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluCarousel.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluCheckBox.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluColorPicker.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluColorView.qml (86%) rename src/{controls => imports/FluentUI/Controls}/FluComboBox.qml (65%) rename src/{controls => imports/FluentUI/Controls}/FluContentDialog.qml (99%) rename src/{controls => imports/FluentUI/Controls}/FluContentPage.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluDatePicker.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluDivider.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluDropDownButton.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluExpander.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluFilledButton.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluFlipView.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluFocusRectangle.qml (94%) rename src/{controls => imports/FluentUI/Controls}/FluIcon.qml (90%) rename src/{controls => imports/FluentUI/Controls}/FluIconButton.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluInfoBar.qml (99%) rename src/{controls => imports/FluentUI/Controls}/FluItem.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluMediaPlayer.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluMenu.qml (98%) rename src/{controls => imports/FluentUI/Controls}/FluMenuItem.qml (98%) rename src/{controls => imports/FluentUI/Controls}/FluMultilineTextBox.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluNavigationView.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluObject.qml (71%) rename src/{controls => imports/FluentUI/Controls}/FluPagination.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluPaneItem.qml (94%) rename src/{controls => imports/FluentUI/Controls}/FluPaneItemEmpty.qml (75%) rename src/{controls => imports/FluentUI/Controls}/FluPaneItemExpander.qml (91%) rename src/{controls => imports/FluentUI/Controls}/FluPaneItemHeader.qml (79%) rename src/{controls => imports/FluentUI/Controls}/FluPaneItemSeparator.qml (75%) rename src/{controls => imports/FluentUI/Controls}/FluPasswordBox.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluPivot.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluPivotItem.qml (84%) rename src/{controls => imports/FluentUI/Controls}/FluProgressBar.qml (98%) rename src/{controls => imports/FluentUI/Controls}/FluProgressRing.qml (99%) rename src/{controls => imports/FluentUI/Controls}/FluRadioButton.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluRatingControl.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluRectangle.qml (99%) rename src/{controls => imports/FluentUI/Controls}/FluScrollBar.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluScrollablePage.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluShadow.qml (97%) create mode 100644 src/imports/FluentUI/Controls/FluSingleton.qml rename src/{controls => imports/FluentUI/Controls}/FluSlider.qml (99%) rename src/{controls => imports/FluentUI/Controls}/FluStatusView.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluTabView.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluTableView.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluText.qml (98%) rename src/{controls => imports/FluentUI/Controls}/FluTextBox.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluTextBoxBackground.qml (97%) rename src/{controls => imports/FluentUI/Controls}/FluTextBoxMenu.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluTextButton.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluTimePicker.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluToggleButton.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluToggleSwitch.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluTooltip.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluTreeView.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluWindow.qml (100%) rename src/{controls => imports/FluentUI/Controls}/FluWindowResize.qml (99%) rename src/{res/font => imports/FluentUI/Font}/Segoe_Fluent_Icons.ttf (100%) create mode 100644 src/imports/FluentUI/qmldir delete mode 100755 src/macos_install.sh delete mode 100644 src/qml_plugin.cpp delete mode 100644 src/qml_plugin.h delete mode 100644 src/res.qrc delete mode 100644 src/styles/Theme.qml delete mode 100644 src/styles/Typography.qml delete mode 100644 src/win_install.bat diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 5774179..884d50f 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -2,14 +2,19 @@ name: MacOS on: push: paths: - - '*.pro' + - '*.txt' + - 'example/**' - 'src/**' + - 'scripts/**' - '.github/workflows/macos.yml' pull_request: paths: - - '*.pro' + - '*.txt' + - 'example/**' - 'src/**' + - 'scripts/**' - '.github/workflows/macos.yml' + jobs: build: name: Build @@ -22,12 +27,11 @@ jobs: env: targetName: example steps: - - name: '⚙️ Cache Qt' - id: cache-qt - uses: actions/cache@v3 + - name: Check out repository + uses: actions/checkout@v3 with: - path: ${{ runner.workspace }}/Qt - key: ${{runner.os}}-qtcachedir-${{ matrix.qt_ver }} + submodules: recursive + - name: Install Qt uses: jurplel/install-qt-action@v3 with: @@ -35,24 +39,30 @@ jobs: cache: ${{steps.cache-qt.outputs.cache-hit}} arch: ${{ matrix.qt_arch }} modules: 'qt5compat qtmultimedia qtshadertools qtimageformats' - - uses: actions/checkout@v2 + + - name: Set up Ninja + uses: seanmiddleditch/gha-setup-ninja@v3 with: - fetch-depth: 1 + version: 1.10.2 + - name: build macos run: | - qmake - make - # 打包 + cmake --version + mkdir build + cd build + cmake -DCMAKE_MESSAGE_LOG_LEVEL=STATUS -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Release -GNinja .. + cmake --build . --target all --config Release --parallel + - name: package run: | # 拷贝依赖 - macdeployqt bin/release/${targetName}.app -qmldir=. -verbose=1 -dmg - # 上传artifacts + macdeployqt bin/release/${targetName}.app -qmldir=. -verbose=1 -dmg + - uses: actions/upload-artifact@v2 with: name: ${{ env.targetName }}_${{ matrix.os }}_${{matrix.qt_ver}}.zip path: bin/release/${{ env.targetName }}.app - # tag 上传Release + - name: uploadRelease if: startsWith(github.event.ref, 'refs/tags/') uses: svenstaro/upload-release-action@v2 diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index d8b5ef3..a51948e 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -1,17 +1,21 @@ name: Ubuntu -# Qt官方没有linux平台的x86包 on: workflow_dispatch: push: paths: - - '*.pro' + - '*.txt' - 'src/**' + - 'example/**' + - 'scripts/**' - '.github/workflows/ubuntu.yml' pull_request: paths: - - '*.pro' + - '*.txt' - 'src/**' - - '.github/workflows/ubuntu.yml' + - 'example/**' + - 'scripts/**' + - '.github/workflows/ubuntu.yml' + jobs: build: name: Build @@ -24,12 +28,11 @@ jobs: env: targetName: example steps: - - name: '⚙️ Cache Qt' - id: cache-qt - uses: actions/cache@v3 + - name: Check out repository + uses: actions/checkout@v3 with: - path: ${{ runner.workspace }}/Qt - key: ${{runner.os}}-qtcachedir-${{ matrix.qt_ver }} + submodules: recursive + - name: Install Qt uses: jurplel/install-qt-action@v3 with: @@ -37,22 +40,32 @@ jobs: cache: ${{steps.cache-qt.outputs.cache-hit}} arch: ${{ matrix.qt_arch }} modules: 'qt5compat qtmultimedia qtshadertools qtimageformats' + + - name: Set up Ninja + uses: seanmiddleditch/gha-setup-ninja@v3 + with: + version: 1.10.2 + - name: ubuntu install GL library run: sudo apt-get install -y libxkbcommon-x11-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxcb-xinerama0-dev libxcb-sync-dev libxcb-render-util0-dev libxcb-shm0-dev - - uses: actions/checkout@v2 - with: - fetch-depth: 1 + - name: build ubuntu run: | - qmake - make + ninja --version + cmake --version + mkdir build + cd build + cmake -DCMAKE_MESSAGE_LOG_LEVEL=STATUS -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_BUILD_TYPE=Release -GNinja .. + cmake --build . --target all --config Release --parallel + - name: install QT linux deploy uses: miurahr/install-linuxdeploy-action@v1 with: plugins: qt appimage + - name: Check if svg file exists run: if [ ! -f "${targetName}.svg" ]; then echo "File not found, creating..."; touch ${targetName}.svg; fi - # 打包 + - name: package run: | # make sure Qt plugin finds QML sources so it can deploy the imported files @@ -60,12 +73,12 @@ jobs: # 拷贝依赖 linuxdeploy-x86_64.AppImage --plugin=qt --output=appimage --create-desktop-file --icon-file=${targetName}.svg --executable=bin/release/${targetName} --appdir bin/release/ mv ${{ env.targetName }}-*.AppImage ${{ env.targetName }}.AppImage - # 上传artifacts + - uses: actions/upload-artifact@v2 with: name: ${{ env.targetName }}_${{ matrix.os }}_${{matrix.qt_ver}} path: ${{ env.targetName }}.AppImage - # tag 上传Release + - name: uploadRelease if: startsWith(github.event.ref, 'refs/tags/') uses: svenstaro/upload-release-action@v2 diff --git a/.github/workflows/windows-mingw.yml b/.github/workflows/windows-mingw.yml index 7830b05..616913d 100644 --- a/.github/workflows/windows-mingw.yml +++ b/.github/workflows/windows-mingw.yml @@ -2,14 +2,19 @@ name: Windows MinGW on: push: paths: - - '*.pro' + - '*.txt' - 'src/**' + - 'example/**' + - 'scripts/**' - '.github/workflows/windows-mingw.yml' pull_request: paths: - - '*.pro' + - '*.txt' + - 'example/**' - 'src/**' - - '.github/workflows/windows-mingw.yml' + - 'scripts/**' + - '.github/workflows/windows-mingw.yml' + jobs: build: name: Build @@ -25,6 +30,11 @@ jobs: targetName: example.exe fileName: example steps: + - name: Check out repository + uses: actions/checkout@v3 + with: + submodules: recursive + - name: Install Qt uses: jurplel/install-qt-action@v3 with: @@ -32,26 +42,29 @@ jobs: arch: ${{ matrix.qt_arch }} cache: ${{steps.cache-qt.outputs.cache-hit}} modules: 'qt5compat qtmultimedia qtshadertools qtimageformats' - - uses: actions/checkout@v2 - with: - fetch-depth: 1 + - name: Qt6 environment configuration if: ${{ startsWith( matrix.qt_ver, 6 ) }} shell: pwsh run: | Write-Output "${{ env.Qt6_DIR }}/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append Write-Output "${{ env.Qt6_DIR }}/../../Tools/${{ matrix.qt_tools_mingw_install }}/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - - name: where is qmake & where is mingw32-make + + - name: where is cmake & where is mingw32-make shell: pwsh run: | - Get-Command -Name 'qmake' | Format-List + Get-Command -Name 'cmake' | Format-List Get-Command -Name 'mingw32-make' | Format-List + - name: mingw-build id: build shell: cmd run: | - qmake - mingw32-make + mkdir build + cd build + cmake -DCMAKE_MESSAGE_LOG_LEVEL=STATUS -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_BUILD_TYPE=Release -GNinja .. + cmake --build . --target all --config Release --parallel + - name: package id: package env: @@ -61,10 +74,12 @@ jobs: & scripts\windows-mingw-publish.ps1 ${env:archiveName} ${env:targetName} $name = ${env:archiveName} echo "::set-output name=packageName::$name" + - uses: actions/upload-artifact@v2 with: name: ${{ steps.package.outputs.packageName }} path: ${{ steps.package.outputs.packageName }} + - name: uploadRelease if: startsWith(github.event.ref, 'refs/tags/') uses: svenstaro/upload-release-action@v2 diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 723ba82..f94c6f0 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -1,24 +1,25 @@ name: Windows on: - # push代码时触发workflow push: paths: - - '*.pro' + - '*.txt' - 'src/**' + - 'example/**' + - 'scripts/**' - '.github/workflows/windows.yml' pull_request: paths: - - '*.pro' + - '*.txt' + - 'example/**' - 'src/**' - - '.github/workflows/windows.yml' + - 'scripts/**' + - '.github/workflows/windows.yml' + jobs: build: name: Build - # 运行平台, windows-latest目前是windows server 2019 - # 参考文档 https://github.com/actions/virtual-environments/blob/main/images/win/Windows2019-Readme.md runs-on: ${{ matrix.os }} strategy: - # 矩阵配置 matrix: os: [windows-2019] include: @@ -29,40 +30,34 @@ jobs: env: targetName: example.exe fileName: example - # 步骤 steps: - - name: '⚙️ Cache Qt' - id: cache-qt - uses: actions/cache@v3 + - name: Check out repository + uses: actions/checkout@v3 with: - path: ${{ runner.workspace }}\Qt - key: ${{runner.os}}-qtcachedir-${{ matrix.qt_ver }} - # 安装Qt + submodules: recursive + - name: Install Qt - # 使用外部action。这个action专门用来安装Qt uses: jurplel/install-qt-action@v3 with: version: ${{ matrix.qt_ver }} arch: ${{ matrix.qt_arch }} cache: ${{steps.cache-qt.outputs.cache-hit}} modules: 'qt5compat qtmultimedia qtshadertools qtimageformats' - # 拉取代码 - - uses: actions/checkout@v2 - with: - fetch-depth: 1 - # msvc编译 + - name: msvc-build id: build shell: cmd run: | call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.msvc_arch }} - qmake - nmake + mkdir build + cd build + cmake -DCMAKE_MESSAGE_LOG_LEVEL=STATUS -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl -DCMAKE_BUILD_TYPE=Release -GNinja .. + cmake --build . --target all --config Release --parallel echo winSdkDir=%WindowsSdkDir% >> %GITHUB_ENV% echo winSdkVer=%WindowsSdkVersion% >> %GITHUB_ENV% echo vcToolsInstallDir=%VCToolsInstallDir% >> %GITHUB_ENV% echo vcToolsRedistDir=%VCToolsRedistDir% >> %GITHUB_ENV% - # 打包 + - name: package id: package env: @@ -73,14 +68,13 @@ jobs: & scripts\windows-publish.ps1 ${env:archiveName} ${env:targetName} # 记录packageName给后续step $name = ${env:archiveName} - echo "::set-output name=packageName::$name" - # tag 查询github-Release - # 上传artifacts + echo "::set-output name=packageName::$name" + - uses: actions/upload-artifact@v2 with: name: ${{ steps.package.outputs.packageName }} path: ${{ steps.package.outputs.packageName }} - # tag 上传Release + - name: uploadRelease if: startsWith(github.event.ref, 'refs/tags/') uses: svenstaro/upload-release-action@v2 diff --git a/.gitignore b/.gitignore index 1380580..6c24bd0 100644 --- a/.gitignore +++ b/.gitignore @@ -33,4 +33,5 @@ CMakeLists.txt.user* src/build-preset/plugins.qmltypes bin -.DS_Store \ No newline at end of file +.DS_Store +build \ No newline at end of file diff --git a/third/mingw/libcrypto-1_1-x64.dll b/3rdparty/mingw/libcrypto-1_1-x64.dll similarity index 100% rename from third/mingw/libcrypto-1_1-x64.dll rename to 3rdparty/mingw/libcrypto-1_1-x64.dll diff --git a/third/mingw/libgcc_s_seh-1.dll b/3rdparty/mingw/libgcc_s_seh-1.dll similarity index 100% rename from third/mingw/libgcc_s_seh-1.dll rename to 3rdparty/mingw/libgcc_s_seh-1.dll diff --git a/third/mingw/libssl-1_1-x64.dll b/3rdparty/mingw/libssl-1_1-x64.dll similarity index 100% rename from third/mingw/libssl-1_1-x64.dll rename to 3rdparty/mingw/libssl-1_1-x64.dll diff --git a/third/mingw/libstdc++-6.dll b/3rdparty/mingw/libstdc++-6.dll similarity index 100% rename from third/mingw/libstdc++-6.dll rename to 3rdparty/mingw/libstdc++-6.dll diff --git a/third/mingw/libwinpthread-1.dll b/3rdparty/mingw/libwinpthread-1.dll similarity index 100% rename from third/mingw/libwinpthread-1.dll rename to 3rdparty/mingw/libwinpthread-1.dll diff --git a/third/msvc/libcrypto-1_1-x64.dll b/3rdparty/msvc/libcrypto-1_1-x64.dll similarity index 100% rename from third/msvc/libcrypto-1_1-x64.dll rename to 3rdparty/msvc/libcrypto-1_1-x64.dll diff --git a/third/msvc/libssl-1_1-x64.dll b/3rdparty/msvc/libssl-1_1-x64.dll similarity index 100% rename from third/msvc/libssl-1_1-x64.dll rename to 3rdparty/msvc/libssl-1_1-x64.dll diff --git a/FluentUI.pro b/FluentUI.pro deleted file mode 100644 index 982edab..0000000 --- a/FluentUI.pro +++ /dev/null @@ -1,6 +0,0 @@ -TEMPLATE = subdirs - -SUBDIRS += \ - src/FluentUI.pro \ - example - example.depends = src/FluentUI.pro diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 46fba11..6a8081a 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -1,65 +1,54 @@ cmake_minimum_required(VERSION 3.16) -project(example) + +project(example VERSION 0.1 LANGUAGES CXX) set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +#获取文件分隔符(解决执行命令的时候有些平台会报错) file(TO_CMAKE_PATH "/" PATH_SEPARATOR) -if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(platform 64) -else() - set(platform 32) -endif() - +#设置可执行文件输出目录 if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../bin/debug) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/debug) else() - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../bin/release) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/release) endif() -find_package(Qt6 COMPONENTS Core Quick QuickControls2 Concurrent Network Multimedia REQUIRED) +find_package(Qt6 REQUIRED COMPONENTS Quick REQUIRED) -set(SOURCES - src/controller/ChatController.cpp - src/AppInfo.cpp - src/main.cpp - src/lang/Lang.cpp - src/lang/Zh.cpp - src/lang/En.cpp - src/tool/IPC.cpp +#遍历所有Cpp文件 +file(GLOB_RECURSE CPP_FILES *.cpp *.h) +foreach(filepath ${CPP_FILES}) + string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" filename ${filepath}) + list(APPEND sources_files ${filename}) +endforeach(filepath) + +#遍历所有qml文件 +file(GLOB_RECURSE QML_PATHS *.qml) +foreach(filepath ${QML_PATHS}) + string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" filename ${filepath}) + list(APPEND qml_files ${filename}) +endforeach(filepath) + +#遍历所有资源文件 +file(GLOB_RECURSE RES_PATHS *.png *.jpg *.svg *.ico *.ttf *.webp) +foreach(filepath ${RES_PATHS}) + string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" filename ${filepath}) + list(APPEND resource_files ${filename}) +endforeach(filepath) + +#添加可执行文件 +qt_add_executable(example + ${sources_files} ) -set(HEADERS - src/controller/ChatController.h - src/AppInfo.h - src/stdafx.h - src/lang/Lang.h - src/lang/Zh.h - src/lang/En.h - src/tool/IPC.h -) - -set(RESOURCES - qml.qrc -) - -set(RC_ICONS - favicon.ico -) - -qt_add_resources(QT_RESOURCES ${RESOURCES}) - -add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${QT_RESOURCES} ${RC_ICONS}) - +#复制动态库到可执行文件同级目录下 if(WIN32) - if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") - set(DLLPATH ${CMAKE_CURRENT_SOURCE_DIR}/../third/msvc/*.dll) + if(${CMAKE_CXX_COMPILER_ID} STREQUAL "MSVC") + set(DLLPATH ${CMAKE_SOURCE_DIR}/3rdparty/msvc/*.dll) else() - set(DLLPATH ${CMAKE_CURRENT_SOURCE_DIR}/../third/mingw/*.dll) + set(DLLPATH ${CMAKE_SOURCE_DIR}/3rdparty/mingw/*.dll) endif() string(REPLACE "/" ${PATH_SEPARATOR} DLLPATH "${DLLPATH}") file(GLOB DLL_FILES ${DLLPATH}) @@ -70,27 +59,29 @@ if(WIN32) ) endif() -target_compile_definitions(${PROJECT_NAME} PRIVATE - QT_DEPRECATED_WARNINGS - QT_NO_WARNING_OUTPUT +#添加qml模块 +qt_add_qml_module(example + URI example + VERSION 1.0 + QML_FILES ${qml_files} qml/global/qmldir + RESOURCES ${resource_files} ) -target_link_libraries(${PROJECT_NAME} PRIVATE - Qt6::Core - Qt6::Quick - Qt6::QuickControls2 - Qt6::Concurrent - Qt6::Network - Qt6::Multimedia +#设置属性 +set_target_properties(example PROPERTIES + MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com + MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} + MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} + MACOSX_BUNDLE TRUE + WIN32_EXECUTABLE TRUE ) -if(WIN32) - target_compile_definitions(${PROJECT_NAME} PRIVATE UNICODE WIN32 _WINDOWS) - target_link_libraries(${PROJECT_NAME} PRIVATE dwmapi user32) -endif() +#链接库 +target_link_libraries(example + PRIVATE Qt6::Quick +) -if(APPLE) - set_target_properties(${PROJECT_NAME} PROPERTIES - MACOSX_BUNDLE_INFO_PLIST Info.plist - ) -endif() +#安装 +install(TARGETS example + BUNDLE DESTINATION . + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) diff --git a/example/Info.plist b/example/Info.plist deleted file mode 100644 index 819a005..0000000 --- a/example/Info.plist +++ /dev/null @@ -1,29 +0,0 @@ - - - - - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - - CFBundleExecutable - example - CFBundleIconFile - - CFBundleIdentifier - com.zhuzichu.example - CFBundlePackageType - APPL - CFBundleSignature - ???? - LSMinimumSystemVersion - 10.13 - NOTE - This file was generated by Qt/QMake. - NSPrincipalClass - NSApplication - NSSupportsAutomaticGraphicsSwitching - - - diff --git a/example/example.pro b/example/example.pro deleted file mode 100644 index 0aca353..0000000 --- a/example/example.pro +++ /dev/null @@ -1,59 +0,0 @@ -QT += quick concurrent network multimedia -CONFIG += c++17 -DEFINES += QT_DEPRECATED_WARNINGS QT_NO_WARNING_OUTPUT - -HEADERS += \ - src/lang/En.h \ - src/lang/Lang.h \ - src/lang/Zh.h \ - src/stdafx.h \ - src/controller/ChatController.h \ - src/AppInfo.h \ - src/tool/IPC.h - -SOURCES += \ - src/controller/ChatController.cpp \ - src/AppInfo.cpp \ - src/lang/En.cpp \ - src/lang/Lang.cpp \ - src/lang/Zh.cpp \ - src/main.cpp \ - src/tool/IPC.cpp - -RESOURCES += qml.qrc - -RC_ICONS = favicon.ico - -QML_IMPORT_PATH = -QML_DESIGNER_IMPORT_PATH = - -CONFIG(debug,debug|release) { - DESTDIR = $$absolute_path($${_PRO_FILE_PWD_}/../bin/debug) -} else { - DESTDIR = $$absolute_path($${_PRO_FILE_PWD_}/../bin/release) -} - -win32 { - -contains(QMAKE_CC, cl) { - COPYDLL = $$absolute_path($${_PRO_FILE_PWD_}/../third/msvc/*.dll) $$DESTDIR - QMAKE_PRE_LINK += $$QMAKE_COPY $$replace(COPYDLL, /, $$QMAKE_DIR_SEP) -} else { - COPYDLL = $$absolute_path($${_PRO_FILE_PWD_}/../third/mingw/*.dll) $$DESTDIR - QMAKE_PRE_LINK += $$QMAKE_COPY $$replace(COPYDLL, /, $$QMAKE_DIR_SEP) -} - -} - -qnx: target.path = /tmp/$${TARGET}/bin -else: unix:!android: target.path = /opt/$${TARGET}/bin -!isEmpty(target.path): INSTALLS += target - -mac: { - QMAKE_INFO_PLIST = Info.plist -} - -#### 如果你正在使用静态库,请将将下面的配置注释取消掉。 -#DEFINES += STATICLIB -#INCLUDEPATH += $$OUT_PWD/../bin/FluentUI/ -#LIBS += -L$$OUT_PWD/../bin/FluentUI/ -lFluentUI diff --git a/example/favicon.ico b/example/favicon.ico deleted file mode 100644 index dcb1c0358d457e08fa1aa7c8469c5a119891d3ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119074 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ǁV*4#CXG17 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 diff --git a/example/qml.qrc b/example/qml.qrc deleted file mode 100644 index f0c0e66..0000000 --- a/example/qml.qrc +++ /dev/null @@ -1,173 +0,0 @@ - - - res/image/image_huoyin.webp - res/svg/avatar_1.svg - res/svg/avatar_2.svg - res/svg/avatar_3.svg - res/svg/avatar_4.svg - res/svg/avatar_5.svg - res/svg/avatar_6.svg - res/svg/avatar_7.svg - res/svg/avatar_8.svg - res/svg/avatar_9.svg - res/svg/avatar_10.svg - res/svg/avatar_11.svg - res/svg/avatar_12.svg - res/image/banner_1.jpg - res/image/banner_2.jpg - res/image/banner_3.jpg - res/image/logo_openai.png - res/image/favicon.ico - res/image/bg_home_header.png - res/image/ic_home_github.png - res/image/control/Acrylic.png - res/image/control/AnimatedIcon.png - res/image/control/AnimatedVisualPlayer.png - res/image/control/AnimationInterop.png - res/image/control/AppBarButton.png - res/image/control/AppBarSeparator.png - res/image/control/AppBarToggleButton.png - res/image/control/AutomationProperties.png - res/image/control/AutoSuggestBox.png - res/image/control/Border.png - res/image/control/BreadcrumbBar.png - res/image/control/Button.png - res/image/control/CalendarDatePicker.png - res/image/control/CalendarView.png - res/image/control/Canvas.png - res/image/control/Checkbox.png - res/image/control/Clipboard.png - res/image/control/ColorPaletteResources.png - res/image/control/ColorPicker.png - res/image/control/ComboBox.png - res/image/control/CommandBar.png - res/image/control/CommandBarFlyout.png - res/image/control/CompactSizing.png - res/image/control/ConnectedAnimation.png - res/image/control/ContentDialog.png - res/image/control/CreateMultipleWindows.png - res/image/control/DataGrid.png - res/image/control/DatePicker.png - res/image/control/DropDownButton.png - res/image/control/EasingFunction.png - res/image/control/Expander.png - res/image/control/FilePicker.png - res/image/control/FlipView.png - res/image/control/Flyout.png - res/image/control/Grid.png - res/image/control/GridView.png - res/image/control/HyperlinkButton.png - res/image/control/IconElement.png - res/image/control/Image.png - res/image/control/ImplicitTransition.png - res/image/control/InfoBadge.png - res/image/control/InfoBar.png - res/image/control/InkCanvas.png - res/image/control/InkToolbar.png - res/image/control/InputValidation.png - res/image/control/ItemsRepeater.png - res/image/control/Line.png - res/image/control/ListBox.png - res/image/control/ListView.png - res/image/control/MediaPlayerElement.png - res/image/control/MenuBar.png - res/image/control/MenuFlyout.png - res/image/control/NavigationView.png - res/image/control/NumberBox.png - res/image/control/PageTransition.png - res/image/control/ParallaxView.png - res/image/control/PasswordBox.png - res/image/control/PersonPicture.png - res/image/control/PipsPager.png - res/image/control/Pivot.png - res/image/control/ProgressBar.png - res/image/control/ProgressRing.png - res/image/control/PullToRefresh.png - res/image/control/RadialGradientBrush.png - res/image/control/RadioButton.png - res/image/control/RadioButtons.png - res/image/control/RatingControl.png - res/image/control/RelativePanel.png - res/image/control/RepeatButton.png - res/image/control/RevealFocus.png - res/image/control/RichEditBox.png - res/image/control/RichTextBlock.png - res/image/control/ScrollViewer.png - res/image/control/SemanticZoom.png - res/image/control/Shape.png - res/image/control/Slider.png - res/image/control/Sound.png - res/image/control/SplitButton.png - res/image/control/SplitView.png - res/image/control/StackPanel.png - res/image/control/StandardUICommand.png - res/image/control/SwipeControl.png - res/image/control/TabView.png - res/image/control/TeachingTip.png - res/image/control/TextBlock.png - res/image/control/TextBox.png - res/image/control/ThemeTransition.png - res/image/control/TimePicker.png - res/image/control/TitleBar.png - res/image/control/ToggleButton.png - res/image/control/ToggleSplitButton.png - res/image/control/ToggleSwitch.png - res/image/control/ToolTip.png - res/image/control/TreeView.png - res/image/control/VariableSizedWrapGrid.png - res/image/control/Viewbox.png - res/image/control/WebView.png - res/image/control/XamlUICommand.png - res/svg/home.svg - res/svg/home_dark.svg - res/image/qrcode_wx.jpg - res/image/qrcode_zfb.jpg - qml/component/CodeExpander.qml - qml/global/ItemsFooter.qml - qml/global/ItemsOriginal.qml - qml/global/MainEvent.qml - qml/global/qmldir - qml/App.qml - qml/window/AboutWindow.qml - qml/window/ChatWindow.qml - qml/window/LoginWindow.qml - qml/window/MainWindow.qml - qml/window/MediaWindow.qml - qml/window/SingleInstanceWindow.qml - qml/window/SingleTaskWindow.qml - qml/window/StandardWindow.qml - qml/page/T_Awesome.qml - qml/page/T_Badge.qml - qml/page/T_Buttons.qml - qml/page/T_CalendarPicker.qml - qml/page/T_Carousel.qml - qml/page/T_CheckBox.qml - qml/page/T_ColorPicker.qml - qml/page/T_DatePicker.qml - qml/page/T_Dialog.qml - qml/page/T_Expander.qml - qml/page/T_FlipView.qml - qml/page/T_Home.qml - qml/page/T_InfoBar.qml - qml/page/T_MediaPlayer.qml - qml/page/T_Menu.qml - qml/page/T_MultiWindow.qml - qml/page/T_Pivot.qml - qml/page/T_Progress.qml - qml/page/T_RatingControl.qml - qml/page/T_Rectangle.qml - qml/page/T_Settings.qml - qml/page/T_Slider.qml - qml/page/T_StatusView.qml - qml/page/T_TableView.qml - qml/page/T_TabView.qml - qml/page/T_TextBox.qml - qml/page/T_Theme.qml - qml/page/T_TimePicker.qml - qml/page/T_ToggleSwitch.qml - qml/page/T_Tooltip.qml - qml/page/T_TreeView.qml - qml/page/T_Typography.qml - qml/page/T_BreadcrumbBar.qml - - diff --git a/example/qml/App.qml b/example/qml/App.qml index 9635c77..f45e90e 100644 --- a/example/qml/App.qml +++ b/example/qml/App.qml @@ -11,14 +11,14 @@ Window { FluTheme.frameless = ("windows" === Qt.platform.os) FluTheme.darkMode = FluDarkMode.System FluApp.routes = { - "/":"qrc:/qml/window/MainWindow.qml", - "/about":"qrc:/qml/window/AboutWindow.qml", - "/login":"qrc:/qml/window/LoginWindow.qml", - "/chat":"qrc:/qml/window/ChatWindow.qml", - "/media":"qrc:/qml/window/MediaWindow.qml", - "/singleTaskWindow":"qrc:/qml/window/SingleTaskWindow.qml", - "/standardWindow":"qrc:/qml/window/StandardWindow.qml", - "/singleInstanceWindow":"qrc:/qml/window/SingleInstanceWindow.qml" + "/":"qrc:/example/qml/window/MainWindow.qml", + "/about":"qrc:/example/qml/window/AboutWindow.qml", + "/login":"qrc:/example/qml/window/LoginWindow.qml", + "/chat":"qrc:/example/qml/window/ChatWindow.qml", + "/media":"qrc:/example/qml/window/MediaWindow.qml", + "/singleTaskWindow":"qrc:/example/qml/window/SingleTaskWindow.qml", + "/standardWindow":"qrc:/example/qml/window/StandardWindow.qml", + "/singleInstanceWindow":"qrc:/example/qml/window/SingleInstanceWindow.qml" } FluApp.initialRoute = "/" FluApp.run() diff --git a/example/qml/global/ItemsFooter.qml b/example/qml/global/ItemsFooter.qml index 0db36fb..5f7991a 100644 --- a/example/qml/global/ItemsFooter.qml +++ b/example/qml/global/ItemsFooter.qml @@ -20,7 +20,7 @@ FluObject{ title:lang.settings icon:FluentIcons.Settings onTap:{ - navigationView.push("qrc:/qml/page/T_Settings.qml") + navigationView.push("qrc:/example/qml/page/T_Settings.qml") } } } diff --git a/example/qml/global/ItemsOriginal.qml b/example/qml/global/ItemsOriginal.qml index 30e226b..f5b52c2 100644 --- a/example/qml/global/ItemsOriginal.qml +++ b/example/qml/global/ItemsOriginal.qml @@ -12,13 +12,13 @@ FluObject{ // icon:FluentIcons.Home cusIcon: Image{ anchors.centerIn: parent - source: FluTheme.dark ? "qrc:/res/svg/home_dark.svg" : "qrc:/res/svg/home.svg" + source: FluTheme.dark ? "qrc:/example/res/svg/home_dark.svg" : "qrc:/example/res/svg/home.svg" sourceSize: Qt.size(30,30) width: 18 height: 18 } onTap:{ - navigationView.push("qrc:/qml/page/T_Home.qml") + navigationView.push("qrc:/example/qml/page/T_Home.qml") } } @@ -27,35 +27,35 @@ FluObject{ icon:FluentIcons.CheckboxComposite FluPaneItem{ title:"Buttons" - image:"qrc:/res/image/control/Button.png" + image:"qrc:/example/res/image/control/Button.png" recentlyUpdated:true desc:"A control that responds to user input and raisesa Click event." onTap:{ - navigationView.push("qrc:/qml/page/T_Buttons.qml") + navigationView.push("qrc:/example/qml/page/T_Buttons.qml") } } FluPaneItem{ title:"Slider" - image:"qrc:/res/image/control/Slider.png" + image:"qrc:/example/res/image/control/Slider.png" recentlyUpdated:true desc:"A control that lets the user select from a rangeof values by moving a Thumb control along atrack." onTap:{ - navigationView.push("qrc:/qml/page/T_Slider.qml") + navigationView.push("qrc:/example/qml/page/T_Slider.qml") } } FluPaneItem{ title:"CheckBox" - image:"qrc:/res/image/control/Checkbox.png" + image:"qrc:/example/res/image/control/Checkbox.png" recentlyUpdated:true desc:"A control that a user can select or clear." onTap:{ - navigationView.push("qrc:/qml/page/T_CheckBox.qml") + navigationView.push("qrc:/example/qml/page/T_CheckBox.qml") } } FluPaneItem{ title:"ToggleSwitch" onTap:{ - navigationView.push("qrc:/qml/page/T_ToggleSwitch.qml") + navigationView.push("qrc:/example/qml/page/T_ToggleSwitch.qml") } } } @@ -66,31 +66,31 @@ FluObject{ FluPaneItem{ title:"TextBox" onTap:{ - navigationView.push("qrc:/qml/page/T_TextBox.qml") + navigationView.push("qrc:/example/qml/page/T_TextBox.qml") } } FluPaneItem{ title:"TimePicker" onTap:{ - navigationView.push("qrc:/qml/page/T_TimePicker.qml") + navigationView.push("qrc:/example/qml/page/T_TimePicker.qml") } } FluPaneItem{ title:"DatePicker" onTap:{ - navigationView.push("qrc:/qml/page/T_DatePicker.qml") + navigationView.push("qrc:/example/qml/page/T_DatePicker.qml") } } FluPaneItem{ title:"CalendarPicker" onTap:{ - navigationView.push("qrc:/qml/page/T_CalendarPicker.qml") + navigationView.push("qrc:/example/qml/page/T_CalendarPicker.qml") } } FluPaneItem{ title:"ColorPicker" onTap:{ - navigationView.push("qrc:/qml/page/T_ColorPicker.qml") + navigationView.push("qrc:/example/qml/page/T_ColorPicker.qml") } } } @@ -100,53 +100,53 @@ FluObject{ icon:FluentIcons.SurfaceHub FluPaneItem{ title:"InfoBar" - image:"qrc:/res/image/control/InfoBar.png" + image:"qrc:/example/res/image/control/InfoBar.png" recentlyUpdated:true desc:"An inline message to display app-wide statuschange information." onTap:{ - navigationView.push("qrc:/qml/page/T_InfoBar.qml") + navigationView.push("qrc:/example/qml/page/T_InfoBar.qml") } } FluPaneItem{ title:"Progress" onTap:{ - navigationView.push("qrc:/qml/page/T_Progress.qml") + navigationView.push("qrc:/example/qml/page/T_Progress.qml") } } FluPaneItem{ title:"RatingControl" onTap:{ - navigationView.push("qrc:/qml/page/T_RatingControl.qml") + navigationView.push("qrc:/example/qml/page/T_RatingControl.qml") } } FluPaneItem{ title:"Badge" onTap:{ - navigationView.push("qrc:/qml/page/T_Badge.qml") + navigationView.push("qrc:/example/qml/page/T_Badge.qml") } } FluPaneItem{ title:"Rectangle" onTap:{ - navigationView.push("qrc:/qml/page/T_Rectangle.qml") + navigationView.push("qrc:/example/qml/page/T_Rectangle.qml") } } FluPaneItem{ title:"StatusView" onTap:{ - navigationView.push("qrc:/qml/page/T_StatusView.qml") + navigationView.push("qrc:/example/qml/page/T_StatusView.qml") } } FluPaneItem{ title:"Carousel" onTap:{ - navigationView.push("qrc:/qml/page/T_Carousel.qml") + navigationView.push("qrc:/example/qml/page/T_Carousel.qml") } } FluPaneItem{ title:"Expander" onTap:{ - navigationView.push("qrc:/qml/page/T_Expander.qml") + navigationView.push("qrc:/example/qml/page/T_Expander.qml") } } } @@ -157,19 +157,19 @@ FluObject{ FluPaneItem{ title:"Dialog" onTap:{ - navigationView.push("qrc:/qml/page/T_Dialog.qml") + navigationView.push("qrc:/example/qml/page/T_Dialog.qml") } } FluPaneItem{ title:"Tooltip" onTap:{ - navigationView.push("qrc:/qml/page/T_Tooltip.qml") + navigationView.push("qrc:/example/qml/page/T_Tooltip.qml") } } FluPaneItem{ title:"Menu" onTap:{ - navigationView.push("qrc:/qml/page/T_Menu.qml") + navigationView.push("qrc:/example/qml/page/T_Menu.qml") } } } @@ -179,60 +179,60 @@ FluObject{ icon:FluentIcons.AllApps FluPaneItem{ title:"Pivot" - image:"qrc:/res/image/control/Pivot.png" + image:"qrc:/example/res/image/control/Pivot.png" recentlyAdded:true order:3 desc:"Presents information from different sources in atabbed view." onTap:{ - navigationView.push("qrc:/qml/page/T_Pivot.qml") + navigationView.push("qrc:/example/qml/page/T_Pivot.qml") } } FluPaneItem{ title:"BreadcrumbBar" onTap:{ - navigationView.push("qrc:/qml/page/T_BreadcrumbBar.qml") + navigationView.push("qrc:/example/qml/page/T_BreadcrumbBar.qml") } } FluPaneItem{ title:"TabView" - image:"qrc:/res/image/control/TabView.png" + image:"qrc:/example/res/image/control/TabView.png" recentlyAdded:true order:1 desc:"A control that displays a collection of tabs thatcan be used to display several documents." onTap:{ - navigationView.push("qrc:/qml/page/T_TabView.qml") + navigationView.push("qrc:/example/qml/page/T_TabView.qml") } } FluPaneItem{ title:"TreeView" onTap:{ - navigationView.push("qrc:/qml/page/T_TreeView.qml") + navigationView.push("qrc:/example/qml/page/T_TreeView.qml") } } FluPaneItem{ title:"TableView" - image:"qrc:/res/image/control/DataGrid.png" + image:"qrc:/example/res/image/control/DataGrid.png" recentlyAdded:true order:4 desc:"The TableView control provides a flexible way to display a collection of data in rows and columns" onTap:{ - navigationView.push("qrc:/qml/page/T_TableView.qml") + navigationView.push("qrc:/example/qml/page/T_TableView.qml") } } FluPaneItem{ title:"MultiWindow" onTap:{ - navigationView.push("qrc:/qml/page/T_MultiWindow.qml") + navigationView.push("qrc:/example/qml/page/T_MultiWindow.qml") } } FluPaneItem{ title:"FlipView" - image:"qrc:/res/image/control/FlipView.png" + image:"qrc:/example/res/image/control/FlipView.png" recentlyAdded:true order:2 desc:"Presents a collection of items that the user canflip through, one item at a time." onTap:{ - navigationView.push("qrc:/qml/page/T_FlipView.qml") + navigationView.push("qrc:/example/qml/page/T_FlipView.qml") } } } @@ -243,19 +243,19 @@ FluObject{ FluPaneItem{ title:"Theme" onTap:{ - navigationView.push("qrc:/qml/page/T_Theme.qml") + navigationView.push("qrc:/example/qml/page/T_Theme.qml") } } FluPaneItem{ title:"Typography" onTap:{ - navigationView.push("qrc:/qml/page/T_Typography.qml") + navigationView.push("qrc:/example/qml/page/T_Typography.qml") } } FluPaneItem{ title:"Awesome" onTap:{ - navigationView.push("qrc:/qml/page/T_Awesome.qml") + navigationView.push("qrc:/example/qml/page/T_Awesome.qml") } } } @@ -265,12 +265,12 @@ FluObject{ icon:FluentIcons.Media FluPaneItem{ title:"MediaPlayer" - image:"qrc:/res/image/control/MediaPlayerElement.png" + image:"qrc:/example/res/image/control/MediaPlayerElement.png" recentlyAdded:true order:0 desc:"A control to display video and image content." onTap:{ - navigationView.push("qrc:/qml/page/T_MediaPlayer.qml") + navigationView.push("qrc:/example/qml/page/T_MediaPlayer.qml") } } } diff --git a/example/qml/page/T_Carousel.qml b/example/qml/page/T_Carousel.qml index 64d1073..3461464 100644 --- a/example/qml/page/T_Carousel.qml +++ b/example/qml/page/T_Carousel.qml @@ -32,7 +32,7 @@ FluScrollablePage{ Layout.topMargin: 20 Layout.leftMargin: 5 Component.onCompleted: { - carousel.setData([{url:"qrc:/res/image/banner_1.jpg"},{url:"qrc:/res/image/banner_2.jpg"},{url:"qrc:/res/image/banner_3.jpg"}]) + carousel.setData([{url:"qrc:/example/res/image/banner_1.jpg"},{url:"qrc:/example/res/image/banner_2.jpg"},{url:"qrc:/example/res/image/banner_3.jpg"}]) } } } @@ -44,7 +44,7 @@ FluScrollablePage{ width: 400 height: 300 Component.onCompleted: { - setData([{url:"qrc:/res/image/banner_1.jpg"},{url:"qrc:/res/image/banner_2.jpg"},{url:"qrc:/res/image/banner_3.jpg"}]) + setData([{url:"qrc:/example/res/image/banner_1.jpg"},{url:"qrc:/example/res/image/banner_2.jpg"},{url:"qrc:/example/res/image/banner_3.jpg"}]) } }' } diff --git a/example/qml/page/T_FlipView.qml b/example/qml/page/T_FlipView.qml index eb0890c..0ac4947 100644 --- a/example/qml/page/T_FlipView.qml +++ b/example/qml/page/T_FlipView.qml @@ -25,17 +25,17 @@ FluScrollablePage{ } FluFlipView{ Image{ - source: "qrc:/res/image/banner_1.jpg" + source: "qrc:/example/res/image/banner_1.jpg" asynchronous: true fillMode:Image.PreserveAspectCrop } Image{ - source: "qrc:/res/image/banner_2.jpg" + source: "qrc:/example/res/image/banner_2.jpg" asynchronous: true fillMode:Image.PreserveAspectCrop } Image{ - source: "qrc:/res/image/banner_3.jpg" + source: "qrc:/example/res/image/banner_3.jpg" asynchronous: true fillMode:Image.PreserveAspectCrop } @@ -47,17 +47,17 @@ FluScrollablePage{ Layout.topMargin: -1 code:'FluFlipView{ Image{ - source: "qrc:/res/image/banner_1.jpg" + source: "qrc:/example/res/image/banner_1.jpg" asynchronous: true fillMode:Image.PreserveAspectCrop } Image{ - source: "qrc:/res/image/banner_1.jpg" + source: "qrc:/example/res/image/banner_1.jpg" asynchronous: true fillMode:Image.PreserveAspectCrop } Image{ - source: "qrc:/res/image/banner_1.jpg" + source: "qrc:/example/res/image/banner_1.jpg" asynchronous: true fillMode:Image.PreserveAspectCrop } @@ -78,18 +78,18 @@ FluScrollablePage{ FluFlipView{ vertical:true Image{ - source: "qrc:/res/image/banner_1.jpg" + source: "qrc:/example/res/image/banner_1.jpg" asynchronous: true sourceSize: Qt.size(400,300) fillMode:Image.PreserveAspectCrop } Image{ - source: "qrc:/res/image/banner_2.jpg" + source: "qrc:/example/res/image/banner_2.jpg" asynchronous: true fillMode:Image.PreserveAspectCrop } Image{ - source: "qrc:/res/image/banner_3.jpg" + source: "qrc:/example/res/image/banner_3.jpg" asynchronous: true fillMode:Image.PreserveAspectCrop } @@ -102,17 +102,17 @@ FluScrollablePage{ code:'FluFlipView{ vertical:true Image{ - source: "qrc:/res/image/banner_1.jpg" + source: "qrc:/example/res/image/banner_1.jpg" asynchronous: true fillMode:Image.PreserveAspectCrop } Image{ - source: "qrc:/res/image/banner_1.jpg" + source: "qrc:/example/res/image/banner_1.jpg" asynchronous: true fillMode:Image.PreserveAspectCrop } Image{ - source: "qrc:/res/image/banner_1.jpg" + source: "qrc:/example/res/image/banner_1.jpg" asynchronous: true fillMode:Image.PreserveAspectCrop } diff --git a/example/qml/page/T_Home.qml b/example/qml/page/T_Home.qml index 11ca4a5..66a416e 100644 --- a/example/qml/page/T_Home.qml +++ b/example/qml/page/T_Home.qml @@ -2,7 +2,7 @@ import QtQuick.Layouts import QtQuick.Window import QtQuick.Controls -import "qrc:///qml/global/" +import "qrc:///example/qml/global/" import FluentUI FluScrollablePage{ @@ -15,7 +15,7 @@ FluScrollablePage{ ListModel{ id:model_header ListElement{ - icon:"qrc:/res/image/ic_home_github.png" + icon:"qrc:/example/res/image/ic_home_github.png" title:"FluentUI GitHub" desc:"The latest FluentUI controls and styles for your applications." url:"https://github.com/zhuzichu520/FluentUI" @@ -30,7 +30,7 @@ FluScrollablePage{ fillMode:Image.PreserveAspectCrop anchors.fill: parent verticalAlignment: Qt.AlignTop - source: "qrc:/res/image/bg_home_header.png" + source: "qrc:/example/res/image/bg_home_header.png" } Rectangle{ anchors.fill: parent diff --git a/example/qml/page/T_Rectangle.qml b/example/qml/page/T_Rectangle.qml index f8e893c..6592e05 100644 --- a/example/qml/page/T_Rectangle.qml +++ b/example/qml/page/T_Rectangle.qml @@ -79,7 +79,7 @@ FluScrollablePage{ Image { asynchronous: true anchors.fill: parent - source: "qrc:/res/svg/avatar_1.svg" + source: "qrc:/example/res/svg/avatar_1.svg" sourceSize: Qt.size(width,height) } } @@ -91,7 +91,7 @@ FluScrollablePage{ asynchronous: true anchors.fill: parent sourceSize: Qt.size(width,height) - source: "qrc:/res/svg/avatar_2.svg" + source: "qrc:/example/res/svg/avatar_2.svg" } } FluRectangle{ @@ -102,7 +102,7 @@ FluScrollablePage{ asynchronous: true anchors.fill: parent sourceSize: Qt.size(width,height) - source: "qrc:/res/svg/avatar_3.svg" + source: "qrc:/example/res/svg/avatar_3.svg" } } FluRectangle{ @@ -113,7 +113,7 @@ FluScrollablePage{ asynchronous: true anchors.fill: parent sourceSize: Qt.size(width,height) - source: "qrc:/res/svg/avatar_4.svg" + source: "qrc:/example/res/svg/avatar_4.svg" } } } @@ -123,7 +123,7 @@ FluScrollablePage{ radius:[25,25,25,25] Image { asynchronous: true - source: "qrc:/res/image/image_huoyin.webp" + source: "qrc:/example/res/image/image_huoyin.webp" anchors.fill: parent sourceSize: Qt.size(width,height) } @@ -142,7 +142,7 @@ FluScrollablePage{ Image{ asynchronous: true anchors.fill: parent - source: "qrc:/res/svg/avatar_4.svg" + source: "qrc:/example/res/svg/avatar_4.svg" sourceSize: Qt.size(width,height) } }' diff --git a/example/qml/page/T_Settings.qml b/example/qml/page/T_Settings.qml index d173b58..c6ef662 100644 --- a/example/qml/page/T_Settings.qml +++ b/example/qml/page/T_Settings.qml @@ -3,7 +3,7 @@ import QtQuick.Layouts import QtQuick.Window import QtQuick.Controls import FluentUI -import "qrc:///qml/global/" +import "qrc:///example/qml/global/" import "../component" FluScrollablePage{ diff --git a/example/qml/page/T_TabView.qml b/example/qml/page/T_TabView.qml index d22d4fd..a03f303 100644 --- a/example/qml/page/T_TabView.qml +++ b/example/qml/page/T_TabView.qml @@ -24,7 +24,7 @@ FluScrollablePage{ } function newTab(){ - tab_view.appendTab("qrc:/res/image/favicon.ico","Document "+tab_view.count(),com_page,colors[Math.floor(Math.random() * 8)].dark) + tab_view.appendTab("qrc:/example/res/image/favicon.ico","Document "+tab_view.count(),com_page,colors[Math.floor(Math.random() * 8)].dark) } Component.onCompleted: { @@ -129,7 +129,7 @@ FluScrollablePage{ } } function newTab(){ - tab_view.appendTab("qrc:/res/image/favicon.ico","Document 1",com_page,argument) + tab_view.appendTab("qrc:/example/res/image/favicon.ico","Document 1",com_page,argument) } } ' diff --git a/example/qml/window/AboutWindow.qml b/example/qml/window/AboutWindow.qml index f326978..2147054 100644 --- a/example/qml/window/AboutWindow.qml +++ b/example/qml/window/AboutWindow.qml @@ -128,12 +128,12 @@ FluWindow { Image{ width: 164.55 height: 224.25 - source: "qrc:/res/image/qrcode_wx.jpg" + source: "qrc:/example/res/image/qrcode_wx.jpg" } Image{ width: 162 height: 252 - source: "qrc:/res/image/qrcode_zfb.jpg" + source: "qrc:/example/res/image/qrcode_zfb.jpg" } } } diff --git a/example/qml/window/ChatWindow.qml b/example/qml/window/ChatWindow.qml index 9424c33..ec04983 100644 --- a/example/qml/window/ChatWindow.qml +++ b/example/qml/window/ChatWindow.qml @@ -120,7 +120,7 @@ FluWindow { asynchronous: true anchors.fill: parent sourceSize: Qt.size(100,100) - source: isMy ? "qrc:/res/svg/avatar_2.svg" : "qrc:/res/image/logo_openai.png" + source: isMy ? "qrc:/example/res/svg/avatar_2.svg" : "qrc:/example/res/image/logo_openai.png" } } diff --git a/example/qml/window/MainWindow.qml b/example/qml/window/MainWindow.qml index 1ed287c..9fd5040 100644 --- a/example/qml/window/MainWindow.qml +++ b/example/qml/window/MainWindow.qml @@ -4,7 +4,8 @@ import QtQuick.Controls import QtQuick.Layouts import Qt.labs.platform import FluentUI -import "qrc:///qml/global/" +import example +import "qrc:///example/qml/global/" FluWindow { @@ -41,7 +42,7 @@ FluWindow { SystemTrayIcon { id:system_tray visible: true - icon.source: "qrc:/res/image/favicon.ico" + icon.source: "qrc:/example/res/image/favicon.ico" tooltip: "FluentUI" menu: Menu { MenuItem { @@ -88,7 +89,7 @@ FluWindow { footerItems:ItemsFooter z:11 displayMode:MainEvent.displayMode - logo: "qrc:/res/image/favicon.ico" + logo: "qrc:/example/res/image/favicon.ico" title:"FluentUI" autoSuggestBox:FluAutoSuggestBox{ width: 280 diff --git a/example/src/main.cpp b/example/src/main.cpp index 8851e74..e76d8b8 100644 --- a/example/src/main.cpp +++ b/example/src/main.cpp @@ -52,7 +52,7 @@ int main(int argc, char *argv[]) context->setContextProperty("lang",appInfo->lang()); }); context->setContextProperty("appInfo",appInfo); - const QUrl url(QStringLiteral("qrc:/qml/App.qml")); + const QUrl url(QStringLiteral("qrc:/example/qml/App.qml")); QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { if (!obj && url == objUrl) diff --git a/scripts/windows-mingw-publish.ps1 b/scripts/windows-mingw-publish.ps1 index d1c8fae..472300f 100644 --- a/scripts/windows-mingw-publish.ps1 +++ b/scripts/windows-mingw-publish.ps1 @@ -17,7 +17,7 @@ function Main() { New-Item -ItemType Directory $archiveName # 拷贝exe - Copy-Item bin\release\* $archiveName\ + Copy-Item bin\release\* $archiveName\ -Force -Recurse | Out-Null # 拷贝依赖 windeployqt --qmldir . --plugindir $archiveName\plugins --no-translations --compiler-runtime $archiveName\$targetName # 删除不必要的文件 diff --git a/scripts/windows-publish.ps1 b/scripts/windows-publish.ps1 index 80432f3..b406b57 100644 --- a/scripts/windows-publish.ps1 +++ b/scripts/windows-publish.ps1 @@ -27,7 +27,7 @@ function Main() { New-Item -ItemType Directory $archiveName # 拷贝exe - Copy-Item bin\release\* $archiveName\ + Copy-Item bin\release\* $archiveName\ -Force -Recurse | Out-Null # 拷贝依赖 windeployqt --qmldir . --plugindir $archiveName\plugins --no-translations --compiler-runtime $archiveName\$targetName # 删除不必要的文件 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 308ed5d..84c109e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,67 +1,59 @@ cmake_minimum_required(VERSION 3.16) -project(FluentUI) +project(fluentui LANGUAGES CXX) set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) -find_package(Qt6 COMPONENTS Core Quick Svg REQUIRED) -set(QT_INSTALL_QML ${Qt6Core_DIR}/../../../qml) -set(TARGET_TYPE SHARED) -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/FluentUI) - -if(WIN32) - set(CMAKE_SHARED_LIBRARY_PREFIX "") +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/debug) +else() + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/release) endif() -set(TARGET_RESOURCES res.qrc) -set(TARGET_SOURCES - Def.cpp - FluApp.cpp - FluColorSet.cpp - FluColors.cpp - FluRegister.cpp - FluTheme.cpp - Fluent.cpp - FluentUI.cpp - NativeEventFilter.cpp - WindowHelper.cpp - qml_plugin.cpp +find_package(Qt6 REQUIRED COMPONENTS Core Quick Qml) + +file(GLOB_RECURSE CPP_FILES *.cpp *.h) +foreach(filepath ${CPP_FILES}) + string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" filename ${filepath}) + list(APPEND sources_files ${filename}) +endforeach(filepath) + +file(GLOB_RECURSE QML_PATHS *.qml) +foreach(filepath ${QML_PATHS}) + string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" filename ${filepath}) + list(APPEND qml_files ${filename}) +endforeach(filepath) + +file(GLOB_RECURSE RES_PATHS *.png *.jpg *.svg *.ico *.ttf *.webp) +foreach(filepath ${RES_PATHS}) + string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" filename ${filepath}) + list(APPEND resource_files ${filename}) +endforeach(filepath) + +foreach(filepath IN LISTS qml_files resource_files) + string(REPLACE "imports/FluentUI/" "" filename ${filepath}) + set_source_files_properties(${filepath} PROPERTIES QT_RESOURCE_ALIAS ${filename}) +endforeach() + +qt_add_qml_module(fluentui + OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/FluentUI + VERSION 1.0 + URI "FluentUI" + SOURCES ${sources_files} + QML_FILES ${qml_files} + RESOURCES ${resource_files} ) -set(TARGET_HEADERS - Def.h - FluApp.h - FluColorSet.h - FluColors.h - FluRegister.h - FluTheme.h - Fluent.h - FluentUI.h - NativeEventFilter.h - WindowHelper.h - qml_plugin.h - stdafx.h +set_target_properties(fluentui PROPERTIES + WIN32_EXECUTABLE TRUE + MACOSX_BUNDLE TRUE ) -add_definitions(-DVERSION_IN="1.0.0") -add_definitions(-DURI_STR="FluentUI") - -add_library(${PROJECT_NAME} ${TARGET_TYPE} ${TARGET_SOURCES} ${TARGET_HEADERS} ${TARGET_RESOURCES}) - -set_target_properties(${PROJECT_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/FluentUI) +target_link_libraries(fluentui PUBLIC + Qt::Core + Qt::Quick + Qt::Qml +) if(WIN32) - target_link_libraries(${PROJECT_NAME} PRIVATE dwmapi user32) -else() -endif() - -target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) - -target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Core Qt6::Quick Qt6::Svg) - -if(WIN32) - include(build_windows.cmake) -else() - include(build_macos.cmake) + target_link_libraries(fluentui PRIVATE dwmapi user32) endif() diff --git a/src/Def.h b/src/Def.h index f6e95ba..4185523 100644 --- a/src/Def.h +++ b/src/Def.h @@ -2,6 +2,7 @@ #define DEF_H #include +#include namespace Fluent_DarkMode { Q_NAMESPACE @@ -10,6 +11,7 @@ Q_NAMESPACE Light = 0x1, Dark = 0x2, }; + QML_NAMED_ELEMENT(FluDarkMode) Q_ENUMS(Fluent_DarkModeType); } @@ -1420,6 +1422,7 @@ enum class Fluent_AwesomeType { SpeechSolidBold=0xf8b2, ClickedOutLoudSolidBold=0xf8b3, }; + QML_NAMED_ELEMENT(FluentIcons) Q_ENUMS(Fluent_AwesomeType) } diff --git a/src/FluApp.cpp b/src/FluApp.cpp index 2ccc67c..334c835 100644 --- a/src/FluApp.cpp +++ b/src/FluApp.cpp @@ -1,4 +1,4 @@ -#include "FluApp.h" +#include "FluApp.h" #include #include @@ -6,6 +6,7 @@ #include #include #include +#include #include #include "FluTheme.h" #include "Def.h" @@ -24,29 +25,39 @@ static bool isCompositionEnabled() } #endif -FluApp* FluApp::m_instance = nullptr; +FluApp* FluApp::fluApp = nullptr; +FluTheme* FluApp::fluTheme = nullptr; +FluColors* FluApp::flutColors = nullptr; -FluApp *FluApp::getInstance() -{ - if(FluApp::m_instance == nullptr){ - FluApp::m_instance = new FluApp; - } - return FluApp::m_instance; +void FluApp::setFluApp(FluApp* val){ + FluApp::fluApp = val; +} +void FluApp::setFluTheme(FluTheme* val){ + FluApp::fluTheme = val; +} +void FluApp::setFluColors(FluColors* val){ + FluApp::flutColors = val; } FluApp::FluApp(QObject *parent) : QObject{parent} { + QFontDatabase::addApplicationFont(":/FluentUI/Font/Segoe_Fluent_Icons.ttf"); } void FluApp::init(QQuickWindow *window){ this->appWindow = window; + QQmlEngine *engine = qmlEngine(appWindow); + QQmlComponent component(engine, ":/FluentUI/Controls/FluSingleton.qml"); + component.create(); + nativeEvent = new NativeEventFilter(); + qApp->installNativeEventFilter(nativeEvent); } void FluApp::run(){ #ifdef Q_OS_WIN if(!isCompositionEnabled()){ - FluTheme::getInstance()->frameless(false); + fluTheme->frameless(false); } #endif navigate(initialRoute()); @@ -66,7 +77,6 @@ void FluApp::navigate(const QString& route,const QJsonObject& argument,FluRegist } properties.insert("argument",argument); QQuickWindow *view = qobject_cast(component.createWithInitialProperties(properties)); - int launchMode = view->property("launchMode").toInt(); if(launchMode==1){ for (auto& pair : wnds) { @@ -88,8 +98,7 @@ void FluApp::navigate(const QString& route,const QJsonObject& argument,FluRegist } } } - - if(FluTheme::getInstance()->frameless()){ + if(fluTheme->frameless()){ view->setFlag(Qt::FramelessWindowHint,true); } wnds.insert(view->winId(),view); diff --git a/src/FluApp.h b/src/FluApp.h index 5c33bd9..effb68b 100644 --- a/src/FluApp.h +++ b/src/FluApp.h @@ -3,10 +3,14 @@ #include #include +#include #include #include #include #include +#include "FluTheme.h" +#include "FluColors.h" +#include "NativeEventFilter.h" #include "FluRegister.h" #include "stdafx.h" @@ -15,31 +19,35 @@ class FluApp : public QObject Q_OBJECT Q_PROPERTY_AUTO(QString,initialRoute); Q_PROPERTY_AUTO(QJsonObject,routes); - + QML_NAMED_ELEMENT(FluApp) + QML_SINGLETON public: - static FluApp *getInstance(); - explicit FluApp(QObject *parent = nullptr); - + ~FluApp(){ + if (nativeEvent != Q_NULLPTR) { + delete nativeEvent; + nativeEvent = Q_NULLPTR; + } + } Q_INVOKABLE void run(); - Q_INVOKABLE void navigate(const QString& route,const QJsonObject& argument = {},FluRegister* fluRegister = nullptr); - Q_INVOKABLE void init(QQuickWindow *window); - Q_INVOKABLE QJsonArray awesomelist(const QString& keyword = ""); - Q_INVOKABLE void clipText(const QString& text); - Q_INVOKABLE QString uuid(); - Q_INVOKABLE void closeApp(); + Q_INVOKABLE void setFluApp(FluApp* val); + Q_INVOKABLE void setFluTheme(FluTheme* val); + Q_INVOKABLE void setFluColors(FluColors* val); public: QMap wnds; + static FluApp* fluApp; + static FluTheme* fluTheme; + static FluColors* flutColors; private: - static FluApp* m_instance; + NativeEventFilter *nativeEvent = Q_NULLPTR; QWindow *appWindow; }; diff --git a/src/FluColors.cpp b/src/FluColors.cpp index 46e7536..feaeb78 100644 --- a/src/FluColors.cpp +++ b/src/FluColors.cpp @@ -1,15 +1,5 @@ #include "FluColors.h" -FluColors* FluColors::m_instance = nullptr; - -FluColors *FluColors::getInstance() -{ - if(FluColors::m_instance == nullptr){ - FluColors::m_instance = new FluColors; - } - return FluColors::m_instance; -} - FluColors::FluColors(QObject *parent) : QObject{parent} { diff --git a/src/FluColors.h b/src/FluColors.h index c494d03..0186b36 100644 --- a/src/FluColors.h +++ b/src/FluColors.h @@ -2,6 +2,7 @@ #define FLUCOLORS_H #include +#include #include "FluColorSet.h" #include "stdafx.h" @@ -41,13 +42,10 @@ class FluColors : public QObject Q_PROPERTY_AUTO(FluColorSet*,Blue); Q_PROPERTY_AUTO(FluColorSet*,Teal); Q_PROPERTY_AUTO(FluColorSet*,Green); - + QML_NAMED_ELEMENT(FluColors) + QML_SINGLETON public: explicit FluColors(QObject *parent = nullptr); - static FluColors *getInstance(); -private: - static FluColors* m_instance; - }; #endif // FLUCOLORS_H diff --git a/src/FluRegister.cpp b/src/FluRegister.cpp index 4cc8c6d..e698f13 100644 --- a/src/FluRegister.cpp +++ b/src/FluRegister.cpp @@ -12,7 +12,7 @@ FluRegister::FluRegister(QObject *parent) } void FluRegister::launch(const QJsonObject& argument){ - FluApp::getInstance()->navigate(path(),argument,this); + FluApp::fluApp->navigate(path(),argument,this); } void FluRegister::onResult(const QJsonObject& data){ diff --git a/src/FluTheme.cpp b/src/FluTheme.cpp index 553a003..fdd1ca1 100644 --- a/src/FluTheme.cpp +++ b/src/FluTheme.cpp @@ -1,27 +1,17 @@ #include "FluTheme.h" -#include "FluColors.h" #include "Def.h" #include +#include "FluApp.h" #include -FluTheme* FluTheme::m_instance = nullptr; - -FluTheme *FluTheme::getInstance() -{ - if(FluTheme::m_instance == nullptr){ - FluTheme::m_instance = new FluTheme; - } - return FluTheme::m_instance; -} - FluTheme::FluTheme(QObject *parent) : QObject{parent} { connect(this,&FluTheme::darkModeChanged,this,[=]{ Q_EMIT darkChanged(); }); - primaryColor(FluColors::getInstance()->Blue()); + primaryColor(FluApp::flutColors->Blue()); textSize(13); nativeText(false); frameless(true); diff --git a/src/FluTheme.h b/src/FluTheme.h index e839c0b..d4efa36 100644 --- a/src/FluTheme.h +++ b/src/FluTheme.h @@ -2,6 +2,7 @@ #define FLUTHEME_H #include +#include #include "FluColorSet.h" #include "stdafx.h" @@ -14,13 +15,13 @@ class FluTheme : public QObject Q_PROPERTY_AUTO(int,darkMode); Q_PROPERTY_AUTO(bool,nativeText); Q_PROPERTY_AUTO(int,textSize); + QML_NAMED_ELEMENT(FluTheme) + QML_SINGLETON public: explicit FluTheme(QObject *parent = nullptr); - static FluTheme *getInstance(); bool dark(); Q_SIGNAL void darkChanged(); private: - static FluTheme* m_instance; bool _dark; bool eventFilter(QObject *obj, QEvent *event); bool systemDark(); diff --git a/src/Fluent.cpp b/src/Fluent.cpp deleted file mode 100644 index 39933cd..0000000 --- a/src/Fluent.cpp +++ /dev/null @@ -1,121 +0,0 @@ -#include "Fluent.h" - -#include -#include -#include -#include -#include "FluColors.h" -#include "NativeEventFilter.h" -#include "FluTheme.h" -#include "WindowHelper.h" -#include "FluApp.h" -#include "Def.h" - -Fluent* Fluent::m_instance = nullptr; - -Fluent *Fluent::getInstance() -{ - if(Fluent::m_instance == nullptr){ - Fluent::m_instance = new Fluent; - } - return Fluent::m_instance; -} - -QString Fluent::version() const -{ - return QStringLiteral(VERSION_IN); -} - -void Fluent::registerTypes(const char *uri){ - Q_INIT_RESOURCE(res); - int major = 1; - int minor = 0; - - qmlRegisterType(uri,major,minor,"WindowHelper"); - qmlRegisterType(uri,major,minor,"FluColorSet"); - - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluBreadcrumbBar.qml"),uri,major,minor,"FluBreadcrumbBar"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluRatingControl.qml"),uri,major,minor,"FluRatingControl"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluStatusView.qml"),uri,major,minor,"FluStatusView"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluPagination.qml"),uri,major,minor,"FluPagination"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluToggleButton.qml"),uri,major,minor,"FluToggleButton"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluTableView.qml"),uri,major,minor,"FluTableView"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluPivotItem.qml"),uri,major,minor,"FluPivotItem"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluPivot.qml"),uri,major,minor,"FluPivot"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluFlipView.qml"),uri,major,minor,"FluFlipView"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluPaneItemExpander.qml"),uri,major,minor,"FluPaneItemExpander"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluTabView.qml"),uri,major,minor,"FluTabView"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluArea.qml"),uri,major,minor,"FluArea"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluBadge.qml"),uri,major,minor,"FluBadge"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluMediaPlayer.qml"),uri,major,minor,"FluMediaPlayer"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluContentPage.qml"),uri,major,minor,"FluContentPage"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluScrollablePage.qml"),uri,major,minor,"FluScrollablePage"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluPaneItemHeader.qml"),uri,major,minor,"FluPaneItemHeader"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluPaneItem.qml"),uri,major,minor,"FluPaneItem"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluPaneItemSeparator.qml"),uri,major,minor,"FluPaneItemSeparator"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluNavigationView.qml"),uri,major,minor,"FluNavigationView"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluCalendarPicker.qml"),uri,major,minor,"FluCalendarPicker"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluCalendarView.qml"),uri,major,minor,"FluCalendarView"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluDatePicker.qml"),uri,major,minor,"FluDatePicker"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluTimePicker.qml"),uri,major,minor,"FluTimePicker"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluColorView.qml"),uri,major,minor,"FluColorView"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluColorPicker.qml"),uri,major,minor,"FluColorPicker"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluCarousel.qml"),uri,major,minor,"FluCarousel"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluAutoSuggestBox.qml"),uri,major,minor,"FluAutoSuggestBox"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluExpander.qml"),uri,major,minor,"FluExpander"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluTreeView.qml"),uri,major,minor,"FluTreeView"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluContentDialog.qml"),uri,major,minor,"FluContentDialog"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluMenuItem.qml"),uri,major,minor,"FluMenuItem"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluMenu.qml"),uri,major,minor,"FluMenu"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluScrollBar.qml"),uri,major,minor,"FluScrollBar"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluTextButton.qml"),uri,major,minor,"FluTextButton"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluMultilineTextBox.qml"),uri,major,minor,"FluMultilineTextBox"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluTooltip.qml"),uri,major,minor,"FluTooltip"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluDivider.qml"),uri,major,minor,"FluDivider"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluIcon.qml"),uri,major,minor,"FluIcon"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluObject.qml"),uri,major,minor,"FluObject"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluInfoBar.qml"),uri,major,minor,"FluInfoBar"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluWindow.qml"),uri,major,minor,"FluWindow"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluRectangle.qml"),uri,major,minor,"FluRectangle"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluAppBar.qml"),uri,major,minor,"FluAppBar"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluButton.qml"),uri,major,minor,"FluButton"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluCheckBox.qml"),uri,major,minor,"FluCheckBox"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluComboBox.qml"),uri,major,minor,"FluComboBox"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluDropDownButton.qml"),uri,major,minor,"FluDropDownButton"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluFilledButton.qml"),uri,major,minor,"FluFilledButton"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluIconButton.qml"),uri,major,minor,"FluIconButton"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluProgressBar.qml"),uri,major,minor,"FluProgressBar"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluProgressRing.qml"),uri,major,minor,"FluProgressRing"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluRadioButton.qml"),uri,major,minor,"FluRadioButton"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluSlider.qml"),uri,major,minor,"FluSlider"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluTextBox.qml"),uri,major,minor,"FluTextBox"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluPasswordBox.qml"),uri,major,minor,"FluPasswordBox"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluText.qml"),uri,major,minor,"FluText"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluFilledButton.qml"),uri,major,minor,"FluFilledButton"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluToggleSwitch.qml"),uri,major,minor,"FluToggleSwitch"); - - qmlRegisterUncreatableMetaObject(Fluent_Awesome::staticMetaObject, uri,major,minor,"FluentIcons", "Access to enums & flags only"); - qmlRegisterUncreatableMetaObject(Fluent_DarkMode::staticMetaObject, uri,major,minor,"FluDarkMode", "Access to enums & flags only"); - -} - -void Fluent::initializeEngine(QQmlEngine *engine, const char *uri) -{ - nativeEvent = new NativeEventFilter(); - qApp->installNativeEventFilter(nativeEvent); - Q_UNUSED(engine) - Q_UNUSED(uri) -#ifdef Q_OS_WIN - QFont font; - font.setFamily("Microsoft YaHei"); - QGuiApplication::setFont(font); - // QQuickWindow::setTextRenderType(QQuickWindow::NativeTextRendering); -#endif - QFontDatabase::addApplicationFont(":/com.zhuzichu/res/font/Segoe_Fluent_Icons.ttf"); - FluApp* app = FluApp::getInstance(); - engine->rootContext()->setContextProperty("FluApp",app); - FluColors* colors = FluColors::getInstance(); - engine->rootContext()->setContextProperty("FluColors",colors); - FluTheme* theme = FluTheme::getInstance(); - engine->rootContext()->setContextProperty("FluTheme",theme); -} diff --git a/src/Fluent.h b/src/Fluent.h deleted file mode 100644 index a1540e5..0000000 --- a/src/Fluent.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef FLUENT_H -#define FLUENT_H - -#include -#include -#include "NativeEventFilter.h" - -class Fluent: public QObject -{ - Q_OBJECT -public: - Q_INVOKABLE QString version() const; - ~Fluent(){ - if (nativeEvent != Q_NULLPTR) { - delete nativeEvent; - nativeEvent = Q_NULLPTR; - } - } - void registerTypes(const char *uri); - void initializeEngine(QQmlEngine *engine, const char *uri); - static Fluent *getInstance(); -private: - static Fluent* m_instance; - NativeEventFilter *nativeEvent = Q_NULLPTR; -}; - -#endif // FLUENT_H diff --git a/src/FluentUI.cpp b/src/FluentUI.cpp deleted file mode 100644 index a4bae0f..0000000 --- a/src/FluentUI.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "FluentUI.h" -#include "Fluent.h" - -void FluentUI::registerTypes(const char *uri){ - Fluent::getInstance()->registerTypes(uri); -} - -void FluentUI::initializeEngine(QQmlEngine *engine, const char *uri){ - Fluent::getInstance()->initializeEngine(engine,uri); -} - -void FluentUI::initialize(QQmlEngine *engine){ - Fluent::getInstance()->registerTypes(URI_STR); - Fluent::getInstance()->initializeEngine(engine,URI_STR); -} diff --git a/src/FluentUI.h b/src/FluentUI.h deleted file mode 100644 index bb74f12..0000000 --- a/src/FluentUI.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef FLUENTUI_H -#define FLUENTUI_H - -#include - -class Q_DECL_EXPORT FluentUI -{ - -public: - static void registerTypes(const char *uri) ; - static void initializeEngine(QQmlEngine *engine, const char *uri); - static void initialize(QQmlEngine *engine); -}; - -#endif // FLUENTUI_H diff --git a/src/FluentUI.pro b/src/FluentUI.pro deleted file mode 100644 index a35c781..0000000 --- a/src/FluentUI.pro +++ /dev/null @@ -1,51 +0,0 @@ -QT += qml quick svg -CONFIG += plugin c++17 -TEMPLATE = lib -TARGET = FluentUI -TARGET = $$qtLibraryTarget($$TARGET) -uri = FluentUI - -CONFIG += sharedlib # staticlib or sharedlib - -RESOURCES += \ - res.qrc - -HEADERS += \ - Def.h \ - FluApp.h \ - FluColorSet.h \ - FluColors.h \ - FluRegister.h \ - FluTheme.h \ - Fluent.h \ - FluentUI.h \ - NativeEventFilter.h \ - WindowHelper.h \ - qml_plugin.h \ - stdafx.h - -SOURCES += \ - Def.cpp \ - FluApp.cpp \ - FluColorSet.cpp \ - FluColors.cpp \ - FluRegister.cpp \ - FluTheme.cpp \ - Fluent.cpp \ - FluentUI.cpp \ - NativeEventFilter.cpp \ - WindowHelper.cpp \ - qml_plugin.cpp \ - -win32 { - LIBS += -ldwmapi -luser32 -} - -DEFINES += VERSION_IN=\\\"1.0.0\\\" -DEFINES += URI_STR=\\\"$$uri\\\" - -contains(QMAKE_HOST.os,Windows) { - include(./build_windows.pri) -}else{ - include(./build_macos.pri) -} diff --git a/src/NativeEventFilter.cpp b/src/NativeEventFilter.cpp index 119f28c..6966cbf 100644 --- a/src/NativeEventFilter.cpp +++ b/src/NativeEventFilter.cpp @@ -11,11 +11,11 @@ bool NativeEventFilter::nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result) { #ifdef Q_OS_WIN - if (eventType == "windows_generic_MSG" && FluTheme::getInstance()->frameless()) { + if (eventType == "windows_generic_MSG" && FluApp::fluTheme->frameless()) { MSG* msg = static_cast(message); if (msg == Q_NULLPTR) return false; - if(!FluApp::getInstance()->wnds.contains((WId)msg->hwnd)){ + if(!FluApp::fluApp->wnds.contains((WId)msg->hwnd)){ return false; } switch(msg->message) { @@ -27,7 +27,7 @@ bool NativeEventFilter::nativeEventFilter(const QByteArray &eventType, void *mes return true; } case WM_NCHITTEST: { - auto view = FluApp::getInstance()->wnds[(WId)msg->hwnd]; + auto view = FluApp::fluApp->wnds[(WId)msg->hwnd]; bool isResize = !(view->maximumWidth()==view->minimumWidth()&&view->maximumHeight()==view->minimumHeight()); const LONG borderWidth = 8; RECT winrect; diff --git a/src/WindowHelper.cpp b/src/WindowHelper.cpp index 1ff5d4c..1fd1b64 100644 --- a/src/WindowHelper.cpp +++ b/src/WindowHelper.cpp @@ -30,7 +30,7 @@ void WindowHelper::initWindow(QQuickWindow* window){ void WindowHelper::firstUpdate(){ if(isFisrt){ #ifdef Q_OS_WIN - if(FluTheme::getInstance()->frameless()){ + if(FluApp::fluTheme->frameless()){ HWND wnd = (HWND)window->winId(); SetWindowLongPtr(wnd, GWL_STYLE, static_cast(Style::aero_borderless)); const MARGINS shadow_on = { 1, 1, 1, 1 }; @@ -54,7 +54,7 @@ QVariant WindowHelper::createRegister(QQuickWindow* window,const QString& path){ void WindowHelper::destoryWindow(){ if(this->window){ - FluApp::getInstance()->wnds.remove(this->window->winId()); + FluApp::fluApp->wnds.remove(this->window->winId()); this->window->deleteLater(); } } diff --git a/src/WindowHelper.h b/src/WindowHelper.h index bc56534..0b2a3f1 100644 --- a/src/WindowHelper.h +++ b/src/WindowHelper.h @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -10,14 +11,13 @@ class WindowHelper : public QObject { Q_OBJECT - + QML_NAMED_ELEMENT(WindowHelper) public: explicit WindowHelper(QObject *parent = nullptr); Q_INVOKABLE void initWindow(QQuickWindow* window); Q_INVOKABLE void destoryWindow(); Q_INVOKABLE QVariant createRegister(QQuickWindow* window,const QString& path); - Q_INVOKABLE void firstUpdate(); private: diff --git a/src/build-preset/qmldir b/src/build-preset/qmldir deleted file mode 100644 index b5ca1f0..0000000 --- a/src/build-preset/qmldir +++ /dev/null @@ -1,4 +0,0 @@ -module FluentUI -plugin FluentUI -classname FluentUIQmlPlugin -typeinfo plugin.qmltypes \ No newline at end of file diff --git a/src/build_macos.cmake b/src/build_macos.cmake deleted file mode 100644 index 254942a..0000000 --- a/src/build_macos.cmake +++ /dev/null @@ -1,32 +0,0 @@ -set(OUTP ${CMAKE_BINARY_DIR}/bin/FluentUI/) - -add_definitions(-DMACOS) - -set(CMAKE_INSTALL_PREFIX ${OUTP}) -set(CMAKE_INSTALL_DESTDIR ${OUTP}) - -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) - -set(QMAKE_MOC_OPTIONS -Muri=${uri}) - -add_custom_command( - TARGET ${PROJECT_NAME} POST_BUILD - COMMAND chmod -R 777 ${CMAKE_CURRENT_SOURCE_DIR}/macos_install.sh -) - -add_custom_command( - TARGET ${PROJECT_NAME} POST_BUILD - COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/macos_install.sh PRESET ${CMAKE_CURRENT_SOURCE_DIR}/ ${OUTP} -) - - - -if(${TARGET_TYPE} STREQUAL "SHARED") - - set(INST_QMLPATH ${QT_INSTALL_QML}/FluentUI) - add_custom_command( - TARGET ${PROJECT_NAME} POST_BUILD - COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/macos_install.sh INSTALL ${CMAKE_CURRENT_SOURCE_DIR}/ ${OUTP} ${INST_QMLPATH} - ) - -endif() diff --git a/src/build_macos.pri b/src/build_macos.pri deleted file mode 100644 index dc26c30..0000000 --- a/src/build_macos.pri +++ /dev/null @@ -1,17 +0,0 @@ -OUTP = $$OUT_PWD/../bin/FluentUI/ - -DESTDIR += $$OUTP - -QMAKE_MOC_OPTIONS += -Muri=$$uri -QMAKE_PRE_LINK += chmod -R 777 $$PWD/macos_install.sh; -QMAKE_PRE_LINK += $$PWD/macos_install.sh PRESET $$PWD/ $$OUTP; - -CONFIG(sharedlib){ - INST_QMLPATH = $$[QT_INSTALL_QML]/$$replace(uri, \\., /) - - QMAKE_POST_LINK += $$PWD/macos_install.sh INSTALL $$PWD/ $$OUTP $$INST_QMLPATH; - - exists($$PWD/../../dev.pri){ - include($$PWD/../../dev.pri) - } -} diff --git a/src/build_windows.cmake b/src/build_windows.cmake deleted file mode 100644 index 875c916..0000000 --- a/src/build_windows.cmake +++ /dev/null @@ -1,27 +0,0 @@ -set(OUTP "${CMAKE_BINARY_DIR}/bin/FluentUI") -set(BUILDBIN_PATH "${OUTP}") -set(QTQMLFLUENT_PATH "${QT_INSTALL_QML}/FluentUI") -set(PRESET_PATH "${CMAKE_CURRENT_SOURCE_DIR}/build-preset") -set(SOLIBFILE_PATH "${CMAKE_BINARY_DIR}/libFluentUI.so") -set(ANDROID NO) -if (ANDROID) - set(ANDROID YES) - execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${OUTP}) -else() - set(CMAKE_INSTALL_PREFIX "${OUTP}") -endif() -set(SHAREDSCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/win_install.bat SHARED ${CMAKE_CURRENT_SOURCE_DIR} ${PRESET_PATH} ${BUILDBIN_PATH} ${QTQMLFLUENT_PATH} ${ANDROID} ${SOLIBFILE_PATH}) -set(STATICSCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/win_install.bat STATIC ${CMAKE_CURRENT_SOURCE_DIR} ${PRESET_PATH} ${BUILDBIN_PATH} ${QTQMLFLUENT_PATH} ${ANDROID} ${SOLIBFILE_PATH}) -string(REPLACE "/" "\\" SHAREDSCRIPT "${SHAREDSCRIPT}") -string(REPLACE "/" "\\" STATICSCRIPT "${STATICSCRIPT}") -if (${TARGET_TYPE} STREQUAL "SHARED") - add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - COMMAND ${SHAREDSCRIPT} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ) -else() - add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - COMMAND ${STATICSCRIPT} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ) -endif() diff --git a/src/build_windows.pri b/src/build_windows.pri deleted file mode 100644 index 41f0202..0000000 --- a/src/build_windows.pri +++ /dev/null @@ -1,20 +0,0 @@ -OUTP = $$OUT_PWD/../bin/FluentUI -BUILDBIN_PATH = $$replace(OUTP, src/../bin, bin) -QTQMLFLUENT_PATH = $$[QT_INSTALL_QML]/FluentUI -PRESET_PATH = $$PWD/build-preset -SOLIBFILE_PATH = $$OUT_PWD/libFluentUI.so -ANDROID = NO -android{ - ANDROID=YES - QMAKE_PRE_LINK *= md $$replace(OUTP, /, \\) -}else{ - DESTDIR += $$OUTP -} -SHAREDSCRIPT = "$$PWD\win_install.bat" SHARED "$$PWD" "$$PRESET_PATH" "$$BUILDBIN_PATH" "$$QTQMLFLUENT_PATH" $$ANDROID "$$SOLIBFILE_PATH" -STATICSCRIPT = "$$PWD\win_install.bat" STATIC "$$PWD" "$$PRESET_PATH" "$$BUILDBIN_PATH" "$$QTQMLFLUENT_PATH" $$ANDROID "$$SOLIBFILE_PATH" -CONFIG(sharedlib){ - QMAKE_POST_LINK *= $$replace(SHAREDSCRIPT, /, \\) -} -else{ - QMAKE_POST_LINK *= $$replace(STATICSCRIPT, /, \\) -} diff --git a/src/colorpicker/ColorPicker.qml b/src/imports/FluentUI/Controls/ColorPicker/ColorPicker.qml similarity index 99% rename from src/colorpicker/ColorPicker.qml rename to src/imports/FluentUI/Controls/ColorPicker/ColorPicker.qml index 96dc336..5c0e82d 100644 --- a/src/colorpicker/ColorPicker.qml +++ b/src/imports/FluentUI/Controls/ColorPicker/ColorPicker.qml @@ -1,7 +1,7 @@ import QtQuick import QtQuick.Layouts import QtQuick.Controls -import "content" +import "Content" Rectangle { id: colorPicker diff --git a/src/colorpicker/content/Checkerboard.qml b/src/imports/FluentUI/Controls/ColorPicker/Content/Checkerboard.qml similarity index 100% rename from src/colorpicker/content/Checkerboard.qml rename to src/imports/FluentUI/Controls/ColorPicker/Content/Checkerboard.qml diff --git a/src/colorpicker/content/ColorSlider.qml b/src/imports/FluentUI/Controls/ColorPicker/Content/ColorSlider.qml similarity index 100% rename from src/colorpicker/content/ColorSlider.qml rename to src/imports/FluentUI/Controls/ColorPicker/Content/ColorSlider.qml diff --git a/src/colorpicker/content/NumberBox.qml b/src/imports/FluentUI/Controls/ColorPicker/Content/NumberBox.qml similarity index 100% rename from src/colorpicker/content/NumberBox.qml rename to src/imports/FluentUI/Controls/ColorPicker/Content/NumberBox.qml diff --git a/src/colorpicker/content/PanelBorder.qml b/src/imports/FluentUI/Controls/ColorPicker/Content/PanelBorder.qml similarity index 100% rename from src/colorpicker/content/PanelBorder.qml rename to src/imports/FluentUI/Controls/ColorPicker/Content/PanelBorder.qml diff --git a/src/colorpicker/content/SBPicker.qml b/src/imports/FluentUI/Controls/ColorPicker/Content/SBPicker.qml similarity index 100% rename from src/colorpicker/content/SBPicker.qml rename to src/imports/FluentUI/Controls/ColorPicker/Content/SBPicker.qml diff --git a/src/controls/FluAppBar.qml b/src/imports/FluentUI/Controls/FluAppBar.qml similarity index 100% rename from src/controls/FluAppBar.qml rename to src/imports/FluentUI/Controls/FluAppBar.qml diff --git a/src/controls/FluArea.qml b/src/imports/FluentUI/Controls/FluArea.qml similarity index 100% rename from src/controls/FluArea.qml rename to src/imports/FluentUI/Controls/FluArea.qml diff --git a/src/controls/FluAutoSuggestBox.qml b/src/imports/FluentUI/Controls/FluAutoSuggestBox.qml similarity index 100% rename from src/controls/FluAutoSuggestBox.qml rename to src/imports/FluentUI/Controls/FluAutoSuggestBox.qml diff --git a/src/controls/FluBadge.qml b/src/imports/FluentUI/Controls/FluBadge.qml similarity index 97% rename from src/controls/FluBadge.qml rename to src/imports/FluentUI/Controls/FluBadge.qml index e37a8c6..ded998b 100644 --- a/src/controls/FluBadge.qml +++ b/src/imports/FluentUI/Controls/FluBadge.qml @@ -1,4 +1,6 @@ import QtQuick +import QtQuick.Controls +import FluentUI Rectangle{ diff --git a/src/controls/FluBreadcrumbBar.qml b/src/imports/FluentUI/Controls/FluBreadcrumbBar.qml similarity index 100% rename from src/controls/FluBreadcrumbBar.qml rename to src/imports/FluentUI/Controls/FluBreadcrumbBar.qml diff --git a/src/controls/FluButton.qml b/src/imports/FluentUI/Controls/FluButton.qml similarity index 100% rename from src/controls/FluButton.qml rename to src/imports/FluentUI/Controls/FluButton.qml diff --git a/src/controls/FluCalendarPicker.qml b/src/imports/FluentUI/Controls/FluCalendarPicker.qml similarity index 100% rename from src/controls/FluCalendarPicker.qml rename to src/imports/FluentUI/Controls/FluCalendarPicker.qml diff --git a/src/controls/FluCalendarView.qml b/src/imports/FluentUI/Controls/FluCalendarView.qml similarity index 100% rename from src/controls/FluCalendarView.qml rename to src/imports/FluentUI/Controls/FluCalendarView.qml diff --git a/src/controls/FluCarousel.qml b/src/imports/FluentUI/Controls/FluCarousel.qml similarity index 100% rename from src/controls/FluCarousel.qml rename to src/imports/FluentUI/Controls/FluCarousel.qml diff --git a/src/controls/FluCheckBox.qml b/src/imports/FluentUI/Controls/FluCheckBox.qml similarity index 100% rename from src/controls/FluCheckBox.qml rename to src/imports/FluentUI/Controls/FluCheckBox.qml diff --git a/src/controls/FluColorPicker.qml b/src/imports/FluentUI/Controls/FluColorPicker.qml similarity index 100% rename from src/controls/FluColorPicker.qml rename to src/imports/FluentUI/Controls/FluColorPicker.qml diff --git a/src/controls/FluColorView.qml b/src/imports/FluentUI/Controls/FluColorView.qml similarity index 86% rename from src/controls/FluColorView.qml rename to src/imports/FluentUI/Controls/FluColorView.qml index 2bf8bf0..97546f8 100644 --- a/src/controls/FluColorView.qml +++ b/src/imports/FluentUI/Controls/FluColorView.qml @@ -1,5 +1,7 @@ import QtQuick -import "../colorpicker" +import QtQuick.Controls +import FluentUI +import "ColorPicker" Item { diff --git a/src/controls/FluComboBox.qml b/src/imports/FluentUI/Controls/FluComboBox.qml similarity index 65% rename from src/controls/FluComboBox.qml rename to src/imports/FluentUI/Controls/FluComboBox.qml index 3dd03fb..151097f 100644 --- a/src/controls/FluComboBox.qml +++ b/src/imports/FluentUI/Controls/FluComboBox.qml @@ -1,4 +1,5 @@ import QtQuick +import QtQuick.Controls import FluentUI Item { diff --git a/src/controls/FluContentDialog.qml b/src/imports/FluentUI/Controls/FluContentDialog.qml similarity index 99% rename from src/controls/FluContentDialog.qml rename to src/imports/FluentUI/Controls/FluContentDialog.qml index 7b5c2a7..0f8955a 100644 --- a/src/controls/FluContentDialog.qml +++ b/src/imports/FluentUI/Controls/FluContentDialog.qml @@ -2,6 +2,7 @@ import QtQuick.Layouts import QtQuick.Controls import QtQuick.Window +import FluentUI Popup { id: popup diff --git a/src/controls/FluContentPage.qml b/src/imports/FluentUI/Controls/FluContentPage.qml similarity index 100% rename from src/controls/FluContentPage.qml rename to src/imports/FluentUI/Controls/FluContentPage.qml diff --git a/src/controls/FluDatePicker.qml b/src/imports/FluentUI/Controls/FluDatePicker.qml similarity index 100% rename from src/controls/FluDatePicker.qml rename to src/imports/FluentUI/Controls/FluDatePicker.qml diff --git a/src/controls/FluDivider.qml b/src/imports/FluentUI/Controls/FluDivider.qml similarity index 100% rename from src/controls/FluDivider.qml rename to src/imports/FluentUI/Controls/FluDivider.qml diff --git a/src/controls/FluDropDownButton.qml b/src/imports/FluentUI/Controls/FluDropDownButton.qml similarity index 100% rename from src/controls/FluDropDownButton.qml rename to src/imports/FluentUI/Controls/FluDropDownButton.qml diff --git a/src/controls/FluExpander.qml b/src/imports/FluentUI/Controls/FluExpander.qml similarity index 100% rename from src/controls/FluExpander.qml rename to src/imports/FluentUI/Controls/FluExpander.qml diff --git a/src/controls/FluFilledButton.qml b/src/imports/FluentUI/Controls/FluFilledButton.qml similarity index 100% rename from src/controls/FluFilledButton.qml rename to src/imports/FluentUI/Controls/FluFilledButton.qml diff --git a/src/controls/FluFlipView.qml b/src/imports/FluentUI/Controls/FluFlipView.qml similarity index 100% rename from src/controls/FluFlipView.qml rename to src/imports/FluentUI/Controls/FluFlipView.qml diff --git a/src/controls/FluFocusRectangle.qml b/src/imports/FluentUI/Controls/FluFocusRectangle.qml similarity index 94% rename from src/controls/FluFocusRectangle.qml rename to src/imports/FluentUI/Controls/FluFocusRectangle.qml index 7a3507d..a565504 100644 --- a/src/controls/FluFocusRectangle.qml +++ b/src/imports/FluentUI/Controls/FluFocusRectangle.qml @@ -1,4 +1,5 @@ import QtQuick +import QtQuick.Controls import FluentUI Item { diff --git a/src/controls/FluIcon.qml b/src/imports/FluentUI/Controls/FluIcon.qml similarity index 90% rename from src/controls/FluIcon.qml rename to src/imports/FluentUI/Controls/FluIcon.qml index 110c075..24ecfea 100644 --- a/src/controls/FluIcon.qml +++ b/src/imports/FluentUI/Controls/FluIcon.qml @@ -1,4 +1,6 @@ import QtQuick +import QtQuick.Controls +import FluentUI Text { diff --git a/src/controls/FluIconButton.qml b/src/imports/FluentUI/Controls/FluIconButton.qml similarity index 100% rename from src/controls/FluIconButton.qml rename to src/imports/FluentUI/Controls/FluIconButton.qml diff --git a/src/controls/FluInfoBar.qml b/src/imports/FluentUI/Controls/FluInfoBar.qml similarity index 99% rename from src/controls/FluInfoBar.qml rename to src/imports/FluentUI/Controls/FluInfoBar.qml index e1020cf..eb2fa41 100644 --- a/src/controls/FluInfoBar.qml +++ b/src/imports/FluentUI/Controls/FluInfoBar.qml @@ -1,4 +1,5 @@ import QtQuick +import QtQuick.Controls import FluentUI FluObject { diff --git a/src/controls/FluItem.qml b/src/imports/FluentUI/Controls/FluItem.qml similarity index 100% rename from src/controls/FluItem.qml rename to src/imports/FluentUI/Controls/FluItem.qml diff --git a/src/controls/FluMediaPlayer.qml b/src/imports/FluentUI/Controls/FluMediaPlayer.qml similarity index 100% rename from src/controls/FluMediaPlayer.qml rename to src/imports/FluentUI/Controls/FluMediaPlayer.qml diff --git a/src/controls/FluMenu.qml b/src/imports/FluentUI/Controls/FluMenu.qml similarity index 98% rename from src/controls/FluMenu.qml rename to src/imports/FluentUI/Controls/FluMenu.qml index 1bc459e..fe4598a 100644 --- a/src/controls/FluMenu.qml +++ b/src/imports/FluentUI/Controls/FluMenu.qml @@ -1,6 +1,7 @@ import QtQuick import QtQuick.Layouts import QtQuick.Controls +import FluentUI Menu { diff --git a/src/controls/FluMenuItem.qml b/src/imports/FluentUI/Controls/FluMenuItem.qml similarity index 98% rename from src/controls/FluMenuItem.qml rename to src/imports/FluentUI/Controls/FluMenuItem.qml index 7ea3d30..894008e 100644 --- a/src/controls/FluMenuItem.qml +++ b/src/imports/FluentUI/Controls/FluMenuItem.qml @@ -1,5 +1,6 @@ import QtQuick import QtQuick.Controls +import FluentUI Item { @@ -16,7 +17,6 @@ Item { } height: 32 - Rectangle{ anchors.centerIn: parent width: control.width-40 diff --git a/src/controls/FluMultilineTextBox.qml b/src/imports/FluentUI/Controls/FluMultilineTextBox.qml similarity index 100% rename from src/controls/FluMultilineTextBox.qml rename to src/imports/FluentUI/Controls/FluMultilineTextBox.qml diff --git a/src/controls/FluNavigationView.qml b/src/imports/FluentUI/Controls/FluNavigationView.qml similarity index 100% rename from src/controls/FluNavigationView.qml rename to src/imports/FluentUI/Controls/FluNavigationView.qml diff --git a/src/controls/FluObject.qml b/src/imports/FluentUI/Controls/FluObject.qml similarity index 71% rename from src/controls/FluObject.qml rename to src/imports/FluentUI/Controls/FluObject.qml index b78c19b..2e1b5ee 100644 --- a/src/controls/FluObject.qml +++ b/src/imports/FluentUI/Controls/FluObject.qml @@ -1,4 +1,6 @@ import QtQuick +import QtQuick.Controls +import FluentUI QtObject { id:flu_object; diff --git a/src/controls/FluPagination.qml b/src/imports/FluentUI/Controls/FluPagination.qml similarity index 100% rename from src/controls/FluPagination.qml rename to src/imports/FluentUI/Controls/FluPagination.qml diff --git a/src/controls/FluPaneItem.qml b/src/imports/FluentUI/Controls/FluPaneItem.qml similarity index 94% rename from src/controls/FluPaneItem.qml rename to src/imports/FluentUI/Controls/FluPaneItem.qml index 93e5e92..d932ae6 100644 --- a/src/controls/FluPaneItem.qml +++ b/src/imports/FluentUI/Controls/FluPaneItem.qml @@ -1,4 +1,5 @@ import QtQuick +import QtQuick.Controls import FluentUI QtObject { diff --git a/src/controls/FluPaneItemEmpty.qml b/src/imports/FluentUI/Controls/FluPaneItemEmpty.qml similarity index 75% rename from src/controls/FluPaneItemEmpty.qml rename to src/imports/FluentUI/Controls/FluPaneItemEmpty.qml index 6e4c6bf..c0a4b8c 100644 --- a/src/controls/FluPaneItemEmpty.qml +++ b/src/imports/FluentUI/Controls/FluPaneItemEmpty.qml @@ -1,4 +1,6 @@ import QtQuick +import QtQuick.Controls +import FluentUI QtObject { readonly property string key : FluApp.uuid() diff --git a/src/controls/FluPaneItemExpander.qml b/src/imports/FluentUI/Controls/FluPaneItemExpander.qml similarity index 91% rename from src/controls/FluPaneItemExpander.qml rename to src/imports/FluentUI/Controls/FluPaneItemExpander.qml index abdc8d6..d354d0b 100644 --- a/src/controls/FluPaneItemExpander.qml +++ b/src/imports/FluentUI/Controls/FluPaneItemExpander.qml @@ -1,4 +1,5 @@ import QtQuick +import QtQuick.Controls import FluentUI FluObject { diff --git a/src/controls/FluPaneItemHeader.qml b/src/imports/FluentUI/Controls/FluPaneItemHeader.qml similarity index 79% rename from src/controls/FluPaneItemHeader.qml rename to src/imports/FluentUI/Controls/FluPaneItemHeader.qml index c83ee61..c00d6e7 100644 --- a/src/controls/FluPaneItemHeader.qml +++ b/src/imports/FluentUI/Controls/FluPaneItemHeader.qml @@ -1,4 +1,6 @@ import QtQuick +import QtQuick.Controls +import FluentUI QtObject { readonly property string key : FluApp.uuid() diff --git a/src/controls/FluPaneItemSeparator.qml b/src/imports/FluentUI/Controls/FluPaneItemSeparator.qml similarity index 75% rename from src/controls/FluPaneItemSeparator.qml rename to src/imports/FluentUI/Controls/FluPaneItemSeparator.qml index 6e4c6bf..c0a4b8c 100644 --- a/src/controls/FluPaneItemSeparator.qml +++ b/src/imports/FluentUI/Controls/FluPaneItemSeparator.qml @@ -1,4 +1,6 @@ import QtQuick +import QtQuick.Controls +import FluentUI QtObject { readonly property string key : FluApp.uuid() diff --git a/src/controls/FluPasswordBox.qml b/src/imports/FluentUI/Controls/FluPasswordBox.qml similarity index 100% rename from src/controls/FluPasswordBox.qml rename to src/imports/FluentUI/Controls/FluPasswordBox.qml diff --git a/src/controls/FluPivot.qml b/src/imports/FluentUI/Controls/FluPivot.qml similarity index 100% rename from src/controls/FluPivot.qml rename to src/imports/FluentUI/Controls/FluPivot.qml diff --git a/src/controls/FluPivotItem.qml b/src/imports/FluentUI/Controls/FluPivotItem.qml similarity index 84% rename from src/controls/FluPivotItem.qml rename to src/imports/FluentUI/Controls/FluPivotItem.qml index 28ffb90..27444ba 100644 --- a/src/controls/FluPivotItem.qml +++ b/src/imports/FluentUI/Controls/FluPivotItem.qml @@ -1,4 +1,5 @@ import QtQuick +import QtQuick.Controls import FluentUI QtObject { diff --git a/src/controls/FluProgressBar.qml b/src/imports/FluentUI/Controls/FluProgressBar.qml similarity index 98% rename from src/controls/FluProgressBar.qml rename to src/imports/FluentUI/Controls/FluProgressBar.qml index f09fe5f..7a9685c 100644 --- a/src/controls/FluProgressBar.qml +++ b/src/imports/FluentUI/Controls/FluProgressBar.qml @@ -1,5 +1,6 @@ import QtQuick import QtQuick.Controls +import FluentUI FluRectangle { diff --git a/src/controls/FluProgressRing.qml b/src/imports/FluentUI/Controls/FluProgressRing.qml similarity index 99% rename from src/controls/FluProgressRing.qml rename to src/imports/FluentUI/Controls/FluProgressRing.qml index deab212..28b92e4 100644 --- a/src/controls/FluProgressRing.qml +++ b/src/imports/FluentUI/Controls/FluProgressRing.qml @@ -1,5 +1,6 @@ import QtQuick import QtQuick.Controls +import FluentUI Rectangle { diff --git a/src/controls/FluRadioButton.qml b/src/imports/FluentUI/Controls/FluRadioButton.qml similarity index 100% rename from src/controls/FluRadioButton.qml rename to src/imports/FluentUI/Controls/FluRadioButton.qml diff --git a/src/controls/FluRatingControl.qml b/src/imports/FluentUI/Controls/FluRatingControl.qml similarity index 100% rename from src/controls/FluRatingControl.qml rename to src/imports/FluentUI/Controls/FluRatingControl.qml diff --git a/src/controls/FluRectangle.qml b/src/imports/FluentUI/Controls/FluRectangle.qml similarity index 99% rename from src/controls/FluRectangle.qml rename to src/imports/FluentUI/Controls/FluRectangle.qml index f5a9609..b2c1e70 100644 --- a/src/controls/FluRectangle.qml +++ b/src/imports/FluentUI/Controls/FluRectangle.qml @@ -1,6 +1,7 @@ import QtQuick import QtQuick.Controls import Qt5Compat.GraphicalEffects +import FluentUI Item{ diff --git a/src/controls/FluScrollBar.qml b/src/imports/FluentUI/Controls/FluScrollBar.qml similarity index 100% rename from src/controls/FluScrollBar.qml rename to src/imports/FluentUI/Controls/FluScrollBar.qml diff --git a/src/controls/FluScrollablePage.qml b/src/imports/FluentUI/Controls/FluScrollablePage.qml similarity index 100% rename from src/controls/FluScrollablePage.qml rename to src/imports/FluentUI/Controls/FluScrollablePage.qml diff --git a/src/controls/FluShadow.qml b/src/imports/FluentUI/Controls/FluShadow.qml similarity index 97% rename from src/controls/FluShadow.qml rename to src/imports/FluentUI/Controls/FluShadow.qml index 9e89023..62d6a8e 100644 --- a/src/controls/FluShadow.qml +++ b/src/imports/FluentUI/Controls/FluShadow.qml @@ -1,4 +1,6 @@ import QtQuick +import QtQuick.Controls +import FluentUI Item { diff --git a/src/imports/FluentUI/Controls/FluSingleton.qml b/src/imports/FluentUI/Controls/FluSingleton.qml new file mode 100644 index 0000000..28e0b8a --- /dev/null +++ b/src/imports/FluentUI/Controls/FluSingleton.qml @@ -0,0 +1,15 @@ +import QtQuick +import QtQuick.Controls +import FluentUI + +QtObject { + + id:control + + Component.onCompleted: { + FluApp.setFluApp(FluApp) + FluApp.setFluColors(FluColors) + FluApp.setFluTheme(FluTheme) + } + +} diff --git a/src/controls/FluSlider.qml b/src/imports/FluentUI/Controls/FluSlider.qml similarity index 99% rename from src/controls/FluSlider.qml rename to src/imports/FluentUI/Controls/FluSlider.qml index 1df29f3..1e4a152 100644 --- a/src/controls/FluSlider.qml +++ b/src/imports/FluentUI/Controls/FluSlider.qml @@ -1,6 +1,7 @@ import QtQuick import QtQuick.Controls import Qt5Compat.GraphicalEffects +import FluentUI Item{ diff --git a/src/controls/FluStatusView.qml b/src/imports/FluentUI/Controls/FluStatusView.qml similarity index 100% rename from src/controls/FluStatusView.qml rename to src/imports/FluentUI/Controls/FluStatusView.qml diff --git a/src/controls/FluTabView.qml b/src/imports/FluentUI/Controls/FluTabView.qml similarity index 100% rename from src/controls/FluTabView.qml rename to src/imports/FluentUI/Controls/FluTabView.qml diff --git a/src/controls/FluTableView.qml b/src/imports/FluentUI/Controls/FluTableView.qml similarity index 100% rename from src/controls/FluTableView.qml rename to src/imports/FluentUI/Controls/FluTableView.qml diff --git a/src/controls/FluText.qml b/src/imports/FluentUI/Controls/FluText.qml similarity index 98% rename from src/controls/FluText.qml rename to src/imports/FluentUI/Controls/FluText.qml index a6a8bbf..7cb2a28 100644 --- a/src/controls/FluText.qml +++ b/src/imports/FluentUI/Controls/FluText.qml @@ -1,4 +1,5 @@ import QtQuick +import QtQuick.Controls import FluentUI Text { diff --git a/src/controls/FluTextBox.qml b/src/imports/FluentUI/Controls/FluTextBox.qml similarity index 100% rename from src/controls/FluTextBox.qml rename to src/imports/FluentUI/Controls/FluTextBox.qml diff --git a/src/controls/FluTextBoxBackground.qml b/src/imports/FluentUI/Controls/FluTextBoxBackground.qml similarity index 97% rename from src/controls/FluTextBoxBackground.qml rename to src/imports/FluentUI/Controls/FluTextBoxBackground.qml index 6260fc6..24b0876 100644 --- a/src/controls/FluTextBoxBackground.qml +++ b/src/imports/FluentUI/Controls/FluTextBoxBackground.qml @@ -1,5 +1,7 @@ import QtQuick +import QtQuick.Controls import Qt5Compat.GraphicalEffects +import FluentUI Rectangle{ diff --git a/src/controls/FluTextBoxMenu.qml b/src/imports/FluentUI/Controls/FluTextBoxMenu.qml similarity index 100% rename from src/controls/FluTextBoxMenu.qml rename to src/imports/FluentUI/Controls/FluTextBoxMenu.qml diff --git a/src/controls/FluTextButton.qml b/src/imports/FluentUI/Controls/FluTextButton.qml similarity index 100% rename from src/controls/FluTextButton.qml rename to src/imports/FluentUI/Controls/FluTextButton.qml diff --git a/src/controls/FluTimePicker.qml b/src/imports/FluentUI/Controls/FluTimePicker.qml similarity index 100% rename from src/controls/FluTimePicker.qml rename to src/imports/FluentUI/Controls/FluTimePicker.qml diff --git a/src/controls/FluToggleButton.qml b/src/imports/FluentUI/Controls/FluToggleButton.qml similarity index 100% rename from src/controls/FluToggleButton.qml rename to src/imports/FluentUI/Controls/FluToggleButton.qml diff --git a/src/controls/FluToggleSwitch.qml b/src/imports/FluentUI/Controls/FluToggleSwitch.qml similarity index 100% rename from src/controls/FluToggleSwitch.qml rename to src/imports/FluentUI/Controls/FluToggleSwitch.qml diff --git a/src/controls/FluTooltip.qml b/src/imports/FluentUI/Controls/FluTooltip.qml similarity index 100% rename from src/controls/FluTooltip.qml rename to src/imports/FluentUI/Controls/FluTooltip.qml diff --git a/src/controls/FluTreeView.qml b/src/imports/FluentUI/Controls/FluTreeView.qml similarity index 100% rename from src/controls/FluTreeView.qml rename to src/imports/FluentUI/Controls/FluTreeView.qml diff --git a/src/controls/FluWindow.qml b/src/imports/FluentUI/Controls/FluWindow.qml similarity index 100% rename from src/controls/FluWindow.qml rename to src/imports/FluentUI/Controls/FluWindow.qml diff --git a/src/controls/FluWindowResize.qml b/src/imports/FluentUI/Controls/FluWindowResize.qml similarity index 99% rename from src/controls/FluWindowResize.qml rename to src/imports/FluentUI/Controls/FluWindowResize.qml index ab43562..9df5831 100644 --- a/src/controls/FluWindowResize.qml +++ b/src/imports/FluentUI/Controls/FluWindowResize.qml @@ -1,5 +1,7 @@ import QtQuick +import QtQuick.Controls import QtQuick.Window +import FluentUI MouseArea { diff --git a/src/res/font/Segoe_Fluent_Icons.ttf b/src/imports/FluentUI/Font/Segoe_Fluent_Icons.ttf similarity index 100% rename from src/res/font/Segoe_Fluent_Icons.ttf rename to src/imports/FluentUI/Font/Segoe_Fluent_Icons.ttf diff --git a/src/imports/FluentUI/qmldir b/src/imports/FluentUI/qmldir new file mode 100644 index 0000000..791ae3e --- /dev/null +++ b/src/imports/FluentUI/qmldir @@ -0,0 +1,68 @@ +module FluentUI +FluAppBar 1.0 FluAppBar.qml +FluArea 1.0 FluArea.qml +FluAutoSuggestBox 1.0 FluAutoSuggestBox.qml +FluBadge 1.0 FluBadge.qml +FluBreadcrumbBar 1.0 FluBreadcrumbBar.qml +FluButton 1.0 FluButton.qml +FluCalendarPicker 1.0 FluCalendarPicker.qml +FluCalendarView 1.0 FluCalendarView.qml +FluCarousel 1.0 FluCarousel.qml +FluCheckBox 1.0 FluCheckBox.qml +FluColorPicker 1.0 FluColorPicker.qml +FluColorView 1.0 FluColorView.qml +FluComboBox 1.0 FluComboBox.qml +FluContentDialog 1.0 FluContentDialog.qml +FluContentPage 1.0 FluContentPage.qml +FluDatePicker 1.0 FluDatePicker.qml +FluDivider 1.0 FluDivider.qml +FluDropDownButton 1.0 FluDropDownButton.qml +FluExpander 1.0 FluExpander.qml +FluFilledButton 1.0 FluFilledButton.qml +FluFlipView 1.0 FluFlipView.qml +FluFocusRectangle 1.0 FluFocusRectangle.qml +FluIcon 1.0 FluIcon.qml +FluIconButton 1.0 FluIconButton.qml +FluInfoBar 1.0 FluInfoBar.qml +FluItem 1.0 FluItem.qml +FluMediaPlayer 1.0 FluMediaPlayer.qml +FluMenu 1.0 FluMenu.qml +FluMenuItem 1.0 FluMenuItem.qml +FluMultilineTextBox 1.0 FluMultilineTextBox.qml +FluNavigationView 1.0 FluNavigationView.qml +FluObject 1.0 FluObject.qml +FluPagination 1.0 FluPagination.qml +FluPaneItem 1.0 FluPaneItem.qml +FluPaneItemEmpty 1.0 FluPaneItemEmpty.qml +FluPaneItemExpander 1.0 FluPaneItemExpander.qml +FluPaneItemHeader 1.0 FluPaneItemHeader.qml +FluPaneItemSeparator 1.0 FluPaneItemSeparator.qml +FluPasswordBox 1.0 FluPasswordBox.qml +FluPivot 1.0 FluPivot.qml +FluPivotItem 1.0 FluPivotItem.qml +FluProgressBar 1.0 FluProgressBar.qml +FluProgressRing 1.0 FluProgressRing.qml +FluRadioButton 1.0 FluRadioButton.qml +FluRatingControl 1.0 FluRatingControl.qml +FluRectangle 1.0 FluRectangle.qml +FluScrollablePage 1.0 FluScrollablePage.qml +FluScrollBar 1.0 FluScrollBar.qml +FluShadow 1.0 FluShadow.qml +FluSlider 1.0 FluSlider.qml +FluStatusView 1.0 FluStatusView.qml +FluTableView 1.0 FluTableView.qml +FluTabView 1.0 FluTabView.qml +FluText 1.0 FluText.qml +FluTextBox 1.0 FluTextBox.qml +FluTextBoxBackground 1.0 FluTextBoxBackground.qml +FluTextBoxMenu 1.0 FluTextBoxMenu.qml +FluTextButton 1.0 FluTextButton.qml +FluTimePicker 1.0 FluTimePicker.qml +FluToggleButton 1.0 FluToggleButton.qml +FluToggleSwitch 1.0 FluToggleSwitch.qml +FluTooltip 1.0 FluTooltip.qml +FluTreeView 1.0 FluTreeView.qml +FluWindow 1.0 FluWindow.qml +FluWindowResize 1.0 FluWindowResize.qml +FluSingleton 1.0 FluSingleton.qml +plugin fluentuiplugin diff --git a/src/macos_install.sh b/src/macos_install.sh deleted file mode 100755 index ba24611..0000000 --- a/src/macos_install.sh +++ /dev/null @@ -1,14 +0,0 @@ -RUN_TYPE=$1 -PRESET_PATH=$2 -BUILDER_BIN_PATH=$3 -QT_QML_FLUENT_PATH=$4 - -echo ${RUN_TYPE} -if [ ${RUN_TYPE} = "PRESET" ]; then -cp -r ${PRESET_PATH}/FluentUI.h ${BUILDER_BIN_PATH} -cp -r ${PRESET_PATH}/build-preset/* ${BUILDER_BIN_PATH} -else -rm -rf ${QT_QML_FLUENT_PATH=} -mkdir -pv ${QT_QML_FLUENT_PATH=} -cp -r ${BUILDER_BIN_PATH}/* ${QT_QML_FLUENT_PATH=} -fi diff --git a/src/qml_plugin.cpp b/src/qml_plugin.cpp deleted file mode 100644 index 31a6ca8..0000000 --- a/src/qml_plugin.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "qml_plugin.h" - -void FluentUIQmlPlugin::registerTypes(const char *uri) -{ - FluentUI::registerTypes(uri); -} - -void FluentUIQmlPlugin::initializeEngine(QQmlEngine *engine, const char *uri) -{ - FluentUI::initializeEngine(engine,uri); -} - diff --git a/src/qml_plugin.h b/src/qml_plugin.h deleted file mode 100644 index 6cf5719..0000000 --- a/src/qml_plugin.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include -#include - -class FluentUIQmlPlugin : public QQmlExtensionPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) - -public: - void registerTypes(const char *uri) override; - void initializeEngine(QQmlEngine *engine, const char *uri) override; -}; diff --git a/src/res.qrc b/src/res.qrc deleted file mode 100644 index 004cb30..0000000 --- a/src/res.qrc +++ /dev/null @@ -1,76 +0,0 @@ - - - controls/FluButton.qml - controls/FluFilledButton.qml - controls/FluText.qml - controls/FluToggleSwitch.qml - controls/FluIconButton.qml - controls/FluCheckBox.qml - controls/FluRadioButton.qml - controls/FluSlider.qml - controls/FluProgressRing.qml - controls/FluProgressBar.qml - controls/FluComboBox.qml - controls/FluDropDownButton.qml - controls/FluTextBox.qml - controls/FluTimePicker.qml - controls/FluAppBar.qml - controls/FluRectangle.qml - controls/FluWindow.qml - controls/FluInfoBar.qml - controls/FluObject.qml - controls/FluIcon.qml - controls/FluDivider.qml - controls/FluTooltip.qml - controls/FluTextBoxBackground.qml - controls/FluWindowResize.qml - controls/FluScrollBar.qml - controls/FluMenu.qml - controls/FluMenuItem.qml - controls/FluShadow.qml - controls/FluTextButton.qml - controls/FluContentDialog.qml - controls/FluTreeView.qml - controls/FluExpander.qml - controls/FluAutoSuggestBox.qml - controls/FluNavigationView.qml - controls/FluPaneItem.qml - controls/FluPaneItemHeader.qml - controls/FluPaneItemSeparator.qml - controls/FluScrollablePage.qml - controls/FluContentPage.qml - controls/FluArea.qml - res/font/Segoe_Fluent_Icons.ttf - controls/FluDatePicker.qml - controls/FluCalendarView.qml - controls/FluCalendarPicker.qml - controls/FluFocusRectangle.qml - controls/FluCarousel.qml - controls/FluBadge.qml - controls/FluColorView.qml - controls/FluColorPicker.qml - colorpicker/ColorPicker.qml - colorpicker/content/Checkerboard.qml - colorpicker/content/ColorSlider.qml - colorpicker/content/NumberBox.qml - colorpicker/content/PanelBorder.qml - colorpicker/content/SBPicker.qml - controls/FluMediaPlayer.qml - controls/FluTabView.qml - controls/FluItem.qml - controls/FluPaneItemExpander.qml - controls/FluTextBoxMenu.qml - controls/FluMultilineTextBox.qml - controls/FluFlipView.qml - controls/FluPivot.qml - controls/FluPivotItem.qml - controls/FluTableView.qml - controls/FluPagination.qml - controls/FluToggleButton.qml - controls/FluStatusView.qml - controls/FluPaneItemEmpty.qml - controls/FluRatingControl.qml - controls/FluPasswordBox.qml - controls/FluBreadcrumbBar.qml - - diff --git a/src/styles/Theme.qml b/src/styles/Theme.qml deleted file mode 100644 index e69de29..0000000 diff --git a/src/styles/Typography.qml b/src/styles/Typography.qml deleted file mode 100644 index e69de29..0000000 diff --git a/src/win_install.bat b/src/win_install.bat deleted file mode 100644 index d6c4133..0000000 --- a/src/win_install.bat +++ /dev/null @@ -1,29 +0,0 @@ - -SET PWD_PATH=%2 -SET PRESET_PATH=%3 -SET BUILDER_BIN_PATH=%4 -SET QT_QML_FLUENT_PATH=%5 -SET ANDROID=%6 -SET LIBFILE_PATH=%7 - -echo "--------win_install-------" -echo %RUN_TYPE% -echo %PWD_PATH% -echo %PRESET_PATH% -echo %BUILDER_BIN_PATH% -echo %QT_QML_FLUENT_PATH% -echo "--------------------------" - -copy /y %PWD_PATH%\FluentUI.h %BUILDER_BIN_PATH% & copy /y %PRESET_PATH%\* %BUILDER_BIN_PATH%\ - -if %ANDROID% == YES copy /y %LIBFILE_PATH% %BUILDER_BIN_PATH% - -if %1 == SHARED ( - echo running install to qtqml folder - del /s /q %PRESET_PATH%\plugins.qmltypes - %QT_QML_FLUENT_PATH%\..\..\bin\qmlplugindump.exe -nonrelocatable FluentUI 1.0 > %PRESET_PATH%\plugins.qmltypes - rmdir /s /q %QT_QML_FLUENT_PATH% & md %QT_QML_FLUENT_PATH% - copy /y %BUILDER_BIN_PATH% %QT_QML_FLUENT_PATH% - xcopy %PRESET_PATH% %QT_QML_FLUENT_PATH% /s/e/i/y - cd %QT_QML_FLUENT_PATH% -) \ No newline at end of file