From 392f6e00472a3bee8018dc88bd47c250b6417ae5 Mon Sep 17 00:00:00 2001 From: zhuzihcu Date: Wed, 1 Mar 2023 11:58:30 +0800 Subject: [PATCH] update --- example/App.qml | 1 + example/MainPage.qml | 8 +- example/T-Rectangle.qml | 60 ------------ example/T_Rectangle.qml | 145 ++++++++++++++++++++++++++++ example/T_Slider.qml | 27 ++++++ example/qml.qrc | 16 ++- example/res/image/image_huoyin.webp | Bin 0 -> 60408 bytes example/res/svg/avatar_1.svg | 1 + example/res/svg/avatar_10.svg | 1 + example/res/svg/avatar_11.svg | 1 + example/res/svg/avatar_12.svg | 1 + example/res/svg/avatar_2.svg | 1 + example/res/svg/avatar_3.svg | 1 + example/res/svg/avatar_4.svg | 1 + example/res/svg/avatar_5.svg | 1 + example/res/svg/avatar_6.svg | 1 + example/res/svg/avatar_7.svg | 1 + example/res/svg/avatar_8.svg | 1 + example/res/svg/avatar_9.svg | 1 + src/FluApp.cpp | 1 + src/FluApp.h | 1 + src/Fluent.cpp | 2 +- src/WindowHelper.cpp | 7 ++ src/WindowHelper.h | 2 + src/build-preset/plugins.qmltypes | 39 +++++--- src/controls/FluAppBar.qml | 7 ++ src/controls/FluDropShadow.qml | 8 ++ src/controls/FluProgressBar.qml | 43 +++------ src/controls/FluProgressRing.qml | 64 ++++++------ src/controls/FluRectangle.qml | 52 +++++----- src/controls/FluShadow.qml | 71 -------------- src/controls/FluSlider.qml | 17 ++-- src/controls/FluTooltip.qml | 6 +- src/controls/FluWindow.qml | 8 ++ src/controls/TFpsMonitor.qml | 70 ++++++++++++++ src/res.qrc | 3 +- 36 files changed, 427 insertions(+), 243 deletions(-) delete mode 100644 example/T-Rectangle.qml create mode 100644 example/T_Rectangle.qml create mode 100644 example/T_Slider.qml create mode 100644 example/res/image/image_huoyin.webp create mode 100644 example/res/svg/avatar_1.svg create mode 100644 example/res/svg/avatar_10.svg create mode 100644 example/res/svg/avatar_11.svg create mode 100644 example/res/svg/avatar_12.svg create mode 100644 example/res/svg/avatar_2.svg create mode 100644 example/res/svg/avatar_3.svg create mode 100644 example/res/svg/avatar_4.svg create mode 100644 example/res/svg/avatar_5.svg create mode 100644 example/res/svg/avatar_6.svg create mode 100644 example/res/svg/avatar_7.svg create mode 100644 example/res/svg/avatar_8.svg create mode 100644 example/res/svg/avatar_9.svg create mode 100644 src/controls/FluDropShadow.qml delete mode 100644 src/controls/FluShadow.qml create mode 100644 src/controls/TFpsMonitor.qml diff --git a/example/App.qml b/example/App.qml index 0c86219b..d71ef1dc 100644 --- a/example/App.qml +++ b/example/App.qml @@ -9,6 +9,7 @@ Window { id:app color: "#00000000" Component.onCompleted: { + FluApp.isFps = true FluApp.setAppWindow(app) FluApp.routes = { "/":"qrc:/MainPage.qml", diff --git a/example/MainPage.qml b/example/MainPage.qml index 8047cb9f..98838988 100644 --- a/example/MainPage.qml +++ b/example/MainPage.qml @@ -10,6 +10,8 @@ FluWindow { width: 800 height: 600 title: "FluentUI" + minimumSize: Qt.size(600,400) + // property var maximumSize FluAppBar{ id:appbar @@ -26,6 +28,10 @@ FluWindow { text:"ToggleSwitch" page:"qrc:/T_ToggleSwitch.qml" } + ListElement{ + text:"Slider" + page:"qrc:/T_Slider.qml" + } ListElement{ text:"InfoBar" page:"qrc:/T_InfoBar.qml" @@ -36,7 +42,7 @@ FluWindow { } ListElement{ text:"Rectangle" - page:"qrc:/T-Rectangle.qml" + page:"qrc:/T_Rectangle.qml" } ListElement{ text:"Typography" diff --git a/example/T-Rectangle.qml b/example/T-Rectangle.qml deleted file mode 100644 index ebad9aaf..00000000 --- a/example/T-Rectangle.qml +++ /dev/null @@ -1,60 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Layouts 1.15 -import QtQuick.Window 2.15 -import QtGraphicalEffects 1.15 -import FluentUI 1.0 - -Item { - - ColumnLayout{ - spacing: 5 - - FluText{ - text:"Rectangle" - fontStyle: FluText.TitleLarge - Layout.topMargin: 20 - } - - 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] - } - - FluRectangle{ - width: 50 - height: 50 - color:"#744da9" - radius:[15,15,15,15] - } - - FluRectangle{ - width: 50 - height: 50 - color:"#0078d4" - radius:[0,0,0,0] - } - } -} diff --git a/example/T_Rectangle.qml b/example/T_Rectangle.qml new file mode 100644 index 00000000..2da12efe --- /dev/null +++ b/example/T_Rectangle.qml @@ -0,0 +1,145 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Window 2.15 +import QtGraphicalEffects 1.15 +import FluentUI 1.0 + +Item { + + ColumnLayout{ + spacing: 5 + + FluText{ + text:"Rectangle" + fontStyle: FluText.TitleLarge + } + + RowLayout{ + 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] + } + + } + + 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" + } + layer.enabled: true + layer.effect: FluDropShadow {} + + } + FluRectangle{ + width: 50 + height: 50 + radius:[10,10,10,10] + Image { + asynchronous: true + anchors.fill: parent + source: "qrc:/res/svg/avatar_2.svg" + } + layer.enabled: true + layer.effect: FluDropShadow {} + } + FluRectangle{ + width: 50 + height: 50 + radius:[25,25,25,25] + Image { + asynchronous: true + anchors.fill: parent + source: "qrc:/res/svg/avatar_3.svg" + } + layer.enabled: true + layer.effect: DropShadow { + radius: 5 + samples: 4 + color: "#80000000" + } + } + FluRectangle{ + width: 50 + height: 50 + radius:[0,25,25,25] + Image { + asynchronous: true + anchors.fill: parent + source: "qrc:/res/svg/avatar_4.svg" + } + layer.enabled: true + layer.effect: FluDropShadow {} + } + } + + 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 + } + Layout.topMargin: 10 + layer.enabled: true + layer.effect: FluDropShadow {} + } + + + + + } +} diff --git a/example/T_Slider.qml b/example/T_Slider.qml new file mode 100644 index 00000000..51519b02 --- /dev/null +++ b/example/T_Slider.qml @@ -0,0 +1,27 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Window 2.15 +import QtGraphicalEffects 1.15 +import FluentUI 1.0 + +Item { + + ColumnLayout{ + spacing: 5 + + + FluText{ + text:"Slider" + fontStyle: FluText.TitleLarge + } + + FluSlider{ + Layout.topMargin: 20 + value: 50 + } + + + } + + +} diff --git a/example/qml.qrc b/example/qml.qrc index 56244fdd..47c0b134 100644 --- a/example/qml.qrc +++ b/example/qml.qrc @@ -7,8 +7,22 @@ SettingPage.qml AboutPage.qml T_Buttons.qml - T-Rectangle.qml + T_Rectangle.qml T_InfoBar.qml T_Progress.qml + T_Slider.qml + res/image/image_huoyin.webp + res/svg/avatar_1.svg + res/svg/avatar_2.svg + res/svg/avatar_3.svg + res/svg/avatar_4.svg + res/svg/avatar_5.svg + res/svg/avatar_6.svg + res/svg/avatar_7.svg + res/svg/avatar_8.svg + res/svg/avatar_9.svg + res/svg/avatar_10.svg + res/svg/avatar_11.svg + res/svg/avatar_12.svg diff --git a/example/res/image/image_huoyin.webp b/example/res/image/image_huoyin.webp new file mode 100644 index 0000000000000000000000000000000000000000..1b6557ddda89dc3f2954aac397a85b014a329961 GIT binary patch literal 60408 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 rDWKw9pNb0x{P8Yw}?{`1<@=#>4DtBt0 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 Jea$#X005hPobdnv literal 0 HcmV?d00001 diff --git a/example/res/svg/avatar_1.svg b/example/res/svg/avatar_1.svg new file mode 100644 index 00000000..8ea966a1 --- /dev/null +++ b/example/res/svg/avatar_1.svg @@ -0,0 +1 @@ +touxiang \ No newline at end of file diff --git a/example/res/svg/avatar_10.svg b/example/res/svg/avatar_10.svg new file mode 100644 index 00000000..b729a36d --- /dev/null +++ b/example/res/svg/avatar_10.svg @@ -0,0 +1 @@ +touxiang \ No newline at end of file diff --git a/example/res/svg/avatar_11.svg b/example/res/svg/avatar_11.svg new file mode 100644 index 00000000..2859ab21 --- /dev/null +++ b/example/res/svg/avatar_11.svg @@ -0,0 +1 @@ +touxiang \ No newline at end of file diff --git a/example/res/svg/avatar_12.svg b/example/res/svg/avatar_12.svg new file mode 100644 index 00000000..b76d2a92 --- /dev/null +++ b/example/res/svg/avatar_12.svg @@ -0,0 +1 @@ +touxiang \ No newline at end of file diff --git a/example/res/svg/avatar_2.svg b/example/res/svg/avatar_2.svg new file mode 100644 index 00000000..40ddfc93 --- /dev/null +++ b/example/res/svg/avatar_2.svg @@ -0,0 +1 @@ +touxiang \ No newline at end of file diff --git a/example/res/svg/avatar_3.svg b/example/res/svg/avatar_3.svg new file mode 100644 index 00000000..93dfa60e --- /dev/null +++ b/example/res/svg/avatar_3.svg @@ -0,0 +1 @@ +touxiang \ No newline at end of file diff --git a/example/res/svg/avatar_4.svg b/example/res/svg/avatar_4.svg new file mode 100644 index 00000000..bbc845a8 --- /dev/null +++ b/example/res/svg/avatar_4.svg @@ -0,0 +1 @@ +touxiang \ No newline at end of file diff --git a/example/res/svg/avatar_5.svg b/example/res/svg/avatar_5.svg new file mode 100644 index 00000000..98d4f7df --- /dev/null +++ b/example/res/svg/avatar_5.svg @@ -0,0 +1 @@ +touxiang \ No newline at end of file diff --git a/example/res/svg/avatar_6.svg b/example/res/svg/avatar_6.svg new file mode 100644 index 00000000..11541a6e --- /dev/null +++ b/example/res/svg/avatar_6.svg @@ -0,0 +1 @@ +touxiang \ No newline at end of file diff --git a/example/res/svg/avatar_7.svg b/example/res/svg/avatar_7.svg new file mode 100644 index 00000000..2c0840b6 --- /dev/null +++ b/example/res/svg/avatar_7.svg @@ -0,0 +1 @@ +touxiang \ No newline at end of file diff --git a/example/res/svg/avatar_8.svg b/example/res/svg/avatar_8.svg new file mode 100644 index 00000000..26ebb645 --- /dev/null +++ b/example/res/svg/avatar_8.svg @@ -0,0 +1 @@ +touxiang \ No newline at end of file diff --git a/example/res/svg/avatar_9.svg b/example/res/svg/avatar_9.svg new file mode 100644 index 00000000..3c16a753 --- /dev/null +++ b/example/res/svg/avatar_9.svg @@ -0,0 +1 @@ +touxiang \ No newline at end of file diff --git a/src/FluApp.cpp b/src/FluApp.cpp index 33061990..2b75b0ae 100644 --- a/src/FluApp.cpp +++ b/src/FluApp.cpp @@ -22,6 +22,7 @@ FluApp::FluApp(QObject *parent) : QObject{parent} { isDark(true); + isFps(true); } diff --git a/src/FluApp.h b/src/FluApp.h index bfc04195..8dcd6856 100644 --- a/src/FluApp.h +++ b/src/FluApp.h @@ -12,6 +12,7 @@ class FluApp : public QObject Q_OBJECT Q_PROPERTY_AUTO(QString,initialRoute); Q_PROPERTY_AUTO(bool,isDark); + Q_PROPERTY_AUTO(bool,isFps); Q_PROPERTY_AUTO(QJsonObject,routes); public: diff --git a/src/Fluent.cpp b/src/Fluent.cpp index 87e8d033..98779878 100644 --- a/src/Fluent.cpp +++ b/src/Fluent.cpp @@ -30,7 +30,7 @@ void Fluent::registerTypes(const char *uri){ qmlRegisterType(uri,major,minor,"WindowHelper"); - qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluShadow.qml"),uri,major,minor,"FluShadow"); + qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluDropShadow.qml"),uri,major,minor,"FluDropShadow"); qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluTooltip.qml"),uri,major,minor,"FluTooltip"); qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluDivider.qml"),uri,major,minor,"FluDivider"); qmlRegisterType(QUrl("qrc:/com.zhuzichu/controls/FluIcon.qml"),uri,major,minor,"FluIcon"); diff --git a/src/WindowHelper.cpp b/src/WindowHelper.cpp index dabade55..65ad7222 100644 --- a/src/WindowHelper.cpp +++ b/src/WindowHelper.cpp @@ -14,3 +14,10 @@ void WindowHelper::setTitle(const QString& text){ void WindowHelper::initWindow(FramelessView* window){ this->window = window; } + +void WindowHelper::setMinimumSize(const QSize &size){ + this->window->setMinimumSize(size); +} +void WindowHelper::setMaximumSize(const QSize &size){ + this->window->setMaximumSize(size); +} diff --git a/src/WindowHelper.h b/src/WindowHelper.h index 678ea5bb..8258d2c5 100644 --- a/src/WindowHelper.h +++ b/src/WindowHelper.h @@ -16,6 +16,8 @@ public: Q_INVOKABLE void initWindow(FramelessView* window); Q_INVOKABLE void setTitle(const QString& text); + Q_INVOKABLE void setMinimumSize(const QSize &size); + Q_INVOKABLE void setMaximumSize(const QSize &size); private: FramelessView* window; diff --git a/src/build-preset/plugins.qmltypes b/src/build-preset/plugins.qmltypes index f237561c..f4075a3e 100644 --- a/src/build-preset/plugins.qmltypes +++ b/src/build-preset/plugins.qmltypes @@ -817,6 +817,14 @@ Module { name: "setTitle" Parameter { name: "text"; type: "string" } } + Method { + name: "setMinimumSize" + Parameter { name: "size"; type: "QSize" } + } + Method { + name: "setMaximumSize" + Parameter { name: "size"; type: "QSize" } + } } Component { prototype: "QQuickRectangle" @@ -896,6 +904,24 @@ Module { isComposite: true defaultProperty: "data" } + Component { + prototype: "QQuickItem" + name: "FluentUI/FluDropShadow 1.0" + exports: ["FluentUI/FluDropShadow 1.0"] + exportMetaObjectRevisions: [0] + isComposite: true + defaultProperty: "data" + Property { name: "fast"; type: "bool" } + Property { name: "source"; type: "QVariant" } + Property { name: "radius"; type: "double" } + Property { name: "samples"; type: "int" } + Property { name: "color"; type: "QColor" } + Property { name: "horizontalOffset"; type: "double" } + Property { name: "verticalOffset"; type: "double" } + Property { name: "spread"; type: "double" } + Property { name: "cached"; type: "bool" } + Property { name: "transparentBorder"; type: "bool" } + } Component { prototype: "QQuickRectangle" name: "FluentUI/FluFilledButton 1.0" @@ -1072,17 +1098,6 @@ Module { Property { name: "borderWidth"; type: "int" } Property { name: "contentItem"; type: "QQuickItem"; isList: true; isReadonly: true } } - Component { - prototype: "QQuickItem" - name: "FluentUI/FluShadow 1.0" - exports: ["FluentUI/FluShadow 1.0"] - exportMetaObjectRevisions: [0] - isComposite: true - defaultProperty: "data" - Property { name: "shadowColor"; type: "QColor" } - Property { name: "radius"; type: "int" } - Property { name: "isShadow"; type: "bool" } - } Component { prototype: "QQuickItem" name: "FluentUI/FluSlider 1.0" @@ -1161,6 +1176,8 @@ Module { defaultProperty: "data" Property { name: "isMax"; type: "bool" } Property { name: "title"; type: "string" } + Property { name: "minimumSize"; type: "QVariant" } + Property { name: "maximumSize"; type: "QVariant" } Property { name: "window"; type: "QVariant" } Method { name: "showSuccess" diff --git a/src/controls/FluAppBar.qml b/src/controls/FluAppBar.qml index 753020f1..92c90667 100644 --- a/src/controls/FluAppBar.qml +++ b/src/controls/FluAppBar.qml @@ -53,6 +53,13 @@ Rectangle{ height: parent.height spacing: 5 + TFpsMonitor{ + Layout.alignment: Qt.AlignVCenter + Layout.rightMargin: 12 + Layout.topMargin: 5 + visible: FluApp.isFps + } + RowLayout{ Layout.alignment: Qt.AlignVCenter spacing: 5 diff --git a/src/controls/FluDropShadow.qml b/src/controls/FluDropShadow.qml new file mode 100644 index 00000000..58e55668 --- /dev/null +++ b/src/controls/FluDropShadow.qml @@ -0,0 +1,8 @@ +import QtQuick 2.15 +import QtGraphicalEffects 1.15 + +DropShadow { + radius: 5 + samples: 4 + color: FluApp.isDark ? "#80FFFFFF" : "#80000000" +} diff --git a/src/controls/FluProgressBar.qml b/src/controls/FluProgressBar.qml index c81c1726..70a61767 100644 --- a/src/controls/FluProgressBar.qml +++ b/src/controls/FluProgressBar.qml @@ -1,7 +1,6 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 -//进度条4 FluRectangle { id: control @@ -9,51 +8,41 @@ FluRectangle { height: 6 radius: [3,3,3,3] clip: true - color:Qt.rgba(214/255,214/255,214/255,1) - property real progress: 0.25 + color: FluApp.isDark ? Qt.rgba(41/255,41/255,41/255,1) : Qt.rgba(214/255,214/255,214/255,1) + property real progress: 0.5 property bool indeterminate: true Component.onCompleted: { - anim.enabled = false if(indeterminate){ - rect.x = -control.width*0.5 + bar.x = -control.width*0.5 + behavior.enabled = true + bar.x = control.width }else{ - rect.x = 0 + bar.x = 0 } - anim.enabled = true - } + } Rectangle{ - id:rect + id:bar radius: 3 width: control.width*progress height: control.height - color:Qt.rgba(0/255,102/255,180/255,1) + color:FluApp.isDark ? Qt.rgba(76/255,160/255,224/255,1) : Qt.rgba(0/255,102/255,180/255,1) Behavior on x{ - id:anim - enabled: true + id:behavior + enabled: false NumberAnimation{ - duration: 800 + duration: 1000 onRunningChanged: { if(!running){ - anim.enabled = false - rect.x = -control.width*0.5 - anim.enabled = true - timer.start() + behavior.enabled = false + bar.x = -control.width*0.5 + behavior.enabled = true + bar.x = control.width } } } } - - Timer{ - id:timer - running: indeterminate - interval: 800 - triggeredOnStart: true - onTriggered: { - rect.x = control.width - } - } } } diff --git a/src/controls/FluProgressRing.qml b/src/controls/FluProgressRing.qml index d2d857f5..96c1b5f7 100644 --- a/src/controls/FluProgressRing.qml +++ b/src/controls/FluProgressRing.qml @@ -1,7 +1,6 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 -//进度条4 Rectangle { id: control @@ -10,28 +9,42 @@ Rectangle { radius: 30 border.width: linWidth color: "#00000000" - border.color: Qt.rgba(214/255,214/255,214/255,1) + border.color: FluApp.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 progress: 0.25 property bool indeterminate: true readonly property real radius2 : radius - linWidth/2 - property color primaryColor : Qt.rgba(0/255,102/255,180/255,1) + property color primaryColor : FluApp.isDark ? Qt.rgba(76/255,160/255,224/255,1) : Qt.rgba(0/255,102/255,180/255,1) onProgressChanged: { canvas.requestPaint() } + Connections{ + target: FluApp + function onIsDarkChanged(isDark){ + canvas.requestPaint() + } + } + + Component.onCompleted: { + if(indeterminate){ + behavior.enabled = true + control.rotation = 360 + } + } + Behavior on rotation{ - id:anim - enabled: true + id:behavior + enabled: false NumberAnimation{ - duration: 800 + duration: 1000 onRunningChanged: { if(!running){ - anim.enabled = false + behavior.enabled = false control.rotation = 0 - anim.enabled = true - timer.start() + behavior.enabled = true + control.rotation = 360 } } } @@ -54,30 +67,21 @@ Rectangle { ctx.arc(width/2, height/2, radius2 ,-0.5 * Math.PI,-0.5 * Math.PI + progress * 2 * Math.PI); ctx.stroke(); ctx.closePath(); -// var start_x = width/2 + Math.cos(-0.5 * Math.PI) * radius2; -// var start_y = height/2 + Math.sin(-0.5 * Math.PI) * radius2; -// ctx.beginPath(); -// ctx.arc(start_x, start_y, 3, 0, 2*Math.PI); -// ctx.fill(); -// ctx.closePath(); -// var end_x = width/2 + Math.cos(-0.5 * Math.PI + progress * 2 * Math.PI) * radius2; -// var end_y = height/2 + Math.sin(-0.5 * Math.PI + progress * 2 * Math.PI) * radius2; -// ctx.beginPath(); -// ctx.arc(end_x, end_y, 3, 0, 2*Math.PI); -// ctx.fill(); -// ctx.closePath(); + // var start_x = width/2 + Math.cos(-0.5 * Math.PI) * radius2; + // var start_y = height/2 + Math.sin(-0.5 * Math.PI) * radius2; + // ctx.beginPath(); + // ctx.arc(start_x, start_y, 3, 0, 2*Math.PI); + // ctx.fill(); + // ctx.closePath(); + // var end_x = width/2 + Math.cos(-0.5 * Math.PI + progress * 2 * Math.PI) * radius2; + // var end_y = height/2 + Math.sin(-0.5 * Math.PI + progress * 2 * Math.PI) * radius2; + // ctx.beginPath(); + // ctx.arc(end_x, end_y, 3, 0, 2*Math.PI); + // ctx.fill(); + // ctx.closePath(); ctx.restore(); } } - Timer{ - id:timer - running: indeterminate - interval: 800 - triggeredOnStart: true - onTriggered: { - control.rotation = 360 - } - } } diff --git a/src/controls/FluRectangle.qml b/src/controls/FluRectangle.qml index 721e75c3..ea14824e 100644 --- a/src/controls/FluRectangle.qml +++ b/src/controls/FluRectangle.qml @@ -1,13 +1,12 @@ import QtQuick 2.15 import QtQuick.Controls 2.15 -import QtQuick.Shapes 1.15 import QtGraphicalEffects 1.15 Item{ id:root property var radius:[0,0,0,0] property color color : "#FFFFFF" - property color borderColor:"transparent" + property color borderColor:"red" property int borderWidth: 1 default property alias contentItem: container.children @@ -20,35 +19,40 @@ Item{ } - Shape { - id: shape - width: root.width - height: root.height - layer.enabled: true - layer.samples: 4 - layer.smooth: true + Canvas { + id: canvas + anchors.fill: parent visible: false - ShapePath { - startX: 0 - startY: radius[0] - fillColor: color - strokeColor: borderColor - strokeWidth: borderWidth - PathQuad { x: radius[0]; y: 0; controlX: 0; controlY: 0 } - PathLine { x: shape.width - radius[1]; y: 0 } - PathQuad { x: shape.width; y: radius[1]; controlX: shape.width; controlY: 0 } - PathLine { x: shape.width; y: shape.height - radius[2] } - PathQuad { x: shape.width - radius[2]; y: shape.height; controlX: shape.width; controlY: shape.height } - PathLine { x: radius[3]; y: shape.height } - PathQuad { x: 0; y: shape.height - radius[3]; controlX: 0; controlY: shape.height } - PathLine { x: 0; y: radius[0] } + onPaint: { + var ctx = getContext("2d"); + var x = 0; + var y = 0; + var w = root.width; + var h = root.height; + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.save(); + ctx.beginPath(); + ctx.moveTo(x + radius[0], y); + ctx.lineTo(x + w - radius[1], y); + ctx.arcTo(x + w, y, x + w, y + radius[1], radius[1]); + ctx.lineTo(x + w, y + h - radius[2]); + ctx.arcTo(x + w, y + h, x + w - radius[2], y + h, radius[2]); + ctx.lineTo(x + radius[3], y + h); + ctx.arcTo(x, y + h, x, y + h - radius[3], radius[3]); + ctx.lineTo(x, y + radius[0]); + ctx.arcTo(x, y, x + radius[0], y, radius[0]); + ctx.closePath(); + ctx.fillStyle = root.color; + ctx.fill(); + ctx.restore(); } } OpacityMask { anchors.fill: container source: container - maskSource: shape + maskSource: canvas } } diff --git a/src/controls/FluShadow.qml b/src/controls/FluShadow.qml deleted file mode 100644 index 4e100aca..00000000 --- a/src/controls/FluShadow.qml +++ /dev/null @@ -1,71 +0,0 @@ -import QtQuick 2.15 - -Item { - - id:root - - anchors.fill: parent - anchors.margins: -5 - property color shadowColor: "#333333" - property int radius: 5 - property bool isShadow: true - - - Rectangle{ - id:react_background - width: root.width - 8 - height: root.height - 8 - anchors.centerIn: parent - radius: root.radius - color:"#00000000" - opacity: 0.25 - border.width: 1 - border.color : Qt.lighter(shadowColor,1.1) - } - - Rectangle{ - width: root.width - 6 - height: root.height - 6 - anchors.centerIn: parent - radius: root.radius - color:"#00000000" - border.width: 1 - opacity: 0.2 - border.color : Qt.lighter(shadowColor,1.2) - } - - Rectangle{ - width: root.width - 4 - height: root.height - 4 - anchors.centerIn: parent - radius: root.radius - color:"#00000000" - border.width: 1 - opacity: 0.15 - border.color : Qt.lighter(shadowColor,1.3) - } - - Rectangle{ - width: root.width - 2 - height: root.height - 2 - anchors.centerIn: parent - radius: root.radius - color:"#00000000" - border.width: 1 - opacity: 0.1 - border.color : Qt.lighter(shadowColor,1.4) - } - - Rectangle{ - width: root.width - height: root.height - anchors.centerIn: parent - radius: root.radius - color:"#00000000" - border.width: 1 - opacity:0.05 - border.color : Qt.lighter(shadowColor,1.5) - } - - -} diff --git a/src/controls/FluSlider.qml b/src/controls/FluSlider.qml index f245aab0..fea3a562 100644 --- a/src/controls/FluSlider.qml +++ b/src/controls/FluSlider.qml @@ -26,18 +26,16 @@ Item{ radius: [3,3,3,3] clip: true anchors.verticalCenter: parent.verticalCenter - color:Qt.rgba(138/255,138/255,138/255,1) - + color:FluApp.isDark ? Qt.rgba(162/255,162/255,162/255,1) : Qt.rgba(138/255,138/255,138/255,1) Rectangle{ id:rect radius: 3 width: control.width*(value/100) height: control.height - color:Qt.rgba(0/255,102/255,180/255,1) + color:FluApp.isDark ? Qt.rgba(76/255,160/255,224/255,1) :Qt.rgba(0/255,102/255,180/255,1) } - - } + Rectangle{ id:dot width: dotSize @@ -45,16 +43,13 @@ Item{ radius: 15 anchors.verticalCenter: parent.verticalCenter layer.enabled: true - layer.effect: DropShadow { - radius: 5 - samples: 4 - color: "#80000000" - } + color:FluApp.isDark ? Qt.rgba(69/255,69/255,69/255,1) :Qt.rgba(1,1,1,1) + layer.effect: FluDropShadow {} Rectangle{ width: dotSize/2 height: dotSize/2 radius: dotSize/4 - color:Qt.rgba(0/255,102/255,180/255,1) + color:FluApp.isDark ? Qt.rgba(76/255,160/255,224/255,1) :Qt.rgba(0/255,102/255,180/255,1) anchors.centerIn: parent scale: control_mouse.containsMouse ? 1.2 : 1 Behavior on scale { diff --git a/src/controls/FluTooltip.qml b/src/controls/FluTooltip.qml index f71a3897..44963462 100644 --- a/src/controls/FluTooltip.qml +++ b/src/controls/FluTooltip.qml @@ -19,10 +19,6 @@ ToolTip { color: FluApp.isDark ? Qt.rgba(50/255,49/255,48/255,1) : Qt.rgba(1,1,1,1) radius: 5 layer.enabled: true - layer.effect: DropShadow { - radius: 5 - samples: 4 - color: "#80000000" - } + layer.effect: FluDropShadow {} } } diff --git a/src/controls/FluWindow.qml b/src/controls/FluWindow.qml index db939264..dafb41c1 100644 --- a/src/controls/FluWindow.qml +++ b/src/controls/FluWindow.qml @@ -12,6 +12,8 @@ Rectangle { return Window.Maximized === Window.window.visibility } property string title: "FluentUI" + property var minimumSize + property var maximumSize Behavior on opacity{ NumberAnimation{ @@ -47,6 +49,12 @@ Rectangle { if(FluApp.equalsWindow(view,window)){ helper.initWindow(view); helper.setTitle(title); + if(minimumSize){ + helper.setMinimumSize(minimumSize) + } + if(maximumSize){ + helper.setMaximumSize(maximumSize) + } } } } diff --git a/src/controls/TFpsMonitor.qml b/src/controls/TFpsMonitor.qml new file mode 100644 index 00000000..e114dbd8 --- /dev/null +++ b/src/controls/TFpsMonitor.qml @@ -0,0 +1,70 @@ +import QtQuick 2.15 +import FluentUI 1.0 + + +/*! TODO */ +Item { + id: toou2d_fps + width: contentItemLoader.width + 5; + height: contentItemLoader.height + 5; + + readonly property alias fps: _private.fps; + readonly property alias fpsAvg: _private.fpsAvg; + + property color color: "#C0C0C0" + property Component contentItem: contentComponent; + + Component{ + id:contentComponent + FluText{ + text: " Avg " + fpsAvg + " | " + fps + " Fps"; + } + } + + FluObject{ + id:_private; + property int frameCounter: 0 + property int frameCounterAvg: 0 + property int counter: 0 + property int fps: 0 + property int fpsAvg: 0 + } + + Rectangle { + id: monitor + radius: 3 + width: 6 + height: width + opacity: 0; + + NumberAnimation on rotation { + from:0 + to: 360 + duration: 800 + loops: Animation.Infinite + } + onRotationChanged: _private.frameCounter++; + } + + Loader{ + id:contentItemLoader + sourceComponent: contentItem + } + + Timer { + interval: 2000 + repeat: true + running: visible + onTriggered: { + _private.frameCounterAvg += _private.frameCounter; + _private.fps = _private.frameCounter/2; + _private.counter++; + _private.frameCounter = 0; + if (_private.counter >= 3) { + _private.fpsAvg = _private.frameCounterAvg/(2 * _private.counter) + _private.frameCounterAvg = 0; + _private.counter = 0; + } + } + } +} diff --git a/src/res.qrc b/src/res.qrc index 8e83cb0b..4061d98b 100644 --- a/src/res.qrc +++ b/src/res.qrc @@ -23,6 +23,7 @@ controls/FluIcon.qml controls/FluDivider.qml controls/FluTooltip.qml - controls/FluShadow.qml + controls/FluDropShadow.qml + controls/TFpsMonitor.qml