Files
fortunecookie/qml/Main.qml
T
darklithium ace4d9c43c fix: Last-State, Keks-Größe, Musik-Button
- Last-State speichert in .cache/fortunecookie.darklithium/music_enabled
- Geöffneter Keks: 36x28 gu (geschlossen: 32x24 gu)
- Musik-Button: 10x10 gu, x-large Icon, erst nach Init sichtbar
- Python ohne PySide2-Abhängigkeiten
- Properties vor Functions in QML

Fixes: PermissionError auf .config/, Icon-Flickern

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-06-02 03:27:35 +02:00

190 lines
6.4 KiB
QML

import QtQuick 2.7
import QtQuick.Layouts 1.3
import QtMultimedia 5.0
import Lomiri.Components 1.3
import Lomiri.Components.Popups 1.3
import io.thp.pyotherside 1.4
MainView {
id: root
applicationName: "fortunecookie.darklithium"
width: units.gu(45)
height: units.gu(75)
theme.name: "Lomiri.Components.Themes.SuruDark"
property bool fortuneOpened: false
property string currentFortune: ""
property bool musicPlaying: false
property bool musicButtonVisible: false
Python {
id: py
Component.onCompleted: {
addImportPath(Qt.resolvedUrl("../src"));
importModule("fortunecookie", function() {
console.log("Python-Modul fortunecookie geladen");
});
}
}
MediaPlayer {
id: mediaPlayer
source: Qt.resolvedUrl("../assets/chinese_music.mp3")
loops: MediaPlayer.Infinite
volume: 0.5
}
MediaPlayer {
id: crackMediaPlayer
source: Qt.resolvedUrl("../assets/cookie_crack.mp3")
volume: 1.0
}
Page {
id: mainPage
anchors.fill: parent
header: PageHeader {
title: "Fortune Cookie"
}
Timer {
id: initTimer
interval: 1000 // Warte 1 Sekunde auf Python-Ladung
running: true
repeat: false
onTriggered: {
try {
currentFortuneLabel.text = py.call_sync("fortunecookie.get_initial_fortune", []);
cookieImage.source = Qt.resolvedUrl("../assets/cookie_closed2.png");
musicPlaying = py.call_sync("fortunecookie.get_music_enabled", []);
console.log("DEBUG QML: musicPlaying loaded from Python: " + musicPlaying);
if (musicPlaying) {
mediaPlayer.play();
}
musicButtonVisible = true;
} catch (e) {
console.log("ERROR QML: Failed to initialize: " + e);
}
}
}
Image {
id: cookieImage
anchors.centerIn: parent
width: fortuneOpened ? units.gu(36) : units.gu(32)
height: fortuneOpened ? units.gu(28) : units.gu(24)
source: fortuneOpened ? Qt.resolvedUrl("../assets/cookie_open2.png") : Qt.resolvedUrl("../assets/cookie_closed2.png")
fillMode: Image.PreserveAspectFit
MouseArea {
anchors.fill: parent
property real startY: 0
onPressed: startY = mouseY
onReleased: {
if (mouseY < startY - units.gu(2)) {
py.call("fortunecookie.open_fortune", [], function() {
crackMediaPlayer.play();
fortuneOpened = true;
currentFortune = py.call_sync("fortunecookie.get_current_fortune", []);
currentFortuneLabel.text = currentFortune;
cookieImage.source = Qt.resolvedUrl("../assets/cookie_open2.png");
});
}
}
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
onClicked: {
if (!fortuneOpened) {
py.call("fortunecookie.open_fortune", [], function() {
crackMediaPlayer.play();
fortuneOpened = true;
currentFortune = py.call_sync("fortunecookie.get_current_fortune", []);
currentFortuneLabel.text = currentFortune;
currentFortuneLabel.visible = true;
cookieImage.source = Qt.resolvedUrl("../assets/cookie_open2.png");
});
} else {
fortuneOpened = false;
currentFortuneLabel.text = "";
currentFortuneLabel.visible = false;
cookieImage.source = Qt.resolvedUrl("../assets/cookie_closed2.png");
}
}
}
}
Label {
id: currentFortuneLabel
anchors {
top: cookieImage.bottom
topMargin: units.gu(2)
left: parent.left
right: parent.right
leftMargin: units.gu(2)
rightMargin: units.gu(2)
}
text: ""
fontSize: "large"
horizontalAlignment: Text.AlignHCenter
visible: fortuneOpened
wrapMode: Text.WordWrap
MouseArea {
anchors.fill: parent
onClicked: {
py.call("fortunecookie.get_new_fortune", [], function() {
fortuneOpened = false;
currentFortune = py.call_sync("fortunecookie.get_current_fortune", []);
currentFortuneLabel.text = currentFortune;
cookieImage.source = Qt.resolvedUrl("../assets/cookie_closed2.png");
});
}
}
}
Item {
id: musicButtonContainer
anchors {
right: parent.right
bottom: parent.bottom
margins: units.gu(2)
}
width: units.gu(10)
height: units.gu(10)
visible: musicButtonVisible
Label {
id: musicButton
text: musicPlaying ? "\uD83D\uDD0A" : "\uD83D\uDD07"
fontSize: "x-large"
anchors.centerIn: parent
MouseArea {
anchors.fill: parent
hoverEnabled: true
onClicked: {
console.log("DEBUG QML: Music button clicked, current musicPlaying: " + musicPlaying);
if (musicPlaying) {
mediaPlayer.stop();
} else {
mediaPlayer.play();
}
musicPlaying = !musicPlaying;
console.log("DEBUG QML: Setting music enabled to: " + musicPlaying);
py.call("fortunecookie.set_music_enabled", [musicPlaying]);
}
}
}
}
}
}