Compare commits

..

8 Commits
1.0.1 ... 1.0.3

Author SHA1 Message Date
bcc5d433a9 update 2023-03-10 18:08:32 +08:00
d835b7c23d update 2023-03-09 23:53:36 +08:00
0867043d7a update 2023-03-09 23:11:59 +08:00
e2cefb6114 update 2023-03-09 16:44:24 +08:00
bdf4da81dd update 2023-03-09 15:49:37 +08:00
f4cebb5c14 update 2023-03-09 13:23:39 +08:00
88b15b92ea update 2023-03-09 11:50:40 +08:00
d43e661388 update 2023-03-09 01:18:46 +08:00
54 changed files with 1664 additions and 875 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

View File

@ -66,7 +66,7 @@ jobs:
- name: package - name: package
id: package id: package
env: env:
archiveName: ${{ matrix.qt_ver }}-${{ env.fileName }}-${{ matrix.qt_arch }} archiveName: ${{ env.fileName }}-${{ matrix.qt_ver }}-${{ matrix.qt_arch }}
shell: pwsh shell: pwsh
run: | run: |
& scripts\windows-mingw-publish.ps1 ${env:archiveName} ${env:targetName} & scripts\windows-mingw-publish.ps1 ${env:archiveName} ${env:targetName}

View File

@ -67,7 +67,7 @@ jobs:
- name: package - name: package
id: package id: package
env: env:
archiveName: ${{ matrix.qt_ver }}-${{ env.fileName }}-${{ matrix.qt_arch }} archiveName: ${{ env.fileName }}-${{ matrix.qt_ver }}-${{ matrix.qt_arch }}
msvcArch: ${{ matrix.msvc_arch }} msvcArch: ${{ matrix.msvc_arch }}
shell: pwsh shell: pwsh
run: | run: |

View File

