Skip to content

Commit 6c20e48

Browse files
authored
Merge pull request #2 from Thedoczek/master
Support additional rain configuration
2 parents 94de54b + f0433b1 commit 6c20e48

5 files changed

Lines changed: 92 additions & 10 deletions

File tree

core/configuration.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ class DisplayConstants:
1515
KEYVIEWER_OFFSET_Y_TOP: int = 50
1616
KEYVIEWER_OFFSET_Y_BOTTOM: int = 50
1717
FALLBACK_SCREEN_HEIGHT: int = 1080
18-
FADE_START_Y: int = 800
19-
FADE_RANGE: int = 200
2018

2119
@dataclass
2220
class VisualSettings:
@@ -114,6 +112,9 @@ class KeyViewerSettings:
114112
show_counts: bool = True
115113
height: int = 60
116114
opacity: float = 0.2
115+
fade_position_y: int = 800
116+
fade_length_y: int = 200
117+
fade_trigger: str = "head"
117118

118119
def validate(self) -> bool:
119120
"""Validate KeyViewer settings.
@@ -135,6 +136,32 @@ def validate(self) -> bool:
135136
self.opacity = max(0.0, min(1.0, self.opacity))
136137
valid = False
137138

139+
# Attempt to get maximum screen height from all connected screens
140+
try:
141+
screens = QApplication.screens()
142+
if screens:
143+
max_screen_y = max(screen.size().height() for screen in screens)
144+
else:
145+
max_screen_y = 5000
146+
except Exception:
147+
max_screen_y = 5000
148+
149+
# Validate fade parameters with respect to maximum screen size
150+
if not (0 <= self.fade_position_y <= max_screen_y):
151+
logger.warning(f"Fade position {self.fade_position_y} out of range [0, {max_screen_y}], clamping")
152+
self.fade_position_y = max(0, min(max_screen_y, self.fade_position_y))
153+
valid = False
154+
if not (10 <= self.fade_length_y <= max_screen_y):
155+
logger.warning(f"Fade length {self.fade_length_y} out of range [10, {max_screen_y}], clamping")
156+
self.fade_length_y = max(0, min(max_screen_y, self.fade_length_y))
157+
valid = False
158+
159+
# Validate fade trigger
160+
if self.fade_trigger not in ("head", "tail"):
161+
logger.warning(f"Fade trigger '{self.fade_trigger}' not in ('head', 'tail'), using 'head'")
162+
self.fade_trigger = "head"
163+
valid = False
164+
138165
# Validate panel_position
139166
if self.panel_position not in ("above", "below"):
140167
logger.warning(f"Invalid panel_position '{self.panel_position}', using 'below'")

core/gui.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def __init__(self, settings_manager: SettingsManager) -> None:
3131
self.settings = settings_manager
3232
self.config = self.settings.app_config
3333
self.setWindowTitle(f"RainingKeys Config v{self.config.VERSION}")
34-
self.resize(400, 670)
34+
self.resize(410, 722)
3535

3636
# Apply Theme
3737
self.setStyleSheet(DARK_THEME)

core/overlay.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -375,8 +375,9 @@ def _draw_active_bars(
375375
kv_offset_x = self.config.key_viewer.panel_offset_x
376376
bar_color = self.config.visual.bar_color
377377

378-
fade_start_y = self.config.display.FADE_START_Y
379-
fade_range = self.config.display.FADE_RANGE
378+
fade_position_y = self.config.key_viewer.fade_position_y
379+
fade_length_y = self.config.key_viewer.fade_length_y
380+
fade_trigger = self.config.key_viewer.fade_trigger
380381
input_latency = self.config.INPUT_LATENCY_OFFSET
381382

382383
# Bar Drawing Loop
@@ -422,10 +423,12 @@ def _draw_active_bars(
422423
continue
423424

424425
# 5. Fade Logic
426+
trigger_dist = dist_head if fade_trigger == "head" else dist_tail
427+
425428
alpha = 1.0
426-
if dist_head > fade_start_y:
427-
dist_into_fade = dist_head - fade_start_y
428-
factor = 1.0 - (dist_into_fade / fade_range)
429+
if trigger_dist > fade_position_y:
430+
dist_into_fade = trigger_dist - fade_position_y
431+
factor = 1.0 - (dist_into_fade / fade_length_y)
429432
alpha = max(0.0, min(1.0, factor))
430433

431434
if alpha <= 0.0:

core/settings_manager.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ def load(self) -> None:
5959
kv.show_counts = self.config_parser.getboolean('keyviewer', 'show_counts', fallback=True)
6060
kv.height = self.config_parser.getint('keyviewer', 'height', fallback=60)
6161
kv.opacity = self.config_parser.getfloat('keyviewer', 'opacity', fallback=0.2)
62+
kv.fade_position_y = self.config_parser.getint('keyviewer', 'fade_position_y', fallback=800)
63+
kv.fade_length_y = self.config_parser.getint('keyviewer', 'fade_length_y', fallback=200)
64+
kv.fade_trigger = self.config_parser.get('keyviewer', 'fade_trigger', fallback="head")
6265

6366
# Lanes
6467
if self.config_parser.has_section('lanes'):
@@ -142,6 +145,9 @@ def save(self) -> None:
142145
self.config_parser.set('keyviewer', 'show_counts', str(kv.show_counts))
143146
self.config_parser.set('keyviewer', 'height', str(kv.height))
144147
self.config_parser.set('keyviewer', 'opacity', str(kv.opacity))
148+
self.config_parser.set('keyviewer', 'fade_position_y', str(kv.fade_position_y))
149+
self.config_parser.set('keyviewer', 'fade_length_y', str(kv.fade_length_y))
150+
self.config_parser.set('keyviewer', 'fade_trigger', kv.fade_trigger)
145151

146152
# Lanes
147153
if not self.config_parser.has_section('lanes'): self.config_parser.add_section('lanes')

core/ui/components.py

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from typing import Optional
22
from PySide6.QtWidgets import (
3-
QWidget, QVBoxLayout, QHBoxLayout, QLabel, QSpinBox,
3+
QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QSpinBox,
44
QComboBox, QGroupBox, QPushButton, QCheckBox, QColorDialog
55
)
66
from PySide6.QtCore import Signal
@@ -281,6 +281,44 @@ def init_ui(self) -> None:
281281
self.chk_kv_counts.setChecked(self.config.key_viewer.show_counts)
282282
self.chk_kv_counts.stateChanged.connect(self.on_change)
283283
layout.addWidget(self.chk_kv_counts)
284+
285+
# Attempt to get maximum screen height from all connected screens
286+
try:
287+
screens = QApplication.screens()
288+
if screens:
289+
max_screen_y = max(screen.size().height() for screen in screens)
290+
else:
291+
max_screen_y = 5000
292+
except Exception:
293+
max_screen_y = 5000
294+
295+
# Fade Controls
296+
fade_layout = QHBoxLayout()
297+
fade_layout.addWidget(QLabel("Fade Y:"))
298+
self.spin_kv_fade_pos = QSpinBox()
299+
self.spin_kv_fade_pos.setRange(0, max_screen_y)
300+
self.spin_kv_fade_pos.setValue(self.config.key_viewer.fade_position_y)
301+
self.spin_kv_fade_pos.valueChanged.connect(self.on_change)
302+
fade_layout.addWidget(self.spin_kv_fade_pos)
303+
304+
fade_layout.addWidget(QLabel("Length:"))
305+
self.spin_kv_fade_len = QSpinBox()
306+
self.spin_kv_fade_len.setRange(10, max_screen_y)
307+
self.spin_kv_fade_len.setValue(self.config.key_viewer.fade_length_y)
308+
self.spin_kv_fade_len.valueChanged.connect(self.on_change)
309+
fade_layout.addWidget(self.spin_kv_fade_len)
310+
layout.addLayout(fade_layout)
311+
312+
# Fade Trigger
313+
trigger_layout = QHBoxLayout()
314+
trigger_layout.addWidget(QLabel("Fade Trigger:"))
315+
self.combo_kv_fade_trig = QComboBox()
316+
self.combo_kv_fade_trig.addItems(["head", "tail"])
317+
self.combo_kv_fade_trig.setCurrentText(self.config.key_viewer.fade_trigger)
318+
self.combo_kv_fade_trig.currentTextChanged.connect(self.on_change)
319+
trigger_layout.addWidget(self.combo_kv_fade_trig)
320+
trigger_layout.addStretch()
321+
layout.addLayout(trigger_layout)
284322

285323
self.setLayout(layout)
286324

@@ -293,6 +331,9 @@ def on_change(self) -> None:
293331
self.config.key_viewer.panel_offset_y = self.spin_kv_off_y.value()
294332
self.config.key_viewer.show_counts = self.chk_kv_counts.isChecked()
295333
self.config.key_viewer.opacity = self.spin_kv_opacity.value() / 100.0
334+
self.config.key_viewer.fade_position_y = self.spin_kv_fade_pos.value()
335+
self.config.key_viewer.fade_length_y = self.spin_kv_fade_len.value()
336+
self.config.key_viewer.fade_trigger = self.combo_kv_fade_trig.currentText()
296337
self.settings.save()
297338

298339
def update_from_config(self) -> None:
@@ -304,7 +345,9 @@ def update_from_config(self) -> None:
304345
self.spin_kv_off_x,
305346
self.spin_kv_off_y,
306347
self.spin_kv_opacity,
307-
self.chk_kv_counts
348+
self.chk_kv_counts,
349+
self.spin_kv_fade_pos,
350+
self.spin_kv_fade_len
308351
):
309352
self.chk_kv_enabled.setChecked(self.config.key_viewer.enabled)
310353
self.spin_kv_height.setValue(self.config.key_viewer.height)
@@ -316,3 +359,6 @@ def update_from_config(self) -> None:
316359
self.spin_kv_off_y.setValue(self.config.key_viewer.panel_offset_y)
317360
self.spin_kv_opacity.setValue(int(self.config.key_viewer.opacity * 100))
318361
self.chk_kv_counts.setChecked(self.config.key_viewer.show_counts)
362+
self.spin_kv_fade_pos.setValue(self.config.key_viewer.fade_position_y)
363+
self.spin_kv_fade_len.setValue(self.config.key_viewer.fade_length_y)
364+
self.combo_kv_fade_trig.setCurrentText(self.config.key_viewer.fade_trigger)

0 commit comments

Comments
 (0)