init commit

This commit is contained in:
2026-04-24 20:20:24 +08:00
commit 5442e32abc
34 changed files with 2684 additions and 0 deletions

178
src/app/qml/main.qml Normal file
View File

@@ -0,0 +1,178 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
ApplicationWindow {
id: root
visible: true
width: 800
height: 600
title: qsTr("LocalSend")
StackView {
id: stackView
anchors.fill: parent
Component.onCompleted: {
push(homePageComponent)
}
}
Component {
id: homePageComponent
Page {
id: homePage
signal openSettings()
header: ToolBar {
RowLayout {
anchors.fill: parent
Label {
text: qsTr("LocalSend")
font.bold: true
font.pixelSize: 20
Layout.leftMargin: 16
}
Item { Layout.fillWidth: true }
ToolButton {
text: qsTr("Settings")
onClicked: homePage.openSettings()
}
}
}
ColumnLayout {
anchors.fill: parent
anchors.margins: 16
spacing: 16
Label {
text: qsTr("Nearby Devices")
font.bold: true
font.pixelSize: 16
}
ListView {
id: deviceListView
Layout.fillWidth: true
Layout.fillHeight: true
property var devices: appController.devices
model: devices
spacing: 8
delegate: Pane {
width: ListView.view.width
padding: 12
background: Rectangle {
color: Qt.lighter("gray", 1.8)
radius: 8
}
RowLayout {
anchors.fill: parent
Column {
Layout.fillWidth: true
Label {
text: modelData.alias || modelData.ip
font.bold: true
}
Label {
text: "%1:%2".arg(modelData.ip).arg(modelData.port)
color: "gray"
font.pixelSize: 12
}
}
Button {
text: qsTr("Send")
onClicked: {
// send to this device
}
}
}
}
}
RowLayout {
Layout.fillWidth: true
Button {
text: qsTr("Refresh")
onClicked: appController.refreshDevices()
}
Item { Layout.fillWidth: true }
Label {
text: qsTr("Alias: %1").arg(appController.alias)
color: "gray"
}
}
}
onOpenSettings: stackView.push(settingsPageComponent)
}
}
Component {
id: settingsPageComponent
Page {
id: settingsPage
signal back()
header: ToolBar {
RowLayout {
anchors.fill: parent
ToolButton {
text: qsTr("Back")
onClicked: settingsPage.back()
}
Label {
text: qsTr("Settings")
font.bold: true
Layout.fillWidth: true
Layout.leftMargin: 16
}
}
}
ColumnLayout {
anchors.fill: parent
anchors.margins: 16
spacing: 16
GridLayout {
columns: 2
Layout.fillWidth: true
Label { text: qsTr("Device Alias:") }
TextField {
id: aliasField
text: appController.alias
onEditingFinished: appController.alias = text
Layout.fillWidth: true
}
Label { text: qsTr("Port:") }
SpinBox {
id: portField
value: appController.port
from: 1
to: 65535
onValueChanged: appController.port = value
}
}
Item { Layout.fillHeight: true }
Label {
text: qsTr("Server Status: %1").arg(appController.serverRunning ? qsTr("Running") : qsTr("Stopped"))
color: appController.serverRunning ? "green" : "red"
}
}
onBack: stackView.pop()
}
}
}