pragma ComponentBehavior: Bound import QtQuick 2.15 import QtQuick.Controls 2.15 ApplicationWindow { id: mainWindow visible: !airPodsTrayApp.hideOnStart width: 400 height: 300 title: "Librepods" objectName: "mainWindowObject" onClosing: mainWindow.visible = false function reopen(pageToLoad) { if (pageToLoad == "settings") { if (stackView.depth == 1) { stackView.push(settingsPage) } } else { if (stackView.depth > 1) { stackView.pop() } } if (!mainWindow.visible) { mainWindow.visible = true } raise() requestActivate() } // Mouse area for handling back/forward navigation MouseArea { anchors.fill: parent 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") } } } StackView { id: stackView anchors.fill: parent initialItem: mainPage } 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 { visible: airPodsTrayApp.deviceInfo.battery.leftPodAvailable inEar: airPodsTrayApp.deviceInfo.leftPodInEar iconSource: "qrc:/icons/assets/" + airPodsTrayApp.deviceInfo.podIcon batteryLevel: airPodsTrayApp.deviceInfo.battery.leftPodLevel isCharging: airPodsTrayApp.deviceInfo.battery.leftPodCharging indicator: "L" } PodColumn { visible: airPodsTrayApp.deviceInfo.battery.rightPodAvailable inEar: airPodsTrayApp.deviceInfo.rightPodInEar iconSource: "qrc:/icons/assets/" + airPodsTrayApp.deviceInfo.podIcon batteryLevel: airPodsTrayApp.deviceInfo.battery.rightPodLevel isCharging: airPodsTrayApp.deviceInfo.battery.rightPodCharging indicator: "R" } PodColumn { visible: airPodsTrayApp.deviceInfo.battery.caseAvailable inEar: true iconSource: "qrc:/icons/assets/" + airPodsTrayApp.deviceInfo.caseIcon batteryLevel: airPodsTrayApp.deviceInfo.battery.caseLevel isCharging: airPodsTrayApp.deviceInfo.battery.caseCharging } } SegmentedControl { anchors.horizontalCenter: parent.horizontalCenter model: ["Off", "Noise Cancellation", "Transparency", "Adaptive"] currentIndex: airPodsTrayApp.deviceInfo.noiseControlMode onCurrentIndexChanged: airPodsTrayApp.setNoiseControlModeInt(currentIndex) visible: airPodsTrayApp.airpodsConnected } Slider { visible: airPodsTrayApp.deviceInfo.adaptiveModeActive from: 0 to: 100 stepSize: 1 value: airPodsTrayApp.deviceInfo.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 { visible: airPodsTrayApp.airpodsConnected text: "Conversational Awareness" checked: airPodsTrayApp.deviceInfo.conversationalAwareness onCheckedChanged: airPodsTrayApp.setConversationalAwareness(checked) } } RoundButton { anchors.top: parent.top anchors.right: parent.right anchors.margins: 10 font.family: iconFont.name font.pixelSize: 18 text: "\uf958" onClicked: stackView.push(settingsPage) } } } Component { id: settingsPage Page { id: settingsPageItem title: "Settings" ScrollView { anchors.fill: parent Column { width: parent.width spacing: 20 padding: 20 Label { text: "Settings" font.pixelSize: 24 // center the label anchors.horizontalCenter: parent.horizontalCenter } Column { spacing: 5 // Small gap between label and ComboBox Label { text: "Pause Behavior When Removing AirPods:" } ComboBox { width: parent.width // Ensures full width model: ["One Removed", "Both Removed", "Never"] currentIndex: airPodsTrayApp.earDetectionBehavior onActivated: airPodsTrayApp.earDetectionBehavior = currentIndex } } Switch { text: "Cross-Device Connectivity with Android" checked: airPodsTrayApp.crossDeviceEnabled onCheckedChanged: { airPodsTrayApp.setCrossDeviceEnabled(checked) } } Switch { text: "Auto-Start on Login" checked: airPodsTrayApp.autoStartManager.autoStartEnabled onCheckedChanged: airPodsTrayApp.autoStartManager.autoStartEnabled = checked } Switch { text: "Enable System Notifications" checked: airPodsTrayApp.notificationsEnabled onCheckedChanged: airPodsTrayApp.notificationsEnabled = checked } Switch { visible: airPodsTrayApp.airpodsConnected text: "One Bud ANC Mode" checked: airPodsTrayApp.deviceInfo.oneBudANCMode onCheckedChanged: airPodsTrayApp.deviceInfo.oneBudANCMode = checked ToolTip { visible: parent.hovered text: "Enable ANC when using one AirPod\n(More noise reduction, but uses more battery)" delay: 500 } } Row { spacing: 5 Label { text: "Bluetooth Retry Attempts:" anchors.verticalCenter: parent.verticalCenter } SpinBox { from: 1 to: 10 value: airPodsTrayApp.retryAttempts onValueChanged: airPodsTrayApp.retryAttempts = value } } Row { spacing: 10 visible: airPodsTrayApp.airpodsConnected TextField { id: newNameField placeholderText: airPodsTrayApp.deviceInfo.deviceName maximumLength: 32 } Button { text: "Rename" onClicked: airPodsTrayApp.renameAirPods(newNameField.text) } } Row { spacing: 10 visible: airPodsTrayApp.airpodsConnected TextField { id: newPhoneMacField placeholderText: (PHONE_MAC_ADDRESS !== "" ? PHONE_MAC_ADDRESS : "00:00:00:00:00:00") maximumLength: 32 } Button { text: "Change Phone MAC" onClicked: airPodsTrayApp.setPhoneMac(newPhoneMacField.text) } } Button { text: "Show Magic Cloud Keys QR" onClicked: keysQrDialog.show() } KeysQRDialog { id: keysQrDialog encKey: airPodsTrayApp.deviceInfo.magicAccEncKey irk: airPodsTrayApp.deviceInfo.magicAccIRK } } } // 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() } } } }