Compare commits

..

78 Commits
1.3.1 ... 1.3.3

Author SHA1 Message Date
a4d04499bc update 2023-06-12 18:03:25 +08:00
47b0c71f95 update 2023-06-12 17:36:36 +08:00
e651b731cf update 2023-06-12 17:04:35 +08:00
31bdea8d44 update 2023-06-12 16:46:02 +08:00
2fbc5696f7 update 2023-06-12 10:53:35 +08:00
f2ea9a19a1 update 2023-06-11 21:48:43 +08:00
aee97c2aab update 2023-06-11 21:44:54 +08:00
05b41f3383 update 2023-06-10 22:46:17 +08:00
b3ca045936 update 2023-06-10 11:11:28 +08:00
18205851f6 update 2023-06-10 11:01:36 +08:00
221361369e update 2023-06-09 18:15:09 +08:00
cf730bc769 update 2023-06-09 09:29:28 +08:00
49029164ff update 2023-06-08 23:19:38 +08:00
6da4a2e10e fix bub 2023-06-08 17:44:32 +08:00
021745c366 update version 2023-06-08 17:16:08 +08:00
2cfd5b3ab2 update 2023-06-08 17:05:52 +08:00
2c7d556042 update 2023-06-08 17:00:43 +08:00
609df92f8c update 2023-06-08 14:51:13 +08:00
ca57b16521 update 2023-06-08 14:32:04 +08:00
c25e2362c4 update 2023-06-08 14:23:00 +08:00
a37e4e3b9f update 2023-06-08 14:10:53 +08:00
e4f02f50ca update 2023-06-08 14:01:18 +08:00
6d7366f74c update 2023-06-08 13:57:16 +08:00
154670f744 update 2023-06-08 13:55:25 +08:00
11206c1d18 Merge branch '6.5.0' 2023-06-08 10:18:59 +08:00
3fa54b37c1 update 2023-06-08 10:17:49 +08:00
ca7292e168 Merge pull request #152 from Gaomengkai/main
Typo (in T_Menu.qml)
2023-06-07 10:22:05 +08:00
2becb17d52 Update T_Menu.qml
Typo
2023-06-07 09:49:39 +08:00
7c1b03b22f Merge pull request #150 from zhuzichu520/6.5.0
6.5.0
2023-06-06 22:21:56 +08:00
ebed19b130 update 2023-06-06 21:14:33 +08:00
d55874f01e update 2023-06-06 21:02:33 +08:00
b4f9f32195 update 2023-06-06 20:45:25 +08:00
cf9ffbe0ca update 2023-06-05 09:45:09 +08:00
b2328ba82c Merge branch 'main' of https://github.com/zhuzichu520/FluentUI 2023-06-03 08:27:56 +08:00
1073efe423 update 2023-06-03 08:27:32 +08:00
5af755dd95 update 2023-06-01 11:51:11 +08:00
5f2f127623 update 2023-05-31 15:39:59 +08:00
52174b7e24 Merge pull request #136 from felixonmars/patch-1
Correct typos in README.md
2023-05-28 08:25:33 +08:00
e69604f5a9 Correct typos in README.md 2023-05-27 23:34:17 +03:00
c23981b81d update 2023-05-26 14:08:22 +08:00
fc9e764c4c Merge branch 'main' of https://github.com/zhuzichu520/FluentUI 2023-05-26 13:49:36 +08:00
591e6bdeff update 2023-05-26 13:49:32 +08:00
4878c92595 Merge pull request #132 from mentalfl0w/dev
Expose more bulr options of FluPopup.
2023-05-26 13:44:21 +08:00
64f40451ec Expose more bulr options of FluPopup. 2023-05-26 13:15:44 +08:00
5c0befb6c2 Merge pull request #131 from parker-int64/test_branch
解决GCC类编译器链接的问题,修正framelesshelper中的flag
2023-05-26 11:10:27 +08:00
33b916a172 Merge branch 'test_branch' of https://github.com/parker-int64/FluentUI into test_branch 2023-05-26 10:26:00 +08:00
183e29dfaa The framelesshelper flag Global::Option::ForceHideWindowFrameBorder only available on windows 2023-05-26 10:25:28 +08:00
f1589e9d1a The debug shared library only works on windows 2023-05-26 10:24:30 +08:00
e3abd96b8e update 2023-05-26 07:36:39 +08:00
8b2b01beac Merge pull request #130 from mentalfl0w/dev
Add FluPopup for universally use.
2023-05-25 22:04:44 +08:00
3007f8f3df Add FluPopup for universally use. 2023-05-25 21:54:37 +08:00
0dbbba56da update 2023-05-25 17:00:48 +08:00
a123dfbccf update 2023-05-24 14:12:33 +08:00
4fdbb47bec Merge branch 'main' of https://github.com/zhuzichu520/FluentUI 2023-05-24 14:02:39 +08:00
24305a3137 update 2023-05-24 14:01:23 +08:00
22d5dfbbc3 Merge pull request #126 from mentalfl0w/dev
Fix acrylic effect for FluNavigationView CompactAndPanel mode.
2023-05-24 12:23:26 +08:00
3b42b30518 Fix acrylic effect for FluNavigationView CompactAndPanel mode. 2023-05-24 10:51:14 +08:00
1b41bd1bcd update 2023-05-23 18:04:21 +08:00
75e850750c update 2023-05-23 17:37:25 +08:00
22de749c74 update 2023-05-23 09:33:37 +08:00
1565e2a3eb update 2023-05-22 21:46:21 +08:00
b02695c012 Merge pull request #123 from mentalfl0w/dev
Add acrylic effect for FluContentDialog.
2023-05-22 21:01:00 +08:00
b7fdcca506 Add acrylic effect for FluContentDialog. 2023-05-22 20:39:00 +08:00
f802838847 fix utf8 without bom 2023-05-22 16:17:51 +08:00
038a2dd598 sync framlesshelper 2023-05-21 23:06:04 +08:00
27d1b3f57f update 2023-05-21 22:24:56 +08:00
1ca784c28f update 2023-05-21 21:34:30 +08:00
e7c185e723 Merge pull request #120 from mentalfl0w/dev
Fix the system titlebar buttons show behind surface.
2023-05-21 20:38:58 +08:00
87d9e45791 update 2023-05-21 20:37:03 +08:00
0ca1de2f1a Fix the system titlebar buttons show behind surface. 2023-05-21 20:33:32 +08:00
1897408528 update 2023-05-21 20:24:48 +08:00
7b922a4380 Merge pull request #119 from mentalfl0w/dev
Improve acrylic effect for example and FluNavigationView.
2023-05-21 20:07:14 +08:00
f998b58d88 Improve acrylic effect for example and FluNavigationview. 2023-05-21 19:35:01 +08:00
a44d2cfe64 sync frameplesshelper 2023-05-21 12:56:42 +08:00
91e7cc8a60 Update README.md 2023-05-20 23:35:07 +08:00
ae6ef539ff Update README.md 2023-05-20 23:09:49 +08:00
4187fb52dd Update README.md 2023-05-20 23:08:02 +08:00
db41a7a1ee update 2023-05-19 18:13:57 +08:00
169 changed files with 1781 additions and 1345 deletions

View File

@ -22,7 +22,7 @@ jobs:
strategy: strategy:
matrix: matrix:
os: [macos-12] os: [macos-12]
qt_ver: [6.4.3] qt_ver: [6.5.0]
qt_arch: [clang_64] qt_arch: [clang_64]
env: env:
targetName: example targetName: example
@ -50,7 +50,7 @@ jobs:
cmake --version cmake --version
mkdir build mkdir build
cd build cd build
cmake -DCMAKE_MESSAGE_LOG_LEVEL=STATUS -DCMAKE_PREFIX_PATH=/Users/runner/work/FluentUI/Qt/6.4.3/macos -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Release -GNinja .. cmake -DCMAKE_MESSAGE_LOG_LEVEL=STATUS -DCMAKE_PREFIX_PATH=/Users/runner/work/FluentUI/Qt/6.5.0/macos -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Release -GNinja ..
cmake --build . --target all --config Release --parallel cmake --build . --target all --config Release --parallel
- name: package - name: package

View File

@ -23,7 +23,7 @@ jobs:
strategy: strategy:
matrix: matrix:
os: [ubuntu-20.04] os: [ubuntu-20.04]
qt_ver: [6.4.3] qt_ver: [6.5.0]
qt_arch: [gcc_64] qt_arch: [gcc_64]
env: env:
targetName: example targetName: example
@ -47,7 +47,7 @@ jobs:
version: 1.10.2 version: 1.10.2
- name: ubuntu install GL library - name: ubuntu install GL library
run: sudo apt-get install -y libgl1-mesa-dev libxcb1-dev libgtk-3-dev 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 run: sudo apt-get install -y libxcb-cursor0 libgl1-mesa-dev libxcb1-dev libgtk-3-dev 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
- name: build ubuntu - name: build ubuntu
run: | run: |
@ -55,7 +55,7 @@ jobs:
cmake --version cmake --version
mkdir build mkdir build
cd build cd build
cmake -DCMAKE_MESSAGE_LOG_LEVEL=STATUS -DCMAKE_PREFIX_PATH=/home/runner/work/FluentUI/Qt/6.4.3/gcc_64 -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_BUILD_TYPE=Release -GNinja .. cmake -DCMAKE_MESSAGE_LOG_LEVEL=STATUS -DCMAKE_PREFIX_PATH=/home/runner/work/FluentUI/Qt/6.5.0/gcc_64 -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_BUILD_TYPE=Release -GNinja ..
cmake --build . --target all --config Release --parallel cmake --build . --target all --config Release --parallel
- name: install QT linux deploy - name: install QT linux deploy

