Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,23 @@ that section into the next version.

## [Unreleased]

### Added

- Search in the raw editor: <kbd>Ctrl</kbd>+<kbd>F</kbd> opens a search bar that
highlights every match and shows "n of m"; <kbd>Enter</kbd> /
<kbd>Shift</kbd>+<kbd>Enter</kbd> (or the arrow buttons) jump between matches,
"Aa" matches case, <kbd>Esc</kbd> closes it.

### Fixed

- Decimal options and shader constants keep up to six decimal places. The
number fields had a fixed 1–3 digits, so a value such as `0.125` was shown as
`0.13`, rounded to that when the field lost focus, and more decimals could not
be typed at all.
- Closing the window with unsaved changes asks again instead of closing without
the dialog, and the raw editor shows "Edited" again after a change (both
handlers shadowed the translation function and failed).

## [0.5.2] - 2026-11-09

### Security
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ Without Noctalia the regular libadwaita look is used.
move a window). Effects that are not installed yet are loaded through a
temporary copy of your saved config, which is restored when the preview
closes.
- **Raw editor** for any loaded file, **undo/redo**, and a backup browser.
- **Raw editor** for any loaded file with search (Ctrl+F), **undo/redo**, and a backup browser.

## Configuration safety

Expand Down
21 changes: 21 additions & 0 deletions tests/test_numbers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from umbrielmod.schema import MAX_DIGITS, decimals, format_number


def test_decimals():
assert decimals(1) == 0
assert decimals(0.5) == 1
assert decimals(0.125) == 3
assert decimals(0.0005) == 4
assert decimals(1.333333) == 6
assert decimals(1 / 3) == MAX_DIGITS


def test_format_number_keeps_precision_and_minimum():
assert format_number(0.125, 2) == "0.125"
assert format_number(0.0005, 2) == "0.0005"
assert format_number(0.5, 2) == "0.50"
assert format_number(250, 1) == "250.0"
assert format_number(1 / 3, 2) == "0.333333"
assert format_number(-0.0, 2) == "0.00"
assert format_number(-1e-9, 1) == "0.0"
assert format_number(-1.25, 1) == "-1.25"
102 changes: 63 additions & 39 deletions umbrielmod/locale/de.po
Original file line number Diff line number Diff line change
Expand Up @@ -459,53 +459,77 @@ msgstr "Live von Umbriel gerendert · {kind}"
msgid "{events} · {ms} ms"
msgstr "{events} · {ms} ms"

#: umbrielmod/pages/raw.py:104
#: umbrielmod/pages/raw.py:244
msgid "Text applied – not saved yet"
msgstr "Text übernommen – noch nicht gespeichert"

#: umbrielmod/pages/raw.py:154
#: umbrielmod/pages/raw.py:294
msgid "Backup loaded – press “Save” to keep it"
msgstr "Sicherung geladen – mit „Speichern“ übernehmen"

#: umbrielmod/pages/raw.py:28
msgid "Validate"
msgstr "Prüfen"

#: umbrielmod/pages/raw.py:71
#: umbrielmod/pages/raw.py:56
msgid "Search in the file"
msgstr "In der Datei suchen"

#: umbrielmod/pages/raw.py:65
msgid "Match case"
msgstr "Groß-/Kleinschreibung beachten"

#: umbrielmod/pages/raw.py:67
msgid "Previous match (Shift+Enter)"
msgstr "Vorheriger Treffer (Umschalt+Enter)"

#: umbrielmod/pages/raw.py:69
msgid "Next match (Enter)"
msgstr "Nächster Treffer (Enter)"

#: umbrielmod/pages/raw.py:142
msgid "No match"
msgstr "Kein Treffer"

#: umbrielmod/pages/raw.py:205
msgid "Edited – “Apply” loads the text into the editor"
msgstr "Bearbeitet – „Übernehmen“ überträgt den Text in die Oberfläche"

#: umbrielmod/pages/raw.py:113
#: umbrielmod/pages/raw.py:253
#: umbrielmod/window.py:39
msgid "Backups"
msgstr "Sicherungen"

#: umbrielmod/pages/raw.py:142
#: umbrielmod/pages/raw.py:282
msgid "This file is no longer part of the configuration"
msgstr "Diese Datei gehört nicht mehr zur Konfiguration"

#: umbrielmod/pages/raw.py:90
#: umbrielmod/pages/raw.py:174
msgid "{current} of {total}"
msgstr "{current} von {total}"

#: umbrielmod/pages/raw.py:230
msgid "Invalid"
msgstr "Ungültig"

#: umbrielmod/pages/raw.py:129
#: umbrielmod/pages/raw.py:269
msgid "Restore"
msgstr "Wiederherstellen"

#: umbrielmod/pages/raw.py:135
#: umbrielmod/pages/raw.py:275
msgid "No backups yet"
msgstr "Noch keine Sicherungen"

#: umbrielmod/pages/raw.py:83
#: umbrielmod/pages/raw.py:98
#: umbrielmod/pages/raw.py:223
#: umbrielmod/pages/raw.py:238
msgid "TOML error: {error}"
msgstr "TOML-Fehler: {error}"

