Skip to content

Commit 93fa13f

Browse files
authored
Demo GIF with real UI, Breeze-Dark screenshots, and correct default hotkey label (#52)
* docs(readme): add animated workflow demo GIF with generator script Add a deterministic demo GIF generator (scripts/_make_demo_gif.py) that grabs the real PyQt6 main window offscreen — with the real Breeze-Dark theme applied like at app startup — in its true states (ready, recording, transcribing, done) and composites it next to a plain target text field that receives the transcript. The real tray icons mirror the workflow states; no invented controls are drawn. The displayed hotkey matches the actual default configuration: hold left Alt (transcription_hotkey: KEY_LEFTALT, hotkey_mode: hold). Embed the generated demo-en.gif / demo-de.gif at the top of both READMEs and cover the pure helpers with unit tests. * fix(tray): show the real default recording key instead of Meta+H The standard Blitztext workflow is triggered by the configurable recording key (transcription_hotkey, default KEY_LEFTALT in hold mode) — there is no Meta+H mapping in the hotkey service. The tray menu and WORKFLOW_META nevertheless displayed a hardcoded Meta+H. Derive the tray menu label from the actual configuration via a new hotkey_display_name() helper (covers all VALID_HOTKEY_KEYS), fix the hotkey table in both READMEs, and adjust the workflow metadata. * fix(screenshots): render README assets with the real Breeze-Dark theme The screenshot generator never called theme.apply_theme(), so all committed README screenshots and banners showed the unthemed light Qt look instead of the actual Breeze-Dark glass appearance the app applies at startup. Apply the theme like the real app start does and regenerate every screenshot and banner (the tray menu now also shows the corrected Alt hotkey label).
1 parent 59dec3c commit 93fa13f

33 files changed

Lines changed: 651 additions & 7 deletions

README.de.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@
1818
<p><strong>🔗 Webseite: <a href="https://timintech.github.io/blitztextweb/">timintech.github.io/blitztextweb</a></strong></p>
1919
</div>
2020

21+
<div align="center">
22+
<img src="docs/screenshots/linux/demo-de.gif" alt="Demo: Hotkey drücken, sprechen, und Blitztext fügt den transkribierten Text direkt in die aktive Anwendung ein" width="720">
23+
<br>
24+
<sub><kbd>Alt</kbd> gedrückt halten (Standard-Hotkey), sprechen, loslassen — das Transkript landet direkt in der aktiven Anwendung.</sub>
25+
</div>
26+
2127
> [!IMPORTANT]
2228
> **Eigenständiger Linux-Port:** Dieses Repository enthält ausschließlich den Linux-Port von Blitztext – eine eigenständige Python 3/PyQt6-Implementierung optimiert für **Kubuntu/Ubuntu unter KDE Plasma mit Wayland**. Für die originale macOS-Version besuche bitte das [offizielle Haupt-Repository](https://github.com/cmagnussen/blitztext-app).
2329
@@ -47,7 +53,7 @@ Blitztext registriert globale Hotkeys via `evdev`. Mit diesen Kombinationen hast
4753

4854
| Workflow | Hotkey | LLM? | Beschreibung |
4955
| :--- | :--- | :---: | :--- |
50-
| **Blitztext** | <kbd>Meta</kbd> + <kbd>H</kbd> || Standard: Nimmt auf, transkribiert und fügt den Text ein. |
56+
| **Blitztext** | <kbd>Alt</kbd> (halten) || Standard: Nimmt auf, solange die Taste gehalten wird, transkribiert und fügt den Text ein. Aufnahmetaste und Halten/Umschalten-Modus sind unter **Einstellungen → Spracherkennung** konfigurierbar. |
5157
| **Blitztext Lokal** | <kbd>Meta</kbd> + <kbd>Shift</kbd> + <kbd>H</kbd> || Erzwingt eine reine **Offline-Transkription**. |
5258
| **Blitztext+** | <kbd>Meta</kbd> + <kbd>Shift</kbd> + <kbd>T</kbd> || Formuliert deine Aufnahme professionell via LLM um. |
5359
| **Blitztext $%&!** | <kbd>Meta</kbd> + <kbd>Shift</kbd> + <kbd>D</kbd> || Emotionale Entladung: Wandelt Frust in eine sachliche Nachricht um. |

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@
1818
<p><strong>🔗 Website: <a href="https://timintech.github.io/blitztextweb/">timintech.github.io/blitztextweb</a></strong></p>
1919
</div>
2020

21+
<div align="center">
22+
<img src="docs/screenshots/linux/demo-en.gif" alt="Demo: press the hotkey, speak, and Blitztext pastes the transcribed text into the active application" width="720">
23+
<br>
24+
<sub>Hold <kbd>Alt</kbd> (default hotkey), speak, release — the transcript lands directly in the active application.</sub>
25+
</div>
26+
2127
> [!IMPORTANT]
2228
> **Standalone Linux port:** This repository contains exclusively the Linux port of Blitztext – a standalone Python 3/PyQt6 implementation optimized for **Kubuntu/Ubuntu running KDE Plasma with Wayland**. For the original macOS version, please visit the [official main repository](https://github.com/cmagnussen/blitztext-app).
2329
@@ -47,7 +53,7 @@ Blitztext registers global hotkeys via `evdev`. With these combinations you have
4753

4854
| Workflow | Hotkey | LLM? | Description |
4955
| :--- | :--- | :---: | :--- |
50-
| **Blitztext** | <kbd>Meta</kbd> + <kbd>H</kbd> || Default: records, transcribes, and pastes the text. |
56+
| **Blitztext** | <kbd>Alt</kbd> (hold) || Default: records while the key is held, transcribes, and pastes the text. Recording key and hold/toggle mode are configurable under **Settings → Speech Recognition**. |
5157
| **Blitztext Local** | <kbd>Meta</kbd> + <kbd>Shift</kbd> + <kbd>H</kbd> || Forces a pure **offline transcription**. |
5258
| **Blitztext+** | <kbd>Meta</kbd> + <kbd>Shift</kbd> + <kbd>T</kbd> || Rephrases your recording professionally via LLM. |
5359
| **Blitztext $%&!** | <kbd>Meta</kbd> + <kbd>Shift</kbd> + <kbd>D</kbd> || Emotional release: turns frustration into a matter-of-fact message. |

app/blitztext_linux.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
from app.config import Config, DEFAULTS, VALID_HOTKEY_KEYS
3434
from app.llm_service import LLMService, WorkflowType, LLM_WORKFLOWS
3535
from app.writing_presets import WRITING_PRESET_KEYS, get_preset, preset_index
36-
from app.hotkey_service import HotkeyWorker
36+
from app.hotkey_service import HotkeyWorker, hotkey_display_name
3737
from app.audio_recorder import AudioRecorder, AudioRecorderError
3838
from app.transcribe import transcribe, TranscribeError
3939
from app.paste_service import PasteService, PasteServiceError
@@ -705,7 +705,9 @@ def setup_tray(self) -> None:
705705
self.menu.addSeparator()
706706

707707
# Actions für die fünf Workflows
708-
self.action_transcription = QAction(f"{t('workflow.transcription.name')}\tMeta+H", self)
708+
self.action_transcription = QAction(
709+
f"{t('workflow.transcription.name')}\t{hotkey_display_name(self.config.transcription_hotkey)}", self
710+
)
709711
self.action_transcription.triggered.connect(lambda: self._trigger_menu_workflow(WorkflowType.TRANSCRIPTION))
710712
self.menu.addAction(self.action_transcription)
711713

@@ -816,7 +818,9 @@ def _refresh_i18n_texts(self) -> None:
816818
if hasattr(self, "action_compose"):
817819
self.action_compose.setText(f"✍ {t('tray.compose')}")
818820
if hasattr(self, "action_transcription"):
819-
self.action_transcription.setText(f"{t('workflow.transcription.name')}\tMeta+H")
821+
self.action_transcription.setText(
822+
f"{t('workflow.transcription.name')}\t{hotkey_display_name(self.config.transcription_hotkey)}"
823+
)
820824
if hasattr(self, "action_local"):
821825
self.action_local.setText(f"{t('workflow.local.name')}\tMeta+Shift+H")
822826
if hasattr(self, "action_improver"):

app/hotkey_service.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,29 @@
2121
DEVICE_REFRESH_SECONDS = 5.0
2222
logger = logging.getLogger("blitztext.hotkey")
2323

24+
# Anzeigenamen für die konfigurierbare Aufnahmetaste (config.transcription_hotkey).
25+
# Deckt alle VALID_HOTKEY_KEYS aus app/config.py ab; unbekannte Namen fallen
26+
# auf den evdev-Namen ohne "KEY_"-Präfix zurück.
27+
_HOTKEY_DISPLAY_NAMES = {
28+
"KEY_LEFTALT": "Alt",
29+
"KEY_RIGHTALT": "AltGr",
30+
"KEY_LEFTCTRL": "Ctrl",
31+
"KEY_RIGHTCTRL": "Ctrl",
32+
"KEY_F13": "F13",
33+
"KEY_F14": "F14",
34+
"KEY_F15": "F15",
35+
"KEY_F16": "F16",
36+
"KEY_SCROLLLOCK": "Scroll Lock",
37+
"KEY_PAUSE": "Pause",
38+
"KEY_INSERT": "Insert",
39+
"KEY_CAPSLOCK": "Caps Lock",
40+
}
41+
42+
43+
def hotkey_display_name(key_name: str) -> str:
44+
"""Menschenlesbarer Name der Aufnahmetaste für Menü- und UI-Labels."""
45+
return _HOTKEY_DISPLAY_NAMES.get(key_name, key_name.removeprefix("KEY_").capitalize())
46+
2447
# Hotkey-Definitionen: WorkflowType -> (modifier_set, trigger_key_name)
2548
_HOTKEY_MAP = [
2649
# (workflow, trigger_key, required_modifiers)

app/workflows.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ class WorkflowType(str, Enum):
1212
WORKFLOW_META: Dict[WorkflowType, Dict[str, Any]] = {
1313
WorkflowType.TRANSCRIPTION: {
1414
"display_name": "🎙 Blitztext",
15-
"hotkey": "Meta+H",
15+
# Standard-Aufnahmetaste (config.transcription_hotkey: KEY_LEFTALT);
16+
# der tatsächliche Wert ist konfigurierbar, UI-Labels leiten ihn zur
17+
# Laufzeit über hotkey_service.hotkey_display_name() ab.
18+
"hotkey": "Alt",
1619
"needs_llm": False,
1720
"description": "Standard Sprache zu Text (Online oder Lokal)",
1821
},
3.56 KB
Loading
2.2 KB
Loading

docs/screenshots/linux/Banner.png

-1.4 MB
Loading
318 Bytes
Loading
716 Bytes
Loading

0 commit comments

Comments
 (0)