View File

@ -23,7 +23,7 @@ jobs:
matrix: matrix:
include: include:
- qt_arch: win64_mingw - qt_arch: win64_mingw
qt_ver: 6.4.3 qt_ver: 6.5.0
qt_tools: "tools_mingw,9.0.0-1-202203221220,qt.tools.win64_mingw900" qt_tools: "tools_mingw,9.0.0-1-202203221220,qt.tools.win64_mingw900"
qt_tools_mingw_install: mingw900_64 qt_tools_mingw_install: mingw900_64
env: env:
@ -62,7 +62,7 @@ jobs:
run: | run: |
mkdir build mkdir build
cd build cd build
cmake -DCMAKE_MESSAGE_LOG_LEVEL=STATUS -DCMAKE_PREFIX_PATH=D:\a\FluentUI\Qt\6.4.3\mingw_64 -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_BUILD_TYPE=Release -GNinja .. cmake -DCMAKE_MESSAGE_LOG_LEVEL=STATUS -DCMAKE_PREFIX_PATH=D:\a\FluentUI\Qt\6.5.0\mingw_64 -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_BUILD_TYPE=Release -GNinja ..
cmake --build . --target all --config Release --parallel cmake --build . --target all --config Release --parallel
- name: package - name: package

View File

@ -23,7 +23,7 @@ jobs:
matrix: matrix:
os: [windows-2019] os: [windows-2019]
include: include:
- qt_ver: 6.4.3 - qt_ver: 6.5.0
qt_arch: win64_msvc2019_64 qt_arch: win64_msvc2019_64
msvc_arch: x64 msvc_arch: x64
qt_arch_install: msvc2019_64 qt_arch_install: msvc2019_64
@ -42,7 +42,7 @@ jobs:
version: ${{ matrix.qt_ver }} version: ${{ matrix.qt_ver }}
arch: ${{ matrix.qt_arch }} arch: ${{ matrix.qt_arch }}
cache: ${{steps.cache-qt.outputs.cache-hit}} cache: ${{steps.cache-qt.outputs.cache-hit}}
modules: 'qt5compat qtmultimedia qtshadertools qtimageformats' modules: 'qt5compat qtmultimedia qtshadertools qtimageformats qtspeech'
- name: msvc-build - name: msvc-build
id: build id: build
@ -51,7 +51,7 @@ jobs:
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.msvc_arch }} call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.msvc_arch }}
mkdir build mkdir build
cd build cd build
cmake -DCMAKE_MESSAGE_LOG_LEVEL=STATUS -DCMAKE_PREFIX_PATH=D:\a\FluentUI\Qt\6.4.3\msvc2019_64 -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl -DCMAKE_BUILD_TYPE=Release -GNinja .. cmake -DCMAKE_MESSAGE_LOG_LEVEL=STATUS -DCMAKE_PREFIX_PATH=D:\a\FluentUI\Qt\6.5.0\msvc2019_64 -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl -DCMAKE_BUILD_TYPE=Release -GNinja ..
cmake --build . --target all --config Release --parallel cmake --build . --target all --config Release --parallel
echo winSdkDir=%WindowsSdkDir% >> %GITHUB_ENV% echo winSdkDir=%WindowsSdkDir% >> %GITHUB_ENV%
echo winSdkVer=%WindowsSdkVersion% >> %GITHUB_ENV% echo winSdkVer=%WindowsSdkVersion% >> %GITHUB_ENV%

View File

@ -1,7 +1,10 @@
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.20)
project(FluentUI VERSION 0.1 LANGUAGES CXX) project(FluentUI VERSION 0.1 LANGUAGES CXX)
add_subdirectory(src) add_subdirectory(src)
add_subdirectory(example) add_subdirectory(example)
add_definitions(-DFRAMELESSHELPER_CORE_NO_DEBUG_OUTPUT)
add_definitions(-DFRAMELESSHELPER_QUICK_NO_DEBUG_OUTPUT)
add_subdirectory(framelesshelper) add_subdirectory(framelesshelper)

View File

@ -6,7 +6,7 @@
QML FluentUI QML FluentUI
</h1> </h1>
<p align="center"> <p align="center">
A fluent design component library for Qt QML A fluent design component library for Qt QML<a href="https://zhuzichu520.github.io">official wasm app.</a>
</p> </p>
![win-badge] ![ubuntu-badge] ![macos-badge] ![release-badge] ![download-badge] ![download-latest] ![win-badge] ![ubuntu-badge] ![macos-badge] ![release-badge] ![download-badge] ![download-latest]
@ -42,7 +42,7 @@ This is a beautiful FluentUI component library based on Qt QML. Currently the ma
+ Qt LinguistTool (optional,for translations) + Qt LinguistTool (optional,for translations)
+ Qt Svg (optional, however essential for Qt 5) + Qt Svg (optional, however essential for Qt 5)
Use [Qt Online Installers](https://download.qt.io/archive/online_installers/) to aquire the moudules (**Recommanded**) or compile them first before using the library. Use [Qt Online Installers](https://download.qt.io/archive/online_installers/) to acquire the modules (**Recommended**) or compile them first before using the library.
## ⚽ Get started ## ⚽ Get started

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.20)
project(example VERSION 0.1 LANGUAGES CXX) project(example VERSION 0.1 LANGUAGES CXX)
@ -20,7 +20,7 @@ endif()
file(TO_CMAKE_PATH "/" PATH_SEPARATOR) file(TO_CMAKE_PATH "/" PATH_SEPARATOR)
#设置版本号 #设置版本号
add_definitions(-DVERSION=1,3,1,0) add_definitions(-DVERSION=1,3,3,0)
find_package(Qt6 REQUIRED COMPONENTS Quick REQUIRED) find_package(Qt6 REQUIRED COMPONENTS Quick REQUIRED)

View File

@ -1,4 +1,4 @@
import QtQuick import QtQuick
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts

View File

@ -1,69 +0,0 @@
import QtQuick
import QtQuick.Window
import QtQuick.Controls
import QtQuick.Layouts
import Qt.labs.platform
import FluentUI
import "qrc:///example/qml/global/"
FluWindow {
id:window
title: "FluentUI"
width: 1000
height: 640
closeDestory:false
minimumWidth: 520
minimumHeight: 460
launchMode: FluWindow.SingleTask
visible: true
FluNavigationView2{
id:nav_view
anchors.fill: parent
items: ItemsOriginal
footerItems:ItemsFooter
z:11
displayMode:MainEvent.displayMode
logo: "qrc:/example/res/image/favicon.ico"
title:"FluentUI"
autoSuggestBox:FluAutoSuggestBox{
width: 280
anchors.centerIn: parent
iconSource: FluentIcons.Search
items: ItemsOriginal.getSearchData()
placeholderText: lang.search
onItemClicked:
(data)=>{
ItemsOriginal.startPageByItem(data)
}
}
actionItem:Item{
height: 40
width: 148
RowLayout{
anchors.centerIn: parent
spacing: 5
FluText{
text:lang.dark_mode
}
FluToggleSwitch{
selected: FluTheme.dark
clickFunc:function(){
if(FluTheme.dark){
FluTheme.darkMode = FluDarkMode.Light
}else{
FluTheme.darkMode = FluDarkMode.Dark
}
}
}
}
}
Component.onCompleted: {
ItemsOriginal.navigationView = nav_view
ItemsFooter.navigationView = nav_view
// nav_view.setCurrentIndex(0)
}
}
}

View File

