omega/app/ui/keyboard.py

71 lines
2.3 KiB
Python

from PySide6.QtCore import QSize, QRectF
from app.ui.key import KeyItem
class KeyboardLayout():
def __init__(self, scene):
self.scene = scene
self.keys = {}
self.letter_rows = [
"QWERTZUIOP",
"ASDFGHJKL",
"YXCVBNM",
]
self.space_key = KeyItem("Space")
self.space_key.clicked.connect(lambda: self.on_key_clicked("Space"))
self.scene.addItem(self.space_key)
self.create_keys()
# callback to be set by scene
self.key_pressed_callback = None
def create_keys(self):
for row in self.letter_rows:
for char in row:
key = KeyItem(char)
key.clicked.connect(lambda c=char: self.on_key_clicked(c))
self.scene.addItem(key)
self.keys[char] = key
def layout_keys(self, view_size: QSize, top_offset: float = 0.0):
view_width = view_size.width()
view_height = view_size.height()
padding = 10.0
spacing = 6.0
rows = self.letter_rows + [" "]
row_count = len(rows)
max_keys_in_row = max(len(row) for row in rows)
total_spacing_x = (max_keys_in_row - 1) * spacing
total_spacing_y = (row_count - 1) * spacing
available_width = view_width - 2 * padding - total_spacing_x
available_height = view_height - top_offset - 2 * padding - total_spacing_y
key_width = available_width / max_keys_in_row
key_height = available_height / row_count
y = top_offset + padding
for row in self.letter_rows:
x = padding
for char in row:
key = self.keys[char]
key.set_geometry(x, y, key_width, key_height)
x += key_width + spacing
y += key_height + spacing
space_width = key_width * 7 + spacing * 6
self.space_key.set_geometry(padding, y, space_width, key_height)
def set_scale_factors(self, predictions: dict):
for key in self.keys.values():
key.set_scale_factor(1.0)
for key, probability in predictions.items():
if key.upper() in self.keys:
self.keys[key.upper()].set_scale_factor(1 + probability)
def on_key_clicked(self, label: str):
if self.key_pressed_callback:
self.key_pressed_callback(label)