From b48a29935df094732fc16451210ea50a601294d0 Mon Sep 17 00:00:00 2001 From: Dark Steveneq Date: Sun, 12 Oct 2025 18:09:34 +0200 Subject: [PATCH] Create icon files, begin writing playback system --- CMakeLists.txt | 14 ++++++++++++-- Main.qml | 35 ++++++++++++++++++++++------------- Player.qml | 30 ++++++++++++++++++++++++++++++ ViewPlayer.qml | 15 +++++++++------ ViewSettings.qml | 9 +++++++++ main.cpp | 3 +++ resources/logo.ico | Bin 0 -> 55198 bytes resources/logo.png | Bin 0 -> 4443 bytes 8 files changed, 85 insertions(+), 21 deletions(-) create mode 100644 Player.qml create mode 100644 resources/logo.ico create mode 100644 resources/logo.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 8a79d0b..6f9ade8 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ project(qyouradio VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD_REQUIRED ON) -find_package(Qt6 REQUIRED COMPONENTS Quick) +find_package(Qt6 REQUIRED COMPONENTS Quick Multimedia) qt_standard_project_setup(REQUIRES 6.8) @@ -12,11 +12,21 @@ qt_add_executable(appqyouradio main.cpp ) +qt_add_resources(appqyouradio "resources" + PREFIX "/" + FILES + resources/logo.png +) + +set_source_files_properties(Player.qml + PROPERTIES QT_QML_SINGLETON_TYPE TRUE) + qt_add_qml_module(appqyouradio URI qyouradio VERSION 1.0 QML_FILES Main.qml + Player.qml ViewPlayer.qml ViewSettings.qml ) @@ -33,7 +43,7 @@ set_target_properties(appqyouradio PROPERTIES ) target_link_libraries(appqyouradio - PRIVATE Qt6::Quick + PRIVATE Qt6::Quick Qt6::Multimedia ) include(GNUInstallDirs) diff --git a/Main.qml b/Main.qml index c63e9e0..aca2be5 100755 --- a/Main.qml +++ b/Main.qml @@ -8,7 +8,7 @@ import QYRComponents 1.0 ApplicationWindow { width: 1280 height: 800 - title: qsTr("Hello World") + title: qsTr("QYouRadio") ColumnLayout { anchors.fill: parent @@ -21,12 +21,12 @@ ApplicationWindow { TabButton { text: qsTr("Autoradio") } - TabButton { - text: qsTr("Live Mix") - } - TabButton { - text: qsTr("Deep Bass") - } + // TabButton { + // text: qsTr("Live Mix") + // } + // TabButton { + // text: qsTr("Deep Bass") + // } TabButton { text: qsTr("Settings") } @@ -40,15 +40,24 @@ ApplicationWindow { currentIndex: tabbar.currentIndex ViewPlayer { title: qsTr("Autoradio") + streamURL: "https://youradio.nonamesoft.xyz/api/autoradio" } - ViewPlayer { - title: qsTr("Live Radio") - } - ViewPlayer { - title: qsTr("Deep Bass") - } + // ViewPlayer { + // title: qsTr("Live Radio") + // streamURL: "https://youradio.nonamesoft.xyz/api/live" + // } + // ViewPlayer { + // title: qsTr("Deep Bass") + // streamURL: "https://youradio.nonamesoft.xyz/api/deepbass" + // } ViewSettings { } } + + YouAds { + Layout.fillWidth: false + Layout.alignment: Qt.AlignHCenter + visible: tabbar.currentIndex != 1 + } } } diff --git a/Player.qml b/Player.qml new file mode 100644 index 0000000..5180d87 --- /dev/null +++ b/Player.qml @@ -0,0 +1,30 @@ +import QtMultimedia 6.8 + +pragma Singleton + +MediaPlayer { + source: "" + + function startPlaying(url) { + if (player.playing) { + return; + } + console.log("Starting playback from " + url); + player.source = url; + player.play(); + } + + function stopPlaying() { + console.log("Stopping playback..."); + player.source = ""; + player.stop(); + } + + audioOutput: AudioOutput { + volume: 0.4 + } + + onErrorOccurred: function(error, errorString) { + player.stopPlaying(); + } +} diff --git a/ViewPlayer.qml b/ViewPlayer.qml index 33a41a7..e94ba9a 100644 --- a/ViewPlayer.qml +++ b/ViewPlayer.qml @@ -63,7 +63,15 @@ ColumnLayout { Button { Layout.rightMargin: 5 - text: "Play" + text: Player.loading ? "Loading" : (Player.playing ? "Pause" : "Play") + + onClicked: function() { + if (Player.playing) { + Player.stopPlaying(); + } else { + Player.startPlaying(parent.parent.streamURL); + } + } } Slider { @@ -78,9 +86,4 @@ ColumnLayout { Item { Layout.fillHeight: true } - - YouAds { - Layout.fillWidth: false - Layout.alignment: Qt.AlignHCenter - } } \ No newline at end of file diff --git a/ViewSettings.qml b/ViewSettings.qml index ac04420..1d2d5b7 100644 --- a/ViewSettings.qml +++ b/ViewSettings.qml @@ -41,8 +41,17 @@ RowLayout { } } + Rectangle { + Layout.fillHeight: true + width: 5 + color: Colors.text + radius: 5 + } + StackLayout { Layout.fillWidth: true Layout.fillHeight: true + currentIndex: settingsCategory.currentIndex + } } \ No newline at end of file diff --git a/main.cpp b/main.cpp index 5557f37..b4fd983 100755 --- a/main.cpp +++ b/main.cpp @@ -1,3 +1,4 @@ +#include #include #include @@ -12,5 +13,7 @@ int main(int argc, char *argv[]) Qt::QueuedConnection); engine.loadFromModule("qyouradio", "Main"); + app.setWindowIcon(QIcon(":/resources/logo.png")); + return app.exec(); } diff --git a/resources/logo.ico b/resources/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..a5e8af954836ddab1b9f253907c62848ed612fd4 GIT binary patch literal 55198 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 literal 0 HcmV?d00001