Files
fortunecookie/qml/Main.qml
T
darklithium da719d7670 fix: Last-State Bug, Musik-Button und Cookie-Größe
- Label direkt verwendet (nicht in Item genestet)
- Icon-Größe auf xx-large erhöht
- Musik-Button erst nach Initialisierung sichtbar
- Geöffneter Keks größer (36x28 vs 32x24 GU)
- Last-State Funktionen bereinigt

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

214 lines
7.6 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"
// ====================================================================
// PROPERTIES (am Anfang definieren!)
// ====================================================================
property bool fortuneOpened: false
property string currentFortune: ""
property bool musicPlaying: false
property bool appInitialized: 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
}
// ====================================================================
// INITIALISIERUNGS-TIMER
// ====================================================================
// WICHTIG: PyOtherSide braucht Zeit zum Laden!
// 1 Sekunde Verzögerung verhindert Race Conditions
Timer {
id: initTimer
interval: 1000
running: true
repeat: false
onTriggered: {
try {
currentFortune = py.call_sync("fortunecookie.get_initial_fortune", []);
currentFortuneLabel.text = currentFortune;
cookieImage.source = Qt.resolvedUrl("../assets/cookie_closed2.png");
// Musik-Status laden (Last-State)
musicPlaying = py.call_sync("fortunecookie.get_music_enabled", []);
console.log("DEBUG QML: musicPlaying geladen: " + musicPlaying);
// MediaPlayer Zustand synchronisieren
if (musicPlaying) {
mediaPlayer.play();
}
// UI erst nach Initialisierung anzeigen
appInitialized = true;
} catch (e) {
console.log("ERROR QML: Initialisierung fehlgeschlagen: " + e);
}
}
}
Page {
id: mainPage
anchors.fill: parent
header: PageHeader {
title: "Fortune Cookie"
}
Image {
id: cookieImage
anchors.centerIn: parent
// Geöffneter Keks ist größer als geschlossener
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;
currentFortuneLabel.visible = true;
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: false
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");
});
}
}
}
// ================================================================
// MUSIK-BUTTON
// ================================================================
// FIX: Label DIREKT verwenden (nicht in Item nesten!) - sonst "Element is not creatable"
// Icon-Größe: xx-large für bessere Sichtbarkeit
// Hintergrund: transparent (wie Page-Hintergrund)
// Erst nach Initialisierung anzeigen, um Flackern zu vermeiden
Label {
id: musicButton
anchors {
right: parent.right
bottom: parent.bottom
margins: units.gu(2)
}
width: units.gu(10)
height: units.gu(10)
text: musicPlaying ? "\uD83D\uDD0A" : "\uD83D\uDD07" // 🎵 oder 🔇
fontSize: "xx-large" // Großes Icon für gute Sichtbarkeit
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
color: theme.palette.normalText
// FIX: Erst nach Initialisierung anzeigen
visible: appInitialized
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]);
}
}
}
}
}