diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt index 79ad4a3..d46fa4b 100644 --- a/linux/CMakeLists.txt +++ b/linux/CMakeLists.txt @@ -31,6 +31,7 @@ qt_add_qml_module(applinux BatteryIndicator.qml SegmentedControl.qml PodColumn.qml + Icon.qml ) # Add the resource file @@ -46,6 +47,7 @@ qt_add_resources(applinux "resources" assets/podpro.png assets/podpro_case.png assets/podmax.png + assets/fonts/SF-Symbols-6.ttf ) target_link_libraries(applinux diff --git a/linux/Icon.qml b/linux/Icon.qml new file mode 100644 index 0000000..8a19020 --- /dev/null +++ b/linux/Icon.qml @@ -0,0 +1,13 @@ +// Icon.qml +import QtQuick 2.15 + +Text { + property string icon: "" + font.family: iconFont.name + text: icon + + FontLoader { + id: iconFont + source: "qrc:/icons/assets/fonts/SF-Symbols-6.ttf" + } +} \ No newline at end of file diff --git a/linux/Main.qml b/linux/Main.qml index 8db5c9b..7ed16e0 100644 --- a/linux/Main.qml +++ b/linux/Main.qml @@ -1,3 +1,5 @@ +pragma ComponentBehavior: Bound + import QtQuick 2.15 import QtQuick.Controls 2.15 @@ -10,110 +12,180 @@ ApplicationWindow { onClosing: mainWindow.visible = false - Column { + // Mouse area for handling back/forward navigation + MouseArea { anchors.fill: parent - spacing: 20 - padding: 20 - - // Connection status indicator (Apple-like pill shape) - Rectangle { - anchors.horizontalCenter: parent.horizontalCenter - anchors.topMargin: 10 - width: 120 - height: 24 - radius: 12 - color: airPodsTrayApp.airpodsConnected ? "#30D158" : "#FF453A" - opacity: 0.8 - visible: !airPodsTrayApp.airpodsConnected - - Label { - anchors.centerIn: parent - text: airPodsTrayApp.airpodsConnected ? "Connected" : "Disconnected" - color: "white" - font.pixelSize: 12 - font.weight: Font.Medium + acceptedButtons: Qt.BackButton | Qt.ForwardButton + onClicked: (mouse) => { + if (mouse.button === Qt.BackButton && stackView.depth > 1) { + stackView.pop() + } else if (mouse.button === Qt.ForwardButton) { + console.log("Forward button pressed") } } + } - // Battery Indicator Row - Row { - anchors.horizontalCenter: parent.horizontalCenter - spacing: 8 + StackView { + id: stackView + anchors.fill: parent + initialItem: mainPage + } - PodColumn { - isVisible: airPodsTrayApp.battery.leftPodAvailable - inEar: airPodsTrayApp.leftPodInEar - iconSource: "qrc:/icons/assets/" + airPodsTrayApp.podIcon - batteryLevel: airPodsTrayApp.battery.leftPodLevel - isCharging: airPodsTrayApp.battery.leftPodCharging - indicator: "L" + FontLoader { + id: iconFont + source: "qrc:/icons/assets/fonts/SF-Symbols-6.ttf" + } + + Component { + id: mainPage + Item { + Column { + anchors.fill: parent + spacing: 20 + padding: 20 + + // Connection status indicator (Apple-like pill shape) + Rectangle { + anchors.horizontalCenter: parent.horizontalCenter + anchors.topMargin: 10 + width: 120 + height: 24 + radius: 12 + color: airPodsTrayApp.airpodsConnected ? "#30D158" : "#FF453A" + opacity: 0.8 + visible: !airPodsTrayApp.airpodsConnected + + Label { + anchors.centerIn: parent + text: airPodsTrayApp.airpodsConnected ? "Connected" : "Disconnected" + color: "white" + font.pixelSize: 12 + font.weight: Font.Medium + } + } + + // Battery Indicator Row + Row { + anchors.horizontalCenter: parent.horizontalCenter + spacing: 8 + + PodColumn { + isVisible: airPodsTrayApp.battery.leftPodAvailable + inEar: airPodsTrayApp.leftPodInEar + iconSource: "qrc:/icons/assets/" + airPodsTrayApp.podIcon + batteryLevel: airPodsTrayApp.battery.leftPodLevel + isCharging: airPodsTrayApp.battery.leftPodCharging + indicator: "L" + } + + PodColumn { + isVisible: airPodsTrayApp.battery.rightPodAvailable + inEar: airPodsTrayApp.rightPodInEar + iconSource: "qrc:/icons/assets/" + airPodsTrayApp.podIcon + batteryLevel: airPodsTrayApp.battery.rightPodLevel + isCharging: airPodsTrayApp.battery.rightPodCharging + indicator: "R" + } + + PodColumn { + isVisible: airPodsTrayApp.battery.caseAvailable + inEar: true + iconSource: "qrc:/icons/assets/" + airPodsTrayApp.caseIcon + batteryLevel: airPodsTrayApp.battery.caseLevel + isCharging: airPodsTrayApp.battery.caseCharging + } + } + + SegmentedControl { + anchors.horizontalCenter: parent.horizontalCenter + model: ["Off", "Noise Cancellation", "Transparency", "Adaptive"] + currentIndex: airPodsTrayApp.noiseControlMode + onCurrentIndexChanged: airPodsTrayApp.noiseControlMode = currentIndex + visible: airPodsTrayApp.airpodsConnected + } + + Slider { + visible: airPodsTrayApp.adaptiveModeActive + from: 0 + to: 100 + stepSize: 1 + value: airPodsTrayApp.adaptiveNoiseLevel + + Timer { + id: debounceTimer + interval: 500 + onTriggered: if (!parent.pressed) airPodsTrayApp.setAdaptiveNoiseLevel(parent.value) + } + + onPressedChanged: if (!pressed) airPodsTrayApp.setAdaptiveNoiseLevel(value) + onValueChanged: if (pressed) debounceTimer.restart() + + Label { + text: "Adaptive Noise Level: " + parent.value + anchors.top: parent.bottom + } + } + + Switch { + text: "Conversational Awareness" + checked: airPodsTrayApp.conversationalAwareness + onCheckedChanged: airPodsTrayApp.conversationalAwareness = checked + } + + Row { + spacing: 10 + + TextField { + id: newNameField + placeholderText: airPodsTrayApp.deviceName + maximumLength: 32 + } + + Button { + text: "Rename" + onClicked: airPodsTrayApp.renameAirPods(newNameField.text) + } + } } - PodColumn { - isVisible: airPodsTrayApp.battery.rightPodAvailable - inEar: airPodsTrayApp.rightPodInEar - iconSource: "qrc:/icons/assets/" + airPodsTrayApp.podIcon - batteryLevel: airPodsTrayApp.battery.rightPodLevel - isCharging: airPodsTrayApp.battery.rightPodCharging - indicator: "R" - } - - PodColumn { - isVisible: airPodsTrayApp.battery.caseAvailable - inEar: true - iconSource: "qrc:/icons/assets/" + airPodsTrayApp.caseIcon - batteryLevel: airPodsTrayApp.battery.caseLevel - isCharging: airPodsTrayApp.battery.caseCharging + RoundButton { + anchors.top: parent.top + anchors.right: parent.right + anchors.margins: 10 + font.family: iconFont.name + font.pixelSize: 18 + text: "\uf958" // U+F958 + onClicked: stackView.push(settingsPage) } } + } - SegmentedControl { - anchors.horizontalCenter: parent.horizontalCenter - model: ["Off", "Noise Cancellation", "Transparency", "Adaptive"] - currentIndex: airPodsTrayApp.noiseControlMode - onCurrentIndexChanged: airPodsTrayApp.noiseControlMode = currentIndex - visible: airPodsTrayApp.airpodsConnected - } + Component { + id: settingsPage + Item { + // Add your settings page content here + Column { + anchors.fill: parent + spacing: 20 + padding: 20 - Slider { - visible: airPodsTrayApp.adaptiveModeActive - from: 0 - to: 100 - stepSize: 1 - value: airPodsTrayApp.adaptiveNoiseLevel + Label { + text: "Settings Page" + anchors.horizontalCenter: parent.horizontalCenter + } - Timer { - id: debounceTimer - interval: 500 - onTriggered: if (!parent.pressed) airPodsTrayApp.setAdaptiveNoiseLevel(parent.value) + } - onPressedChanged: if (!pressed) airPodsTrayApp.setAdaptiveNoiseLevel(value) - onValueChanged: if (pressed) debounceTimer.restart() - - Label { - text: "Adaptive Noise Level: " + parent.value - anchors.top: parent.bottom - } - } - - Switch { - text: "Conversational Awareness" - checked: airPodsTrayApp.conversationalAwareness - onCheckedChanged: airPodsTrayApp.conversationalAwareness = checked - } - - Row { - spacing: 10 - - TextField { - placeholderText: airPodsTrayApp.deviceName - maximumLength: 32 - } - - Button { - text: "Rename" - onClicked: airPodsTrayApp.renameAirPods(newNameField.text) + // Floating back button + RoundButton { + anchors.top: parent.top + anchors.left: parent.left + anchors.margins: 10 + font.family: iconFont.name + font.pixelSize: 18 + text: "\uecb1" // U+ECB1 + onClicked: stackView.pop() } } } diff --git a/linux/assets/fonts/SF-Symbols-6.ttf b/linux/assets/fonts/SF-Symbols-6.ttf new file mode 100644 index 0000000..68da07f Binary files /dev/null and b/linux/assets/fonts/SF-Symbols-6.ttf differ