完成主要交互、高性能组件、国际化和A型传感器数据包接收
This commit is contained in:
165
qml/content/NavBar.qml
Normal file
165
qml/content/NavBar.qml
Normal file
@@ -0,0 +1,165 @@
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Controls.Material
|
||||
import QtQuick.Layouts
|
||||
import TactileIPC 1.0
|
||||
|
||||
Rectangle {
|
||||
id: root
|
||||
height: 56
|
||||
color: Backend.lightMode ? "#F5F7F5" : "#2B2F2B"
|
||||
|
||||
Material.theme: Backend.lightMode ? Material.Light : Material.Dark
|
||||
Material.accent: Material.Green
|
||||
Material.primary: Material.Green
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
height: 1
|
||||
color: Qt.rgba(0, 0, 0, 0.08)
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
anchors.fill: parent
|
||||
anchors.leftMargin: 16
|
||||
anchors.rightMargin: 16
|
||||
spacing: 14
|
||||
|
||||
Label {
|
||||
text: "Tactile IPC 3D"
|
||||
font.pixelSize: 18
|
||||
font.weight: Font.DemiBold
|
||||
color: Material.color(Material.Green)
|
||||
}
|
||||
|
||||
Item { Layout.fillWidth: true }
|
||||
|
||||
RowLayout {
|
||||
spacing: 6
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
|
||||
Rectangle {
|
||||
width: 10
|
||||
height: 10
|
||||
radius: 5
|
||||
color: Backend.connected ? "#2e7d32" : "#d32f2f"
|
||||
}
|
||||
|
||||
Label {
|
||||
text: Qt.binding(function() {
|
||||
I18n.retranslateToken
|
||||
return Backend.connected ? qsTr("CONNECTED") : qsTr("DISCONNECTED")
|
||||
})
|
||||
font.pixelSize: 12
|
||||
font.weight: Font.DemiBold
|
||||
color: Backend.connected ? "#2e7d32" : "#d32f2f"
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
id: themeSwitch
|
||||
text: Qt.binding(function() {
|
||||
I18n.retranslateToken
|
||||
return Backend.lightMode ? qsTr("Light") : qsTr("Dark")
|
||||
})
|
||||
checked: Backend.lightMode
|
||||
onCheckedChanged: Backend.lightMode = checked
|
||||
}
|
||||
|
||||
ComboBox {
|
||||
id: langBox
|
||||
implicitHeight: 32
|
||||
leftPadding: 10
|
||||
rightPadding: 26
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
model: [
|
||||
{ text: "中文", value: "zh_CN", icon: "qrc:/images/china.png" },
|
||||
{ text: "English", value: "en_US", icon: "qrc:/images/united-states.png" }
|
||||
]
|
||||
textRole: "text"
|
||||
delegate: ItemDelegate {
|
||||
width: langBox.width
|
||||
height: 28
|
||||
onClicked: {
|
||||
langBox.currentIndex = index
|
||||
langBox.popup.close()
|
||||
}
|
||||
contentItem: Row {
|
||||
spacing: 8
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 8
|
||||
Image {
|
||||
width: 18
|
||||
height: 12
|
||||
fillMode: Image.PreserveAspectFit
|
||||
source: modelData.icon
|
||||
}
|
||||
Label {
|
||||
text: modelData.text
|
||||
font: langBox.font
|
||||
}
|
||||
}
|
||||
}
|
||||
contentItem: Item {
|
||||
anchors.fill: parent
|
||||
Row {
|
||||
spacing: 8
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
Image {
|
||||
width: 18
|
||||
height: 12
|
||||
fillMode: Image.PreserveAspectFit
|
||||
source: langBox.model[langBox.currentIndex]
|
||||
? langBox.model[langBox.currentIndex].icon
|
||||
: ""
|
||||
}
|
||||
Label {
|
||||
text: langBox.displayText
|
||||
font: langBox.font
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
}
|
||||
}
|
||||
popup: Popup {
|
||||
y: langBox.height
|
||||
width: langBox.width
|
||||
implicitHeight: contentItem.implicitHeight
|
||||
padding: 0
|
||||
modal: false
|
||||
focus: true
|
||||
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
|
||||
popupType: Popup.Window
|
||||
contentItem: ListView {
|
||||
implicitHeight: contentHeight
|
||||
model: langBox.delegateModel
|
||||
currentIndex: langBox.highlightedIndex
|
||||
delegate: langBox.delegate
|
||||
clip: true
|
||||
}
|
||||
}
|
||||
function syncLanguage() {
|
||||
for (let i = 0; i < model.length; i++) {
|
||||
if (model[i].value === Backend.language) {
|
||||
if (currentIndex !== i)
|
||||
currentIndex = i
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
Component.onCompleted: syncLanguage()
|
||||
Connections {
|
||||
target: Backend
|
||||
function onLanguageChanged() {
|
||||
langBox.syncLanguage()
|
||||
}
|
||||
}
|
||||
onCurrentIndexChanged: {
|
||||
if (model[currentIndex])
|
||||
Backend.language = model[currentIndex].value
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user