From 9573efb391d15cdf4ef884d95af93ee1a5c9597a Mon Sep 17 00:00:00 2001 From: jamulix Date: Sat, 25 Oct 2025 06:46:15 +0200 Subject: [PATCH] Metronom reagiert auf Benutzereingaben --- app.py | 26 +++++- static/js/script.js | 48 ++++++++++- templates/index.html | 7 +- templates/settings.html | 173 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 250 insertions(+), 4 deletions(-) create mode 100644 templates/settings.html diff --git a/app.py b/app.py index a288563..0ab31b9 100644 --- a/app.py +++ b/app.py @@ -234,6 +234,9 @@ def index(): metronome_enabled = session.get('metronome_enabled', False) metronome_bpm = session.get('metronome_bpm', 60) metronome_sound = session.get('metronome_sound', 'beep') + metronome_mode = session.get('metronome_mode', 'automatic') + metronome_speed = session.get('metronome_speed', 60) + target_error_rate = session.get('target_error_rate', 5) return render_template('index.html', current_text=current_text, @@ -244,7 +247,10 @@ def index(): current_lesson_index=progress.current_text_index, metronome_enabled=metronome_enabled, metronome_bpm=metronome_bpm, - metronome_sound=metronome_sound) + metronome_sound=metronome_sound, + metronome_mode=metronome_mode, + metronome_speed=metronome_speed, + target_error_rate=target_error_rate) except Exception as e: print(f"Fehler in index(): {e}") @@ -582,6 +588,24 @@ def get_lesson_statistics(lesson_index): print(f"Fehler in get_lesson_statistics: {e}") return jsonify({'error': 'Interner Serverfehler'}), 500 +@app.route('/settings') +def settings(): + """Einstellungsseite""" + return render_template('settings.html') + +@app.route('/save_settings', methods=['POST']) +def save_settings(): + """Speichert die Einstellungen in der Session""" + try: + data = request.get_json() + session['metronome_mode'] = data.get('metronome_mode', 'automatic') + session['metronome_speed'] = data.get('metronome_speed', 60) + session['target_error_rate'] = data.get('target_error_rate', 5) + return jsonify({'status': 'success'}) + except Exception as e: + print(f"Fehler in save_settings: {e}") + return jsonify({'error': 'Interner Serverfehler'}), 500 + @app.route('/set_metronome', methods=['POST']) def set_metronome(): """Setzt die Metronom-Einstellungen in der Session""" diff --git a/static/js/script.js b/static/js/script.js index c54ba53..eed9c7b 100644 --- a/static/js/script.js +++ b/static/js/script.js @@ -40,6 +40,11 @@ document.addEventListener('DOMContentLoaded', function() { helpModal.show(); }); + // Settings Link initialisieren + document.getElementById('settings-toggle').addEventListener('click', function() { + window.location.href = '/settings'; + }); + // Aktuelle Textdaten - mit Fallback falls undefiniert let fullText = window.fullText || "Kein Text verfügbar. Bitte laden Sie die Seite neu."; let currentCharIndex = window.currentCharIndex || 0; @@ -65,7 +70,18 @@ document.addEventListener('DOMContentLoaded', function() { let metronomeInterval = null; let audioContext = null; let metronomeSound = window.metronomeSound || 'beep'; - let metronomeBPM = window.metronomeBPM || 60; + let metronomeMode = window.metronomeMode || 'automatic'; // automatic or explicit + let targetErrorRate = window.targetErrorRate || 5; // Prozent + let currentErrorRate = 0; + let currentSpeed = 0; // Aktuelle Tippgeschwindigkeit in ZPM + + // Metronom-Geschwindigkeit basierend auf Modus initialisieren + let metronomeBPM; + if (metronomeMode === 'explicit') { + metronomeBPM = window.metronomeSpeed || 60; + } else { + metronomeBPM = window.metronomeBPM || 60; + } // Metronom-Funktionen function createBeepSound(vol, freq, duration) { @@ -156,6 +172,24 @@ document.addEventListener('DOMContentLoaded', function() { } } + // Funktion zur automatischen Anpassung der Metronom-Geschwindigkeit + function adjustMetronomeSpeed() { + if (metronomeMode === 'automatic') { + if (currentErrorRate < targetErrorRate) { + // Fehlerrate ist niedrig -> Geschwindigkeit erhöhen + metronomeBPM = Math.min(600, metronomeBPM + 10); + } else { + // Fehlerrate ist hoch -> Geschwindigkeit verringern + metronomeBPM = Math.max(60, metronomeBPM - 10); + } + + // Starte Metronom mit neuer Geschwindigkeit neu + if (metronomeEnabled && !isPaused) { + startMetronome(); + } + } + } + // Starte Metronom standardmäßig if (!isPaused) { startMetronome(); @@ -183,7 +217,10 @@ document.addEventListener('DOMContentLoaded', function() { body: JSON.stringify({ enabled: metronomeEnabled, bpm: metronomeBPM, - sound: metronomeSound + sound: metronomeSound, + mode: metronomeMode, + speed: metronomeBPM, // Verwende die aktuelle BPM + target_error_rate: targetErrorRate }) }); }); @@ -624,6 +661,13 @@ document.addEventListener('DOMContentLoaded', function() { totalElement.textContent = totalKeyStrokes; wpmElement.textContent = Math.round(wpm); + // Speichere aktuelle Werte für Metronom-Anpassung + currentSpeed = Math.round(charsPerMinute); + currentErrorRate = errorRate; + + // Passe Metronom-Geschwindigkeit automatisch an + adjustMetronomeSpeed(); + // Aktualisiere die Textfarben updateTextDisplay(); } diff --git a/templates/index.html b/templates/index.html index e0f4b8a..f266d90 100644 --- a/templates/index.html +++ b/templates/index.html @@ -17,7 +17,9 @@

Typewriter Trainer

- +
+ +
@@ -71,6 +73,9 @@ window.metronomeEnabled = {{ metronome_enabled|tojson }}; window.metronomeBPM = {{ metronome_bpm|tojson }}; window.metronomeSound = {{ metronome_sound|tojson }}; + window.metronomeMode = {{ metronome_mode|tojson }}; + window.metronomeSpeed = {{ metronome_speed|tojson }}; + window.targetErrorRate = {{ target_error_rate|tojson }}; diff --git a/templates/settings.html b/templates/settings.html new file mode 100644 index 0000000..e228392 --- /dev/null +++ b/templates/settings.html @@ -0,0 +1,173 @@ + + + + + + Einstellungen - Typewriter Trainer + + + + + +
+
+
+
+
+
+

Einstellungen

+
+
+ + +
+ +
+
+
+
+ +
+
Metronom-Einstellungen
+ + +
+ +
+ + +
+
+ + +
+
+ + + + + +
+ + + Die Metronom-Geschwindigkeit wird automatisch angepasst, um diese Fehlerrate nicht zu überschreiten +
+
+ +
+ +
+
+
+
+
+
+ + + + + + +