ProtocolParser/app_source/qml/components/FrameChooser.qml

374 lines
14 KiB
QML

import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import RibbonUI
import ProtocolParser
Item {
clip: true
id: root
implicitWidth: layout.width + margins*2
implicitHeight: layout.height + margins*2
property double margins: 30
property int object_width: 30
ListModel{
id: frame_model
ListElement{
name:"温度"
type:"float"
}
ListElement{
name:"湿度"
type:"float"
}
ListElement{
name:"气体浓度"
type:"float"
}
ListElement{
name:"火焰指数"
type:"float"
}
}
Component.onCompleted: {
let result = Config.getArray('Protocol', 'data_frame_name')
if (result.length)
{
frame_model.clear()
var name_array=[],type_array=[]
name_array = Config.getArray('Protocol', 'data_frame_name')
type_array = Config.getArray('Protocol', 'data_frame_type')
for (var i=0;i<name_array.length;i++)
{
frame_model.append({
name:name_array[i],
type:type_array[i]
})
}
}
else
{
let name_array=[],type_array=[]
for (let i=0;i<frame_model.count;i++)
{
name_array[i] = frame_model.get(i).name
type_array[i] = frame_model.get(i).type
}
Config.setArray('Protocol', 'data_frame_name', name_array)
Config.setArray('Protocol', 'data_frame_type', type_array)
}
}
RibbonButton{
anchors{
top:parent.top
margins: 4
right:parent.right
}
show_bg: false
show_hovered_bg: false
icon_source: RibbonIcons.Dismiss
onClicked: window_popup.close()
}
ColumnLayout{
id:layout
anchors{
top:parent.top
horizontalCenter: parent.horizontalCenter
margins: margins
}
RibbonText{
Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
width: implicitWidth > parent.width ? parent.width : implicitWidth
text: qsTr("自定义传感器数据结构")
font.pixelSize: 20
wrapMode: RibbonText.WordWrap
view_only: true
}
RibbonText{
Layout.topMargin: margins/2
Layout.alignment: Qt.AlignTop | Qt.AlignLeft
width: implicitWidth > parent.width ? parent.width : implicitWidth
text: qsTr("传感器数据帧结构组成:")
wrapMode: RibbonText.WordWrap
view_only: true
}
Rectangle{
id: frame_bg
radius: 5
Layout.preferredHeight: object_width + frame.anchors.leftMargin*2
Layout.preferredWidth: object_width * 16 + frame.anchors.leftMargin*2
color: RibbonTheme.dark_mode ? '#2A2C31' : '#F2F4F7'
ListView{
id: frame
property int current_size: 0
property bool is_full: current_size === 16
property int has_selected: 0
clip: true
model: frame_model
orientation: ListView.Horizontal
implicitHeight: object_width
implicitWidth: contentWidth
anchors{
leftMargin: 2
left: parent.left
verticalCenter: parent.verticalCenter
}
delegate:RibbonRectangle{
id: bg
topLeftRadius: index === 0 ? 5 : 0
bottomLeftRadius: topLeftRadius
topRightRadius: frame.current_size === 16 && (index + 1) === frame.count ? 5 : 0
bottomRightRadius: topRightRadius
implicitHeight: object_width
implicitWidth: object_width
color: bg.selected || mouse.containsMouse ? RibbonTheme.dark_mode ? "#8AAAEB" : "#506BBD" : RibbonTheme.dark_mode ? '#3A4045' : "white"
property bool selected: false
property bool is_focused: frame.currentIndex === index
onIs_focusedChanged: {
if (!is_focused && selected)
bg.selected = !bg.selected
}
onSelectedChanged: frame.has_selected += bg.selected ? 1 : -1
property string type: model.type
property int data_size
onTypeChanged: {
data_size = cal_size(model.type)
implicitWidth = object_width * data_size
}
RibbonText{
anchors.centerIn: parent
width: implicitWidth > parent.width ? parent.width : implicitWidth
text: model.name
wrapMode: RibbonText.WordWrap
view_only: true
color:{
if(!RibbonTheme.dark_mode)
{
if(mouse.containsMouse&&!bg.selected)
return 'white'
else if(mouse.containsMouse&&bg.selected)
return 'black'
else if(!mouse.containsMouse&&bg.selected)
return 'white'
else
return 'black'
}
else
{
if(mouse.containsMouse&&!bg.selected)
return 'white'
else if(mouse.containsMouse&&bg.selected)
return 'black'
else if(!mouse.containsMouse&&bg.selected)
return 'white'
else
return 'white'
}
}
}
Rectangle{
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
width: 1
height: parent.height - frame.anchors.leftMargin * 2
visible: index + 1 !== frame.count
color: RibbonTheme.dark_mode ? "#525252" : "#D4D4D4"
Behavior on color {
ColorAnimation {
duration: 60
easing.type: Easing.OutSine
}
}
}
RibbonToolTip{
text: qsTr('类型:')+ `${bg.type}, ` + qsTr('长度:') + `${bg.data_size}B`
visible: text && mouse.containsMouse
}
MouseArea{
id: mouse
anchors.fill: parent
hoverEnabled: true
onClicked:
{
frame.currentIndex = index
bg.selected = !bg.selected
}
}
ListView.onRemove: cal_size(type,true)
function cal_size(type,is_remove)
{
let size = frame.judge_size(type);
if(!is_remove)
frame.current_size += size
else
frame.current_size -= size
return size
}
}
function judge_size(type)
{
let size = 0
switch(type)
{
case "float":
size = 4
break
case "double":
size = 8
break
case "int64_t":
size = 8
break
case "int32_t":
size = 4
break
case "int16_t":
size = 2
break
case "int8_t":
size = 1
break
case "uint64_t":
size = 8
break
case "uint32_t":
size = 4
break
case "uint16_t":
size = 2
break
case "uint8_t":
size = 1
break
}
return size
}
}
}
RowLayout{
Layout.preferredWidth: parent.width
Layout.topMargin: margins/2
Layout.alignment: Qt.AlignHCenter
spacing: margins/3
RibbonText{
text: qsTr("类型:")
view_only: true
}
RibbonComboBox{
id: type_combo
Layout.preferredWidth: 100
model: ListModel {
ListElement { text: "float" }
ListElement { text: "double" }
ListElement { text: "int64_t" }
ListElement { text: "int32_t" }
ListElement { text: "int16_t" }
ListElement { text: "int8_t" }
ListElement { text: "uint64_t" }
ListElement { text: "uint32_t" }
ListElement { text: "uint16_t" }
ListElement { text: "uint8_t" }
}
enabled: frame.current_size !==16
}
RibbonText{
text: qsTr("名称:")
view_only: true
}
RibbonLineEdit{
id: name_edit
Layout.preferredWidth: 120
placeholderText: qsTr("请输入数据名称")
onCommit: save_btn.clicked()
enabled: frame.current_size !==16
}
RibbonButton{
id: add_btn
icon_source: RibbonIcons.Add
text: qsTr("添加")
show_tooltip: false
enabled: {
if (frame.judge_size(type_combo.currentText)+frame.current_size>16)
return false
else
return true
}
onClicked: {
frame_model.append({
type:type_combo.currentText,
name:name_edit.text
})
}
}
RibbonButton{
id: delete_btn
icon_source: RibbonIcons.Delete
text: qsTr("删除")
show_tooltip: false
enabled: frame.has_selected !== 0
onClicked: {
frame_model.remove(frame.currentIndex)
}
}
}
RowLayout{
Layout.alignment: Qt.AlignHCenter
Layout.topMargin: margins/2
spacing: margins
RibbonButton{
id: save_btn
Layout.preferredWidth: 150
Layout.alignment: Qt.AlignHCenter
icon_source: RibbonIcons.Save
text: qsTr("保存")
show_tooltip: false
onClicked: {
if (!type_combo.enabled && !name_edit.enabled && frame.current_size > 0)
{
let name_array=[],type_array=[]
for (let i=0;i<frame_model.count;i++)
{
name_array[i] = frame_model.get(i).name
type_array[i] = frame_model.get(i).type
}
Config.setArray('Protocol', 'data_frame_name', name_array)
Config.setArray('Protocol', 'data_frame_type', type_array)
}
else
{
name_edit.text = qsTr("请检查数据长度")
}
}
}
RibbonButton{
id: reset_btn
Layout.preferredWidth: 150
icon_source: RibbonIcons.ArrowReset
text: qsTr("还原默认值")
show_tooltip: false
onClicked: {
frame_model.clear()
frame_model.append([{
name:"温度",
type:"float"
},{
name:"湿度",
type:"float"
},{
name:"气体浓度",
type:"float"
},{
name:"火焰指数",
type:"float"
}])
}
}
}
}
}