mirror of
https://github.com/zhuzichu520/FluentUI.git
synced 2024-11-26 21:37:04 +08:00
update FluContentDialog and FluShortcutPicker
This commit is contained in:
parent
1a21cd7b31
commit
2428a38194
@ -151,7 +151,7 @@ FluObject{
|
|||||||
onTap:{ navigationView.push(url) }
|
onTap:{ navigationView.push(url) }
|
||||||
}
|
}
|
||||||
FluPaneItem{
|
FluPaneItem{
|
||||||
title:"ShortcutPicker(ToDo)"
|
title:"ShortcutPicker"
|
||||||
menuDelegate: paneItemMenu
|
menuDelegate: paneItemMenu
|
||||||
url:"qrc:/example/qml/page/T_ShortcutPicker.qml"
|
url:"qrc:/example/qml/page/T_ShortcutPicker.qml"
|
||||||
onTap:{ navigationView.push(url) }
|
onTap:{ navigationView.push(url) }
|
||||||
|
@ -77,15 +77,23 @@ FluWindow {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Timer{
|
||||||
|
id:timer_window_hide_delay
|
||||||
|
interval: 150
|
||||||
|
onTriggered: {
|
||||||
|
window.hide()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
FluContentDialog{
|
FluContentDialog{
|
||||||
id:dialog_close
|
id:dialog_close
|
||||||
title:"退出"
|
title:"退出"
|
||||||
message:"确定要退出程序吗?"
|
message:"确定要退出程序吗?"
|
||||||
negativeText:"最小化"
|
negativeText:"最小化"
|
||||||
buttonFlags: FluContentDialogType.NegativeButton | FluContentDialogType.NeutralButton | FluContentDialogType.PositiveButton
|
buttonFlags: FluContentDialogType.NegativeButton | FluContentDialogType.NeutralButton | FluContentDialogType.PositiveButton
|
||||||
onNegativeClicked:{
|
onNegativeClicked: {
|
||||||
window.hide()
|
|
||||||
system_tray.showMessage("友情提示","FluentUI已隐藏至托盘,点击托盘可再次激活窗口");
|
system_tray.showMessage("友情提示","FluentUI已隐藏至托盘,点击托盘可再次激活窗口");
|
||||||
|
timer_window_hide_delay.restart()
|
||||||
}
|
}
|
||||||
positiveText:"退出"
|
positiveText:"退出"
|
||||||
neutralText:"取消"
|
neutralText:"取消"
|
||||||
|
@ -151,7 +151,7 @@ FluObject{
|
|||||||
onTap:{ navigationView.push(url) }
|
onTap:{ navigationView.push(url) }
|
||||||
}
|
}
|
||||||
FluPaneItem{
|
FluPaneItem{
|
||||||
title:"ShortcutPicker(ToDo)"
|
title:"ShortcutPicker"
|
||||||
menuDelegate: paneItemMenu
|
menuDelegate: paneItemMenu
|
||||||
url:"qrc:/example/qml/page/T_ShortcutPicker.qml"
|
url:"qrc:/example/qml/page/T_ShortcutPicker.qml"
|
||||||
onTap:{ navigationView.push(url) }
|
onTap:{ navigationView.push(url) }
|
||||||
|
@ -80,15 +80,23 @@ FluWindow {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Timer{
|
||||||
|
id:timer_window_hide_delay
|
||||||
|
interval: 150
|
||||||
|
onTriggered: {
|
||||||
|
window.hide()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
FluContentDialog{
|
FluContentDialog{
|
||||||
id:dialog_close
|
id:dialog_close
|
||||||
title:"退出"
|
title:"退出"
|
||||||
message:"确定要退出程序吗?"
|
message:"确定要退出程序吗?"
|
||||||
negativeText:"最小化"
|
negativeText:"最小化"
|
||||||
buttonFlags: FluContentDialogType.NegativeButton | FluContentDialogType.NeutralButton | FluContentDialogType.PositiveButton
|
buttonFlags: FluContentDialogType.NegativeButton | FluContentDialogType.NeutralButton | FluContentDialogType.PositiveButton
|
||||||
onNegativeClicked:{
|
onNegativeClicked: {
|
||||||
window.hide()
|
|
||||||
system_tray.showMessage("友情提示","FluentUI已隐藏至托盘,点击托盘可再次激活窗口");
|
system_tray.showMessage("友情提示","FluentUI已隐藏至托盘,点击托盘可再次激活窗口");
|
||||||
|
timer_window_hide_delay.restart()
|
||||||
}
|
}
|
||||||
positiveText:"退出"
|
positiveText:"退出"
|
||||||
neutralText:"取消"
|
neutralText:"取消"
|
||||||
|
@ -5,51 +5,37 @@ import QtQuick.Window 2.15
|
|||||||
import FluentUI 1.0
|
import FluentUI 1.0
|
||||||
|
|
||||||
FluPopup {
|
FluPopup {
|
||||||
id: popup
|
id: control
|
||||||
property string title: "Title"
|
property string title: ""
|
||||||
property string message: "Message"
|
property string message: ""
|
||||||
property string neutralText: "Neutral"
|
property string neutralText: "Neutral"
|
||||||
property string negativeText: "Negative"
|
property string negativeText: "Negative"
|
||||||
property string positiveText: "Positive"
|
property string positiveText: "Positive"
|
||||||
property alias messageTextFormart: text_message.textFormat
|
property int messageTextFormart: Text.AutoText
|
||||||
property int delayTime: 100
|
property int delayTime: 100
|
||||||
|
property int buttonFlags: FluContentDialogType.NegativeButton | FluContentDialogType.PositiveButton
|
||||||
|
property var contentDelegate: Component{
|
||||||
|
Item{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
property var onNeutralClickListener
|
||||||
|
property var onNegativeClickListener
|
||||||
|
property var onPositiveClickListener
|
||||||
signal neutralClicked
|
signal neutralClicked
|
||||||
signal negativeClicked
|
signal negativeClicked
|
||||||
signal positiveClicked
|
signal positiveClicked
|
||||||
property int buttonFlags: FluContentDialogType.NegativeButton | FluContentDialogType.PositiveButton
|
|
||||||
focus: true
|
|
||||||
implicitWidth: 400
|
implicitWidth: 400
|
||||||
implicitHeight: text_title.height + sroll_message.height + layout_actions.height
|
implicitHeight: layout_content.height
|
||||||
Rectangle {
|
focus: true
|
||||||
id:layout_content
|
Component{
|
||||||
anchors.fill: parent
|
id:com_message
|
||||||
color: 'transparent'
|
|
||||||
radius:5
|
|
||||||
FluText{
|
|
||||||
id:text_title
|
|
||||||
font: FluTextStyle.TitleLarge
|
|
||||||
text:title
|
|
||||||
topPadding: 20
|
|
||||||
leftPadding: 20
|
|
||||||
rightPadding: 20
|
|
||||||
wrapMode: Text.WrapAnywhere
|
|
||||||
anchors{
|
|
||||||
top:parent.top
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Flickable{
|
Flickable{
|
||||||
id:sroll_message
|
id:sroll_message
|
||||||
|
contentHeight: text_message.height
|
||||||
contentWidth: width
|
contentWidth: width
|
||||||
clip: true
|
clip: true
|
||||||
anchors{
|
|
||||||
top:text_title.bottom
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
}
|
|
||||||
boundsBehavior:Flickable.StopAtBounds
|
boundsBehavior:Flickable.StopAtBounds
|
||||||
contentHeight: text_message.height
|
width: parent.width
|
||||||
height: Math.min(text_message.height,300)
|
height: Math.min(text_message.height,300)
|
||||||
ScrollBar.vertical: FluScrollBar {}
|
ScrollBar.vertical: FluScrollBar {}
|
||||||
FluText{
|
FluText{
|
||||||
@ -58,79 +44,98 @@ FluPopup {
|
|||||||
wrapMode: Text.WrapAnywhere
|
wrapMode: Text.WrapAnywhere
|
||||||
text:message
|
text:message
|
||||||
width: parent.width
|
width: parent.width
|
||||||
topPadding: 14
|
topPadding: 4
|
||||||
leftPadding: 20
|
leftPadding: 20
|
||||||
rightPadding: 20
|
rightPadding: 20
|
||||||
bottomPadding: 14
|
bottomPadding: 4
|
||||||
}
|
|
||||||
}
|
|
||||||
Rectangle{
|
|
||||||
id:layout_actions
|
|
||||||
height: 60
|
|
||||||
radius: 5
|
|
||||||
color: FluTheme.dark ? Qt.rgba(32/255,32/255,32/255,1) : Qt.rgba(243/255,243/255,243/255,1)
|
|
||||||
anchors{
|
|
||||||
top:sroll_message.bottom
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
}
|
|
||||||
RowLayout{
|
|
||||||
anchors
|
|
||||||
{
|
|
||||||
centerIn: parent
|
|
||||||
margins: spacing
|
|
||||||
fill: parent
|
|
||||||
}
|
|
||||||
spacing: 15
|
|
||||||
FluButton{
|
|
||||||
id:neutral_btn
|
|
||||||
Layout.fillWidth: true
|
|
||||||
visible: popup.buttonFlags&FluContentDialogType.NeutralButton
|
|
||||||
text: neutralText
|
|
||||||
onClicked: {
|
|
||||||
popup.close()
|
|
||||||
timer_delay.targetFlags = FluContentDialogType.NeutralButton
|
|
||||||
timer_delay.restart()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FluButton{
|
|
||||||
id:negative_btn
|
|
||||||
Layout.fillWidth: true
|
|
||||||
visible: popup.buttonFlags&FluContentDialogType.NegativeButton
|
|
||||||
text: negativeText
|
|
||||||
onClicked: {
|
|
||||||
popup.close()
|
|
||||||
timer_delay.targetFlags = FluContentDialogType.NegativeButton
|
|
||||||
timer_delay.restart()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FluFilledButton{
|
|
||||||
id:positive_btn
|
|
||||||
Layout.fillWidth: true
|
|
||||||
visible: popup.buttonFlags&FluContentDialogType.PositiveButton
|
|
||||||
text: positiveText
|
|
||||||
onClicked: {
|
|
||||||
popup.close()
|
|
||||||
timer_delay.targetFlags = FluContentDialogType.PositiveButton
|
|
||||||
timer_delay.restart()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Timer{
|
Rectangle {
|
||||||
property int targetFlags
|
id:layout_content
|
||||||
id:timer_delay
|
width: parent.width
|
||||||
interval: popup.delayTime
|
height: layout_column.childrenRect.height
|
||||||
onTriggered: {
|
color: 'transparent'
|
||||||
if(targetFlags === FluContentDialogType.NegativeButton){
|
radius:5
|
||||||
negativeClicked()
|
ColumnLayout{
|
||||||
|
id:layout_column
|
||||||
|
width: parent.width
|
||||||
|
FluText{
|
||||||
|
id:text_title
|
||||||
|
font: FluTextStyle.Title
|
||||||
|
text:title
|
||||||
|
topPadding: 20
|
||||||
|
leftPadding: 20
|
||||||
|
rightPadding: 20
|
||||||
|
wrapMode: Text.WrapAnywhere
|
||||||
}
|
}
|
||||||
if(targetFlags === FluContentDialogType.NeutralButton){
|
FluLoader{
|
||||||
neutralClicked()
|
sourceComponent: com_message
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: status===Loader.Ready ? item.height : 0
|
||||||
}
|
}
|
||||||
if(targetFlags === FluContentDialogType.PositiveButton){
|
FluLoader{
|
||||||
positiveClicked()
|
sourceComponent: control.contentDelegate
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: status===Loader.Ready ? item.height : 0
|
||||||
|
}
|
||||||
|
Rectangle{
|
||||||
|
id:layout_actions
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: 60
|
||||||
|
radius: 5
|
||||||
|
color: FluTheme.dark ? Qt.rgba(32/255,32/255,32/255,1) : Qt.rgba(243/255,243/255,243/255,1)
|
||||||
|
RowLayout{
|
||||||
|
anchors
|
||||||
|
{
|
||||||
|
centerIn: parent
|
||||||
|
margins: spacing
|
||||||
|
fill: parent
|
||||||
|
}
|
||||||
|
spacing: 15
|
||||||
|
FluButton{
|
||||||
|
id:neutral_btn
|
||||||
|
Layout.fillWidth: true
|
||||||
|
visible: control.buttonFlags&FluContentDialogType.NeutralButton
|
||||||
|
text: neutralText
|
||||||
|
onClicked: {
|
||||||
|
if(control.onNeutralClickListener){
|
||||||
|
control.onNeutralClickListener()
|
||||||
|
}else{
|
||||||
|
neutralClicked()
|
||||||
|
control.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FluButton{
|
||||||
|
id:negative_btn
|
||||||
|
Layout.fillWidth: true
|
||||||
|
visible: control.buttonFlags&FluContentDialogType.NegativeButton
|
||||||
|
text: negativeText
|
||||||
|
onClicked: {
|
||||||
|
if(control.onNegativeClickListener){
|
||||||
|
control.onNegativeClickListener()
|
||||||
|
}else{
|
||||||
|
negativeClicked()
|
||||||
|
control.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FluFilledButton{
|
||||||
|
id:positive_btn
|
||||||
|
Layout.fillWidth: true
|
||||||
|
visible: control.buttonFlags&FluContentDialogType.PositiveButton
|
||||||
|
text: positiveText
|
||||||
|
onClicked: {
|
||||||
|
if(control.onPositiveClickListener){
|
||||||
|
control.onPositiveClickListener()
|
||||||
|
}else{
|
||||||
|
positiveClicked()
|
||||||
|
control.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,9 +3,115 @@ import QtQuick.Controls 2.15
|
|||||||
import FluentUI 1.0
|
import FluentUI 1.0
|
||||||
|
|
||||||
FluIconButton {
|
FluIconButton {
|
||||||
|
|
||||||
id:control
|
id:control
|
||||||
|
property var current : ["Ctrl","Shift","A"]
|
||||||
|
property string title: "激活快捷键"
|
||||||
|
property string message: "按下组合键以更改此快捷键"
|
||||||
|
property string positiveText: "保存"
|
||||||
|
property string neutralText: "取消"
|
||||||
|
property string negativeText: "重置"
|
||||||
|
signal accepted()
|
||||||
|
QtObject{
|
||||||
|
id: d
|
||||||
|
function keyToString(key_code,shift = true)
|
||||||
|
{
|
||||||
|
switch(key_code)
|
||||||
|
{
|
||||||
|
case Qt.Key_Period: return ".";
|
||||||
|
case Qt.Key_Greater: return shift ? ">" : ".";
|
||||||
|
case Qt.Key_Comma: return ",";
|
||||||
|
case Qt.Key_Less: return shift ? "<" : ",";
|
||||||
|
case Qt.Key_Slash: return "/";
|
||||||
|
case Qt.Key_Question: return shift ? "?" : "/";
|
||||||
|
case Qt.Key_Semicolon: return ";";
|
||||||
|
case Qt.Key_Colon: return shift ? ":" : ";";
|
||||||
|
case Qt.Key_Apostrophe: return "'";
|
||||||
|
case Qt.Key_QuoteDbl: return shift ? "'" : "\"";
|
||||||
|
case Qt.Key_QuoteLeft: return "`";
|
||||||
|
case Qt.Key_AsciiTilde: return shift ? "~" : "`";
|
||||||
|
case Qt.Key_Minus: return "-";
|
||||||
|
case Qt.Key_Underscore: return shift ? "_" : "-";
|
||||||
|
case Qt.Key_Equal: return "=";
|
||||||
|
case Qt.Key_Plus: return shift ? "+" : "=";
|
||||||
|
case Qt.Key_BracketLeft: return "[";
|
||||||
|
case Qt.Key_BraceLeft: return shift ? "{" : "[";
|
||||||
|
case Qt.Key_BracketRight: return "]";
|
||||||
|
case Qt.Key_BraceRight: return shift ? "}" : "]";
|
||||||
|
case Qt.Key_Backslash: return "\\";
|
||||||
|
case Qt.Key_Bar: return shift ? "|" : "\\";
|
||||||
|
case Qt.Key_Up: return "Up";
|
||||||
|
case Qt.Key_Down: return "Down";
|
||||||
|
case Qt.Key_Right: return "Right";
|
||||||
|
case Qt.Key_Left: return "Left";
|
||||||
|
case Qt.Key_Space: return "Space";
|
||||||
|
case Qt.Key_PageDown: return "PgDown";
|
||||||
|
case Qt.Key_PageUp: return "PgUp";
|
||||||
|
case Qt.Key_0: return "0";
|
||||||
|
case Qt.Key_1: return "1";
|
||||||
|
case Qt.Key_2: return "2";
|
||||||
|
case Qt.Key_3: return "3";
|
||||||
|
case Qt.Key_4: return "4";
|
||||||
|
case Qt.Key_5: return "5";
|
||||||
|
case Qt.Key_6: return "6";
|
||||||
|
case Qt.Key_7: return "7";
|
||||||
|
case Qt.Key_8: return "8";
|
||||||
|
case Qt.Key_9: return "9";
|
||||||
|
case Qt.Key_Exclam: return shift ? "!" : "1";
|
||||||
|
case Qt.Key_At: return shift ? "@" : "2";
|
||||||
|
case Qt.Key_NumberSign: return shift ? "#" : "3";
|
||||||
|
case Qt.Key_Dollar: return shift ? "$" : "4";
|
||||||
|
case Qt.Key_Percent: return shift ? "%" : "5";
|
||||||
|
case Qt.Key_AsciiCircum: return shift ? "^" : "6";
|
||||||
|
case Qt.Key_Ampersand: return shift ? "&" : "7";
|
||||||
|
case Qt.Key_Asterisk: return shift ? "*" : "8";
|
||||||
|
case Qt.Key_ParenLeft: return shift ? "(" : "9";
|
||||||
|
case Qt.Key_ParenRight: return shift ? ")" : "0";
|
||||||
|
case Qt.Key_A: return "A";
|
||||||
|
case Qt.Key_B: return "B";
|
||||||
|
case Qt.Key_C: return "C";
|
||||||
|
case Qt.Key_D: return "D";
|
||||||
|
case Qt.Key_E: return "E";
|
||||||
|
case Qt.Key_F: return "F";
|
||||||
|
case Qt.Key_G: return "G";
|
||||||
|
case Qt.Key_H: return "H";
|
||||||
|
case Qt.Key_I: return "I";
|
||||||
|
case Qt.Key_J: return "J";
|
||||||
|
case Qt.Key_K: return "K";
|
||||||
|
case Qt.Key_L: return "L";
|
||||||
|
case Qt.Key_M: return "M";
|
||||||
|
case Qt.Key_N: return "N";
|
||||||
|
case Qt.Key_O: return "O";
|
||||||
|
case Qt.Key_P: return "P";
|
||||||
|
case Qt.Key_Q: return "Q";
|
||||||
|
case Qt.Key_R: return "R";
|
||||||
|
case Qt.Key_S: return "S";
|
||||||
|
case Qt.Key_T: return "T";
|
||||||
|
case Qt.Key_U: return "U";
|
||||||
|
case Qt.Key_V: return "V";
|
||||||
|
case Qt.Key_W: return "W";
|
||||||
|
case Qt.Key_X: return "X";
|
||||||
|
case Qt.Key_Y: return "Y";
|
||||||
|
case Qt.Key_Z: return "Z";
|
||||||
|
case Qt.Key_F1: return "F1";
|
||||||
|
case Qt.Key_F2: return "F2";
|
||||||
|
case Qt.Key_F3: return "F3";
|
||||||
|
case Qt.Key_F4: return "F4";
|
||||||
|
case Qt.Key_F5: return "F5";
|
||||||
|
case Qt.Key_F6: return "F6";
|
||||||
|
case Qt.Key_F7: return "F7";
|
||||||
|
case Qt.Key_F8: return "F8";
|
||||||
|
case Qt.Key_F9: return "F9";
|
||||||
|
case Qt.Key_F10: return "F10";
|
||||||
|
case Qt.Key_F11: return "F11";
|
||||||
|
case Qt.Key_F12: return "F12";
|
||||||
|
case Qt.Key_Home: return "Home";
|
||||||
|
case Qt.Key_End: return "End";
|
||||||
|
case Qt.Key_Insert: return "Insert";
|
||||||
|
case Qt.Key_Delete: return "Delete";
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
background: Rectangle{
|
background: Rectangle{
|
||||||
border.color: FluTheme.dark ? "#505050" : "#DFDFDF"
|
border.color: FluTheme.dark ? "#505050" : "#DFDFDF"
|
||||||
border.width: 1
|
border.width: 1
|
||||||
@ -17,7 +123,6 @@ FluIconButton {
|
|||||||
visible: control.activeFocus
|
visible: control.activeFocus
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
component ItemKey:Rectangle{
|
component ItemKey:Rectangle{
|
||||||
id:item_key_control
|
id:item_key_control
|
||||||
property string text : ""
|
property string text : ""
|
||||||
@ -33,16 +138,15 @@ FluIconButton {
|
|||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Row{
|
Row{
|
||||||
id:layout_row
|
id:layout_row
|
||||||
spacing: 5
|
spacing: 5
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
ItemKey{
|
Repeater{
|
||||||
text:"Ctrl"
|
model: control.current
|
||||||
}
|
delegate: ItemKey{
|
||||||
ItemKey{
|
text: modelData
|
||||||
text:"A"
|
}
|
||||||
}
|
}
|
||||||
Item{
|
Item{
|
||||||
width: 3
|
width: 3
|
||||||
@ -55,16 +159,70 @@ FluIconButton {
|
|||||||
verticalCenter: parent.verticalCenter
|
verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FluContentDialog{
|
FluContentDialog{
|
||||||
id:content_dialog
|
id:content_dialog
|
||||||
|
property var keysModel: []
|
||||||
|
title: control.title
|
||||||
|
message: control.message
|
||||||
|
buttonFlags: FluContentDialogType.NegativeButton | FluContentDialogType.PositiveButton | FluContentDialogType.NeutralButton
|
||||||
|
positiveText: control.positiveText
|
||||||
|
neutralText: control.neutralText
|
||||||
|
negativeText: control.negativeText
|
||||||
|
onVisibleChanged: {
|
||||||
|
content_dialog.keysModel = control.current
|
||||||
|
}
|
||||||
|
onPositiveClicked: {
|
||||||
|
control.current = content_dialog.keysModel
|
||||||
|
control.accepted()
|
||||||
|
}
|
||||||
|
onNegativeClicked: {
|
||||||
|
content_dialog.keysModel = control.current
|
||||||
|
}
|
||||||
|
contentDelegate: Component{
|
||||||
|
Item{
|
||||||
|
width: parent.width
|
||||||
|
height: 100
|
||||||
|
Component.onCompleted: {
|
||||||
|
forceActiveFocus()
|
||||||
|
}
|
||||||
|
Keys.enabled: true
|
||||||
|
Keys.onPressed: {
|
||||||
|
var keyNames = []
|
||||||
|
if (event.modifiers & Qt.AltModifier) {
|
||||||
|
keyNames.push("Alt")
|
||||||
|
}
|
||||||
|
if (event.modifiers & Qt.ControlModifier) {
|
||||||
|
keyNames.push("Ctrl")
|
||||||
|
}
|
||||||
|
if (event.modifiers & Qt.ShiftModifier) {
|
||||||
|
keyNames.push("Shift")
|
||||||
|
}
|
||||||
|
var keyName = d.keyToString(event.key,false)
|
||||||
|
if(keyName!==""){
|
||||||
|
keyNames.push(keyName)
|
||||||
|
content_dialog.keysModel = keyNames
|
||||||
|
}
|
||||||
|
event.accepted = true
|
||||||
|
}
|
||||||
|
Keys.onTabPressed:
|
||||||
|
(event)=>{
|
||||||
|
event.accepted = true
|
||||||
|
}
|
||||||
|
Row{
|
||||||
|
spacing: 5
|
||||||
|
anchors.centerIn: parent
|
||||||
|
Repeater{
|
||||||
|
model: content_dialog.keysModel
|
||||||
|
delegate: ItemKey{
|
||||||
|
text: modelData
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
content_dialog.open()
|
content_dialog.open()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,51 +5,37 @@ import QtQuick.Window
|
|||||||
import FluentUI
|
import FluentUI
|
||||||
|
|
||||||
FluPopup {
|
FluPopup {
|
||||||
id: popup
|
id: control
|
||||||
property string title: "Title"
|
property string title: ""
|
||||||
property string message: "Message"
|
property string message: ""
|
||||||
property string neutralText: "Neutral"
|
property string neutralText: "Neutral"
|
||||||
property string negativeText: "Negative"
|
property string negativeText: "Negative"
|
||||||
property string positiveText: "Positive"
|
property string positiveText: "Positive"
|
||||||
property alias messageTextFormart: text_message.textFormat
|
property int messageTextFormart: Text.AutoText
|
||||||
property int delayTime: 100
|
property int delayTime: 100
|
||||||
|
property int buttonFlags: FluContentDialogType.NegativeButton | FluContentDialogType.PositiveButton
|
||||||
|
property var contentDelegate: Component{
|
||||||
|
Item{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
property var onNeutralClickListener
|
||||||
|
property var onNegativeClickListener
|
||||||
|
property var onPositiveClickListener
|
||||||
signal neutralClicked
|
signal neutralClicked
|
||||||
signal negativeClicked
|
signal negativeClicked
|
||||||
signal positiveClicked
|
signal positiveClicked
|
||||||
property int buttonFlags: FluContentDialogType.NegativeButton | FluContentDialogType.PositiveButton
|
|
||||||
focus: true
|
|
||||||
implicitWidth: 400
|
implicitWidth: 400
|
||||||
implicitHeight: text_title.height + sroll_message.height + layout_actions.height
|
implicitHeight: layout_content.height
|
||||||
Rectangle {
|
focus: true
|
||||||
id:layout_content
|
Component{
|
||||||
anchors.fill: parent
|
id:com_message
|
||||||
color: 'transparent'
|
|
||||||
radius:5
|
|
||||||
FluText{
|
|
||||||
id:text_title
|
|
||||||
font: FluTextStyle.TitleLarge
|
|
||||||
text:title
|
|
||||||
topPadding: 20
|
|
||||||
leftPadding: 20
|
|
||||||
rightPadding: 20
|
|
||||||
wrapMode: Text.WrapAnywhere
|
|
||||||
anchors{
|
|
||||||
top:parent.top
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Flickable{
|
Flickable{
|
||||||
id:sroll_message
|
id:sroll_message
|
||||||
|
contentHeight: text_message.height
|
||||||
contentWidth: width
|
contentWidth: width
|
||||||
clip: true
|
clip: true
|
||||||
anchors{
|
|
||||||
top:text_title.bottom
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
}
|
|
||||||
boundsBehavior:Flickable.StopAtBounds
|
boundsBehavior:Flickable.StopAtBounds
|
||||||
contentHeight: text_message.height
|
width: parent.width
|
||||||
height: Math.min(text_message.height,300)
|
height: Math.min(text_message.height,300)
|
||||||
ScrollBar.vertical: FluScrollBar {}
|
ScrollBar.vertical: FluScrollBar {}
|
||||||
FluText{
|
FluText{
|
||||||
@ -58,79 +44,98 @@ FluPopup {
|
|||||||
wrapMode: Text.WrapAnywhere
|
wrapMode: Text.WrapAnywhere
|
||||||
text:message
|
text:message
|
||||||
width: parent.width
|
width: parent.width
|
||||||
topPadding: 14
|
topPadding: 4
|
||||||
leftPadding: 20
|
leftPadding: 20
|
||||||
rightPadding: 20
|
rightPadding: 20
|
||||||
bottomPadding: 14
|
bottomPadding: 4
|
||||||
}
|
|
||||||
}
|
|
||||||
Rectangle{
|
|
||||||
id:layout_actions
|
|
||||||
height: 60
|
|
||||||
radius: 5
|
|
||||||
color: FluTheme.dark ? Qt.rgba(32/255,32/255,32/255,1) : Qt.rgba(243/255,243/255,243/255,1)
|
|
||||||
anchors{
|
|
||||||
top:sroll_message.bottom
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
}
|
|
||||||
RowLayout{
|
|
||||||
anchors
|
|
||||||
{
|
|
||||||
centerIn: parent
|
|
||||||
margins: spacing
|
|
||||||
fill: parent
|
|
||||||
}
|
|
||||||
spacing: 15
|
|
||||||
FluButton{
|
|
||||||
id:neutral_btn
|
|
||||||
Layout.fillWidth: true
|
|
||||||
visible: popup.buttonFlags&FluContentDialogType.NeutralButton
|
|
||||||
text: neutralText
|
|
||||||
onClicked: {
|
|
||||||
popup.close()
|
|
||||||
timer_delay.targetFlags = FluContentDialogType.NeutralButton
|
|
||||||
timer_delay.restart()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FluButton{
|
|
||||||
id:negative_btn
|
|
||||||
Layout.fillWidth: true
|
|
||||||
visible: popup.buttonFlags&FluContentDialogType.NegativeButton
|
|
||||||
text: negativeText
|
|
||||||
onClicked: {
|
|
||||||
popup.close()
|
|
||||||
timer_delay.targetFlags = FluContentDialogType.NegativeButton
|
|
||||||
timer_delay.restart()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FluFilledButton{
|
|
||||||
id:positive_btn
|
|
||||||
Layout.fillWidth: true
|
|
||||||
visible: popup.buttonFlags&FluContentDialogType.PositiveButton
|
|
||||||
text: positiveText
|
|
||||||
onClicked: {
|
|
||||||
popup.close()
|
|
||||||
timer_delay.targetFlags = FluContentDialogType.PositiveButton
|
|
||||||
timer_delay.restart()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Timer{
|
Rectangle {
|
||||||
property int targetFlags
|
id:layout_content
|
||||||
id:timer_delay
|
width: parent.width
|
||||||
interval: popup.delayTime
|
height: layout_column.childrenRect.height
|
||||||
onTriggered: {
|
color: 'transparent'
|
||||||
if(targetFlags === FluContentDialogType.NegativeButton){
|
radius:5
|
||||||
negativeClicked()
|
ColumnLayout{
|
||||||
|
id:layout_column
|
||||||
|
width: parent.width
|
||||||
|
FluText{
|
||||||
|
id:text_title
|
||||||
|
font: FluTextStyle.Title
|
||||||
|
text:title
|
||||||
|
topPadding: 20
|
||||||
|
leftPadding: 20
|
||||||
|
rightPadding: 20
|
||||||
|
wrapMode: Text.WrapAnywhere
|
||||||
}
|
}
|
||||||
if(targetFlags === FluContentDialogType.NeutralButton){
|
FluLoader{
|
||||||
neutralClicked()
|
sourceComponent: com_message
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: status===Loader.Ready ? item.height : 0
|
||||||
}
|
}
|
||||||
if(targetFlags === FluContentDialogType.PositiveButton){
|
FluLoader{
|
||||||
positiveClicked()
|
sourceComponent: control.contentDelegate
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: status===Loader.Ready ? item.height : 0
|
||||||
|
}
|
||||||
|
Rectangle{
|
||||||
|
id:layout_actions
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: 60
|
||||||
|
radius: 5
|
||||||
|
color: FluTheme.dark ? Qt.rgba(32/255,32/255,32/255,1) : Qt.rgba(243/255,243/255,243/255,1)
|
||||||
|
RowLayout{
|
||||||
|
anchors
|
||||||
|
{
|
||||||
|
centerIn: parent
|
||||||
|
margins: spacing
|
||||||
|
fill: parent
|
||||||
|
}
|
||||||
|
spacing: 15
|
||||||
|
FluButton{
|
||||||
|
id:neutral_btn
|
||||||
|
Layout.fillWidth: true
|
||||||
|
visible: control.buttonFlags&FluContentDialogType.NeutralButton
|
||||||
|
text: neutralText
|
||||||
|
onClicked: {
|
||||||
|
if(control.onNeutralClickListener){
|
||||||
|
control.onNeutralClickListener()
|
||||||
|
}else{
|
||||||
|
neutralClicked()
|
||||||
|
control.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FluButton{
|
||||||
|
id:negative_btn
|
||||||
|
Layout.fillWidth: true
|
||||||
|
visible: control.buttonFlags&FluContentDialogType.NegativeButton
|
||||||
|
text: negativeText
|
||||||
|
onClicked: {
|
||||||
|
if(control.onNegativeClickListener){
|
||||||
|
control.onNegativeClickListener()
|
||||||
|
}else{
|
||||||
|
negativeClicked()
|
||||||
|
control.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FluFilledButton{
|
||||||
|
id:positive_btn
|
||||||
|
Layout.fillWidth: true
|
||||||
|
visible: control.buttonFlags&FluContentDialogType.PositiveButton
|
||||||
|
text: positiveText
|
||||||
|
onClicked: {
|
||||||
|
if(control.onPositiveClickListener){
|
||||||
|
control.onPositiveClickListener()
|
||||||
|
}else{
|
||||||
|
positiveClicked()
|
||||||
|
control.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,9 +3,115 @@ import QtQuick.Controls
|
|||||||
import FluentUI
|
import FluentUI
|
||||||
|
|
||||||
FluIconButton {
|
FluIconButton {
|
||||||
|
|
||||||
id:control
|
id:control
|
||||||
|
property var current : ["Ctrl","Shift","A"]
|
||||||
|
property string title: "激活快捷键"
|
||||||
|
property string message: "按下组合键以更改此快捷键"
|
||||||
|
property string positiveText: "保存"
|
||||||
|
property string neutralText: "取消"
|
||||||
|
property string negativeText: "重置"
|
||||||
|
signal accepted()
|
||||||
|
QtObject{
|
||||||
|
id: d
|
||||||
|
function keyToString(key_code,shift = true)
|
||||||
|
{
|
||||||
|
switch(key_code)
|
||||||
|
{
|
||||||
|
case Qt.Key_Period: return ".";
|
||||||
|
case Qt.Key_Greater: return shift ? ">" : ".";
|
||||||
|
case Qt.Key_Comma: return ",";
|
||||||
|
case Qt.Key_Less: return shift ? "<" : ",";
|
||||||
|
case Qt.Key_Slash: return "/";
|
||||||
|
case Qt.Key_Question: return shift ? "?" : "/";
|
||||||
|
case Qt.Key_Semicolon: return ";";
|
||||||
|
case Qt.Key_Colon: return shift ? ":" : ";";
|
||||||
|
case Qt.Key_Apostrophe: return "'";
|
||||||
|
case Qt.Key_QuoteDbl: return shift ? "'" : "\"";
|
||||||
|
case Qt.Key_QuoteLeft: return "`";
|
||||||
|
case Qt.Key_AsciiTilde: return shift ? "~" : "`";
|
||||||
|
case Qt.Key_Minus: return "-";
|
||||||
|
case Qt.Key_Underscore: return shift ? "_" : "-";
|
||||||
|
case Qt.Key_Equal: return "=";
|
||||||
|
case Qt.Key_Plus: return shift ? "+" : "=";
|
||||||
|
case Qt.Key_BracketLeft: return "[";
|
||||||
|
case Qt.Key_BraceLeft: return shift ? "{" : "[";
|
||||||
|
case Qt.Key_BracketRight: return "]";
|
||||||
|
case Qt.Key_BraceRight: return shift ? "}" : "]";
|
||||||
|
case Qt.Key_Backslash: return "\\";
|
||||||
|
case Qt.Key_Bar: return shift ? "|" : "\\";
|
||||||
|
case Qt.Key_Up: return "Up";
|
||||||
|
case Qt.Key_Down: return "Down";
|
||||||
|
case Qt.Key_Right: return "Right";
|
||||||
|
case Qt.Key_Left: return "Left";
|
||||||
|
case Qt.Key_Space: return "Space";
|
||||||
|
case Qt.Key_PageDown: return "PgDown";
|
||||||
|
case Qt.Key_PageUp: return "PgUp";
|
||||||
|
case Qt.Key_0: return "0";
|
||||||
|
case Qt.Key_1: return "1";
|
||||||
|
case Qt.Key_2: return "2";
|
||||||
|
case Qt.Key_3: return "3";
|
||||||
|
case Qt.Key_4: return "4";
|
||||||
|
case Qt.Key_5: return "5";
|
||||||
|
case Qt.Key_6: return "6";
|
||||||
|
case Qt.Key_7: return "7";
|
||||||
|
case Qt.Key_8: return "8";
|
||||||
|
case Qt.Key_9: return "9";
|
||||||
|
case Qt.Key_Exclam: return shift ? "!" : "1";
|
||||||
|
case Qt.Key_At: return shift ? "@" : "2";
|
||||||
|
case Qt.Key_NumberSign: return shift ? "#" : "3";
|
||||||
|
case Qt.Key_Dollar: return shift ? "$" : "4";
|
||||||
|
case Qt.Key_Percent: return shift ? "%" : "5";
|
||||||
|
case Qt.Key_AsciiCircum: return shift ? "^" : "6";
|
||||||
|
case Qt.Key_Ampersand: return shift ? "&" : "7";
|
||||||
|
case Qt.Key_Asterisk: return shift ? "*" : "8";
|
||||||
|
case Qt.Key_ParenLeft: return shift ? "(" : "9";
|
||||||
|
case Qt.Key_ParenRight: return shift ? ")" : "0";
|
||||||
|
case Qt.Key_A: return "A";
|
||||||
|
case Qt.Key_B: return "B";
|
||||||
|
case Qt.Key_C: return "C";
|
||||||
|
case Qt.Key_D: return "D";
|
||||||
|
case Qt.Key_E: return "E";
|
||||||
|
case Qt.Key_F: return "F";
|
||||||
|
case Qt.Key_G: return "G";
|
||||||
|
case Qt.Key_H: return "H";
|
||||||
|
case Qt.Key_I: return "I";
|
||||||
|
case Qt.Key_J: return "J";
|
||||||
|
case Qt.Key_K: return "K";
|
||||||
|
case Qt.Key_L: return "L";
|
||||||
|
case Qt.Key_M: return "M";
|
||||||
|
case Qt.Key_N: return "N";
|
||||||
|
case Qt.Key_O: return "O";
|
||||||
|
case Qt.Key_P: return "P";
|
||||||
|
case Qt.Key_Q: return "Q";
|
||||||
|
case Qt.Key_R: return "R";
|
||||||
|
case Qt.Key_S: return "S";
|
||||||
|
case Qt.Key_T: return "T";
|
||||||
|
case Qt.Key_U: return "U";
|
||||||
|
case Qt.Key_V: return "V";
|
||||||
|
case Qt.Key_W: return "W";
|
||||||
|
case Qt.Key_X: return "X";
|
||||||
|
case Qt.Key_Y: return "Y";
|
||||||
|
case Qt.Key_Z: return "Z";
|
||||||
|
case Qt.Key_F1: return "F1";
|
||||||
|
case Qt.Key_F2: return "F2";
|
||||||
|
case Qt.Key_F3: return "F3";
|
||||||
|
case Qt.Key_F4: return "F4";
|
||||||
|
case Qt.Key_F5: return "F5";
|
||||||
|
case Qt.Key_F6: return "F6";
|
||||||
|
case Qt.Key_F7: return "F7";
|
||||||
|
case Qt.Key_F8: return "F8";
|
||||||
|
case Qt.Key_F9: return "F9";
|
||||||
|
case Qt.Key_F10: return "F10";
|
||||||
|
case Qt.Key_F11: return "F11";
|
||||||
|
case Qt.Key_F12: return "F12";
|
||||||
|
case Qt.Key_Home: return "Home";
|
||||||
|
case Qt.Key_End: return "End";
|
||||||
|
case Qt.Key_Insert: return "Insert";
|
||||||
|
case Qt.Key_Delete: return "Delete";
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
background: Rectangle{
|
background: Rectangle{
|
||||||
border.color: FluTheme.dark ? "#505050" : "#DFDFDF"
|
border.color: FluTheme.dark ? "#505050" : "#DFDFDF"
|
||||||
border.width: 1
|
border.width: 1
|
||||||
@ -17,7 +123,6 @@ FluIconButton {
|
|||||||
visible: control.activeFocus
|
visible: control.activeFocus
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
component ItemKey:Rectangle{
|
component ItemKey:Rectangle{
|
||||||
id:item_key_control
|
id:item_key_control
|
||||||
property string text : ""
|
property string text : ""
|
||||||
@ -33,16 +138,15 @@ FluIconButton {
|
|||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Row{
|
Row{
|
||||||
id:layout_row
|
id:layout_row
|
||||||
spacing: 5
|
spacing: 5
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
ItemKey{
|
Repeater{
|
||||||
text:"Ctrl"
|
model: control.current
|
||||||
}
|
delegate: ItemKey{
|
||||||
ItemKey{
|
text: modelData
|
||||||
text:"A"
|
}
|
||||||
}
|
}
|
||||||
Item{
|
Item{
|
||||||
width: 3
|
width: 3
|
||||||
@ -55,17 +159,70 @@ FluIconButton {
|
|||||||
verticalCenter: parent.verticalCenter
|
verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FluContentDialog{
|
FluContentDialog{
|
||||||
id:content_dialog
|
id:content_dialog
|
||||||
|
property var keysModel: []
|
||||||
|
title: control.title
|
||||||
|
message: control.message
|
||||||
|
buttonFlags: FluContentDialogType.NegativeButton | FluContentDialogType.PositiveButton | FluContentDialogType.NeutralButton
|
||||||
|
positiveText: control.positiveText
|
||||||
|
neutralText: control.neutralText
|
||||||
|
negativeText: control.negativeText
|
||||||
|
onVisibleChanged: {
|
||||||
|
content_dialog.keysModel = control.current
|
||||||
|
}
|
||||||
|
onPositiveClicked: {
|
||||||
|
control.current = content_dialog.keysModel
|
||||||
|
control.accepted()
|
||||||
|
}
|
||||||
|
onNegativeClicked: {
|
||||||
|
content_dialog.keysModel = control.current
|
||||||
|
}
|
||||||
|
contentDelegate: Component{
|
||||||
|
Item{
|
||||||
|
width: parent.width
|
||||||
|
height: 100
|
||||||
|
Component.onCompleted: {
|
||||||
|
forceActiveFocus()
|
||||||
|
}
|
||||||
|
Keys.enabled: true
|
||||||
|
Keys.onPressed: {
|
||||||
|
var keyNames = []
|
||||||
|
if (event.modifiers & Qt.AltModifier) {
|
||||||
|
keyNames.push("Alt")
|
||||||
|
}
|
||||||
|
if (event.modifiers & Qt.ControlModifier) {
|
||||||
|
keyNames.push("Ctrl")
|
||||||
|
}
|
||||||
|
if (event.modifiers & Qt.ShiftModifier) {
|
||||||
|
keyNames.push("Shift")
|
||||||
|
}
|
||||||
|
var keyName = d.keyToString(event.key,false)
|
||||||
|
if(keyName!==""){
|
||||||
|
keyNames.push(keyName)
|
||||||
|
content_dialog.keysModel = keyNames
|
||||||
|
}
|
||||||
|
event.accepted = true
|
||||||
|
}
|
||||||
|
Keys.onTabPressed:
|
||||||
|
(event)=>{
|
||||||
|
event.accepted = true
|
||||||
|
}
|
||||||
|
Row{
|
||||||
|
spacing: 5
|
||||||
|
anchors.centerIn: parent
|
||||||
|
Repeater{
|
||||||
|
model: content_dialog.keysModel
|
||||||
|
delegate: ItemKey{
|
||||||
|
text: modelData
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
content_dialog.open()
|
content_dialog.open()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user