#: umbrielmod/pages/raw.py:114
#: umbrielmod/pages/raw.py:254
msgid "Before every save a copy is stored in {dir} (the last 50 per file)."
msgstr "Vor jedem Speichern wird eine Kopie in {dir} abgelegt (je Datei die letzten 50)."

#: umbrielmod/pages/raw.py:148
#: umbrielmod/pages/raw.py:288
#: umbrielmod/pages/shaders.py:343
#: umbrielmod/pages/shaders.py:217
#: umbrielmod/window.py:315
Expand Down Expand Up @@ -867,7 +891,7 @@ msgstr "Top-Level-Konstanten aus dem GLSL-Code – so dokumentiert die Sammlung
msgid "Must match the preset padding"
msgstr "Muss dem padding des Presets entsprechen"

#: umbrielmod/pages/shaders.py:857
#: umbrielmod/pages/shaders.py:860
msgid "Global effects"
msgstr "Globale Effekte"

Expand Down Expand Up @@ -1057,98 +1081,98 @@ msgstr "aktuell"
msgid "preferred"
msgstr "bevorzugt"

#: umbrielmod/widgets.py:235
#: umbrielmod/widgets.py:416
#: umbrielmod/widgets.py:255
#: umbrielmod/widgets.py:439
msgid "Reset to default (removes the key)"
msgstr "Auf Standard zurücksetzen (entfernt den Schlüssel)"

#: umbrielmod/widgets.py:319
#: umbrielmod/widgets.py:342
msgid "Not set"
msgstr "Nicht gesetzt"

#: umbrielmod/widgets.py:371
#: umbrielmod/widgets.py:394
msgid "TOML value, e.g. \"text\", 1.5, [1, 2] or { a = 1 }"
msgstr "TOML-Wert, z. B. \"text\", 1.5, [1, 2] oder { a = 1 }"

#: umbrielmod/widgets.py:450
#: umbrielmod/widgets.py:473
msgid "Add entry"
msgstr "Eintrag hinzufügen"

#: umbrielmod/widgets.py:64
#: umbrielmod/widgets.py:84
msgid "Suggestions"
msgstr "Vorschläge"

#: umbrielmod/widgets.py:70
#: umbrielmod/widgets.py:90
msgid "Search…"
msgstr "Suchen…"

#: umbrielmod/widgets.py:139
#: umbrielmod/widgets.py:159
msgid "built-in"
msgstr "eingebaut"

#: umbrielmod/widgets.py:143
#: umbrielmod/widgets.py:163
msgid "Spring: damping, stiffness"
msgstr "Feder: Dämpfung, Steifigkeit"

#: umbrielmod/widgets.py:144
#: umbrielmod/widgets.py:164
msgid "Bézier curve"
msgstr "Bézier-Kurve"

#: umbrielmod/widgets.py:413
#: umbrielmod/widgets.py:426
#: umbrielmod/widgets.py:436
#: umbrielmod/widgets.py:449
msgid "empty"
msgstr "leer"

#: umbrielmod/widgets.py:444
#: umbrielmod/widgets.py:467
msgid "Remove"
msgstr "Entfernen"

#: umbrielmod/widgets.py:40
#: umbrielmod/widgets.py:60
msgid "Open the Umbriel documentation"
msgstr "Umbriel-Dokumentation öffnen"

#: umbrielmod/widgets.py:137
#: umbrielmod/widgets.py:157
msgid "suppress"
msgstr "unterdrücken"

#: umbrielmod/widgets.py:141
#: umbrielmod/widgets.py:161
msgid "Bézier"
msgstr "Bézier"

#: umbrielmod/widgets.py:142
#: umbrielmod/widgets.py:162
msgid "Spring"
msgstr "Feder"

#: umbrielmod/widgets.py:218
#: umbrielmod/widgets.py:238
msgid "Range: {min} – {max}"
msgstr "Bereich: {min} – {max}"

#: umbrielmod/widgets.py:319
#: umbrielmod/widgets.py:342
msgid "Default ({value})"
msgstr "Standard ({value})"

#: umbrielmod/widgets.py:499
#: umbrielmod/widgets.py:522
msgid "Add option"
msgstr "Option hinzufügen"

#: umbrielmod/widgets.py:220
#: umbrielmod/widgets.py:203
#: umbrielmod/widgets.py:240
#: umbrielmod/widgets.py:223
msgid "Default: {value}"
msgstr "Standard: {value}"

#: umbrielmod/widgets.py:430
#: umbrielmod/widgets.py:453
msgid "Entry {n}"
msgstr "Eintrag {n}"

#: umbrielmod/widgets.py:200
#: umbrielmod/widgets.py:220
msgid "Set in {file}"
msgstr "Festgelegt in {file}"

#: umbrielmod/widgets.py:223
#: umbrielmod/widgets.py:243
msgid "Description taken from {path}"
msgstr "Beschreibung übernommen von {path}"

#: umbrielmod/widgets.py:205
#: umbrielmod/widgets.py:225
msgid "Not set – Umbriel decides"
msgstr "Nicht gesetzt – Umbriel entscheidet"

Expand Down
Loading
Loading