Kylin/Fluent/qml/InfoBar.qml
2024-09-01 00:33:29 +08:00

245 lines
10 KiB
QML

import QtQuick as Quick
import QtQuick.Controls
import Fluent
Object {
property var root
property int layoutY: 75
id:control
Object{
id:mcontrol
property string const_success: "success"
property string const_info: "info"
property string const_warning: "warning"
property string const_error: "error"
property int maxWidth: 300
property var screenLayout: null
function create(type,text,duration,moremsg){
if(screenLayout){
var last = screenLayout.getLastloader()
if(last.type === type && last.text === text && moremsg === last.moremsg){
last.duration = duration
if (duration > 0) last.restart()
return last
}
}
initScreenLayout()
return contentComponent.createObject(screenLayout,{type:type,text:text,duration:duration,moremsg:moremsg,})
}
function createCustom(itemcomponent,duration){
initScreenLayout()
if(itemcomponent){
return contentComponent.createObject(screenLayout,{itemcomponent:itemcomponent,duration:duration})
}
}
function initScreenLayout(){
if(screenLayout == null){
screenLayout = screenlayoutComponent.createObject(root)
screenLayout.y = control.layoutY
screenLayout.z = 100000
}
}
Quick.Component{
id:screenlayoutComponent
Quick.Column{
parent: Overlay.overlay
z:999
spacing: 20
width: root.width
move: Quick.Transition {
Quick.NumberAnimation {
properties: "y"
easing.type: Quick.Easing.OutCubic
duration: Theme.animationEnabled ? 333 : 0
}
}
onChildrenChanged: if(children.length === 0) destroy()
function getLastloader(){
if(children.length > 0){
return children[children.length - 1]
}
return null
}
}
}
Quick.Component{
id:contentComponent
Quick.Item{
id:content
property int duration: 1500
property var itemcomponent
property string type
property string text
property string moremsg
width: parent.width
height: loader.height
function close(){
content.destroy()
}
function restart(){
delayTimer.restart()
}
Quick.Timer {
id:delayTimer
interval: duration
running: duration > 0
repeat: duration > 0
onTriggered: content.close()
}
Loader{
id:loader
x:(parent.width - width) / 2
property var _super: content
scale: item ? 1 : 0
asynchronous: true
Quick.Behavior on scale {
enabled: Theme.animationEnabled
Quick.NumberAnimation {
easing.type: Quick.Easing.OutCubic
duration: 167
}
}
sourceComponent:itemcomponent ? itemcomponent : mcontrol.fluent_sytle
}
}
}
property Quick.Component fluent_sytle: Quick.Rectangle{
width: rowlayout.width + (btn_close.visible ? 30 : 48)
height: rowlayout.height + 20
color: {
if(Theme.dark){
switch(_super.type){
case mcontrol.const_success: return Qt.rgba(57/255,61/255,27/255,1)
case mcontrol.const_warning: return Qt.rgba(67/255,53/255,25/255,1)
case mcontrol.const_info: return Qt.rgba(39/255,39/255,39/255,1)
case mcontrol.const_error: return Qt.rgba(68/255,39/255,38/255,1)
}
return Qt.rgba(1,1,1,1)
}else{
switch(_super.type){
case mcontrol.const_success: return Qt.rgba(223/255,246/255,221/255,1)
case mcontrol.const_warning: return Qt.rgba(255/255,244/255,206/255,1)
case mcontrol.const_info: return Qt.rgba(244/255,244/255,244/255,1)
case mcontrol.const_error: return Qt.rgba(253/255,231/255,233/255,1)
}
return Qt.rgba(1,1,1,1)
}
}
Shadow{
radius: 4
}
radius: 4
border.width: 1
border.color: {
if(Theme.dark){
switch(_super.type){
case mcontrol.const_success: return Qt.rgba(56/255,61/255,27/255,1)
case mcontrol.const_warning: return Qt.rgba(66/255,53/255,25/255,1)
case mcontrol.const_info: return Qt.rgba(38/255,39/255,39/255,1)
case mcontrol.const_error: return Qt.rgba(67/255,39/255,38/255,1)
}
return Qt.rgba(1,1,1,1)
}else{
switch(_super.type){
case mcontrol.const_success: return Qt.rgba(210/255,232/255,208/255,1)
case mcontrol.const_warning: return Qt.rgba(240/255,230/255,194/255,1)
case mcontrol.const_info: return Qt.rgba(230/255,230/255,230/255,1)
case mcontrol.const_error: return Qt.rgba(238/255,217/255,219/255,1)
}
return Qt.rgba(1,1,1,1)
}
}
Quick.Row{
id:rowlayout
x:20
y:(parent.height - height) / 2
spacing: 10
Icon{
iconSource:{
switch(_super.type){
case mcontrol.const_success: return Icons.CompletedSolid
case mcontrol.const_warning: return Icons.InfoSolid
case mcontrol.const_info: return Icons.InfoSolid
case mcontrol.const_error: return Icons.StatusErrorFull
}FluentIcons.StatusErrorFull
return FluentIcons.FA_info_circle
}
iconSize:20
iconColor: {
if(Theme.dark){
switch(_super.type){
case mcontrol.const_success: return Qt.rgba(108/255,203/255,95/255,1)
case mcontrol.const_warning: return Qt.rgba(252/255,225/255,0/255,1)
case mcontrol.const_info: return FluTheme.primaryColor
case mcontrol.const_error: return Qt.rgba(255/255,153/255,164/255,1)
}
return Qt.rgba(1,1,1,1)
}else{
switch(_super.type){
case mcontrol.const_success: return Qt.rgba(15/255,123/255,15/255,1)
case mcontrol.const_warning: return Qt.rgba(157/255,93/255,0/255,1)
case mcontrol.const_info: return Qt.rgba(0/255,102/255,180/255,1)
case mcontrol.const_error: return Qt.rgba(196/255,43/255,28/255,1)
}
return Qt.rgba(1,1,1,1)
}
}
}
Quick.Column{
spacing: 5
Text{
text:_super.text
wrapMode: Text.WrapAnywhere
width: Math.min(implicitWidth,mcontrol.maxWidth)
}
Text{
text: _super.moremsg
visible: _super.moremsg
wrapMode : Text.WrapAnywhere
textColor: Colors.Grey120
width: Math.min(implicitWidth,mcontrol.maxWidth)
}
}
IconButton{
id:btn_close
iconSource: Icons.ChromeClose
iconSize: 10
verticalPadding: 0
horizontalPadding: 0
width: 30
height: 20
visible: _super.duration<=0
anchors.verticalCenter: parent.verticalCenter
iconColor: Theme.dark ? Qt.rgba(222/255,222/255,222/255,1) : Qt.rgba(97/255,97/255,97/255,1)
onClicked: _super.close()
}
}
}
}
function showSuccess(text,duration=1000,moremsg){
return mcontrol.create(mcontrol.const_success,text,duration,moremsg ? moremsg : "")
}
function showInfo(text,duration=1000,moremsg){
return mcontrol.create(mcontrol.const_info,text,duration,moremsg ? moremsg : "")
}
function showWarning(text,duration=1000,moremsg){
return mcontrol.create(mcontrol.const_warning,text,duration,moremsg ? moremsg : "")
}
function showError(text,duration=1000,moremsg){
return mcontrol.create(mcontrol.const_error,text,duration,moremsg ? moremsg : "")
}
function showCustom(itemcomponent,duration=1000){
return mcontrol.createCustom(itemcomponent,duration)
}
function clearAllInfo(){
if(mcontrol.screenLayout != null) {
mcontrol.screenLayout.destroy()
mcontrol.screenLayout = null
}
return true
}
}