@ -6,8 +6,11 @@ FluWindow {
width: 500 width: 500
height: 600 height: 600
minimumWidth: 300 minimumWidth: 500
minimumHeight: 400 minimumHeight: 600
maximumWidth: 500
maximumHeight: 600
title:"关于" title:"关于"
FluAppBar{ FluAppBar{
@ -31,7 +34,7 @@ FluWindow {
fontStyle: FluText.Title fontStyle: FluText.Title
} }
FluText{ FluText{
text:"v1.0.1" text:"v1.0.3"
fontStyle: FluText.Body fontStyle: FluText.Body
Layout.alignment: Qt.AlignBottom Layout.alignment: Qt.AlignBottom
} }

View File

@ -11,193 +11,170 @@ FluWindow {
width: 800 width: 800
height: 600 height: 600
title: "FluentUI" title: "FluentUI"
minimumWidth: 600 minimumWidth: 500
minimumHeight: 400 minimumHeight: 400
FluAppBar{ FluAppBar{
id:appbar id:appbar
title: "FluentUI" title: "FluentUI"
showDark: true
showFps: true
} }
ListModel{
id:nav_items FluObject{
ListElement{ id:original_items
text:"Buttons"
page:"qrc:/T_Buttons.qml" FluPaneItemHeader{
title:"Inputs"
} }
ListElement{
text:"TextBox" FluPaneItem{
page:"qrc:/T_TextBox.qml" title:"Buttons"
onTap:{
nav_view.push("qrc:/T_Buttons.qml")
}
} }
ListElement{
text:"ToggleSwitch" FluPaneItem{
page:"qrc:/T_ToggleSwitch.qml" title:"Slider"
onTap:{
nav_view.push("qrc:/T_Slider.qml")
}
} }
ListElement{
text:"Slider" FluPaneItem{
page:"qrc:/T_Slider.qml" title:"ToggleSwitch"
onTap:{
nav_view.push("qrc:/T_ToggleSwitch.qml")
}
} }
ListElement{
text:"InfoBar" FluPaneItemHeader{
page:"qrc:/T_InfoBar.qml" title:"Form"
} }
ListElement{
text:"Dialog" FluPaneItem{
page:"qrc:/T_Dialog.qml" title:"TextBox"
onTap:{
nav_view.push("qrc:/T_TextBox.qml")
}
} }
ListElement{
text:"Progress" FluPaneItemHeader{
page:"qrc:/T_Progress.qml" title:"Surface"
} }
ListElement{
text:"Rectangle" FluPaneItem{
page:"qrc:/T_Rectangle.qml" title:"InfoBar"
onTap:{
nav_view.push("qrc:/T_InfoBar.qml")
}
} }
ListElement{
text:"Expander" FluPaneItem{
page:"qrc:/T_Expander.qml" title:"Progress"
onTap:{
nav_view.push("qrc:/T_Progress.qml")
}
} }
ListElement{ FluPaneItem{
text:"TreeView" title:"Rectangle"
page:"qrc:/T_TreeView.qml" onTap:{
nav_view.push("qrc:/T_Rectangle.qml")
}
} }
ListElement{ FluPaneItem{
text:"Theme" title:"Expander"
page:"qrc:/T_Theme.qml" onTap:{
nav_view.push("qrc:/T_Expander.qml")
}
} }
ListElement{
text:"Awesome" FluPaneItemHeader{
page:"qrc:/T_Awesome.qml" title:"Popus"
} }
ListElement{
text:"Typography"
page:"qrc:/T_Typography.qml" FluPaneItem{
title:"Dialog"
onTap:{
nav_view.push("qrc:/T_Dialog.qml")
}
}
FluPaneItemHeader{
title:"Navigation"
}
FluPaneItem{
title:"TreeView"
onTap:{
nav_view.push("qrc:/T_TreeView.qml")
}
}
FluPaneItemHeader{
title:"Theming"
}
FluPaneItem{
title:"Theme"
onTap:{
nav_view.push("qrc:/T_Theme.qml")
}
}
FluPaneItem{
title:"Awesome"
onTap:{
nav_view.push("qrc:/T_Awesome.qml")
}
}
FluPaneItem{
title:"Typography"
onTap:{
nav_view.push("qrc:/T_Typography.qml")
}
}
}
FluObject{
id:footer_items
FluPaneItemSeparator{}
FluPaneItem{
title:"意见反馈"
onTap:{
Qt.openUrlExternally("https://github.com/zhuzichu520/FluentUI/issues/new")
}
}
FluPaneItem{
title:"关于"
onTap:{
FluApp.navigate("/About")
}
} }
} }
FluIconButton{
icon:FluentIcons.FA_navicon FluNavigationView{
id:nav_view
anchors{ anchors{
top: appbar.bottom
left: parent.left left: parent.left
bottom: parent.bottom
leftMargin: 12
bottomMargin: 12
}
FluMenu{
id:menu
x:40
margins:4
FluMenuItem{
text:"意见反馈"
onClicked:{
showInfo("正在建设中...")
}
}
FluMenuItem{
text:"关于"
onClicked:{
FluApp.navigate("/About")
}
}
}
onClicked:{
menu.open()
}
}
ListView{
id:nav_list
anchors{
top: appbar.bottom
bottom: parent.bottom
topMargin: 20
bottomMargin: 52
}
ScrollBar.vertical: ScrollBar { }
boundsBehavior: Flickable.StopAtBounds
clip: true
width: 160
model: nav_items
delegate: Item{
height: 38
width: nav_list.width
Rectangle{
radius: 4
anchors{
top: parent.top
bottom: parent.bottom
left: parent.left
right: parent.right
topMargin: 2
bottomMargin: 2
leftMargin: 6
rightMargin: 6
}
MouseArea{
id:item_mouse
hoverEnabled: true
anchors.fill: parent
onClicked: {
nav_list.currentIndex = index
}
}
color: {
if(FluTheme.isDark){
if(nav_list.currentIndex === index){
return "#2D2D2D"
}
if(item_mouse.containsMouse){
return "#292929"
}
return "#202020"
}else{
if(nav_list.currentIndex === index){
return "#EAEAEA"
}
if(item_mouse.containsMouse){
return "#EDEDED"
}
return "#F3f3f3"
}
}
FluText{
text:model.text
anchors.centerIn: parent
fontStyle: FluText.Caption
}
}
}
}
Rectangle{
color: FluTheme.isDark ? "#323232" : "#FFFFFF"
radius: 10
clip: true
anchors{
left: nav_list.right
leftMargin: 2
top: appbar.bottom
topMargin: 20
right: parent.right right: parent.right
rightMargin: 10
bottom: parent.bottom bottom: parent.bottom
bottomMargin: 20
} }
border.width: 1 items:original_items
border.color: FluTheme.isDark ? Qt.rgba(45/255,45/255,45/255,1) : Qt.rgba(238/255,238/255,238/255,1) footerItems:footer_items
Loader{ Component.onCompleted: {
anchors.fill: parent nav_view.setCurrentIndex(1)
anchors.margins:20 nav_view.push("qrc:/T_Buttons.qml")
source: nav_items.get(nav_list.currentIndex).page
} }
} }
} }

View File

@ -4,20 +4,19 @@ import QtQuick.Layouts 1.15
import QtQuick.Window 2.15 import QtQuick.Window 2.15
import FluentUI 1.0 import FluentUI 1.0
Item { FluContentPage {
FluText{
id:title title:"Awesome"
text:"Awesome"
fontStyle: FluText.TitleLarge
}
FluTextBox{ FluTextBox{
id:text_box id:text_box
placeholderText: "请输入关键字" placeholderText: "请输入关键字"
anchors{ anchors{
topMargin: 20 topMargin: 20
top:title.bottom top:parent.top
} }
} }
FluFilledButton{ FluFilledButton{
text:"搜索" text:"搜索"
anchors{ anchors{

View File

@ -2,130 +2,182 @@
import QtQuick.Layouts 1.15 import QtQuick.Layouts 1.15
import QtQuick.Window 2.15 import QtQuick.Window 2.15
import QtQuick.Controls 2.15 import QtQuick.Controls 2.15
import QtGraphicalEffects 1.15
import FluentUI 1.0 import FluentUI 1.0
Item { FluScrollablePage{
width: parent.width title:"Buttons"
FluText{
id:title spacing: 20
text:"Buttons"
fontStyle: FluText.TitleLarge FluArea{
} Layout.topMargin: 20
ScrollView{
clip: true
width: parent.width width: parent.width
contentWidth: parent.width height: 68
anchors{ paddings: 10
top: title.bottom
bottom: parent.bottom FluButton{
disabled:button_switch.checked
onClicked: {
showInfo("点击StandardButton")
}
anchors{
verticalCenter: parent.verticalCenter
left: parent.left
}
} }
ColumnLayout{
Row{
spacing: 5 spacing: 5
width: parent.width anchors{
RowLayout{ verticalCenter: parent.verticalCenter
Layout.topMargin: 20 right: parent.right
width: parent.width
FluButton{
disabled:button_switch.checked
onClicked: {
showInfo("点击StandardButton")
}
}
Item{
height: 1
Layout.fillWidth: true
}
FluToggleSwitch{
id:button_switch
Layout.alignment: Qt.AlignRight
}
FluText{
text:"Disabled"
}
} }
FluDivider{ FluToggleSwitch{
Layout.fillWidth: true ; height:1; id:button_switch
Layout.alignment: Qt.AlignRight
} }
RowLayout{ FluText{
Layout.topMargin: 20 text:"Disabled"
width: parent.width }
FluFilledButton{ }
disabled:filled_button_switch.checked }
FluArea{
width: parent.width
height: 68
paddings: 10
FluFilledButton{
disabled:filled_button_switch.checked
onClicked: {
showWarning("点击FilledButton")
}
anchors{
verticalCenter: parent.verticalCenter
left: parent.left
}
}
Row{
spacing: 5
anchors{
verticalCenter: parent.verticalCenter
right: parent.right
}
FluToggleSwitch{
id:filled_button_switch
Layout.alignment: Qt.AlignRight
}
FluText{
text:"Disabled"
}
}
}
FluArea{
width: parent.width
height: 68
paddings: 10
FluIconButton{
icon:FluentIcons.FA_close
disabled:icon_button_switch.checked
anchors{
verticalCenter: parent.verticalCenter
left: parent.left
}
onClicked:{
showSuccess("点击IconButton")
}
}
Row{
spacing: 5
anchors{
verticalCenter: parent.verticalCenter
right: parent.right
}
FluToggleSwitch{
id:icon_button_switch
Layout.alignment: Qt.AlignRight
}
FluText{
text:"Disabled"
}
}
}
FluArea{
width: parent.width
height: 100
paddings: 10
ColumnLayout{
spacing: 8
anchors{
verticalCenter: parent.verticalCenter
left: parent.left
}
Repeater{
id:repeater
property int selecIndex : 0
model: 3
delegate: FluRadioButton{
checked : repeater.selecIndex===index
disabled:radio_button_switch.checked
text:"Radio Button_"+index
onClicked:{ onClicked:{
showWarning("点击FilledButton") repeater.selecIndex = index
} }
} }
Item{
height: 1
Layout.fillWidth: true
}
FluToggleSwitch{
id:filled_button_switch
Layout.alignment: Qt.AlignRight
}
FluText{
text:"Disabled"
}
} }
FluDivider{ }
Layout.fillWidth: true ; height:1
Row{
spacing: 5
anchors{
verticalCenter: parent.verticalCenter
right: parent.right
} }
RowLayout{ FluToggleSwitch{
Layout.topMargin: 20 id:radio_button_switch
width: parent.width Layout.alignment: Qt.AlignRight
FluIconButton{
icon:FluentIcons.FA_close
disabled:icon_button_switch.checked
onClicked:{
showSuccess("点击IconButton")
}
}
Item{
height: 1
Layout.fillWidth: true
}
FluToggleSwitch{
id:icon_button_switch
Layout.alignment: Qt.AlignRight
}
FluText{
text:"Disabled"
}
} }
FluDivider{ FluText{
Layout.fillWidth: true ; height:1 text:"Disabled"
} }
RowLayout{ }
Layout.topMargin: 20 }
width: parent.width
ColumnLayout{
spacing: 8 FluArea{
Repeater{ width: parent.width
id:repeater height: 68
property int selecIndex : 0 paddings: 10
model: 3
delegate: FluRadioButton{ FluCheckBox{
checked : repeater.selecIndex===index disabled:icon_button_check.checked
disabled:radio_button_switch.checked anchors{
text:"RodioButton_"+index verticalCenter: parent.verticalCenter
onClicked:{ left: parent.left
repeater.selecIndex = index }
} }
}
}
} Row{
Item{ spacing: 5
height: 1 anchors{
Layout.fillWidth: true verticalCenter: parent.verticalCenter
} right: parent.right
FluToggleSwitch{ }
id:radio_button_switch FluToggleSwitch{
Layout.alignment: Qt.AlignRight id:icon_button_check
} Layout.alignment: Qt.AlignRight
FluText{ }
text:"Disabled" FluText{
} text:"Disabled"
} }
} }
} }

View File

@ -5,13 +5,8 @@ import QtQuick.Controls 2.15
import QtGraphicalEffects 1.15 import QtGraphicalEffects 1.15
import FluentUI 1.0 import FluentUI 1.0
Item { FluScrollablePage{
title:"Dialog"
FluText{
id:title
text:"Dialog"
fontStyle: FluText.TitleLarge
}
FluContentDialog{ FluContentDialog{
id:dialog id:dialog
@ -27,25 +22,11 @@ Item {
} }
} }
FluButton{
Layout.topMargin: 20
ScrollView{ text:"Show Dialog"
clip: true onClicked: {
width: parent.width dialog.open()
contentWidth: parent.width
anchors{
top: title.bottom
bottom: parent.bottom
}
ColumnLayout{
spacing: 5
FluButton{
Layout.topMargin: 20
text:"Show Dialog"
onClicked: {
dialog.open()
}
}
} }
} }
} }

View File

@ -5,72 +5,54 @@ import QtQuick.Window 2.15
import QtGraphicalEffects 1.15 import QtGraphicalEffects 1.15
import FluentUI 1.0 import FluentUI 1.0
Item { FluScrollablePage{
FluText{ title:"Expander"
id:title
text:"Expander" FluExpander{
fontStyle: FluText.TitleLarge headerText:"打开一个单选框"
} Layout.topMargin: 20
ScrollView{ Item{
clip: true anchors.fill: parent
width: parent.width ColumnLayout{
contentWidth: parent.width spacing: 8
anchors{ anchors{
top: title.bottom top: parent.top
bottom: parent.bottom left: parent.left
} topMargin: 15
Column{ leftMargin: 15
spacing: 5 }
Item{ Repeater{
width: 1 id:repeater
height: 20 property int selecIndex : 0
} model: 3
FluExpander{ delegate: FluRadioButton{
headerText:"打开一个单选框" checked : repeater.selecIndex===index
Item{ text:"Radio Button_"+index
anchors.fill: parent onClicked:{
ColumnLayout{ repeater.selecIndex = index
spacing: 8
anchors{
top: parent.top
left: parent.left
topMargin: 15
leftMargin: 15
}
Repeater{
id:repeater
property int selecIndex : 0
model: 3
delegate: FluRadioButton{
checked : repeater.selecIndex===index
text:"RodioButton_"+index
onClicked:{
repeater.selecIndex = index
}
}
} }
} }
} }
} }
}
}
FluExpander{ FluExpander{
Layout.topMargin: 20 Layout.topMargin: 20
headerText:"打开一个滑动文本框" headerText:"打开一个滑动文本框"
Item{ Item{
anchors.fill: parent anchors.fill: parent
ScrollView{ ScrollView{
id:scrollview id:scrollview
width: parent.width width: parent.width
height: parent.height height: parent.height
contentWidth: parent.width contentWidth: parent.width
FluText{ FluText{
id:test id:test
width: scrollview.width width: scrollview.width
wrapMode: Text.WrapAnywhere wrapMode: Text.WrapAnywhere
padding: 14 padding: 14
text:"先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。宫中府中,俱为一体;陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明;故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏。臣不胜受恩感激。今当远离,临表涕零,不知所言。" text:"先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。宫中府中,俱为一体;陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明;故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏。臣不胜受恩感激。今当远离,临表涕零,不知所言。"
}
}
} }
} }
} }

View File

@ -5,51 +5,35 @@ import QtQuick.Controls 2.15
import QtGraphicalEffects 1.15 import QtGraphicalEffects 1.15
import FluentUI 1.0 import FluentUI 1.0
Item { FluScrollablePage{
FluText{ title:"InfoBar"
id:title
text:"InfoBar"
fontStyle: FluText.TitleLarge
}
ScrollView{
clip: true
width: parent.width
contentWidth: parent.width
anchors{
top: title.bottom
bottom: parent.bottom
}
ColumnLayout{
spacing: 5
FluButton{ FluButton{
text:"Info" text:"Info"
Layout.topMargin: 20 Layout.topMargin: 20
onClicked: { onClicked: {
showInfo("这是一个Info样式的InfoBar") showInfo("这是一个Info样式的InfoBar")
} }
} }
FluButton{ FluButton{
text:"Warning" text:"Warning"
Layout.topMargin: 20 Layout.topMargin: 20
onClicked: { onClicked: {
showWarning("这是一个Warning样式的InfoBar") showWarning("这是一个Warning样式的InfoBar")
} }
} }
FluButton{ FluButton{
text:"Error" text:"Error"
Layout.topMargin: 20 Layout.topMargin: 20
onClicked: { onClicked: {
showError("这是一个Error样式的InfoBar") showError("这是一个Error样式的InfoBar")
} }
} }
FluButton{ FluButton{
text:"Success" text:"Success"
Layout.topMargin: 20 Layout.topMargin: 20
onClicked: { onClicked: {
showSuccess("这是一个Success样式的InfoBar这是一个Success样式的InfoBar") showSuccess("这是一个Success样式的InfoBar这是一个Success样式的InfoBar")
}
}
} }
} }
} }

View File

@ -5,47 +5,32 @@ import QtQuick.Controls 2.15
import QtGraphicalEffects 1.15 import QtGraphicalEffects 1.15
import FluentUI 1.0 import FluentUI 1.0
Item { FluScrollablePage{
FluText{ title:"Progress"
id:title
text:"Progress" FluProgressBar{
fontStyle: FluText.TitleLarge Layout.topMargin: 20
} }
ScrollView{ FluProgressRing{
clip: true Layout.topMargin: 10
width: parent.width }
contentWidth: parent.width FluProgressBar{
anchors{ id:progress_bar
top: title.bottom Layout.topMargin: 20
bottom: parent.bottom indeterminate: false
} }
ColumnLayout{ FluProgressRing{
spacing: 5 id:progress_ring
FluProgressBar{ Layout.topMargin: 10
Layout.topMargin: 20 indeterminate: false
} }
FluProgressRing{ FluSlider{
Layout.topMargin: 10 Layout.topMargin: 30
} value:50
FluProgressBar{ onValueChanged:{
id:progress_bar progress_bar.progress = value/100
Layout.topMargin: 20 progress_ring.progress = value/100
indeterminate: false
}
FluProgressRing{
id:progress_ring
Layout.topMargin: 10
indeterminate: false
}
FluSlider{
Layout.topMargin: 30
value:50
onValueChanged:{
progress_bar.progress = value/100
progress_ring.progress = value/100
}
Layout.bottomMargin: 30
}
} }
Layout.bottomMargin: 30
} }
} }

View File

@ -5,127 +5,110 @@ import QtQuick.Window 2.15
import QtGraphicalEffects 1.15 import QtGraphicalEffects 1.15
import FluentUI 1.0 import FluentUI 1.0
Item { FluScrollablePage{
FluText{ title:"Rectangle"
id:title
text:"Rectangle" RowLayout{
fontStyle: FluText.TitleLarge Layout.topMargin: 20
FluRectangle{
width: 50
height: 50
color:"#0078d4"
radius:[0,0,0,0]
}
FluRectangle{
width: 50
height: 50
color:"#744da9"
radius:[15,15,15,15]
}
FluRectangle{
width: 50
height: 50
color:"#ffeb3b"
radius:[15,0,0,0]
}
FluRectangle{
width: 50
height: 50
color:"#f7630c"
radius:[0,15,0,0]
}
FluRectangle{
width: 50
height: 50
color:"#e71123"
radius:[0,0,15,0]
}
FluRectangle{
width: 50
height: 50
color:"#b4009e"
radius:[0,0,0,15]
}
} }
ScrollView{ FluText{
clip: true text:"配合图片使用"
width: parent.width fontStyle: FluText.Subtitle
contentWidth: parent.width Layout.topMargin: 20
anchors{ }
top: title.bottom RowLayout{
bottom: parent.bottom spacing: 14
} FluRectangle{
ColumnLayout{ width: 50
spacing: 5 height: 50
width: parent.width radius:[25,0,25,25]
height: parent.height Image {
RowLayout{ asynchronous: true
Layout.topMargin: 20 anchors.fill: parent
FluRectangle{ source: "qrc:/res/svg/avatar_1.svg"
width: 50 sourceSize: Qt.size(width,height)
height: 50
color:"#0078d4"
radius:[0,0,0,0]
}
FluRectangle{
width: 50
height: 50
color:"#744da9"
radius:[15,15,15,15]
}
FluRectangle{
width: 50
height: 50
color:"#ffeb3b"
radius:[15,0,0,0]
}
FluRectangle{
width: 50
height: 50
color:"#f7630c"
radius:[0,15,0,0]
}
FluRectangle{
width: 50
height: 50
color:"#e71123"
radius:[0,0,15,0]
}
FluRectangle{
width: 50
height: 50
color:"#b4009e"
radius:[0,0,0,15]
}
}
FluText{
text:"配合图片使用"
fontStyle: FluText.Subtitle
Layout.topMargin: 20
}
RowLayout{
spacing: 14
FluRectangle{
width: 50
height: 50
radius:[25,0,25,25]
Image {
asynchronous: true
anchors.fill: parent
source: "qrc:/res/svg/avatar_1.svg"
sourceSize: Qt.size(width,height)
}
}
FluRectangle{
width: 50
height: 50
radius:[10,10,10,10]
Image {
asynchronous: true
anchors.fill: parent
sourceSize: Qt.size(width,height)
source: "qrc:/res/svg/avatar_2.svg"
}
}
FluRectangle{
width: 50
height: 50
radius:[25,25,25,25]
Image {
asynchronous: true
anchors.fill: parent
sourceSize: Qt.size(width,height)
source: "qrc:/res/svg/avatar_3.svg"
}
}
FluRectangle{
width: 50
height: 50
radius:[0,25,25,25]
Image {
asynchronous: true
anchors.fill: parent
sourceSize: Qt.size(width,height)
source: "qrc:/res/svg/avatar_4.svg"
}
}
}
FluRectangle{
width: 1080/5
height: 1439/5
radius:[25,25,25,25]
Image {
asynchronous: true
source: "qrc:/res/image/image_huoyin.webp"
anchors.fill: parent
sourceSize: Qt.size(width,height)
}
Layout.topMargin: 10
} }
} }
FluRectangle{
width: 50
height: 50
radius:[10,10,10,10]
Image {
asynchronous: true
anchors.fill: parent
sourceSize: Qt.size(width,height)
source: "qrc:/res/svg/avatar_2.svg"
}
}
FluRectangle{
width: 50
height: 50
radius:[25,25,25,25]
Image {
asynchronous: true
anchors.fill: parent
sourceSize: Qt.size(width,height)
source: "qrc:/res/svg/avatar_3.svg"
}
}
FluRectangle{
width: 50
height: 50
radius:[0,25,25,25]
Image {
asynchronous: true
anchors.fill: parent
sourceSize: Qt.size(width,height)
source: "qrc:/res/svg/avatar_4.svg"
}
}
}
FluRectangle{
width: 1080/5
height: 1439/5
radius:[25,25,25,25]
Image {
asynchronous: true
source: "qrc:/res/image/image_huoyin.webp"
anchors.fill: parent
sourceSize: Qt.size(width,height)
}
Layout.topMargin: 10
} }
} }

View File

@ -5,27 +5,19 @@ import QtQuick.Controls 2.15
import QtGraphicalEffects 1.15 import QtGraphicalEffects 1.15
import FluentUI 1.0 import FluentUI 1.0
Item { FluScrollablePage{
FluText{
id:title title:"Slider"
text:"Slider"
fontStyle: FluText.TitleLarge FluSlider{
Layout.topMargin: 20
Layout.leftMargin: 15
value: 50
} }
ScrollView{ FluSlider{
clip: true orientation:FluSlider.Vertical
width: parent.width Layout.topMargin: 20
contentWidth: parent.width Layout.leftMargin: 15
anchors{ value: 50
top: title.bottom
bottom: parent.bottom
}
ColumnLayout{
spacing: 5
FluSlider{
Layout.topMargin: 20
Layout.leftMargin: 15
value: 50
}
}
} }
} }

View File

@ -5,32 +5,45 @@ import QtQuick.Window 2.15
import QtGraphicalEffects 1.15 import QtGraphicalEffects 1.15
import FluentUI 1.0 import FluentUI 1.0
Item { FluScrollablePage{
FluText{
id:title title:"TextBox"
text:"TextBox"
fontStyle: FluText.TitleLarge FluTextBox{
Layout.topMargin: 20
placeholderText: "单行输入框"
Layout.preferredWidth: 300
} }
ScrollView{ FluMultiLineTextBox{
clip: true Layout.topMargin: 20
width: parent.width Layout.preferredWidth: 300
contentWidth: parent.width placeholderText: "多行输入框"
anchors{
top: title.bottom
bottom: parent.bottom
}
ColumnLayout{
spacing: 5
FluTextBox{
Layout.topMargin: 20
placeholderText: "单行输入框"
Layout.preferredWidth: 300
}
FluMultiLineTextBox{
Layout.topMargin: 20
Layout.preferredWidth: 300
placeholderText: "多行输入框"
}
}
} }
FluAutoSuggestBox{
Layout.topMargin: 20
values:generateRandomNames(100)
placeholderText: "AutoSuggestBox"
Layout.preferredWidth: 300
}
function generateRandomNames(numNames) {
const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
const names = [];
function generateRandomName() {
const nameLength = Math.floor(Math.random() * 5) + 4;
let name = '';
for (let i = 0; i < nameLength; i++) {
const letterIndex = Math.floor(Math.random() * 26);
name += alphabet.charAt(letterIndex);
}
return name;
}
for (let i = 0; i < numNames; i++) {
const name = generateRandomName();
names.push(name);
}
return names;
}
} }

View File

@ -5,60 +5,57 @@ import QtQuick.Controls 2.15
import QtGraphicalEffects 1.15 import QtGraphicalEffects 1.15
import FluentUI 1.0 import FluentUI 1.0
Item { FluScrollablePage{
FluText{
id:title title:"Theme"
text:"Theme"
fontStyle: FluText.TitleLarge RowLayout{
} Layout.topMargin: 20
ScrollView{ Repeater{
clip: true model: [FluColors.Yellow,FluColors.Orange,FluColors.Red,FluColors.Magenta,FluColors.Purple,FluColors.Blue,FluColors.Teal,FluColors.Green]
width: parent.width delegate: Rectangle{
contentWidth: parent.width width: 42
anchors{ height: 42
top: title.bottom radius: 4
bottom: parent.bottom color: mouse_item.containsMouse ? Qt.lighter(modelData.normal,1.1) : modelData.normal
} FluIcon {
ColumnLayout{ anchors.centerIn: parent
spacing: 5 icon: FluentIcons.FA_check
RowLayout{ iconSize: 15
Layout.topMargin: 20 visible: modelData === FluTheme.primaryColor
Repeater{ color: FluTheme.isDark ? Qt.rgba(0,0,0,1) : Qt.rgba(1,1,1,1)
model: [FluColors.Yellow,FluColors.Orange,FluColors.Red,FluColors.Magenta,FluColors.Purple,FluColors.Blue,FluColors.Teal,FluColors.Green] }
delegate: Rectangle{ MouseArea{
width: 42 id:mouse_item
height: 42 anchors.fill: parent
radius: 4 hoverEnabled: true
color: mouse_item.containsMouse ? Qt.lighter(modelData.normal,1.1) : modelData.normal onClicked: {
FluIcon { FluTheme.primaryColor = modelData
anchors.centerIn: parent
icon: FluentIcons.FA_check
iconSize: 15
visible: modelData === FluTheme.primaryColor
color: FluTheme.isDark ? Qt.rgba(0,0,0,1) : Qt.rgba(1,1,1,1)
}
MouseArea{
id:mouse_item
anchors.fill: parent
hoverEnabled: true
onClicked: {
FluTheme.primaryColor = modelData
}
}
} }
} }
} }
FluText{ }
text:"夜间模式" }
fontStyle: FluText.Subtitle FluText{
Layout.topMargin: 20 text:"夜间模式"
} fontStyle: FluText.Subtitle
FluToggleSwitch{ Layout.topMargin: 20
checked: FluTheme.isDark }
onClickFunc:function(){ FluToggleSwitch{
FluTheme.isDark = !FluTheme.isDark checked: FluTheme.isDark
} onClickFunc:function(){
} FluTheme.isDark = !FluTheme.isDark
}
}
FluText{
text:"无边框"
fontStyle: FluText.Subtitle
Layout.topMargin: 20
}
FluToggleSwitch{
checked: FluTheme.isFrameless
onClickFunc:function(){
FluTheme.isFrameless = !FluTheme.isFrameless
} }
} }
} }

View File

@ -5,26 +5,11 @@ import QtQuick.Controls 2.15
import QtGraphicalEffects 1.15 import QtGraphicalEffects 1.15
import FluentUI 1.0 import FluentUI 1.0
Item { FluScrollablePage{
FluText{
id:title
text:"ToggleSwitch"
fontStyle: FluText.TitleLarge
}
ScrollView{
clip: true
width: parent.width
contentWidth: parent.width
anchors{
top: title.bottom
bottom: parent.bottom
}
ColumnLayout{
spacing: 5
FluToggleSwitch{
Layout.topMargin: 20
}
}
title:"ToggleSwitch"
FluToggleSwitch{
Layout.topMargin: 20
} }
} }

View File

@ -2,15 +2,11 @@
import QtQuick.Layouts 1.15 import QtQuick.Layouts 1.15
import QtQuick.Window 2.15 import QtQuick.Window 2.15
import QtQuick.Controls 2.15 import QtQuick.Controls 2.15
import QtGraphicalEffects 1.15
import FluentUI 1.0 import FluentUI 1.0
Item { FluContentPage {
FluText{
id:title title:"TreeView"
text:"TreeView"
fontStyle: FluText.TitleLarge
}
function randomName() { function randomName() {
var names = ["张三", "李四", "王五", "赵六", "钱七", "孙八", "周九", "吴十"] var names = ["张三", "李四", "王五", "赵六", "钱七", "孙八", "周九", "吴十"]
@ -56,7 +52,7 @@ Item {
id:tree_view id:tree_view
width:240 width:240
anchors{ anchors{
top:title.bottom top:parent.top
left:parent.left left:parent.left
bottom:parent.bottom bottom:parent.bottom
} }

View File

@ -3,55 +3,82 @@ import QtQuick.Layouts 1.15
import QtQuick.Controls 2.15 import QtQuick.Controls 2.15
import FluentUI 1.0 import FluentUI 1.0
Item { FluContentPage {
FluText{
id:title title: "Typography"
text:"Typography" property int textSize: 13
fontStyle: FluText.TitleLarge
}
ScrollView{ ScrollView{
clip: true clip: true
width: parent.width width: parent.width
contentWidth: parent.width contentWidth: parent.width
anchors{
top: title.bottom
bottom: parent.bottom
}
ColumnLayout{ ColumnLayout{
spacing: 5 spacing: 0
FluText{ FluText{
text:"Display" text:"Display"
Layout.topMargin: 20 Layout.topMargin: 20
padding: 0
pixelSize: textSize
fontStyle: FluText.Display fontStyle: FluText.Display
} }
FluText{ FluText{
text:"Title Large" text:"Title Large"
padding: 0
pixelSize: textSize
fontStyle: FluText.TitleLarge fontStyle: FluText.TitleLarge
} }
FluText{ FluText{
text:"Title" text:"Title"
padding: 0
pixelSize: textSize
fontStyle: FluText.Title fontStyle: FluText.Title
} }
FluText{ FluText{
text:"Subtitle" text:"Subtitle"
padding: 0
pixelSize: textSize
fontStyle: FluText.Subtitle fontStyle: FluText.Subtitle
} }
FluText{ FluText{
text:"Body Large" text:"Body Large"
padding: 0
pixelSize: textSize
fontStyle: FluText.BodyLarge fontStyle: FluText.BodyLarge
} }
FluText{ FluText{
text:"Body Strong" text:"Body Strong"
padding: 0
pixelSize: textSize
fontStyle: FluText.BodyStrong fontStyle: FluText.BodyStrong
} }
FluText{ FluText{
text:"Body" text:"Body"
padding: 0
pixelSize: textSize
fontStyle: FluText.Body fontStyle: FluText.Body
} }
FluText{ FluText{
text:"Caption" text:"Caption"
padding: 0
pixelSize: textSize
fontStyle: FluText.Caption fontStyle: FluText.Caption
} }
} }
} }
FluSlider{
orientation:FluSlider.Vertical
anchors{
right: parent.right
rightMargin: 30
top: parent.top
topMargin: 30
}
onValueChanged:{
textSize = value/100*16+8
}
value: 31
}
} }

View File

@ -2,6 +2,7 @@
#include <QQmlApplicationEngine> #include <QQmlApplicationEngine>
#include <QQmlContext> #include <QQmlContext>
#include <QDir> #include <QDir>
#include <QQuickWindow>
#include <QProcess> #include <QProcess>
QMap<QString, QVariant> properties(){ QMap<QString, QVariant> properties(){
@ -16,6 +17,7 @@ int main(int argc, char *argv[])
QCoreApplication::setOrganizationDomain("https://zhuzichu520.github.io"); QCoreApplication::setOrganizationDomain("https://zhuzichu520.github.io");
QCoreApplication::setApplicationName("FluentUI"); QCoreApplication::setApplicationName("FluentUI");
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
// QQuickWindow::setSceneGraphBackend(QSGRendererInterface::Software);
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
QQmlApplicationEngine engine; QQmlApplicationEngine engine;
QMapIterator<QString, QVariant> iterator(properties()); QMapIterator<QString, QVariant> iterator(properties());

View File

@ -3,7 +3,6 @@
<file>T_ToggleSwitch.qml</file> <file>T_ToggleSwitch.qml</file>
<file>T_Typography.qml</file> <file>T_Typography.qml</file>
<file>App.qml</file> <file>App.qml</file>
<file>MainPage.qml</file>
<file>SettingPage.qml</file> <file>SettingPage.qml</file>
<file>AboutPage.qml</file> <file>AboutPage.qml</file>
<file>T_Buttons.qml</file> <file>T_Buttons.qml</file>
@ -30,5 +29,6 @@
<file>T_Dialog.qml</file> <file>T_Dialog.qml</file>
<file>T_TreeView.qml</file> <file>T_TreeView.qml</file>
<file>T_Expander.qml</file> <file>T_Expander.qml</file>
<file>MainPage.qml</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -59,7 +59,7 @@ void FluApp::navigate(const QString& route){
view->setSource((routes().value(route).toString())); view->setSource((routes().value(route).toString()));
if(isAppWindow){ if(isAppWindow){
QObject::connect(view->engine(), &QQmlEngine::quit, qApp, &QCoreApplication::quit); QObject::connect(view->engine(), &QQmlEngine::quit, qApp, &QCoreApplication::quit);
QObject::connect(qApp, &QGuiApplication::aboutToQuit, qApp, [&view](){view->setSource({});}); // QObject::connect(qApp, &QGuiApplication::aboutToQuit, qApp, [&view](){view->setSource({});});
}else{ }else{
view->closeDeleteLater(); view->closeDeleteLater();
} }

View File

@ -16,5 +16,7 @@ FluTheme::FluTheme(QObject *parent)
: QObject{parent} : QObject{parent}
{ {
primaryColor(FluColors::getInstance()->Blue()); primaryColor(FluColors::getInstance()->Blue());
textSize(13);
isFrameless(true);
isDark(false); isDark(false);
} }

View File

@ -9,7 +9,9 @@ class FluTheme : public QObject
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY_AUTO(FluColorSet*,primaryColor) Q_PROPERTY_AUTO(FluColorSet*,primaryColor)
Q_PROPERTY_AUTO(bool,isFrameless);
Q_PROPERTY_AUTO(bool,isDark); Q_PROPERTY_AUTO(bool,isDark);
Q_PROPERTY_AUTO(int,textSize);
public: public:
explicit FluTheme(QObject *parent = nullptr); explicit FluTheme(QObject *parent = nullptr);
static FluTheme *getInstance(); static FluTheme *getInstance();

View File

@ -33,6 +33,16 @@ void Fluent::registerTypes(const char *uri){
qmlRegisterType<WindowHelper>(uri,major,minor,"WindowHelper"); qmlRegisterType<WindowHelper>(uri,major,minor,"WindowHelper");
qmlRegisterType<FluColorSet>(uri,major,minor,"FluColorSet"); qmlRegisterType<FluColorSet>(uri,major,minor,"FluColorSet");
qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluArea.qml"),uri,major,minor,"FluArea");
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/FluAutoSuggestBox.qml"),uri,major,minor,"FluAutoSuggestBox");
qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluExpander.qml"),uri,major,minor,"FluExpander"); 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/FluTreeView.qml"),uri,major,minor,"FluTreeView");
qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluContentDialog.qml"),uri,major,minor,"FluContentDialog"); qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluContentDialog.qml"),uri,major,minor,"FluContentDialog");
@ -72,9 +82,12 @@ void Fluent::initializeEngine(QQmlEngine *engine, const char *uri)
{ {
Q_UNUSED(engine) Q_UNUSED(engine)
Q_UNUSED(uri) Q_UNUSED(uri)
#ifdef Q_OS_WIN
QFont font; QFont font;
font.setFamily("Microsoft YaHei"); font.setFamily("Microsoft YaHei");
QGuiApplication::setFont(font); QGuiApplication::setFont(font);
QQuickWindow::setTextRenderType(QQuickWindow::NativeTextRendering);
#endif
QFontDatabase::addApplicationFont(":/com.zhuzichu/res/font/fontawesome-webfont.ttf"); QFontDatabase::addApplicationFont(":/com.zhuzichu/res/font/fontawesome-webfont.ttf");
FluApp* app = FluApp::getInstance(); FluApp* app = FluApp::getInstance();
engine->rootContext()->setContextProperty("FluApp",app); engine->rootContext()->setContextProperty("FluApp",app);

View File

@ -21,6 +21,7 @@ public:
void closeDeleteLater(); void closeDeleteLater();
bool isMax() const; bool isMax() const;
bool isFull() const; bool isFull() const;
void refreshWindow();
QQuickItem *titleItem() const; QQuickItem *titleItem() const;
static QMap<WId,FramelessView*> *windowCache; static QMap<WId,FramelessView*> *windowCache;
@ -38,6 +39,7 @@ signals:
protected: protected:
void showEvent(QShowEvent *e) override; void showEvent(QShowEvent *e) override;
void resizeEvent(QResizeEvent *e) override; void resizeEvent(QResizeEvent *e) override;
bool event(QEvent *ev) override;
# if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) # if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
bool nativeEvent(const QByteArray &eventType, void *message, qintptr *result) override; bool nativeEvent(const QByteArray &eventType, void *message, qintptr *result) override;
# else # else

View File

@ -3,6 +3,7 @@
#include <QQuickItem> #include <QQuickItem>
#include <QScreen> #include <QScreen>
#include <QWindow> #include <QWindow>
#include <FluTheme.h>
class FramelessViewPrivate class FramelessViewPrivate
{ {
@ -12,10 +13,10 @@ public:
bool m_deleteLater = false; bool m_deleteLater = false;
QQuickItem *m_titleItem = nullptr; QQuickItem *m_titleItem = nullptr;
}; };
FramelessView::FramelessView(QWindow *parent) : Super(parent), d(new FramelessViewPrivate) FramelessView::FramelessView(QWindow *parent) : Super(parent), d(new FramelessViewPrivate)
{ {
setFlags(Qt::CustomizeWindowHint | Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint); refreshWindow();
setResizeMode(SizeRootObjectToView);
setIsMax(windowState() == Qt::WindowMaximized); setIsMax(windowState() == Qt::WindowMaximized);
setIsFull(windowState() == Qt::WindowFullScreen); setIsFull(windowState() == Qt::WindowFullScreen);
connect(this, &QWindow::windowStateChanged, this, [&](Qt::WindowState state) { connect(this, &QWindow::windowStateChanged, this, [&](Qt::WindowState state) {
@ -23,15 +24,31 @@ FramelessView::FramelessView(QWindow *parent) : Super(parent), d(new FramelessVi
setIsMax(windowState() == Qt::WindowMaximized); setIsMax(windowState() == Qt::WindowMaximized);
setIsFull(windowState() == Qt::WindowFullScreen); setIsFull(windowState() == Qt::WindowFullScreen);
}); });
connect(FluTheme::getInstance(),&FluTheme::isFramelessChanged,this,[=](){
refreshWindow();
});
} }
void FramelessView::refreshWindow(){
if(FluTheme::getInstance()->isFrameless()){
setFlags(Qt::CustomizeWindowHint | Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint);
}else{
setFlags(Qt::Window);
}
setResizeMode(SizeViewToRootObject);
setResizeMode(SizeRootObjectToView);
}
FramelessView::~FramelessView() FramelessView::~FramelessView()
{ {
delete d; delete d;
} }
void FramelessView::showEvent(QShowEvent *e) void FramelessView::showEvent(QShowEvent *e)
{ {
Super::showEvent(e); Super::showEvent(e);
} }
QRect FramelessView::calcCenterGeo(const QRect &screenGeo, const QSize &normalSize) QRect FramelessView::calcCenterGeo(const QRect &screenGeo, const QSize &normalSize)
{ {
int w = normalSize.width(); int w = normalSize.width();
@ -46,9 +63,9 @@ QRect FramelessView::calcCenterGeo(const QRect &screenGeo, const QSize &normalSi
y = screenGeo.y(); y = screenGeo.y();
h = screenGeo.height(); h = screenGeo.height();
} }
return { x, y, w, h }; return { x, y, w, h };
} }
void FramelessView::moveToScreenCenter() void FramelessView::moveToScreenCenter()
{ {
auto geo = calcCenterGeo(screen()->availableGeometry(), size()); auto geo = calcCenterGeo(screen()->availableGeometry(), size());
@ -58,6 +75,7 @@ void FramelessView::moveToScreenCenter()
setGeometry(geo); setGeometry(geo);
update(); update();
} }
void FramelessView::closeDeleteLater(){ void FramelessView::closeDeleteLater(){
d->m_deleteLater = true; d->m_deleteLater = true;
} }
@ -66,14 +84,17 @@ bool FramelessView::isMax() const
{ {
return d->m_isMax; return d->m_isMax;
} }
bool FramelessView::isFull() const bool FramelessView::isFull() const
{ {
return d->m_isFull; return d->m_isFull;
} }
QQuickItem *FramelessView::titleItem() const QQuickItem *FramelessView::titleItem() const
{ {
return d->m_titleItem; return d->m_titleItem;
} }
void FramelessView::setIsMax(bool isMax) void FramelessView::setIsMax(bool isMax)
{ {
if (d->m_isMax == isMax) if (d->m_isMax == isMax)
@ -82,6 +103,7 @@ void FramelessView::setIsMax(bool isMax)
d->m_isMax = isMax; d->m_isMax = isMax;
emit isMaxChanged(d->m_isMax); emit isMaxChanged(d->m_isMax);
} }
void FramelessView::setIsFull(bool isFull) void FramelessView::setIsFull(bool isFull)
{ {
if(d->m_isFull == isFull) if(d->m_isFull == isFull)
@ -90,6 +112,7 @@ void FramelessView::setIsFull(bool isFull)
d->m_isFull = isFull; d->m_isFull = isFull;
emit isFullChanged(d->m_isFull); emit isFullChanged(d->m_isFull);
} }
void FramelessView::setTitleItem(QQuickItem *item) void FramelessView::setTitleItem(QQuickItem *item)
{ {
d->m_titleItem = item; d->m_titleItem = item;
@ -107,3 +130,15 @@ void FramelessView::resizeEvent(QResizeEvent *e)
{ {
Super::resizeEvent(e); Super::resizeEvent(e);
} }
bool FramelessView::event(QEvent *ev)
{
if (ev->type() == QEvent::Close) {
if(d->m_deleteLater){
deleteLater();
ev->setAccepted(false);
}
}
return QQuickWindow::event(ev);
}

View File

@ -3,27 +3,7 @@
#include <QQuickItem> #include <QQuickItem>
#include <QScreen> #include <QScreen>
#include <QWindow> #include <QWindow>
#include <FluTheme.h>
#include <VersionHelpers.h>
#include <WinUser.h>
#include <dwmapi.h>
#include <objidl.h> // Fixes error C2504: 'IUnknown' : base class undefined
#include <windows.h>
#include <windowsx.h>
#include <wtypes.h>
#pragma comment(lib, "Dwmapi.lib") // Adds missing library, fixes error LNK2019: unresolved
#pragma comment(lib, "User32.lib")
#pragma comment(lib, "Gdi32.lib")
static bool isMaxWin(QWindow* win)
{
return win->windowState() == Qt::WindowMaximized;
}
static bool isFullWin(QQuickView* win)
{
return win->windowState() == Qt::WindowFullScreen;
}
class FramelessViewPrivate class FramelessViewPrivate
{ {
@ -33,10 +13,10 @@ public:
bool m_deleteLater = false; bool m_deleteLater = false;
QQuickItem *m_titleItem = nullptr; QQuickItem *m_titleItem = nullptr;
}; };
FramelessView::FramelessView(QWindow *parent) : Super(parent), d(new FramelessViewPrivate) FramelessView::FramelessView(QWindow *parent) : Super(parent), d(new FramelessViewPrivate)
{ {
setFlags(Qt::CustomizeWindowHint | Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint); refreshWindow();
setResizeMode(SizeRootObjectToView);
setIsMax(windowState() == Qt::WindowMaximized); setIsMax(windowState() == Qt::WindowMaximized);
setIsFull(windowState() == Qt::WindowFullScreen); setIsFull(windowState() == Qt::WindowFullScreen);
connect(this, &QWindow::windowStateChanged, this, [&](Qt::WindowState state) { connect(this, &QWindow::windowStateChanged, this, [&](Qt::WindowState state) {
@ -44,15 +24,31 @@ FramelessView::FramelessView(QWindow *parent) : Super(parent), d(new FramelessVi
setIsMax(windowState() == Qt::WindowMaximized); setIsMax(windowState() == Qt::WindowMaximized);
setIsFull(windowState() == Qt::WindowFullScreen); setIsFull(windowState() == Qt::WindowFullScreen);
}); });
connect(FluTheme::getInstance(),&FluTheme::isFramelessChanged,this,[=](){
refreshWindow();
});
} }
void FramelessView::refreshWindow(){
if(FluTheme::getInstance()->isFrameless()){
setFlags(Qt::CustomizeWindowHint | Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint);
}else{
setFlags(Qt::Window);
}
setResizeMode(SizeViewToRootObject);
setResizeMode(SizeRootObjectToView);
}
FramelessView::~FramelessView() FramelessView::~FramelessView()
{ {
delete d; delete d;
} }
void FramelessView::showEvent(QShowEvent *e) void FramelessView::showEvent(QShowEvent *e)
{ {
Super::showEvent(e); Super::showEvent(e);
} }
QRect FramelessView::calcCenterGeo(const QRect &screenGeo, const QSize &normalSize) QRect FramelessView::calcCenterGeo(const QRect &screenGeo, const QSize &normalSize)
{ {
int w = normalSize.width(); int w = normalSize.width();
@ -67,9 +63,9 @@ QRect FramelessView::calcCenterGeo(const QRect &screenGeo, const QSize &normalSi
y = screenGeo.y(); y = screenGeo.y();
h = screenGeo.height(); h = screenGeo.height();
} }
return { x, y, w, h }; return { x, y, w, h };
} }
void FramelessView::moveToScreenCenter() void FramelessView::moveToScreenCenter()
{ {
auto geo = calcCenterGeo(screen()->availableGeometry(), size()); auto geo = calcCenterGeo(screen()->availableGeometry(), size());
@ -79,6 +75,7 @@ void FramelessView::moveToScreenCenter()
setGeometry(geo); setGeometry(geo);
update(); update();
} }
void FramelessView::closeDeleteLater(){ void FramelessView::closeDeleteLater(){
d->m_deleteLater = true; d->m_deleteLater = true;
} }
@ -87,14 +84,17 @@ bool FramelessView::isMax() const
{ {
return d->m_isMax; return d->m_isMax;
} }
bool FramelessView::isFull() const bool FramelessView::isFull() const
{ {
return d->m_isFull; return d->m_isFull;
} }
QQuickItem *FramelessView::titleItem() const QQuickItem *FramelessView::titleItem() const
{ {
return d->m_titleItem; return d->m_titleItem;
} }
void FramelessView::setIsMax(bool isMax) void FramelessView::setIsMax(bool isMax)
{ {
if (d->m_isMax == isMax) if (d->m_isMax == isMax)
@ -103,6 +103,7 @@ void FramelessView::setIsMax(bool isMax)
d->m_isMax = isMax; d->m_isMax = isMax;
emit isMaxChanged(d->m_isMax); emit isMaxChanged(d->m_isMax);
} }
void FramelessView::setIsFull(bool isFull) void FramelessView::setIsFull(bool isFull)
{ {
if(d->m_isFull == isFull) if(d->m_isFull == isFull)
@ -111,6 +112,7 @@ void FramelessView::setIsFull(bool isFull)
d->m_isFull = isFull; d->m_isFull = isFull;
emit isFullChanged(d->m_isFull); emit isFullChanged(d->m_isFull);
} }
void FramelessView::setTitleItem(QQuickItem *item) void FramelessView::setTitleItem(QQuickItem *item)
{ {
d->m_titleItem = item; d->m_titleItem = item;
@ -121,43 +123,16 @@ bool FramelessView::nativeEvent(const QByteArray &eventType, void *message, qint
bool FramelessView::nativeEvent(const QByteArray &eventType, void *message, long *result) bool FramelessView::nativeEvent(const QByteArray &eventType, void *message, long *result)
#endif #endif
{ {
#if (QT_VERSION == QT_VERSION_CHECK(5, 11, 1)) MSG* msg = static_cast<MSG*>(message);
// Work-around a bug caused by typo which only exists in Qt 5.11.1 if (msg->message == WM_WINDOWPOSCHANGING)
const auto msg = *reinterpret_cast<MSG**>(message);
#else
const auto msg = static_cast<LPMSG>(message);
#endif
if (!msg || !msg->hwnd)
{ {
return false; WINDOWPOS* wp = reinterpret_cast<WINDOWPOS*>(msg->lParam);
} if (wp != nullptr && (wp->flags & SWP_NOSIZE) == 0)
switch (msg->message)
{
case WM_NCCALCSIZE: {
const auto mode = static_cast<BOOL>(msg->wParam);
const auto clientRect = mode ? &(reinterpret_cast<LPNCCALCSIZE_PARAMS>(msg->lParam)->rgrc[0]) : reinterpret_cast<LPRECT>(msg->lParam);
if (mode == TRUE)
{ {
*result = WVR_REDRAW; wp->flags |= SWP_NOCOPYBITS;
//规避 拖动border进行resize时界面闪烁 *result = 0;
if (!isMaxWin(this) && !isFullWin(this))
{
if (clientRect->top != 0)
{
clientRect->top -= 0.1;
}
}
else
{
if (clientRect->top != 0)
{
clientRect->top += 0.1;
}
}
return true; return true;
} }
break;
}
} }
return Super::nativeEvent(eventType, message, result); return Super::nativeEvent(eventType, message, result);
} }
@ -166,3 +141,15 @@ void FramelessView::resizeEvent(QResizeEvent *e)
{ {
Super::resizeEvent(e); Super::resizeEvent(e);
} }
bool FramelessView::event(QEvent *ev)
{
if (ev->type() == QEvent::Close) {
if(d->m_deleteLater){
deleteLater();
ev->setAccepted(false);
}
}
return QQuickWindow::event(ev);
}

View File

@ -13,13 +13,16 @@ Rectangle{
return borerlessColor return borerlessColor
return Window.window.active ? borerlessColor : Qt.lighter(borerlessColor,1.1) return Window.window.active ? borerlessColor : Qt.lighter(borerlessColor,1.1)
} }
height: 50 visible: FluTheme.isFrameless
height: visible ? 34 : 0
width: { width: {
if(parent==null) if(parent==null)
return 200 return 200
return parent.width return parent.width
} }
z: 65535 z: 65535
clip: true
property string title: "标题" property string title: "标题"
property color textColor: FluTheme.isDark ? "#000000" : "#FFFFFF" property color textColor: FluTheme.isDark ? "#000000" : "#FFFFFF"
property bool showDark: false property bool showDark: false
@ -58,7 +61,7 @@ Rectangle{
anchors{ anchors{
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
left: parent.left left: parent.left
leftMargin: 14 leftMargin: 10
} }
color:root.textColor color:root.textColor
fontStyle: FluText.Title fontStyle: FluText.Title
@ -67,14 +70,13 @@ Rectangle{
} }
RowLayout{ RowLayout{
anchors.right: parent.right; anchors.right: parent.right
anchors.rightMargin: 10 height: 30
height: parent.height spacing: 0
spacing: 5
TFpsMonitor{ TFpsMonitor{
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
Layout.rightMargin: 12 Layout.rightMargin: 20
Layout.topMargin: 5 Layout.topMargin: 5
color:root.textColor color:root.textColor
visible: showFps visible: showFps
@ -82,8 +84,9 @@ Rectangle{
RowLayout{ RowLayout{
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
spacing: 5 Layout.rightMargin: 14
visible: showDark visible: showDark
spacing: 5
FluText{ FluText{
text:"夜间模式" text:"夜间模式"
color:root.textColor color:root.textColor

28
src/controls/FluArea.qml Normal file
View File

@ -0,0 +1,28 @@
import QtQuick 2.15
import FluentUI 1.0
Rectangle {
radius: 4
color: FluTheme.isDark ? Qt.rgba(39/255,39/255,39/255,1) : Qt.rgba(251/255,251/255,253/255,1)
border.color: FluTheme.isDark ? Qt.rgba(45/255,45/255,45/255,1) : Qt.rgba(226/255,229/255,234/255,1)
border.width: 1
implicitHeight: height
implicitWidth: width
default property alias content: container.data
property int paddings : 0
property int leftPadding : 0
property int rightPadding : 0
property int topPadding : 0
property int bottomPadding : 0
Item {
id: container
anchors.fill: parent
anchors.leftMargin: Math.max(paddings,leftPadding)
anchors.rightMargin: Math.max(paddings,rightPadding)
anchors.topMargin: Math.max(paddings,topPadding)
anchors.bottomMargin: Math.max(paddings,bottomPadding)
}
}

View File

@ -0,0 +1,185 @@
import QtQuick 2.15
import QtQuick.Controls 2.15
import FluentUI 1.0
TextField{
property var values:[]
property int fontStyle: FluText.Body
property int pixelSize : FluTheme.textSize
id:input
width: 300
color: FluTheme.isDark ? "#FFFFFF" : "#1A1A1A"
selectionColor: {
if(FluTheme.isDark){
return FluTheme.primaryColor.lighter
}else{
return FluTheme.primaryColor.dark
}
}
placeholderTextColor: {
if(focus){
return FluTheme.isDark ? Qt.rgba(152/255,152/255,152/255,1) : Qt.rgba(141/255,141/255,141/255,1)
}
return FluTheme.isDark ? Qt.rgba(210/255,210/255,210/255,1) : Qt.rgba(96/255,96/255,96/255,1)
}
rightPadding: 30
selectByMouse: true
font.bold: {
switch (fontStyle) {
case FluText.Display:
return true
case FluText.TitleLarge:
return true
case FluText.Title:
return true
case FluText.Subtitle:
return true
case FluText.BodyLarge:
return false
case FluText.BodyStrong:
return true
case FluText.Body:
return false
case FluText.Caption:
return false
default:
return false
}
}
font.pixelSize: {
switch (fontStyle) {
case FluText.Display:
return input.pixelSize * 4
case FluText.TitleLarge:
return input.pixelSize * 2
case FluText.Title:
return input.pixelSize * 1.5
case FluText.Subtitle:
return input.pixelSize * 0.9
case FluText.BodyLarge:
return input.pixelSize * 1.1
case FluText.BodyStrong:
return input.pixelSize * 1.0
case FluText.Body:
return input.pixelSize * 1.0
case FluText.Caption:
return input.pixelSize * 0.8
default:
return input.pixelSize * 1.0
}
}
background: FluTextBoxBackground{
inputItem: input
FluIconButton{
icon:FluentIcons.FA_close
iconSize: 14
width: 20
height: 20
opacity: 0.5
visible: input.text !== ""
anchors{
verticalCenter: parent.verticalCenter
right: parent.right
rightMargin: 5
}
onClicked:{
input.text = ""
}
}
}
Component.onCompleted: {
searchData()
}
Popup{
id:input_popup
visible: input.focus
y:input.height
onClosed: {
input.focus = false
}
background: Rectangle{
width: input.width
radius: 4
FluShadow{
radius: 4
}
color: FluTheme.isDark ? Qt.rgba(51/255,48/255,48/255,1) : Qt.rgba(243/255,241/255,240/255,1)
height: 38*Math.min(Math.max(list_view.count,1),8)
ListView{
id:list_view
signal closePopup
anchors.fill: parent
boundsBehavior: ListView.StopAtBounds
clip: true
header: Item{
width: input.width
height: visible ? 38 : 0
visible: list_view.count === 0
FluText{
text:"没有找到结果"
anchors{
verticalCenter: parent.verticalCenter
left: parent.left
leftMargin: 10
}
}
}
ScrollBar.vertical: ScrollBar { }
delegate: Item{
height: 38
width: input.width
Rectangle{
anchors.fill: parent
anchors.topMargin: 2
anchors.bottomMargin: 2
color: {
if(item_mouse.containsMouse){
return FluTheme.isDark ? Qt.rgba(63/255,60/255,61/255,1) : Qt.rgba(234/255,234/255,234/255,1)
}
return FluTheme.isDark ? Qt.rgba(51/255,48/255,48/255,1) : Qt.rgba(243/255,241/255,240/255,1)
}
radius: 3
MouseArea{
id:item_mouse
anchors.fill: parent
hoverEnabled: true
onClicked: {
input_popup.close()
input.text = modelData
}
}
FluText{
text:modelData
anchors{
verticalCenter: parent.verticalCenter
left: parent.left
leftMargin: 10
}
}
}
}
}
}
}
onTextChanged: {
searchData()
}
function searchData(){
var result = []
values.map(function(item){
if(item.indexOf(input.text)!==-1){
result.push(item)
}
})
list_view.model = result
}
}

View File

@ -7,8 +7,8 @@ Rectangle {
property string text: "Standard Button" property string text: "Standard Button"
property int startPadding : 15 property int startPadding : 15
property int endPadding : 15 property int endPadding : 15
property int topPadding: 8 property int topPadding: 5
property int bottomPadding: 8 property int bottomPadding: 5
property bool disabled: false property bool disabled: false
property color primaryColor : "#0064B0" property color primaryColor : "#0064B0"
signal clicked signal clicked
@ -37,7 +37,6 @@ Rectangle {
FluText { FluText {
id: button_text id: button_text
text: button.text text: button.text
font.pixelSize: 14
leftPadding: button.startPadding leftPadding: button.startPadding
rightPadding: button.endPadding rightPadding: button.endPadding
topPadding: button.topPadding topPadding: button.topPadding
@ -62,9 +61,8 @@ Rectangle {
id:button_mouse id:button_mouse
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
enabled: !disabled
onClicked: { onClicked: {
if(disabled)
return
button.clicked() button.clicked()
} }
} }

View File

@ -9,56 +9,59 @@ Item {
property string text: "Check Box" property string text: "Check Box"
property var checkClicked property var checkClicked
property bool hovered: mouse_area.containsMouse property bool hovered: mouse_area.containsMouse
property bool disabled: false
width: childrenRect.width width: childrenRect.width
height: childrenRect.height height: childrenRect.height
property color borderNormalColor: FluTheme.isDark ? Qt.rgba(160/255,160/255,160/255,1) : Qt.rgba(136/255,136/255,136/255,1)
property color borderCheckedColor: FluTheme.isDark ? FluTheme.primaryColor.lighter : FluTheme.primaryColor.dark
property color borderHoverColor: FluTheme.isDark ? Qt.rgba(167/255,167/255,167/255,1) : Qt.rgba(135/255,135/255,135/255,1)
property color borderDisableColor: FluTheme.isDark ? Qt.rgba(82/255,82/255,82/255,1) : Qt.rgba(199/255,199/255,199/255,1)
property color normalColor: FluTheme.isDark ? Qt.rgba(45/255,45/255,45/255,1) : Qt.rgba(247/255,247/255,247/255,1)
property color checkedColor: FluTheme.isDark ? FluTheme.primaryColor.lighter : FluTheme.primaryColor.dark
property color hoverColor: FluTheme.isDark ? Qt.rgba(62/255,62/255,62/255,1) : Qt.rgba(244/255,244/255,244/255,1)
property color checkedHoverColor: FluTheme.isDark ? Qt.darker(checkedColor,1.1) : Qt.lighter(checkedColor,1.1)
property color checkedDisableColor: FluTheme.isDark ? Qt.rgba(82/255,82/255,82/255,1) : Qt.rgba(199/255,199/255,199/255,1)
property color disableColor: FluTheme.isDark ? Qt.rgba(50/255,50/255,50/255,1) : Qt.rgba(253/255,253/255,253/255,1)
RowLayout{ RowLayout{
spacing: 4 spacing: 4
Rectangle{ Rectangle{
width: 22 width: 20
height: 22 height: 20
radius: 4 radius: 4
border.color: { border.color: {
if(FluTheme.isDark){ if(disabled){
if(checked){ return borderDisableColor
return FluTheme.primaryColor.lighter
}
return Qt.rgba(160/255,160/255,160/255,1)
}else{
if(checked){
if(mouse_area.containsMouse){
return Qt.rgba(25/255,117/255,187/255,1)
}
return FluTheme.primaryColor.dark
}
return Qt.rgba(136/255,136/255,136/255,1)
} }
if(checked){
return borderCheckedColor
}
if(hovered){
return borderHoverColor
}
return borderNormalColor
} }
border.width: 1 border.width: 1
color: { color: {
if(FluTheme.isDark){ if(checked){
if(checked){ if(disabled){
if(mouse_area.containsMouse){ return checkedDisableColor
return Qt.rgba(74/255,149/255,207/255,1)
}
return FluTheme.primaryColor.lighter
} }
if(mouse_area.containsMouse){ if(hovered){
return Qt.rgba(62/255,62/255,62/255,1) return checkedHoverColor
} }
return Qt.rgba(45/255,45/255,45/255,1) return checkedColor
}else{
if(checked){
if(mouse_area.containsMouse){
return Qt.rgba(25/255,117/255,187/255,1)
}
return FluTheme.primaryColor.dark
}
if(mouse_area.containsMouse){
return Qt.rgba(244/255,244/255,244/255,1)
}
return Qt.rgba(247/255,247/255,247/255,1)
} }
if(hovered){
return hoverColor
}
return normalColor
} }
FluIcon { FluIcon {
@ -79,6 +82,7 @@ Item {
id:mouse_area id:mouse_area
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
enabled: !disabled
onClicked: { onClicked: {
if(checkClicked){ if(checkClicked){
checkClicked() checkClicked()

View File

@ -23,10 +23,12 @@ Popup {
anchors.centerIn: Overlay.overlay anchors.centerIn: Overlay.overlay
closePolicy: Popup.CloseOnEscape closePolicy: Popup.CloseOnEscape
background: Rectangle { background: Rectangle {
id:layout_content
implicitWidth:minWidth implicitWidth:minWidth
implicitHeight: text_title.height + text_message.height + layout_actions.height implicitHeight: text_title.height + text_message.height + layout_actions.height
color:FluTheme.isDark ? Qt.rgba(45/255,45/255,45/255,1) : Qt.rgba(249/255,249/255,249/255,1) color:FluTheme.isDark ? Qt.rgba(45/255,45/255,45/255,1) : Qt.rgba(249/255,249/255,249/255,1)
radius:5 radius:5
FluShadow{ FluShadow{
radius: 5 radius: 5
} }

View File

@ -0,0 +1,29 @@
import QtQuick 2.15
import QtQuick.Layouts 1.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
import FluentUI 1.0
Item {
id:root
property alias title: text_title.text
default property alias content: container.data
FluText{
id:text_title
fontStyle: FluText.TitleLarge
}
Item{
clip: true
id:container
anchors{
top: text_title.bottom
bottom: parent.bottom
}
width: parent.width
}
}

View File

@ -10,6 +10,8 @@ Item {
id:root id:root
height: layout_header.height + container.height height: layout_header.height + container.height
width: 400 width: 400
implicitWidth: width
implicitHeight: height
property int contentHeight : 300 property int contentHeight : 300
@ -18,7 +20,7 @@ Item {
Rectangle{ Rectangle{
id:layout_header id:layout_header
width: parent.width width: parent.width
height: 50 height: 45
radius: 4 radius: 4
border.color: FluTheme.isDark ? Qt.rgba(53/255,53/255,53/255,1) : Qt.rgba(240/255,240/255,240/255,1) border.color: FluTheme.isDark ? Qt.rgba(53/255,53/255,53/255,1) : Qt.rgba(240/255,240/255,240/255,1)
color: FluTheme.isDark ? Qt.rgba(61/255,61/255,61/255,1) : Qt.rgba(254/255,254/255,254/255,1) color: FluTheme.isDark ? Qt.rgba(61/255,61/255,61/255,1) : Qt.rgba(254/255,254/255,254/255,1)

View File

@ -8,8 +8,8 @@ Rectangle {
property string text: "Filled Button" property string text: "Filled Button"
property int startPadding : 15 property int startPadding : 15
property int endPadding : 15 property int endPadding : 15
property int topPadding: 8 property int topPadding: 5
property int bottomPadding: 8 property int bottomPadding: 5
property bool disabled: false property bool disabled: false
signal clicked signal clicked

View File

@ -14,9 +14,9 @@ Rectangle {
property bool disabled: false property bool disabled: false
property bool hovered: button_mouse.containsMouse property bool hovered: button_mouse.containsMouse
property color hoverColor: FluTheme.isDark ? Qt.rgba(62/255,62/255,62/255,1) : Qt.rgba(244/255,244/255,244/255,1) property color hoverColor: FluTheme.isDark ? Qt.rgba(62/255,62/255,62/255,1) : Qt.rgba(0,0,0,0.03)
property color normalColor: FluTheme.isDark ? Qt.rgba(50/255,50/255,50/255,1) : Qt.rgba(1,1,1,1) property color normalColor: FluTheme.isDark ? Qt.rgba(0,0,0,0) : Qt.rgba(0,0,0,0)
property color disableColor: FluTheme.isDark ? Qt.rgba(59/255,59/255,59/255,1) : Qt.rgba(1,1,1,1) property color disableColor: FluTheme.isDark ? Qt.rgba(59/255,59/255,59/255,1) : Qt.rgba(0,0,0,0)
property color textColor: { property color textColor: {
if(FluTheme.isDark){ if(FluTheme.isDark){

View File

@ -11,6 +11,7 @@ Popup {
implicitHeight: container.height implicitHeight: container.height
color:FluTheme.isDark ? Qt.rgba(45/255,45/255,45/255,1) : Qt.rgba(237/255,237/255,237/255,1) color:FluTheme.isDark ? Qt.rgba(45/255,45/255,45/255,1) : Qt.rgba(237/255,237/255,237/255,1)
radius: 5 radius: 5
FluShadow{ FluShadow{
radius: 5 radius: 5
} }

View File

@ -3,6 +3,10 @@ import QtQuick.Controls 2.15
import FluentUI 1.0 import FluentUI 1.0
TextArea{ TextArea{
property int fontStyle: FluText.Body
property int pixelSize : FluTheme.textSize
id:input id:input
width: 300 width: 300
color: FluTheme.isDark ? "#FFFFFF" : "#1A1A1A" color: FluTheme.isDark ? "#FFFFFF" : "#1A1A1A"
@ -18,5 +22,57 @@ TextArea{
background: FluTextBoxBackground{ background: FluTextBoxBackground{
inputItem: input inputItem: input
} }
placeholderTextColor: {
if(focus){
return FluTheme.isDark ? Qt.rgba(152/255,152/255,152/255,1) : Qt.rgba(141/255,141/255,141/255,1)
}
return FluTheme.isDark ? Qt.rgba(210/255,210/255,210/255,1) : Qt.rgba(96/255,96/255,96/255,1)
}
font.bold: {
switch (fontStyle) {
case FluText.Display:
return true
case FluText.TitleLarge:
return true
case FluText.Title:
return true
case FluText.Subtitle:
return true
case FluText.BodyLarge:
return false
case FluText.BodyStrong:
return true
case FluText.Body:
return false
case FluText.Caption:
return false
default:
return false
}
}
font.pixelSize: {
switch (fontStyle) {
case FluText.Display:
return input.pixelSize * 4
case FluText.TitleLarge:
return input.pixelSize * 2
case FluText.Title:
return input.pixelSize * 1.5
case FluText.Subtitle:
return input.pixelSize * 0.9
case FluText.BodyLarge:
return input.pixelSize * 1.1
case FluText.BodyStrong:
return input.pixelSize * 1.0
case FluText.Body:
return input.pixelSize * 1.0
case FluText.Caption:
return input.pixelSize * 0.8
default:
return input.pixelSize * 1.0
}
}
} }

View File

@ -0,0 +1,341 @@
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import FluentUI 1.0
Item {
id:root
property FluObject items
property FluObject footerItems
property int displayMode: width<=700 ? FluNavigationView.Minimal : FluNavigationView.Open
property bool displaMinimalNav : false
onDisplayModeChanged: {
if(displayMode === FluNavigationView.Minimal){
anim_navi.enabled = false
displaMinimalNav = false
timer_anim_enable.restart()
}
}
Timer{
id:timer_anim_enable
interval: 150
onTriggered: {
anim_navi.enabled = true
}
}
enum DisplayMode {
Minimal,
Open,
Auto
}
property var window : {
if(Window.window == null)
return null
return Window.window
}
Component{
id:com_panel_item_separatorr
FluDivider{
width: nav_list.width
height: 1
}
}
Component{
id:com_panel_item_header
Item{
height: 30
width: nav_list.width
FluText{
text:model.title
fontStyle: FluText.BodyStrong
anchors{
bottom: parent.bottom
left:parent.left
leftMargin: 10
}
}
}
}
Component{
id:com_panel_item
Item{
height: 38
width: nav_list.width
Rectangle{
radius: 4
anchors{
top: parent.top
bottom: parent.bottom
left: parent.left
right: parent.right
topMargin: 2
bottomMargin: 2
leftMargin: 6
rightMargin: 6
}
MouseArea{
id:item_mouse
hoverEnabled: true
anchors.fill: parent
onClicked: {
if(type===0){
model.repTap()
if(nav_list.currentIndex !== position){
nav_list.currentIndex = position
model.tap()
}
}else{
model.tap()
}
}
}
color: {
if(FluTheme.isDark){
if((nav_list.currentIndex === position)&&type===0){
return "#2D2D2D"
}
if(item_mouse.containsMouse){
return "#292929"
}
return Qt.rgba(0,0,0,0)
}else{
if(item_mouse.containsMouse){
return Qt.rgba(0,0,0,0.03)
}
if(nav_list.currentIndex === position&&type===0){
return Qt.rgba(0,0,0,0.06)
}
return Qt.rgba(0,0,0,0)
}
}
FluText{
text:model.title
anchors{
verticalCenter: parent.verticalCenter
left:parent.left
leftMargin: 14
}
}
}
}
}
Item {
id:nav_app_bar
width: parent.width
height: 38
RowLayout{
height:parent.height
spacing: 0
FluIconButton{
icon: FluentIcons.FA_arrow_left
Layout.leftMargin: 5
Layout.alignment: Qt.AlignVCenter
disabled: nav_swipe.depth === 1
onClicked: {
nav_swipe.pop()
nav_list.stackIndex.pop()
var index = nav_list.stackIndex[nav_list.stackIndex.length-1]
nav_list.enableStack = false
nav_list.currentIndex = index
nav_list.enableStack = true
}
}
FluIconButton{
icon: FluentIcons.FA_navicon
Layout.leftMargin: 5
visible: displayMode === FluNavigationView.Minimal
Layout.alignment: Qt.AlignVCenter
onClicked: {
displaMinimalNav = !displaMinimalNav
}
}
}
RowLayout{
anchors{
right: parent.right
rightMargin: 14
verticalCenter: parent.verticalCenter
}
spacing: 5
FluText{
text:"夜间模式"
fontStyle: FluText.Body
}
FluToggleSwitch{
checked: FluTheme.isDark
onClickFunc:function(){
FluTheme.isDark = !FluTheme.isDark
}
}
}
}
Item{
anchors{
left: displayMode === FluNavigationView.Minimal ? parent.left : layout_list.right
leftMargin: 2
top: nav_app_bar.bottom
right: parent.right
rightMargin: 10
bottom: parent.bottom
bottomMargin: 20
}
StackView{
id:nav_swipe
anchors.fill: parent
clip: true
anchors.margins: 10
popEnter : Transition{}
popExit : Transition{}
pushEnter : Transition{}
pushExit : Transition{}
replaceEnter : Transition{}
replaceExit : Transition{}
}
}
MouseArea{
anchors.fill: parent
enabled: (displayMode === FluNavigationView.Minimal && displaMinimalNav)
onClicked: {
displaMinimalNav = false
}
}
Rectangle{
id:layout_list
width: 300
anchors{
top: nav_app_bar.bottom
bottom: parent.bottom
}
x: {
if(displayMode !== FluNavigationView.Minimal)
return 0
return (displayMode === FluNavigationView.Minimal && displaMinimalNav) ? 0 : -width
}
Behavior on x{
id:anim_navi
NumberAnimation{
duration: 150
}
}
color: {
if(displayMode === FluNavigationView.Minimal){
return FluTheme.isDark ? Qt.rgba(61/255,61/255,61/255,1) : Qt.rgba(243/255,243/255,243/255,1)
}
if(window && window.active){
return FluTheme.isDark ? Qt.rgba(32/255,32/255,32/255,1) : Qt.rgba(238/255,244/255,249/255,1)
}
return FluTheme.isDark ? Qt.rgba(32/255,32/255,32/255,1) : Qt.rgba(243/255,243/255,243/255,1)
}
Behavior on color{
ColorAnimation {
duration: 300
}
}
ListView{
id:nav_list
property bool enableStack: true
property var stackIndex: []
clip: true
anchors{
top: parent.top
left: parent.left
right: parent.right
bottom: layout_footer.top
}
currentIndex: -1
onCurrentIndexChanged: {
if(enableStack){
stackIndex.push(currentIndex)
}
}
model:{
if(items){
return items.children
}
}
boundsBehavior: ListView.StopAtBounds
delegate: Loader{
property var model: modelData
property var position: index
property int type: 0
sourceComponent: {
if(modelData instanceof FluPaneItem){
return com_panel_item
}
if(modelData instanceof FluPaneItemHeader){
return com_panel_item_header
}
if(modelData instanceof FluPaneItemSeparator){
return com_panel_item_separatorr
}
}
}
}
ListView{
id:layout_footer
width: layout_list.width
height: childrenRect.height
anchors.bottom: parent.bottom
boundsBehavior: ListView.StopAtBounds
model: {
if(footerItems){
return footerItems.children
}
}
currentIndex: -1
delegate: Loader{
property var model: modelData
property var position: index
property int type: 1
sourceComponent: {
if(modelData instanceof FluPaneItem){
return com_panel_item
}
if(modelData instanceof FluPaneItemHeader){
return com_panel_item_header
}
if(modelData instanceof FluPaneItemSeparator){
return com_panel_item_separatorr
}
}
}
}
}
function push(url){
nav_swipe.push(url)
}
function setCurrentIndex(index){
nav_list.currentIndex = index
}
}

View File

@ -0,0 +1,7 @@
import QtQuick 2.15
QtObject {
property string title
signal tap
signal repTap
}

View File

@ -0,0 +1,5 @@
import QtQuick 2.15
QtObject {
property string title
}

View File

@ -0,0 +1,5 @@
import QtQuick 2.15
QtObject {
}

View File

@ -4,8 +4,8 @@ import QtQuick.Controls 2.12
FluRectangle { FluRectangle {
id: control id: control
width: 180 width: 150
height: 6 height: 5
radius: [3,3,3,3] radius: [3,3,3,3]
clip: true clip: true
color: FluTheme.isDark ? Qt.rgba(41/255,41/255,41/255,1) : Qt.rgba(214/255,214/255,214/255,1) color: FluTheme.isDark ? Qt.rgba(41/255,41/255,41/255,1) : Qt.rgba(214/255,214/255,214/255,1)

View File

@ -4,13 +4,13 @@ import QtQuick.Controls 2.12
Rectangle { Rectangle {
id: control id: control
width: 60 width: 44
height: 60 height: 44
radius: 30 radius: 22
border.width: linWidth border.width: linWidth
color: "#00000000" color: "#00000000"
border.color: FluTheme.isDark ? Qt.rgba(41/255,41/255,41/255,1) : Qt.rgba(214/255,214/255,214/255,1) border.color: FluTheme.isDark ? Qt.rgba(41/255,41/255,41/255,1) : Qt.rgba(214/255,214/255,214/255,1)
property real linWidth : 6 property real linWidth : 5
property real progress: 0.25 property real progress: 0.25
property bool indeterminate: true property bool indeterminate: true
readonly property real radius2 : radius - linWidth/2 readonly property real radius2 : radius - linWidth/2

View File

@ -0,0 +1,34 @@
import QtQuick 2.15
import QtQuick.Layouts 1.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
import FluentUI 1.0
Item {
id:root
property alias title: text_title.text
default property alias content: container.data
property int spacing : 5
FluText{
id:text_title
fontStyle: FluText.TitleLarge
}
ScrollView{
clip: true
width: parent.width
contentWidth: parent.width
anchors{
top: text_title.bottom
bottom: parent.bottom
}
ColumnLayout{
id:container
spacing: root.spacing
width: parent.width
}
}
}

View File

@ -6,23 +6,44 @@ Item{
id:root id:root
property int lineWidth: 6 property int lineSize: 5
property int dotSize: 30 property int size: 180
property int dotSize: 26
property int value: 50 property int value: 50
enum Orientation {
Horizontal,
Vertical
}
height: control.height
width: control.width
property int orientation: FluSlider.Horizontal
property bool isHorizontal: orientation === FluSlider.Horizontal
rotation: isHorizontal ? 0 : 180
Component.onCompleted: { Component.onCompleted: {
dot.x =value/100*control.width - dotSize/2 if(isHorizontal){
root.value = Qt.binding(function(){ dot.x =value/100*control.width - dotSize/2
return (dot.x+15)/control.width*100 root.value = Qt.binding(function(){
}) return (dot.x+dotSize/2)/control.width*100
})
}else{
dot.y =value/100*control.height - dotSize/2
root.value = Qt.binding(function(){
return (dot.y+dotSize/2)/control.height*100
})
}
} }
FluRectangle { FluRectangle {
id: control id: control
width: isHorizontal ? size : root.lineSize
width: 300 height: isHorizontal ? root.lineSize : size
height: root.lineWidth
radius: [3,3,3,3] radius: [3,3,3,3]
clip: true clip: true
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
@ -30,8 +51,8 @@ Item{
Rectangle{ Rectangle{
id:rect id:rect
radius: 3 radius: 3
width: control.width*(value/100) width: isHorizontal ? control.width*(value/100) : control.width
height: control.height height: isHorizontal ? control.height : control.height*(value/100)
color:FluTheme.isDark ? FluTheme.primaryColor.lighter :FluTheme.primaryColor.dark color:FluTheme.isDark ? FluTheme.primaryColor.lighter :FluTheme.primaryColor.dark
} }
} }
@ -40,11 +61,12 @@ Item{
id:dot id:dot
width: dotSize width: dotSize
height: dotSize height: dotSize
FluShadow{ FluShadow{
radius: 15 radius: dotSize/2
} }
radius: 15 radius: dotSize/2
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: isHorizontal ? parent.verticalCenter : undefined
anchors.horizontalCenter: isHorizontal ? undefined :parent.horizontalCenter
color:FluTheme.isDark ? Qt.rgba(69/255,69/255,69/255,1) :Qt.rgba(1,1,1,1) color:FluTheme.isDark ? Qt.rgba(69/255,69/255,69/255,1) :Qt.rgba(1,1,1,1)
Rectangle{ Rectangle{
width: dotSize/2 width: dotSize/2
@ -65,9 +87,11 @@ Item{
hoverEnabled: true hoverEnabled: true
drag { drag {
target: dot target: dot
axis: Drag.XAxis axis: isHorizontal ? Drag.XAxis : Drag.YAxis
minimumX: -dotSize/2 minimumX: isHorizontal ? -dotSize/2 : 0
maximumX: control.width - dotSize/2 maximumX: isHorizontal ? (control.width - dotSize/2) : 0
minimumY: isHorizontal ? 0 : -dotSize/2
maximumY: isHorizontal ? 0 : (control.height - dotSize/2)
} }
onPressed: { onPressed: {
tool_tip.visible = true tool_tip.visible = true
@ -81,6 +105,7 @@ Item{
FluTooltip{ FluTooltip{
id:tool_tip id:tool_tip
text:String(root.value) text:String(root.value)
y: isHorizontal ? -40 : 32
} }
} }

View File

@ -3,7 +3,9 @@ import FluentUI 1.0
Text { Text {
id:text property int fontStyle: FluText.Body
property color textColor: FluTheme.isDark ? "#FFFFFF" : "#1A1A1A"
property int pixelSize : FluTheme.textSize
enum FontStyle { enum FontStyle {
Display, Display,
@ -16,12 +18,8 @@ Text {
Caption Caption
} }
property int fontStyle: FluText.Body id:text
property color textColor: FluTheme.isDark ? "#FFFFFF" : "#1A1A1A"
property int pixelSize : 14
color: textColor color: textColor
font.bold: { font.bold: {
switch (fontStyle) { switch (fontStyle) {
case FluText.Display: case FluText.Display:
@ -44,7 +42,6 @@ Text {
return false return false
} }
} }
font.pixelSize: { font.pixelSize: {
switch (fontStyle) { switch (fontStyle) {
case FluText.Display: case FluText.Display:
@ -68,5 +65,4 @@ Text {
} }
} }
} }

View File

@ -3,6 +3,10 @@ import QtQuick.Controls 2.15
import FluentUI 1.0 import FluentUI 1.0
TextField{ TextField{
property int fontStyle: FluText.Body
property int pixelSize : FluTheme.textSize
id:input id:input
width: 300 width: 300
color: FluTheme.isDark ? "#FFFFFF" : "#1A1A1A" color: FluTheme.isDark ? "#FFFFFF" : "#1A1A1A"
@ -13,6 +17,56 @@ TextField{
return FluTheme.primaryColor.dark return FluTheme.primaryColor.dark
} }
} }
placeholderTextColor: {
if(focus){
return FluTheme.isDark ? Qt.rgba(152/255,152/255,152/255,1) : Qt.rgba(141/255,141/255,141/255,1)
}
return FluTheme.isDark ? Qt.rgba(210/255,210/255,210/255,1) : Qt.rgba(96/255,96/255,96/255,1)
}
font.bold: {
switch (fontStyle) {
case FluText.Display:
return true
case FluText.TitleLarge:
return true
case FluText.Title:
return true
case FluText.Subtitle:
return true
case FluText.BodyLarge:
return false
case FluText.BodyStrong:
return true
case FluText.Body:
return false
case FluText.Caption:
return false
default:
return false
}
}
font.pixelSize: {
switch (fontStyle) {
case FluText.Display:
return input.pixelSize * 4
case FluText.TitleLarge:
return input.pixelSize * 2
case FluText.Title:
return input.pixelSize * 1.5
case FluText.Subtitle:
return input.pixelSize * 0.9
case FluText.BodyLarge:
return input.pixelSize * 1.1
case FluText.BodyStrong:
return input.pixelSize * 1.0
case FluText.Body:
return input.pixelSize * 1.0
case FluText.Caption:
return input.pixelSize * 0.8
default:
return input.pixelSize * 1.0
}
}
selectByMouse: true selectByMouse: true
background: FluTextBoxBackground{ background: FluTextBoxBackground{
inputItem: input inputItem: input

View File

@ -9,6 +9,9 @@ Rectangle{
radius: 4 radius: 4
layer.enabled: true layer.enabled: true
color: { color: {
if(input.focus){
return FluTheme.isDark ? Qt.rgba(36/255,36/255,36/255,1) : Qt.rgba(1,1,1,1)
}
if(input.hovered){ if(input.hovered){
return FluTheme.isDark ? Qt.rgba(68/255,68/255,68/255,1) : Qt.rgba(251/255,251/255,251/255,1) return FluTheme.isDark ? Qt.rgba(68/255,68/255,68/255,1) : Qt.rgba(251/255,251/255,251/255,1)
} }

View File

@ -5,9 +5,8 @@ import QtQuick.Controls 2.15
import FluentUI 1.0 import FluentUI 1.0
import QtGraphicalEffects 1.15 import QtGraphicalEffects 1.15
Rectangle { Item {
id:root id:root
color: FluTheme.isDark ? Qt.rgba(50/255,50/255,50/255,1) : Qt.rgba(253/255,253/255,253/255,1)
enum TreeViewSelectionMode { enum TreeViewSelectionMode {
None, None,
@ -101,12 +100,12 @@ Rectangle {
if(item_layout.singleSelected && selectionMode === FluTreeView.Single){ if(item_layout.singleSelected && selectionMode === FluTreeView.Single){
return Qt.rgba(62/255,62/255,62/255,1) return Qt.rgba(62/255,62/255,62/255,1)
} }
return (item_layout_mouse.containsMouse || item_layout_expanded.hovered || item_layout_checkbox.hovered)?Qt.rgba(62/255,62/255,62/255,1):Qt.rgba(50/255,50/255,50/255,1) return (item_layout_mouse.containsMouse || item_layout_expanded.hovered || item_layout_checkbox.hovered)?Qt.rgba(62/255,62/255,62/255,1):Qt.rgba(0,0,0,0)
}else{ }else{
if(item_layout.singleSelected && selectionMode === FluTreeView.Single){ if(item_layout.singleSelected && selectionMode === FluTreeView.Single){
return Qt.rgba(244/255,244/255,244/255,1) return Qt.rgba(0,0,0,0.06)
} }
return (item_layout_mouse.containsMouse || item_layout_expanded.hovered || item_layout_checkbox.hovered)?Qt.rgba(244/255,244/255,244/255,1):Qt.rgba(253/255,253/255,253/255,1) return (item_layout_mouse.containsMouse || item_layout_expanded.hovered || item_layout_checkbox.hovered)?Qt.rgba(0,0,0,0.03):Qt.rgba(0,0,0,0)
} }
} }
@ -198,8 +197,6 @@ Rectangle {
} }
} }
} }
} }
checkClicked:function(){ checkClicked:function(){
@ -239,8 +236,8 @@ Rectangle {
FluText { FluText {
text: item_layout.text text: item_layout.text
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
topPadding: 10 topPadding: 7
bottomPadding: 10 bottomPadding: 7
} }
} }
} }

View File

@ -14,7 +14,13 @@ Item {
return Window.window return Window.window
} }
property color color: FluTheme.isDark ? "#202020" : "#F3F3F3" property color color: {
if(window && window.active){
return FluTheme.isDark ? Qt.rgba(32/255,32/255,32/255,1) : Qt.rgba(238/255,244/255,249/255,1)
}
return FluTheme.isDark ? Qt.rgba(32/255,32/255,32/255,1) : Qt.rgba(243/255,243/255,243/255,1)
}
property string title: "FluentUI" property string title: "FluentUI"
property int minimumWidth property int minimumWidth
property int maximumWidth property int maximumWidth
@ -22,13 +28,12 @@ Item {
property int maximumHeight property int maximumHeight
property int borderless:{ property int borderless:{
if(window === null) if(!FluTheme.isFrameless){
return 4
if(Window.window.visibility === Window.Maximized){
return 0 return 0
} }
return 4 return (window && (window.visibility === Window.Maximized)) ? 0 : 4
} }
default property alias content: container.data default property alias content: container.data
FluWindowResize{ FluWindowResize{
@ -43,11 +48,7 @@ Item {
Rectangle{ Rectangle{
property color borerlessColor : FluTheme.isDark ? FluTheme.primaryColor.lighter : FluTheme.primaryColor.dark property color borerlessColor : FluTheme.isDark ? FluTheme.primaryColor.lighter : FluTheme.primaryColor.dark
color: { color: (window && window.active) ? borerlessColor : Qt.lighter(borerlessColor,1.1)
if(window === null)
return borerlessColor
return window.active ? borerlessColor : Qt.lighter(borerlessColor,1.1)
}
border.width: 1 border.width: 1
anchors.fill: parent anchors.fill: parent
radius: 4 radius: 4
@ -59,6 +60,12 @@ Item {
color:root.color color:root.color
anchors.fill: parent anchors.fill: parent
anchors.margins: borderless anchors.margins: borderless
clip: true
Behavior on color{
ColorAnimation {
duration: 300
}
}
} }
Component.onCompleted: { Component.onCompleted: {

0
src/macos_install.sh Normal file → Executable file
View File

View File

@ -35,5 +35,13 @@
<file>controls/FluContentDialog.qml</file> <file>controls/FluContentDialog.qml</file>
<file>controls/FluTreeView.qml</file> <file>controls/FluTreeView.qml</file>
<file>controls/FluExpander.qml</file> <file>controls/FluExpander.qml</file>
<file>controls/FluAutoSuggestBox.qml</file>
<file>controls/FluNavigationView.qml</file>
<file>controls/FluPaneItem.qml</file>
<file>controls/FluPaneItemHeader.qml</file>
<file>controls/FluPaneItemSeparator.qml</file>
<file>controls/FluScrollablePage.qml</file>
<file>controls/FluContentPage.qml</file>
<file>controls/FluArea.qml</file>
</qresource> </qresource>
</RCC> </RCC>