Files
VersaGUI/doc/05_action_dialog.md
T

4.9 KiB
Raw Blame History

ActionDialog

Datei: ActionDialog.cs

Verantwortung

Modaler Dialog zum Bearbeiten einer einzelnen Aktion (MX-Button oder Encoder-Slot) inkl. optionaler LED-Einstellungen.

Ergebnis-Properties

public DeviceAction ResultAction { get; }   // Typ + Keycode/Usage/etc.
public Color        ResultColor  { get; }   // LED-Basisfarbe
public LedAnimType  ResultAnim   { get; }   // Animation
public ushort       ResultPeriod { get; }   // Periode in ms

Panels (je nach Typ ein Panel sichtbar)

Typ Panel Inhalt
HID Tastatur _hidKeyPanel Capture-Button + Strg/Shift/Alt/Win-Checkboxen
HID Consumer _consumerPanel Dropdown mit 12 Medien-Aktionen
Host Command _cmdPanel TextBox für numerische Command-ID
Makro _macroPanel 8 Step-Buttons + je Strg/Shift/Alt-Checkboxen
Profil wechseln _profilePanel Dropdown: "Nächstes Profil (Zyklus)" / "Profil 1" / "Profil 2" / "Profil 3"
Keine Alle Panels ausgeblendet

LED-Panels (_colorPanel, _animPanel) erscheinen zusätzlich wenn showColor=true (nur MX-Buttons, nicht Encoder).

UpdateLayout() repositioniert LED-Panels und passt ClientSize dynamisch an wenn der Typ gewechselt wird.

Profil-Panel

// Items in _profileCombo:
//   Index 0: "Nächstes Profil (Zyklus)"  → Data = 0xFFFF
//   Index 1: "Profil 1"                   → Data = 0
//   Index 2: "Profil 2"                   → Data = 1
//   Index 3: "Profil 3"                   → Data = 2

// Initialbelegung: beide von der Firmware akzeptierten Zykluswerte erkennen
_profileCombo.SelectedIndex =
    action.Data is 0x00FF or 0xFFFF ? 0 : action.Data + 1;

// In OnOk():
data = _profileCombo.SelectedIndex == 0
    ? (ushort)0xFFFF
    : (ushort)(_profileCombo.SelectedIndex - 1);

SAction.data ist ein 16-Bit-Feld. Die GUI schreibt für „nächstes Profil“ kanonisch 0xFFFF; Firmware und Deserialisierung akzeptieren zusätzlich den älteren Wert 0x00FF.

Tasten-Capture (HID-Modus)

  1. Benutzer klickt "Taste drücken..."
  2. _capturing = true
  3. Nächste Taste in ProcessCmdKey()VkToHid()_hidKeycode setzen
  4. Capture-Button zeigt Tastenname (HidKeyName())

Warum ProcessCmdKey statt OnKeyDown? WinForms behandelt Pfeil- und Enter-Tasten als "Dialog Keys" in ProcessDialogKey() — sie erreichen OnKeyDown nie. ProcessCmdKey wird vor ProcessDialogKey aufgerufen und kann diese Tasten abfangen.

Makro-Capture

Jeder der 8 Steps hat einen eigenen Capture-Button. _captureStep (07, -1 = inaktiv) zeigt, welcher Step gerade aufnimmt. Capture-Logik identisch mit HID-Modus, schreibt in _stepKeycodes[captureStep]. Der erste leere Step beendet die Makrosequenz; deshalb dürfen belegte Steps keine Lücke enthalten.

Schlüssellookup (layout-unabhängig)

Problem: Windows VK-Codes sind tastaturlayout-abhängig. Keys.OemQuotes auf QWERTZ → Ö, auf US → '. Würde falsche HID-Codes liefern.

Lösung: PS/2 Scan-Codes sind layout-unabhängig (physische Tastenposition).

VK → Scan-Code via MapVirtualKey(vk, MAPVK_VK_TO_VSC)
Scan-Code → HID Usage via s_scanToHid[sc]

s_scanToHid: vollständige PS/2-Set-1 → HID-Tabelle (~60 Einträge).

Ausnahme: Erweiterte Navigationstasten (Pfeiltasten, Pos1, Ende, …) geben via MapVirtualKey den Numpad-Scan-Code zurück. Für diese gibt es eine direkte Keys → HID-Tabelle (s_extVkToHid).

Anzeige: HidKeyName(hid) gibt den lokalisierten Tastennamen zurück:

  • Sondertasten: fest eingetragene deutsche Namen ("Esc", "→", "F5", …)
  • Zeichentasten: GetKeyNameText(scanCode << 16, ...) → Windows gibt den Namen laut aktivem Layout zurück ("Ö" auf QWERTZ, ";" auf US)

Consumer-Aktionen

12 HID Consumer Usage IDs als feste Liste:

Usage Name
0x00CD Play / Pause
0x00B5 Nächster Titel
0x00B6 Vorheriger Titel
0x00B7 Stop
0x00E9 Lauter
0x00EA Leiser
0x00E2 Stummschalten
0x0192 Taschenrechner
0x0223 Browser Startseite
0x0224 Browser Zurück
0x0225 Browser Vor
0x00B0 Aufnahme

LED-Einstellungen

Nur wenn showColor=true (MX-Buttons). Enthält:

  • Farbpicker: ColorDialog_colorBtn.BackColor
  • Animations-Dropdown: Statisch / Blinken / Pulsieren / Regenbogen
  • Periode-Dropdown: 500 ms, 1 s, 2 s oder 4 s

Bei "Regenbogen" wird der Farbpicker ausgeblendet (Farbe irrelevant).

Das Binärmodell kennt außerdem FadeIn, FadeOut und ColorFade; diese drei Werte sind im Dialog noch nicht auswählbar. Per-LED-Helligkeit wird im Binärformat und JSON erhalten, besitzt hier aber ebenfalls kein Bedienelement. Beim Öffnen einer nicht angebotenen Animation fällt die Auswahl derzeit auf Static zurück. Unbekannte, aber formal gültige Consumer-Usages fallen auf „Play / Pause“ zurück. Details stehen in 07_known_limitations.md.