@ -1,4 +1,4 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
@ -6,17 +6,19 @@ import FluentUI
FluExpander{ FluExpander{
id:control
property string code: "" property string code: ""
headerText: "Source" headerText: "Source"
contentHeight:content.height contentHeight:content.height
focus: false
FluMultilineTextBox{ FluMultilineTextBox{
id:content id:content
width:parent.width width:parent.width
readOnly:true activeFocusOnTab: false
activeFocusOnPress: false
readOnly: true
text:highlightQmlCode(code) text:highlightQmlCode(code)
focus:false
textFormat: FluMultilineTextBox.RichText textFormat: FluMultilineTextBox.RichText
KeyNavigation.priority: KeyNavigation.BeforeItem KeyNavigation.priority: KeyNavigation.BeforeItem
background:Rectangle{ background:Rectangle{
@ -35,6 +37,11 @@ FluExpander{
rightMargin: 5 rightMargin: 5
topMargin: 5 topMargin: 5
} }
onActiveFocusChanged: {
if(activeFocus){
control.expand = true
}
}
onClicked:{ onClicked:{
FluTools.clipText(content.text) FluTools.clipText(content.text)
showSuccess("复制成功") showSuccess("复制成功")
@ -42,91 +49,92 @@ FluExpander{
} }
function htmlEncode(e){ function htmlEncode(e){
var i,s; var i,s;
for(i in s={ for(i in s={
"&":/&/g,//""//":/"/g,"'":/'/g, "&":/&/g,//""//":/"/g,"'":/'/g,
"<":/</g,">":/>/g,"<br/>":/\n/g, "<":/</g,">":/>/g,"<br/>":/\n/g,
" ":/ /g," ":/\t/g " ":/ /g," ":/\t/g
})e=e.replace(s[i],i); })e=e.replace(s[i],i);
return e; return e;
} }
function highlightQmlCode(code) { function highlightQmlCode(code) {
// 定义 QML 关键字列表 // 定义 QML 关键字列表
var qmlKeywords = [ var qmlKeywords = [
"FluTextButton", "FluTextButton",
"FluAppBar", "FluAppBar",
"FluAutoSuggestBox", "FluAutoSuggestBox",
"FluBadge", "FluBadge",
"FluButton", "FluButton",
"FluCalendarPicker", "FluCalendarPicker",
"FluCalendarView", "FluCalendarView",
"FluCarousel", "FluCarousel",
"FluCheckBox", "FluCheckBox",
"FluColorPicker", "FluColorPicker",
"FluColorView", "FluColorView",
"FluComboBox", "FluComboBox",
"FluContentDialog", "FluContentDialog",
"FluContentPage", "FluContentPage",
"FluDatePicker", "FluDatePicker",
"FluDivider", "FluDivider",
"FluDropDownButton", "FluDropDownButton",
"FluExpander", "FluExpander",
"FluFilledButton", "FluFilledButton",
"FluFlipView", "FluFlipView",
"FluFocusRectangle", "FluFocusRectangle",
"FluIcon", "FluIcon",
"FluIconButton", "FluIconButton",
"FluInfoBar", "FluInfoBar",
"FluItem", "FluItem",
"FluMediaPlayer", "FluMediaPlayer",
"FluMenu", "FluMenu",
"FluMenuItem", "FluMenuItem",
"FluMultilineTextBox", "FluMultilineTextBox",
"FluNavigationView", "FluNavigationView",
"FluObject", "FluObject",
"FluPaneItem", "FluPaneItem",
"FluPaneItemExpander", "FluPaneItemExpander",
"FluPaneItemHeader", "FluPaneItemHeader",
"FluPaneItemSeparator", "FluPaneItemSeparator",
"FluPivot", "FluPivot",
"FluPivotItem", "FluPivotItem",
"FluProgressBar", "FluProgressBar",
"FluProgressRing", "FluProgressRing",
"FluRadioButton", "FluRadioButton",
"FluRectangle", "FluRectangle",
"FluScrollablePage", "FluScrollablePage",
"FluScrollBar", "FluScrollBar",
"FluShadow", "FluShadow",
"FluSlider", "FluSlider",
"FluTabView", "FluTabView",
"FluText", "FluText",
"FluTextArea", "FluTextArea",
"FluTextBox", "FluTextBox",
"FluTextBoxBackground", "FluTextBoxBackground",
"FluTextBoxMenu", "FluTextBoxMenu",
"FluTextButton", "FluTextButton",
"FluTextFiled", "FluTextFiled",
"FluTimePicker", "FluTimePicker",
"FluToggleSwitch", "FluToggleSwitch",
"FluTooltip", "FluTooltip",
"FluTreeView", "FluTreeView",
"FluWindow", "FluWindow",
"FluWindowResize", "FluWindowResize",
"FluToggleButton", "FluToggleButton",
"FluTableView", "FluTableView",
"FluColors", "FluColors",
"FluTheme", "FluTheme",
"FluStatusView", "FluStatusView",
"FluRatingControl", "FluRatingControl",
"FluPasswordBox", "FluPasswordBox",
"FluBreadcrumbBar", "FluBreadcrumbBar",
"FluCopyableText", "FluCopyableText",
"FluAcrylic" "FluAcrylic",
]; "FluRemoteLoader"
code = code.replace(/\n/g, "<br>"); ];
code = code.replace(/ /g, "&nbsp;"); code = code.replace(/\n/g, "<br>");
return code.replace(RegExp("\\b(" + qmlKeywords.join("|") + ")\\b", "g"), "<span style='color: #c23a80'>$1</span>"); code = code.replace(/ /g, "&nbsp;");
return code.replace(RegExp("\\b(" + qmlKeywords.join("|") + ")\\b", "g"), "<span style='color: #c23a80'>$1</span>");
} }

View File

@ -1,4 +1,4 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import FluentUI import FluentUI
import org.wangwenx190.FramelessHelper import org.wangwenx190.FramelessHelper
@ -12,10 +12,6 @@ FluWindow {
property bool appBarVisible: true property bool appBarVisible: true
default property alias content: container.data default property alias content: container.data
Component.onCompleted: {
console.debug(FramelessUtils.frameBorderVisible)
}
FluAppBar { FluAppBar {
id: title_bar id: title_bar
title: window.title title: window.title
@ -43,13 +39,24 @@ FluWindow {
id:framless_helper id:framless_helper
onReady: { onReady: {
setTitleBarItem(title_bar) setTitleBarItem(title_bar)
framless_helper.moveWindowToDesktopCenter() moveWindowToDesktopCenter()
setHitTestVisible(title_bar.minimizeButton()) setHitTestVisible(title_bar.minimizeButton())
setHitTestVisible(title_bar.maximizeButton()) setHitTestVisible(title_bar.maximizeButton())
setHitTestVisible(title_bar.closeButton()) setHitTestVisible(title_bar.closeButton())
framless_helper.setWindowFixedSize(fixSize) setWindowFixedSize(fixSize)
title_bar.maximizeButton.visible = !fixSize title_bar.maximizeButton.visible = !fixSize
window.visible = true if (blurBehindWindowEnabled)
window.backgroundVisible = false
window.show()
}
}
Connections{
target: FluTheme
function onDarkChanged(){
if (FluTheme.dark)
FramelessUtils.systemTheme = FramelessHelperConstants.Dark
else
FramelessUtils.systemTheme = FramelessHelperConstants.Light
} }
} }

View File

@ -1,4 +1,4 @@
pragma Singleton pragma Singleton
import QtQuick import QtQuick
import FluentUI import FluentUI

View File

@ -1,4 +1,4 @@
pragma Singleton pragma Singleton
import QtQuick import QtQuick
import FluentUI import FluentUI
@ -166,6 +166,12 @@ FluObject{
navigationView.push("qrc:/example/qml/page/T_Dialog.qml") navigationView.push("qrc:/example/qml/page/T_Dialog.qml")
} }
} }
FluPaneItem{
title:"ComboBox"
onTap:{
navigationView.push("qrc:/example/qml/page/T_ComboBox.qml")
}
}
FluPaneItem{ FluPaneItem{
title:"Tooltip" title:"Tooltip"
onTap:{ onTap:{
@ -285,6 +291,18 @@ FluObject{
navigationView.push("qrc:/example/qml/page/T_MediaPlayer.qml") navigationView.push("qrc:/example/qml/page/T_MediaPlayer.qml")
} }
} }
}
FluPaneItemExpander{
title:lang.other
icon:FluentIcons.Shop
FluPaneItem{
title:"RemoteLoader"
onTap:{
navigationView.push("qrc:/example/qml/page/T_RemoteLoader.qml")
}
}
} }
function getRecentlyAddedData(){ function getRecentlyAddedData(){

View File

@ -1,4 +1,4 @@
pragma Singleton pragma Singleton
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,4 +1,4 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,10 +1,10 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Controls.Basic import QtQuick.Controls.Basic
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{
@ -22,7 +22,7 @@ FluScrollablePage{
Layout.topMargin: 20 Layout.topMargin: 20
FluTextButton{ FluTextButton{
disabled:text_button_switch.selected disabled:text_button_switch.checked
text:"Text Button" text:"Text Button"
onClicked: { onClicked: {
showInfo("点击Text Button") showInfo("点击Text Button")
@ -32,18 +32,13 @@ FluScrollablePage{
left: parent.left left: parent.left
} }
} }
FluToggleSwitch{
Row{ id:text_button_switch
spacing: 5
anchors{ anchors{
verticalCenter: parent.verticalCenter
right: parent.right right: parent.right
verticalCenter: parent.verticalCenter
} }
FluToggleSwitch{ text:"Disabled"
id:text_button_switch
Layout.alignment: Qt.AlignRight
text:"Disabled"
}
} }
} }
CodeExpander{ CodeExpander{
@ -64,7 +59,7 @@ FluScrollablePage{
Layout.topMargin: 20 Layout.topMargin: 20
FluButton{ FluButton{
disabled:button_switch.selected disabled:button_switch.checked
text:"Standard Button" text:"Standard Button"
onClicked: { onClicked: {
showInfo("点击StandardButton") showInfo("点击StandardButton")
@ -74,18 +69,13 @@ FluScrollablePage{
left: parent.left left: parent.left
} }
} }
FluToggleSwitch{
Row{ id:button_switch
spacing: 5
anchors{ anchors{
verticalCenter: parent.verticalCenter
right: parent.right right: parent.right
verticalCenter: parent.verticalCenter
} }
FluToggleSwitch{ text:"Disabled"
id:button_switch
Layout.alignment: Qt.AlignRight
text:"Disabled"
}
} }
} }
CodeExpander{ CodeExpander{
@ -106,7 +96,7 @@ FluScrollablePage{
paddings: 10 paddings: 10
FluFilledButton{ FluFilledButton{
disabled:filled_button_switch.selected disabled:filled_button_switch.checked
text:"Filled Button" text:"Filled Button"
onClicked: { onClicked: {
showWarning("点击FilledButton"+height) showWarning("点击FilledButton"+height)
@ -116,18 +106,13 @@ FluScrollablePage{
left: parent.left left: parent.left
} }
} }
FluToggleSwitch{
Row{ id:filled_button_switch
spacing: 5
anchors{ anchors{
verticalCenter: parent.verticalCenter
right: parent.right right: parent.right
verticalCenter: parent.verticalCenter
} }
FluToggleSwitch{ text:"Disabled"
id:filled_button_switch
Layout.alignment: Qt.AlignRight
text:"Disabled"
}
} }
} }
CodeExpander{ CodeExpander{
@ -148,28 +133,20 @@ FluScrollablePage{
paddings: 10 paddings: 10
FluToggleButton{ FluToggleButton{
disabled:toggle_button_switch.selected disabled:toggle_button_switch.checked
text:"Toggle Button" text:"Toggle Button"
onClicked: {
selected = !selected
}
anchors{ anchors{
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
left: parent.left left: parent.left
} }
} }
FluToggleSwitch{
Row{ id:toggle_button_switch
spacing: 5
anchors{ anchors{
verticalCenter: parent.verticalCenter
right: parent.right right: parent.right
verticalCenter: parent.verticalCenter
} }
FluToggleSwitch{ text:"Disabled"
id:toggle_button_switch
Layout.alignment: Qt.AlignRight
text:"Disabled"
}
} }
} }
CodeExpander{ CodeExpander{
@ -178,7 +155,7 @@ FluScrollablePage{
code:'FluToggleButton{ code:'FluToggleButton{
text:"Toggle Button" text:"Toggle Button"
onClicked: { onClicked: {
selected = !selected checked = !checked
} }
}' }'
} }
@ -191,7 +168,7 @@ FluScrollablePage{
Layout.topMargin: 20 Layout.topMargin: 20
FluIconButton{ FluIconButton{
iconSource:FluentIcons.ChromeCloseContrast iconSource:FluentIcons.ChromeCloseContrast
disabled:icon_button_switch.selected disabled:icon_button_switch.checked
iconSize: 15 iconSize: 15
anchors{ anchors{
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
@ -201,18 +178,13 @@ FluScrollablePage{
showSuccess("点击IconButton") showSuccess("点击IconButton")
} }
} }
FluToggleSwitch{
Row{ id:icon_button_switch
spacing: 5
anchors{ anchors{
verticalCenter: parent.verticalCenter
right: parent.right right: parent.right
verticalCenter: parent.verticalCenter
} }
FluToggleSwitch{ text:"Disabled"
id:icon_button_switch
Layout.alignment: Qt.AlignRight
text:"Disabled"
}
} }
} }
CodeExpander{ CodeExpander{
@ -232,7 +204,7 @@ FluScrollablePage{
paddings: 10 paddings: 10
Layout.topMargin: 20 Layout.topMargin: 20
FluDropDownButton{ FluDropDownButton{
disabled:drop_down_button_switch.selected disabled:drop_down_button_switch.checked
text:"DropDownButton" text:"DropDownButton"
anchors{ anchors{
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
@ -253,17 +225,13 @@ FluScrollablePage{
} }
] ]
} }
Row{ FluToggleSwitch{
spacing: 5 id:drop_down_button_switch
anchors{ anchors{
verticalCenter: parent.verticalCenter
right: parent.right right: parent.right
verticalCenter: parent.verticalCenter
} }
FluToggleSwitch{ text:"Disabled"
id:drop_down_button_switch
Layout.alignment: Qt.AlignRight
text:"Disabled"
}
} }
} }
CodeExpander{ CodeExpander{
@ -304,35 +272,29 @@ FluScrollablePage{
property int selecIndex : 0 property int selecIndex : 0
model: 3 model: 3
delegate: FluRadioButton{ delegate: FluRadioButton{
selected : repeater.selecIndex===index checked : repeater.selecIndex===index
disabled:radio_button_switch.selected disabled:radio_button_switch.checked
text:"Radio Button_"+index text:"Radio Button_"+index
onClicked:{ clickListener:function(){
repeater.selecIndex = index repeater.selecIndex = index
} }
} }
} }
} }
FluToggleSwitch{
id:radio_button_switch
Row{
spacing: 5
anchors{ anchors{
verticalCenter: parent.verticalCenter
right: parent.right right: parent.right
verticalCenter: parent.verticalCenter
} }
FluToggleSwitch{ text:"Disabled"
id:radio_button_switch
Layout.alignment: Qt.AlignRight
text:"Disabled"
}
} }
} }
CodeExpander{ CodeExpander{
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: -1 Layout.topMargin: -1
code:'FluRadioButton{ code:'FluRadioButton{
selected:true checked:true
text:"Text Button" text:"Text Button"
onClicked: { onClicked: {
@ -340,38 +302,4 @@ FluScrollablePage{
}' }'
} }
FluArea{
Layout.fillWidth: true
height: 68
paddings: 10
Layout.topMargin: 20
FluCheckBox{
disabled:check_box_switch.selected
text:"Check Box"
anchors{
verticalCenter: parent.verticalCenter
left: parent.left
}
}
Row{
spacing: 5
anchors{
verticalCenter: parent.verticalCenter
right: parent.right
}
FluToggleSwitch{
id:check_box_switch
Layout.alignment: Qt.AlignRight
text:"Disabled"
}
}
}
CodeExpander{
Layout.fillWidth: true
Layout.topMargin: -1
code:'FluCheckBox{
text:"Check Box"
}'
}
} }

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{
@ -18,11 +18,21 @@ FluScrollablePage{
spacing: 30 spacing: 30
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
FluCheckBox{ FluCheckBox{
disabled: check_box_switch.checked
} }
FluCheckBox{ FluCheckBox{
disabled: check_box_switch.checked
text:"Text" text:"Text"
} }
} }
FluToggleSwitch{
id:check_box_switch
anchors{
right: parent.right
verticalCenter: parent.verticalCenter
}
text:"Disabled"
}
} }
CodeExpander{ CodeExpander{
Layout.fillWidth: true Layout.fillWidth: true

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -0,0 +1,84 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Window
import QtQuick.Controls
import FluentUI
import "qrc:///example/qml/component"
FluScrollablePage{
title:"ComboBox"
FluArea{
Layout.fillWidth: true
height: 80
paddings: 5
Layout.topMargin: 20
Column{
spacing: 5
anchors.verticalCenter: parent.verticalCenter
FluText{
text: "editable=false"
x:10
}
FluComboBox {
model: ListModel {
id: model_1
ListElement { text: "Banana" }
ListElement { text: "Apple" }
ListElement { text: "Coconut" }
}
onAccepted: {
if (find(editText) === -1)
model_1.append({text: editText})
}
}
}
}
FluArea{
Layout.fillWidth: true
height: 80
paddings: 10
Layout.topMargin: 20
Column{
spacing: 5
anchors.verticalCenter: parent.verticalCenter
FluText{
text: "editable=true"
x:5
}
FluComboBox {
editable: true
model: ListModel {
id: model_2
ListElement { text: "Banana" }
ListElement { text: "Apple" }
ListElement { text: "Coconut" }
}
onAccepted: {
if (find(editText) === -1)
model_2.append({text: editText})
}
}
}
}
CodeExpander{
Layout.fillWidth: true
Layout.topMargin: -1
code:'FluComboBox{
editable: true
model: ListModel {
id: model
ListElement { text: "Banana" }
ListElement { text: "Apple" }
ListElement { text: "Coconut" }
}
onAccepted: {
if (find(editText) === -1)
model.append({text: editText})
}
}'
}
}

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{
@ -40,9 +40,9 @@ FluScrollablePage{
property int selecIndex : 0 property int selecIndex : 0
model: 3 model: 3
delegate: FluRadioButton{ delegate: FluRadioButton{
selected : repeater.selecIndex===index checked : repeater.selecIndex===index
text:"Radio Button_"+index text:"Radio Button_"+index
onClicked:{ clickListener:function() {
repeater.selecIndex = index repeater.selecIndex = index
} }
} }

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,12 +1,14 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import "qrc:///example/qml/global/" import "qrc:///example/qml/global"
import FluentUI import FluentUI
FluScrollablePage{ FluScrollablePage{
pageMode: FluNavigationView.SingleTask
ListModel{ ListModel{
id:model_header id:model_header
ListElement{ ListElement{
@ -75,10 +77,10 @@ FluScrollablePage{
FluAcrylic { FluAcrylic {
sourceItem:bg sourceItem:bg
anchors.fill: parent anchors.fill: parent
color: FluTheme.dark ? 'black' : 'white' color: FluTheme.dark ? Window.active ? Qt.rgba(38/255,44/255,54/255,1) : Qt.rgba(39/255,39/255,39/255,1) : Qt.rgba(251/255,251/255,253/255,1)
rectX: list.x-list.contentX+10+(control.width)*index rectX: list.x-list.contentX+10+(control.width)*index
rectY: list.y+10 rectY: list.y+10
acrylicOpacity:0.5 acrylicOpacity:0.8
} }
Rectangle{ Rectangle{
anchors.fill: parent anchors.fill: parent

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{
@ -61,7 +61,7 @@ FluScrollablePage{
FluMenuItem:{ FluMenuItem:{
text:"修改" text:"修改"
onClicked: { onClicked: {
showInfo"修改") showInfo("修改")
} }
} }
} }

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,40 +1,35 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage {
title:"RatingControl" title: "RatingControl"
FluArea{ FluArea {
Layout.fillWidth: true Layout.fillWidth: true
height: 100 height: 100
paddings: 10 paddings: 10
Layout.topMargin: 20 Layout.topMargin: 20
Column{ Column {
spacing: 10 spacing: 10
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
FluRatingControl{ FluRatingControl {}
FluRatingControl {
} number: 10
FluRatingControl{
number:10
} }
} }
} }
CodeExpander{ CodeExpander {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: -1 Layout.topMargin: -1
code:'FluRatingControl{ code: 'FluRatingControl{
}' }'
} }
} }

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Window import QtQuick.Window
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -0,0 +1,12 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Window
import QtQuick.Controls
import FluentUI
import "qrc:///example/qml/component"
FluRemoteLoader{
property int pageMode: FluNavigationView.Standard
property string url: ''
source: "https://zhu-zichu.gitee.io/T_RemoteLoader.qml"
}

View File

@ -1,10 +1,10 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI
import "qrc:///example/qml/global/" import "qrc:///example/qml/global"
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{
@ -30,17 +30,14 @@ FluScrollablePage{
Repeater{ Repeater{
model: [{title:"System",mode:FluDarkMode.System},{title:"Light",mode:FluDarkMode.Light},{title:"Dark",mode:FluDarkMode.Dark}] model: [{title:"System",mode:FluDarkMode.System},{title:"Light",mode:FluDarkMode.Light},{title:"Dark",mode:FluDarkMode.Dark}]
delegate: FluRadioButton{ delegate: FluRadioButton{
selected : FluTheme.darkMode === modelData.mode checked : FluTheme.darkMode === modelData.mode
text:modelData.title text:modelData.title
onClicked:{ clickListener:function(){
FluTheme.darkMode = modelData.mode FluTheme.darkMode = modelData.mode
} }
} }
} }
} }
} }
FluArea{ FluArea{
@ -63,10 +60,10 @@ FluScrollablePage{
} }
Repeater{ Repeater{
model: [{title:"Open",mode:FluNavigationView.Open},{title:"Compact",mode:FluNavigationView.Compact},{title:"Minimal",mode:FluNavigationView.Minimal},{title:"Auto",mode:FluNavigationView.Auto}] model: [{title:"Open",mode:FluNavigationView.Open},{title:"Compact",mode:FluNavigationView.Compact},{title:"Minimal",mode:FluNavigationView.Minimal},{title:"Auto",mode:FluNavigationView.Auto}]
delegate: FluRadioButton{ delegate: FluRadioButton{
selected : MainEvent.displayMode===modelData.mode checked : MainEvent.displayMode===modelData.mode
text:modelData.title text:modelData.title
onClicked:{ clickListener:function(){
MainEvent.displayMode = modelData.mode MainEvent.displayMode = modelData.mode
} }
} }
@ -97,11 +94,10 @@ FluScrollablePage{
spacing: 5 spacing: 5
Repeater{ Repeater{
model: ["Zh","En"] model: ["Zh","En"]
delegate: FluRadioButton{ delegate: FluRadioButton{
selected : appInfo.lang.objectName === modelData checked: appInfo.lang.objectName === modelData
text:modelData text:modelData
onClicked:{ clickListener:function(){
console.debug(modelData)
appInfo.changeLang(modelData) appInfo.changeLang(modelData)
} }
} }

View File

@ -1,8 +1,8 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import "../component" import "qrc:///example/qml/component"
import FluentUI import FluentUI
FluScrollablePage{ FluScrollablePage{

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Window import QtQuick.Window
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{
@ -19,7 +19,7 @@ FluScrollablePage{
Layout.topMargin: 20 Layout.topMargin: 20
placeholderText: "单行输入框" placeholderText: "单行输入框"
Layout.preferredWidth: 300 Layout.preferredWidth: 300
disabled:text_box_switch.selected disabled:text_box_switch.checked
anchors{ anchors{
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
left: parent.left left: parent.left
@ -57,7 +57,7 @@ FluScrollablePage{
Layout.topMargin: 20 Layout.topMargin: 20
placeholderText: "请输入密码" placeholderText: "请输入密码"
Layout.preferredWidth: 300 Layout.preferredWidth: 300
disabled:password_box_switch.selected disabled:password_box_switch.checked
anchors{ anchors{
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
left: parent.left left: parent.left
@ -97,7 +97,7 @@ FluScrollablePage{
Layout.topMargin: 20 Layout.topMargin: 20
placeholderText: "多行输入框" placeholderText: "多行输入框"
Layout.preferredWidth: 300 Layout.preferredWidth: 300
disabled:text_box_multi_switch.selected disabled:text_box_multi_switch.checked
anchors{ anchors{
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
left: parent.left left: parent.left
@ -137,7 +137,7 @@ FluScrollablePage{
placeholderText: "AutoSuggestBox" placeholderText: "AutoSuggestBox"
Layout.preferredWidth: 300 Layout.preferredWidth: 300
items:generateRandomNames(100) items:generateRandomNames(100)
disabled:text_box_suggest_switch.selected disabled:text_box_suggest_switch.checked
anchors{ anchors{
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
left: parent.left left: parent.left

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{
@ -52,8 +52,8 @@ FluScrollablePage{
} }
FluToggleSwitch{ FluToggleSwitch{
Layout.topMargin: 5 Layout.topMargin: 5
selected: FluTheme.dark checked: FluTheme.dark
clickFunc:function(){ onClicked: {
if(FluTheme.dark){ if(FluTheme.dark){
FluTheme.darkMode = FluDarkMode.Light FluTheme.darkMode = FluDarkMode.Light
}else{ }else{
@ -67,8 +67,8 @@ FluScrollablePage{
} }
FluToggleSwitch{ FluToggleSwitch{
Layout.topMargin: 5 Layout.topMargin: 5
selected: FluTheme.nativeText checked: FluTheme.nativeText
clickFunc:function(){ onClicked: {
FluTheme.nativeText = !FluTheme.nativeText FluTheme.nativeText = !FluTheme.nativeText
} }
} }

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{
@ -18,11 +18,20 @@ FluScrollablePage{
spacing: 30 spacing: 30
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
FluToggleSwitch{ FluToggleSwitch{
disabled: toggle_switch.checked
} }
FluToggleSwitch{ FluToggleSwitch{
text:"Text" disabled: toggle_switch.checked
} }
} }
FluToggleSwitch{
id:toggle_switch
anchors{
right: parent.right
verticalCenter: parent.verticalCenter
}
text:"Disabled"
}
} }
CodeExpander{ CodeExpander{
Layout.fillWidth: true Layout.fillWidth: true

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage{ FluScrollablePage{

View File

@ -1,9 +1,9 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
FluScrollablePage { FluScrollablePage {

View File

@ -1,4 +1,4 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI

View File

@ -1,8 +1,8 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
CustomWindow { CustomWindow {

View File

@ -1,8 +1,8 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
CustomWindow { CustomWindow {

View File

@ -1,11 +1,11 @@
import QtQuick import QtQuick
import QtQuick.Window import QtQuick.Window
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import Qt.labs.platform import Qt.labs.platform
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
import "qrc:///example/qml/global/" import "qrc:///example/qml/global"
CustomWindow { CustomWindow {
@ -64,59 +64,236 @@ CustomWindow {
negativeText:"最小化" negativeText:"最小化"
buttonFlags: FluContentDialog.NeutralButton | FluContentDialog.NegativeButton | FluContentDialog.PositiveButton buttonFlags: FluContentDialog.NeutralButton | FluContentDialog.NegativeButton | FluContentDialog.PositiveButton
onNegativeClicked:{ onNegativeClicked:{
system_tray.showMessage("友情提示","FluentUI已隐藏至托盘,点击托盘可再次激活窗口");
window.hide() window.hide()
system_tray.showMessage("友情提示","FluentUI已隐藏至托盘,点击托盘可再次激活窗口");
} }
positiveText:"退出" positiveText:"退出"
neutralText:"取消" neutralText:"取消"
blurSource: nav_view
onPositiveClicked:{ onPositiveClicked:{
window.deleteWindow() window.deleteWindow()
FluApp.closeApp() FluApp.closeApp()
} }
} }
FluAppBar { Flipable{
id: title_bar id:flipable
anchors { anchors.fill: parent
top: parent.top property bool flipped: false
left: parent.left property real flipAngle: 0
right: parent.right transform: Rotation {
id: rotation
origin.x: flipable.width/2
origin.y: flipable.height/2
axis { x: 0; y: 1; z: 0 }
angle: flipable.flipAngle
}
states: State {
PropertyChanges { target: flipable; flipAngle: 180 }
when: flipable.flipped
}
transitions: Transition {
NumberAnimation { target: flipable; property: "flipAngle"; duration: 1000 ; easing.type: Easing.OutQuad}
}
back: Item{
anchors.fill: flipable
visible: flipable.flipAngle !== 0
FluAppBar {
anchors {
top: parent.top
left: parent.left
right: parent.right
}
darkText: lang.dark_mode
showDark: true
z:7
darkClickListener:(button)=>handleDarkChanged(button)
}
Row{
z:8
FluIconButton{
iconSource: FluentIcons.ChromeBack
width: 30
height: 30
iconSize: 13
onClicked: {
flipable.flipped = false
}
}
FluIconButton{
iconSource: FluentIcons.Sync
width: 30
height: 30
iconSize: 13
onClicked: {
loader.reload()
}
}
}
FluRemoteLoader{
id:loader
anchors.fill: parent
// source: "http://localhost:9000/RemoteComponent.qml"
source: "https://zhu-zichu.gitee.io/RemoteComponent.qml"
}
}
front: Item{
id:page_front
visible: flipable.flipAngle !== 180
anchors.fill: flipable
FluAppBar {
anchors {
top: parent.top
left: parent.left
right: parent.right
}
darkText: lang.dark_mode
showDark: true
darkClickListener:(button)=>handleDarkChanged(button)
z:7
}
FluNavigationView{
property int clickCount: 0
id:nav_view
width: parent.width
height: parent.height
z:999
items: ItemsOriginal
footerItems:ItemsFooter
topPadding:FluTools.isMacos() ? 20 : 5
displayMode:MainEvent.displayMode
logo: "qrc:/example/res/image/favicon.ico"
title:"FluentUI"
Behavior on rotation {
NumberAnimation{
duration: 167
}
}
transformOrigin: Item.Center
onLoginClicked:{
clickCount += 1
if(clickCount === 1){
loader.reload()
flipable.flipped = true
clickCount = 0
}
}
autoSuggestBox:FluAutoSuggestBox{
width: 280
anchors.centerIn: parent
iconSource: FluentIcons.Search
items: ItemsOriginal.getSearchData()
placeholderText: lang.search
onItemClicked:
(data)=>{
ItemsOriginal.startPageByItem(data)
}
}
Component.onCompleted: {
ItemsOriginal.navigationView = nav_view
ItemsFooter.navigationView = nav_view
setCurrentIndex(0)
}
}
} }
darkText: lang.dark_mode
showDark: true
z:7
} }
FluNavigationView{ Image{
id:nav_view id:img_cache
anchors{ visible: false
top: parent.top anchors.fill: parent
left: parent.left }
right: parent.right
bottom: parent.bottom Canvas{
id:canvas
anchors.fill: parent
property int centerX: canvas.width / 2
property int centerY: canvas.height / 2
property real radius: 0
property int maxRadius: 0
property url imageUrl
Behavior on radius{
id:anim_radius
NumberAnimation {
target: canvas
property: "radius"
duration: 666
easing.type: Easing.OutCubic
}
} }
z:999 onRadiusChanged: {
items: ItemsOriginal canvas.requestPaint()
footerItems:ItemsFooter }
topPadding:FluTools.isMacos() ? 20 : 5 onPaint: {
displayMode:MainEvent.displayMode var ctx = canvas.getContext("2d");
logo: "qrc:/example/res/image/favicon.ico" ctx.setTransform(1, 0, 0, 1, 0, 0);
title:"FluentUI" ctx.clearRect(0, 0, canvasSize.width, canvasSize.height);
autoSuggestBox:FluAutoSuggestBox{ ctx.save()
width: 280 if(img_cache.source.toString().length!==0){
anchors.centerIn: parent try{
iconSource: FluentIcons.Search ctx.drawImage(img_cache, 0, 0, canvasSize.width, canvasSize.height, 0, 0, canvasSize.width, canvasSize.height)
items: ItemsOriginal.getSearchData() }catch(e){
placeholderText: lang.search img_cache.source = ""
onItemClicked:
(data)=>{
ItemsOriginal.startPageByItem(data)
} }
}
clearArc(ctx, centerX, centerY, radius)
ctx.restore()
} }
Component.onCompleted: { function clearArc(ctx,x, y, radius, startAngle, endAngle) {
ItemsOriginal.navigationView = nav_view ctx.beginPath()
ItemsFooter.navigationView = nav_view ctx.globalCompositeOperation = 'destination-out'
nav_view.setCurrentIndex(0) ctx.fillStyle = 'black'
ctx.arc(x, y, radius, 0, 2*Math.PI);
ctx.fill();
ctx.closePath();
} }
} }
function distance(x1,y1,x2,y2){
return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2))
}
function handleDarkChanged(button){
var changeDark = function(){
if(FluTheme.dark){
FluTheme.darkMode = FluDarkMode.Light
}else{
FluTheme.darkMode = FluDarkMode.Dark
}
}
if(FluTools.isWin()){
var target = window.contentItem
var pos = button.mapToItem(target,0,0)
var mouseX = pos.x
var mouseY = pos.y
canvas.maxRadius = Math.max(distance(mouseX,mouseY,0,0),distance(mouseX,mouseY,target.width,0),distance(mouseX,mouseY,0,target.height),distance(mouseX,mouseY,target.width,target.height))
target.grabToImage(function(result) {
img_cache.source = result.url
canvas.requestPaint()
changeDark()
canvas.centerX = mouseX
canvas.centerY = mouseY
anim_radius.enabled = false
canvas.radius = 0
anim_radius.enabled = true
canvas.radius = canvas.maxRadius
},canvas.canvasSize)
}else{
changeDark()
}
}
Shortcut {
sequence: "F5"
context: Qt.WindowShortcut
onActivated: {
if(flipable.flipped){
loader.reload()
}
}
}
} }

View File

@ -1,8 +1,8 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
CustomWindow { CustomWindow {

View File

@ -1,8 +1,8 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
CustomWindow { CustomWindow {

View File

@ -1,8 +1,8 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
CustomWindow { CustomWindow {

View File

@ -1,8 +1,8 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import FluentUI import FluentUI
import "../component" import "qrc:///example/qml/component"
CustomWindow { CustomWindow {

View File

@ -1,7 +1,9 @@
#include "AppInfo.h" #include "AppInfo.h"
#include <QQmlContext>
#include <QDebug>
#include "lang/En.h" #include "lang/En.h"
#include "lang/Zh.h" #include "lang/Zh.h"
#include <QDebug>
#define STR(x) #x #define STR(x) #x
#define VER_JOIN(a,b,c,d) STR(a.b.c.d) #define VER_JOIN(a,b,c,d) STR(a.b.c.d)
@ -15,6 +17,16 @@ AppInfo::AppInfo(QObject *parent)
lang(new En()); lang(new En());
} }
void AppInfo::init(QQmlApplicationEngine *engine){
QQmlContext * context = engine->rootContext();
Lang* lang = this->lang();
context->setContextProperty("lang",lang);
QObject::connect(this,&AppInfo::langChanged,this,[=]{
context->setContextProperty("lang",this->lang());
});
context->setContextProperty("appInfo",this);
}
void AppInfo::changeLang(const QString& locale){ void AppInfo::changeLang(const QString& locale){
if(_lang){ if(_lang){
_lang->deleteLater(); _lang->deleteLater();
@ -26,5 +38,19 @@ void AppInfo::changeLang(const QString& locale){
}else { }else {
lang(new En()); lang(new En());
} }
}
bool AppInfo::isOwnerProcess(IPC *ipc){
QString activeWindowEvent = "activeWindow";
if(!ipc->isCurrentOwner()){
ipc->postEvent(activeWindowEvent,QString().toUtf8(),0);
return false;
}
if(ipc->isAttached()){
ipc->registerEventHandler(activeWindowEvent,[=](const QByteArray&){
Q_EMIT this->activeWindow();
return true;
});
}
return true;
} }

View File

@ -1,7 +1,9 @@
#ifndef APPINFO_H #ifndef APPINFO_H
#define APPINFO_H #define APPINFO_H
#include <QObject> #include <QObject>
#include <QQmlApplicationEngine>
#include "tool/IPC.h"
#include "lang/Lang.h" #include "lang/Lang.h"
#include "stdafx.h" #include "stdafx.h"
@ -12,6 +14,8 @@ class AppInfo : public QObject
Q_PROPERTY_AUTO(Lang*,lang) Q_PROPERTY_AUTO(Lang*,lang)
public: public:
explicit AppInfo(QObject *parent = nullptr); explicit AppInfo(QObject *parent = nullptr);
void init(QQmlApplicationEngine *engine);
bool isOwnerProcess(IPC *ipc);
Q_INVOKABLE void changeLang(const QString& locale); Q_INVOKABLE void changeLang(const QString& locale);
Q_SIGNAL void activeWindow(); Q_SIGNAL void activeWindow();
}; };

View File

@ -1,4 +1,4 @@
#include "En.h" #include "En.h"
En::En(QObject *parent) En::En(QObject *parent)
: Lang{parent} : Lang{parent}
@ -19,4 +19,5 @@ En::En(QObject *parent)
settings("Settings"); settings("Settings");
locale("Locale"); locale("Locale");
navigation_view_display_mode("NavigationView Display Mode"); navigation_view_display_mode("NavigationView Display Mode");
other("Other");
} }

View File

@ -1,4 +1,4 @@
#ifndef EN_H #ifndef EN_H
#define EN_H #define EN_H
#include <QObject> #include <QObject>

View File

@ -1,4 +1,4 @@
#ifndef LANG_H #ifndef LANG_H
#define LANG_H #define LANG_H
#include <QObject> #include <QObject>
@ -22,6 +22,7 @@ class Lang : public QObject
Q_PROPERTY_AUTO(QString,settings); Q_PROPERTY_AUTO(QString,settings);
Q_PROPERTY_AUTO(QString,navigation_view_display_mode); Q_PROPERTY_AUTO(QString,navigation_view_display_mode);
Q_PROPERTY_AUTO(QString,locale); Q_PROPERTY_AUTO(QString,locale);
Q_PROPERTY_AUTO(QString,other);
public: public:
explicit Lang(QObject *parent = nullptr); explicit Lang(QObject *parent = nullptr);

View File

@ -1,4 +1,4 @@
#include "Zh.h" #include "Zh.h"
Zh::Zh(QObject *parent) Zh::Zh(QObject *parent)
: Lang{parent} : Lang{parent}
@ -19,4 +19,5 @@ Zh::Zh(QObject *parent)
settings("设置"); settings("设置");
locale("语言环境"); locale("语言环境");
navigation_view_display_mode("导航视图显示模式"); navigation_view_display_mode("导航视图显示模式");
other("其他");
} }

View File

@ -1,4 +1,4 @@
#ifndef ZH_H #ifndef ZH_H
#define ZH_H #define ZH_H
#include <QObject> #include <QObject>

View File

@ -1,4 +1,4 @@
#include <QGuiApplication> #include <QGuiApplication>
#include <QQmlApplicationEngine> #include <QQmlApplicationEngine>
#include <QQmlContext> #include <QQmlContext>
#include <QDir> #include <QDir>
@ -6,13 +6,11 @@
#include <QProcess> #include <QProcess>
#include <FramelessHelper/Quick/framelessquickmodule.h> #include <FramelessHelper/Quick/framelessquickmodule.h>
#include <FramelessHelper/Core/private/framelessconfig_p.h> #include <FramelessHelper/Core/private/framelessconfig_p.h>
#include "lang/Lang.h"
#include "AppInfo.h" #include "AppInfo.h"
#include "tool/IPC.h"
FRAMELESSHELPER_USE_NAMESPACE FRAMELESSHELPER_USE_NAMESPACE
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
//将样式设置为Basic不然会导致组件显示异常 //将样式设置为Basic不然会导致组件显示异常
qputenv("QT_QUICK_CONTROLS_STYLE","Basic"); qputenv("QT_QUICK_CONTROLS_STYLE","Basic");
@ -21,33 +19,26 @@ FRAMELESSHELPER_USE_NAMESPACE
QGuiApplication::setOrganizationDomain("https://zhuzichu520.github.io"); QGuiApplication::setOrganizationDomain("https://zhuzichu520.github.io");
QGuiApplication::setApplicationName("FluentUI"); QGuiApplication::setApplicationName("FluentUI");
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
#ifdef Q_OS_WIN // 此设置仅在Windows下生效
FramelessConfig::instance()->set(Global::Option::ForceHideWindowFrameBorder); FramelessConfig::instance()->set(Global::Option::ForceHideWindowFrameBorder);
#endif
FramelessConfig::instance()->set(Global::Option::DisableLazyInitializationForMicaMaterial);
FramelessConfig::instance()->set(Global::Option::CenterWindowBeforeShow);
FramelessConfig::instance()->set(Global::Option::ForceNonNativeBackgroundBlur);
FramelessConfig::instance()->set(Global::Option::EnableBlurBehindWindow);
#ifdef Q_OS_MACOS
FramelessConfig::instance()->set(Global::Option::ForceNonNativeBackgroundBlur,false);
#endif
AppInfo* appInfo = new AppInfo(); AppInfo* appInfo = new AppInfo();
IPC ipc(0); IPC ipc(0);
QString activeWindowEvent = "activeWindow"; if(!appInfo->isOwnerProcess(&ipc)){
if(!ipc.isCurrentOwner()){
ipc.postEvent(activeWindowEvent,QString().toUtf8(),0);
delete appInfo;
return 0; return 0;
} }
if(ipc.isAttached()){
ipc.registerEventHandler(activeWindowEvent,[&appInfo](const QByteArray&){
Q_EMIT appInfo->activeWindow();
return true;
});
}
app.setQuitOnLastWindowClosed(false); app.setQuitOnLastWindowClosed(false);
QQmlApplicationEngine engine; QQmlApplicationEngine engine;
FramelessHelper::Quick::registerTypes(&engine); FramelessHelper::Quick::registerTypes(&engine);
QQmlContext * context = engine.rootContext(); appInfo->init(&engine);
Lang* lang = appInfo->lang();
context->setContextProperty("lang",lang);
QObject::connect(appInfo,&AppInfo::langChanged,&app,[context,appInfo]{
context->setContextProperty("lang",appInfo->lang());
});
context->setContextProperty("appInfo",appInfo);
const QUrl url(QStringLiteral("qrc:/example/qml/App.qml")); const QUrl url(QStringLiteral("qrc:/example/qml/App.qml"));
// const QUrl url(QStringLiteral("qrc:/example/qml/TestWindow.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) { &app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl) if (!obj && url == objUrl)

View File

@ -1,4 +1,4 @@
#if defined(_MSC_VER) && (_MSC_VER >= 1600) #if defined(_MSC_VER) && (_MSC_VER >= 1600)
#pragma execution_character_set("utf-8") #pragma execution_character_set("utf-8")
#endif #endif

View File

@ -1,4 +1,4 @@
#include "IPC.h" #include "IPC.h"
#include <QCoreApplication> #include <QCoreApplication>
#include <QDebug> #include <QDebug>

View File

@ -1,4 +1,4 @@
#ifndef IPC_H #ifndef IPC_H
#define IPC_H #define IPC_H
#include <QMap> #include <QMap>

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.20)
project(fluentuiplugin LANGUAGES CXX) project(fluentuiplugin LANGUAGES CXX)
@ -13,7 +13,7 @@ endif()
set(QML_PLUGIN_DIRECTORY ${CMAKE_PREFIX_PATH}/qml/FluentUI) set(QML_PLUGIN_DIRECTORY ${CMAKE_PREFIX_PATH}/qml/FluentUI)
#设置版本号 #设置版本号
add_definitions(-DVERSION=1,3,1,0) add_definitions(-DVERSION=1,3,3,0)
find_package(Qt6 REQUIRED COMPONENTS Core Quick Qml ShaderTools) find_package(Qt6 REQUIRED COMPONENTS Core Quick Qml ShaderTools)
@ -52,6 +52,8 @@ qt_add_qml_module(fluentuiplugin
OUTPUT_DIRECTORY ${QML_PLUGIN_DIRECTORY} OUTPUT_DIRECTORY ${QML_PLUGIN_DIRECTORY}
VERSION 1.0 VERSION 1.0
URI "FluentUI" URI "FluentUI"
#修改qmltypes文件名称。默认fluentuiplugin.qmltypes使用默认名称有时候import FluentUI会爆红所以修改成plugins.qmltypes
TYPEINFO "plugins.qmltypes"
SOURCES ${sources_files} fluentui.rc SOURCES ${sources_files} fluentui.rc
QML_FILES ${qml_files} QML_FILES ${qml_files}
RESOURCES ${resource_files} RESOURCES ${resource_files}
@ -72,4 +74,9 @@ if(WIN32)
endif() endif()
#如果是debug则生成的库文件名后面拼接d #如果是debug则生成的库文件名后面拼接d
set_target_properties(fluentuiplugin PROPERTIES DEBUG_POSTFIX "d") # 在MinGW和GCC/Clang中, 默认不会链接带`d`后缀的动态库
if(MSVC)
set_target_properties(fluentuiplugin PROPERTIES DEBUG_POSTFIX "d")
endif(MSVC)

View File

@ -1,3 +1 @@
#include "Def.h" #include "Def.h"

View File

@ -1,4 +1,4 @@
#ifndef DEF_H #ifndef DEF_H
#define DEF_H #define DEF_H
#include <QObject> #include <QObject>

View File

@ -1,4 +1,4 @@
#include "FluApp.h" #include "FluApp.h"
#include <QQmlEngine> #include <QQmlEngine>
#include <QGuiApplication> #include <QGuiApplication>
@ -23,11 +23,9 @@ FluApp *FluApp::getInstance()
FluApp::FluApp(QObject *parent) FluApp::FluApp(QObject *parent)
: QObject{parent} : QObject{parent}
{ {
QFontDatabase::addApplicationFont(":/FluentUI/Font/Segoe_Fluent_Icons.ttf");
} }
FluApp::~FluApp(){ FluApp::~FluApp(){
} }
void FluApp::init(QQuickWindow *window){ void FluApp::init(QQuickWindow *window){

View File

@ -1,4 +1,4 @@
#ifndef FLUAPP_H #ifndef FLUAPP_H
#define FLUAPP_H #define FLUAPP_H
#include <QObject> #include <QObject>

View File

@ -1,4 +1,4 @@
#ifndef FLUCOLORSET_H #ifndef FLUCOLORSET_H
#define FLUCOLORSET_H #define FLUCOLORSET_H
#include <QObject> #include <QObject>

View File

@ -1,4 +1,4 @@
#include "FluColors.h" #include "FluColors.h"
FluColors* FluColors::m_instance = nullptr; FluColors* FluColors::m_instance = nullptr;

View File

@ -1,4 +1,4 @@
#ifndef FLUCOLORS_H #ifndef FLUCOLORS_H
#define FLUCOLORS_H #define FLUCOLORS_H
#include <QObject> #include <QObject>

View File

@ -1,4 +1,4 @@
#include "FluRegister.h" #include "FluRegister.h"
#include "FluApp.h" #include "FluApp.h"
#include <QCoreApplication> #include <QCoreApplication>

View File

@ -1,4 +1,4 @@
#ifndef FLUREGISTER_H #ifndef FLUREGISTER_H
#define FLUREGISTER_H #define FLUREGISTER_H
#include <QObject> #include <QObject>

View File

@ -1,4 +1,4 @@
#include "FluTextStyle.h" #include "FluTextStyle.h"
FluTextStyle::FluTextStyle(QObject *parent) FluTextStyle::FluTextStyle(QObject *parent)
: QObject{parent} : QObject{parent}

View File

@ -1,4 +1,4 @@
#ifndef FLUTEXTSTYLE_H #ifndef FLUTEXTSTYLE_H
#define FLUTEXTSTYLE_H #define FLUTEXTSTYLE_H
#include <QObject> #include <QObject>

View File

@ -2,9 +2,15 @@
#include "Def.h" #include "Def.h"
#include "FluColors.h" #include "FluColors.h"
#include <QPalette> #if (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0))
#include <QStyleHints>
#elif ((QT_VERSION >= QT_VERSION_CHECK(6, 2, 1)))
#include <QtGui/qpa/qplatformtheme.h> #include <QtGui/qpa/qplatformtheme.h>
#include <QtGui/private/qguiapplication_p.h> #include <QtGui/private/qguiapplication_p.h>
#else
#include <QPalette>
#endif
#include <QGuiApplication> #include <QGuiApplication>
FluTheme* FluTheme::m_instance = nullptr; FluTheme* FluTheme::m_instance = nullptr;
@ -45,10 +51,18 @@ bool FluTheme::eventFilter(QObject *obj, QEvent *event)
bool FluTheme::systemDark() bool FluTheme::systemDark()
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0))
return (QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Dark);
#elif ((QT_VERSION >= QT_VERSION_CHECK(6, 2, 1)))
if (const QPlatformTheme * const theme = QGuiApplicationPrivate::platformTheme()) { if (const QPlatformTheme * const theme = QGuiApplicationPrivate::platformTheme()) {
return (theme->appearance() == QPlatformTheme::Appearance::Dark); return (theme->appearance() == QPlatformTheme::Appearance::Dark);
} }
return false; return false;
#else
QPalette palette = qApp->palette();
QColor color = palette.color(QPalette::Window).rgb();
return !(color.red() * 0.2126 + color.green() * 0.7152 + color.blue() * 0.0722 > 255 / 2);
#endif
} }
bool FluTheme::dark(){ bool FluTheme::dark(){

View File

@ -1,4 +1,4 @@
#ifndef FLUTHEME_H #ifndef FLUTHEME_H
#define FLUTHEME_H #define FLUTHEME_H
#include <QObject> #include <QObject>

View File

@ -1,4 +1,4 @@
#include "FluTools.h" #include "FluTools.h"
#include <QGuiApplication> #include <QGuiApplication>
#include <QClipboard> #include <QClipboard>
#include <QUuid> #include <QUuid>
@ -63,4 +63,6 @@ bool FluTools::isWin(){
#endif #endif
} }
void FluTools::setQuitOnLastWindowClosed(bool val){
qApp->setQuitOnLastWindowClosed(val);
}

View File

@ -1,4 +1,4 @@
#ifndef FLUTOOLS_H #ifndef FLUTOOLS_H
#define FLUTOOLS_H #define FLUTOOLS_H
#include <QObject> #include <QObject>
@ -48,6 +48,8 @@ public:
Q_INVOKABLE bool isWin(); Q_INVOKABLE bool isWin();
Q_INVOKABLE void setQuitOnLastWindowClosed(bool val);
}; };
#endif // FLUTOOLS_H #endif // FLUTOOLS_H

View File

@ -1,4 +1,4 @@
#include "WindowHelper.h" #include "WindowHelper.h"
#include "FluRegister.h" #include "FluRegister.h"
#include "FluApp.h" #include "FluApp.h"

View File

@ -1,4 +1,4 @@
#ifndef WINDOWHELPER_H #ifndef WINDOWHELPER_H
#define WINDOWHELPER_H #define WINDOWHELPER_H
#include <QObject> #include <QObject>

View File

@ -1,4 +1,4 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Controls import QtQuick.Controls
import "Content" import "Content"
@ -21,7 +21,6 @@ Rectangle {
color: "#00000000" color: "#00000000"
clip: true clip: true
RowLayout { RowLayout {
id: picker id: picker
anchors.top: parent.top anchors.top: parent.top

View File

@ -1,4 +1,4 @@
import QtQuick import QtQuick
Grid { Grid {
id: root id: root
property int cellSide: 5 property int cellSide: 5

View File

@ -1,4 +1,4 @@
import QtQuick import QtQuick
Item { Item {
property int cursorHeight: 7 property int cursorHeight: 7

View File

@ -1,4 +1,4 @@
import QtQuick import QtQuick
Row { Row {
property alias caption: captionBox.text property alias caption: captionBox.text

View File

@ -1,4 +1,4 @@
import QtQuick import QtQuick
Rectangle { Rectangle {
width : 40; height : 15; radius: 2 width : 40; height : 15; radius: 2
@ -14,5 +14,3 @@ Rectangle {
color: "transparent" color: "transparent"
} }
} }

View File

@ -1,4 +1,4 @@
import QtQuick import QtQuick
Item { Item {
id: root id: root

View File

@ -1,4 +1,4 @@
import QtQuick import QtQuick
import Qt5Compat.GraphicalEffects import Qt5Compat.GraphicalEffects
import FluentUI import FluentUI

View File

@ -1,4 +1,4 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Window import QtQuick.Window
import QtQuick.Layouts import QtQuick.Layouts
@ -22,6 +22,25 @@ Rectangle{
property bool titleVisible: true property bool titleVisible: true
property bool isMac: FluTools.isMacos() property bool isMac: FluTools.isMacos()
property color borerlessColor : FluTheme.dark ? FluTheme.primaryColor.lighter : FluTheme.primaryColor.dark property color borerlessColor : FluTheme.dark ? FluTheme.primaryColor.lighter : FluTheme.primaryColor.dark
property var maxClickListener : function(){
if (d.win.visibility === Window.Maximized)
d.win.visibility = Window.Windowed
else
d.win.visibility = Window.Maximized
}
property var minClickListener: function(){
d.win.visibility = Window.Minimized
}
property var closeClickListener : function(){
d.win.close()
}
property var darkClickListener: function(){
if(FluTheme.dark){
FluTheme.darkMode = FluDarkMode.Light
}else{
FluTheme.darkMode = FluDarkMode.Dark
}
}
id:root id:root
color: Qt.rgba(0,0,0,0) color: Qt.rgba(0,0,0,0)
height: visible ? 30 : 0 height: visible ? 30 : 0
@ -67,14 +86,9 @@ Rectangle{
color:root.textColor color:root.textColor
} }
FluToggleSwitch{ FluToggleSwitch{
selected: FluTheme.dark id:btn_dark
clickFunc:function(){ checked: FluTheme.dark
if(FluTheme.dark){ clickListener:()=> darkClickListener(btn_dark)
FluTheme.darkMode = FluDarkMode.Light
}else{
FluTheme.darkMode = FluDarkMode.Dark
}
}
} }
} }
FluIconButton{ FluIconButton{
@ -89,9 +103,7 @@ Rectangle{
visible: !isMac visible: !isMac
iconColor: root.textColor iconColor: root.textColor
color: hovered ? minimizeHoverColor : minimizeNormalColor color: hovered ? minimizeHoverColor : minimizeNormalColor
onClicked: { onClicked: minClickListener()
d.win.visibility = Window.Minimized
}
} }
FluIconButton{ FluIconButton{
id:btn_maximize id:btn_maximize
@ -105,12 +117,7 @@ Rectangle{
iconColor: root.textColor iconColor: root.textColor
text:d.isRestore?restoreText:maximizeText text:d.isRestore?restoreText:maximizeText
iconSize: 11 iconSize: 11
onClicked: { onClicked: maxClickListener()
if (d.win.visibility === Window.Maximized)
d.win.visibility = Window.Windowed
else
d.win.visibility = Window.Maximized
}
} }
FluIconButton{ FluIconButton{
id:btn_close id:btn_close
@ -124,9 +131,7 @@ Rectangle{
iconSize: 10 iconSize: 10
iconColor: hovered ? Qt.rgba(1,1,1,1) : root.textColor iconColor: hovered ? Qt.rgba(1,1,1,1) : root.textColor
color:hovered ? closeHoverColor : closeNormalColor color:hovered ? closeHoverColor : closeNormalColor
onClicked: { onClicked: closeClickListener()
d.win.close()
}
} }
} }

View File

@ -1,4 +1,4 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Window import QtQuick.Window
import FluentUI import FluentUI
@ -16,16 +16,6 @@ Rectangle {
border.width: 1 border.width: 1
implicitHeight: height implicitHeight: height
implicitWidth: width implicitWidth: width
Behavior on color{
ColorAnimation {
duration: 300
}
}
Behavior on border.color{
ColorAnimation {
duration: 300
}
}
Item { Item {
id: container id: container
anchors.fill: parent anchors.fill: parent

View File

@ -1,4 +1,4 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI
@ -6,6 +6,7 @@ FluTextBox{
property var items:[] property var items:[]
property string emptyText: "没有找到结果" property string emptyText: "没有找到结果"
property int autoSuggestBoxReplacement: FluentIcons.Search property int autoSuggestBoxReplacement: FluentIcons.Search
property var window : Window.window
signal itemClicked(var data) signal itemClicked(var data)
signal handleClicked signal handleClicked
id:control id:control
@ -22,17 +23,11 @@ FluTextBox{
y:control.height y:control.height
focus: false focus: false
enter: Transition { enter: Transition {
NumberAnimation {
property: "y"
from:0
to:control_popup.y
duration: 150
}
NumberAnimation { NumberAnimation {
property: "opacity" property: "opacity"
from:0 from:0
to:1 to:1
duration: 150 duration: 83
} }
} }
onVisibleChanged: { onVisibleChanged: {
@ -41,6 +36,7 @@ FluTextBox{
} }
} }
background: Rectangle{ background: Rectangle{
id:container
width: control.width width: control.width
radius: 4 radius: 4
FluShadow{ FluShadow{
@ -118,6 +114,14 @@ FluTextBox{
onTextChanged: { onTextChanged: {
loadData() loadData()
if(d.flagVisible){ if(d.flagVisible){
var pos = control.mapToItem(null, 0, 0)
if(window.height>pos.y+control.height+container.height){
control_popup.y = control.height
} else if(pos.y>container.height){
control_popup.y = -container.height
} else {
popup.y = window.height-(pos.y+container.height)
}
control_popup.visible = true control_popup.visible = true
} }
} }

View File

@ -1,4 +1,4 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import FluentUI import FluentUI

View File

@ -1,4 +1,4 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import FluentUI import FluentUI

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