374 lines
14 KiB
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 ? "#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 'black'
|
||
else if(mouse.containsMouse&&bg.selected)
|
||
return 'white'
|
||
else if(!mouse.containsMouse&&bg.selected)
|
||
return 'black'
|
||
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}, 长度:${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"
|
||
}])
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|