Commit Graph
1396 Commits
Author SHA1 Message Date
aiongg 217f108ee0 Merge remote-tracking branch 'origin/i18n-format' into i18n-parse-number
# Conflicts:
#	crates/i18n/src/lib.rs
2026-10-21 05:54:08 +00:00
aiongg 9d636cf6cb Merge remote-tracking branch 'origin/i18n-file-size' into i18n-format
# Conflicts:
#	crates/i18n/src/size.rs
2026-10-21 05:50:09 +00:00
aiongg f2ab6dc7f3 i18n: rewrap the Region README paragraph 2026-10-21 05:49:46 +00:00
aiongg 9c75eda598 keymap: block the position fallback only at positions seen typing something else
AZERTY's Ctrl+Shift+E works before an e has been typed.
2026-10-21 05:49:41 +00:00
aiongg 233e0b7aa0 i18n: plural rules by language, CLDR data for every locale, trn_plain
Plural rules are looked up by language alone: CLDR's parent of sr-Latn
and zh-Hant is the root, whose only category is other, so sr-latn rows
were rejected. The baked data covers every CLDR locale (10 KB): plural
rules for he, ro, nb, ca, sk, th, ms and the rest, and decimal symbols
for nb-NO, sk-SK, bn-BD, ar-MA and English in Europe. Format applies a
Region's separators only where the system set them, and an empty
grouping separator writes none.

trn_plain writes counts in 0-9 without grouping, for documents and file
names. reset_format goes back to the system region. trn_decimal and
Format write infinities and NaN as CLDR does and take the other form.
Tests that don't set a format use en-US, not the machine's region. The
ICU4X crates are pinned to ~2.3, the minor version the data is for.
2026-10-21 05:49:38 +00:00
aiongg d0acf36588 keymap: Shift presses egui reports as their position run nothing on moved layouts
Dvorak's ⇧, types <, which egui has no key for, so egui reports the
press as W and Ctrl+Shift+, ran Ctrl+Shift+W. Once typing shows the
layout's letters are not on QWERTY positions, such a press resolves to
nothing unless the position is known to type its own letter.
2026-10-21 05:47:51 +00:00
aiongg 44dbe32226 i18n: glibc names in Collator; fa and hi collation; Persian letters and digits in folding
Collator::new takes sv_SE.UTF-8 and sr_RS@latin. Folding maps every
script's decimal digits to ASCII and, ignoring accents, Persian keheh,
Farsi yeh, alef maksura, teh marbuta and heh with hamza to the Arabic
letters. The collation data grows 4.8 KB (465 bytes gzipped).
2026-10-21 05:45:47 +00:00
aiongg c1f64180c9 i18n: check whole_from after rounding
9,960,000 bytes in DECIMAL with whole_from(10) rounds to 10.0 MB, which
is written 10 MB.
2026-10-21 05:44:52 +00:00
aiongg 01ad4a3b11 Merge remote-tracking branch 'origin/i18n-region' into i18n-format 2026-10-21 05:44:48 +00:00
aiongg 3e4cca9737 i18n: Region separators only where the system sets them; C in LC_* is en-US
Region::decimal and grouping are None unless Windows' or macOS's own
settings set them, so the number locale's CLDR data decides otherwise.
A cleared Windows sThousand is no grouping. LC_ALL=C and LC_NUMERIC=C
(and the other LC_* variables) mean the C locale; only LANG=C gives way
to the preferred language.
2026-10-21 05:44:34 +00:00
aiongg 705e91e183 i18n: isolate only text with a right-to-left letter
fmt and trn add isolates only when the template or an inserted value has
a strong RTL character (bidi class R or AL). Text with none comes out as
before, and a value's own isolate from ltr or isolate is taken off.
2026-10-21 05:44:27 +00:00
aiongg 75b97a9192 i18n: non_exhaustive Script and Han; regions that imply a script
pa-PK, uz-AF and az-IR are written in Arabic and sd-IN in Devanagari, as
CLDR's likely subtags give them. A script subtag still wins.
2026-10-21 05:43:04 +00:00
aiongg cf36f3cb21 i18n: numbers for a region on ICU4X, locale digits in counts and sizes
Format writes integers, decimals and percentages for a Region on ICU4X's
decimal formatter: the locale's digits (Arabic-Indic in Egypt, Persian in
Iran) or Latin ones on request, its separators and grouping sizes (Indian
12,34,567), CLDR's percent patterns, and the region's own separators where
the system sets them. I18n::format holds the one trn, file_size and
measure use, the system region's until set_format.

Plural rules move from intl_pluralrules to ICU4X, and trn_decimal picks
the form from the digits shown (1.0 files, 1,5 файла).

The CLDR data (decimal symbols, digits, plural rules, percent patterns)
covers the shipped languages and their regional variants; data/generate.sh
rebuilds it.
2026-10-21 05:14:23 +00:00
aiongg 86248331bb keymap: read presses by the keyboard layout
Matching, the recorder and labels share one rule (craft-libs#198, track 4):
letters by the layout's Latin letter, or by position on layouts that are not
Latin; digits as typed, else by position; punctuation as typed, without the
Shift the layout needs for it. Layout holds whether the layout is Latin and
its characters at punctuation positions, reported by the platform or learned
from typing. KeyInput holds what the toolkit reports for one press, so a
toolkit that knows the virtual-key code, the macOS command table or the
Shift level can pass it on.
2026-10-21 04:57:06 +00:00
69a4154fb8 craft-i18n: search folding and locale sorting
`Folder` folds text for case- and accent-insensitive search (Turkish and
Azerbaijani i by locale, ß, final sigma, ligatures, full-width forms) and
maps matches back to the original text for highlighting. `Collator`
(feature `collate`) sorts lists in the locale's order with digits compared
by value, on ICU4X with collation data for the shipped locales only.

The Turkish i and sigma handling come from PdfCraft's `fold_case`.

Part of #198.

Co-authored-by: snipeTR <31975916+snipeTR@users.noreply.github.com>
Co-authored-by: nevicia2010-hub <nevicia2010@gmail.com>
2026-10-21 04:56:28 +00:00
aiongg 3f8226ac69 Merge remote-tracking branch 'origin/i18n-region' into i18n-format
# Conflicts:
#	crates/i18n/README.md
#	crates/i18n/src/lib.rs
2026-10-21 04:47:06 +00:00
aiongg 3fcaddbdae i18n: file sizes and measures with translatable unit names
I18n::file_size writes a byte count in steps of 1024 (KB or KiB) or 1000
(KB), with decimals per unit, no decimals from a given value up, a
smallest and largest unit, and bytes as B or in words. I18n::measure
writes any value with a unit template such as "{n} px". Unit names are
catalog rows in context `unit`, keyed by the English template, so a
translation can change the symbol and its spacing.
2026-10-21 04:44:53 +00:00
aiongg 90a5999a1d i18n: parse_number for typed and pasted numbers
Reads any Unicode decimal digits, the locale's decimal mark plus ٫,
grouping by the locale's other mark, spaces, apostrophes or ٬ (threes
or Indian 2-2-3), and -/−/+ signs, ignoring bidi marks. Input that
fits no single reading is an error, not a guess.
2026-10-21 04:44:16 +00:00
ce70b2ede8 i18n: formatting region apart from the interface language
Region holds the number and time locales, metric or US measurement, A4 or
Letter, the decimal separator, and the grouping separator and clock when
the system sets them. Region::system reads Windows' regional format with
the user's changes, Apple's current locale, the POSIX LC_* variables each
on their own, and the preferred language on the web and Android.
Region::from_setting takes an app's saved choice ("auto" or a tag).

Ported from WordCraft's Region (storytold/wordcraft#857, #1494).

Co-authored-by: Dmitrii Khlapov <dkhlapov@pm.me>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-21 04:41:41 +00:00
aiongg a0b923ac1e docking: icon groups reserve no drag strip
An icon group's drag band covers the separator above it and the top 4 pt of its first icon, so icons are spaced only by the separators between groups.
2026-10-21 04:40:33 +00:00
aiongg e896187c6c i18n: isolate inserted values in fmt and trn
fmt wraps each value in FSI…PDI and trn wraps {n} in LRI…PDI, so a
value's direction can't reorder the message around it. ltr() isolates
numbers and paths left to right; a value that already is one isolate
goes in unchanged, and a stray PDI can't close the isolate early.
fmt_plain and strip_isolates are for text that leaves the interface.
2026-10-21 04:40:00 +00:00
aiongg 903dbd5fa3 i18n: scripts, direction and regional Han per language tag
scripts(tag) lists the ISO 15924 scripts a language's interface text is
written in, direction(tag) follows the main script, and han(tag) gives
the regional Han forms (SC, TC, HK, JP, KR) for picking a CJK face.
I18n::rtl uses direction.
2026-10-21 04:38:22 +00:00
aiongg 592cba1ca1 docking: drag areas draw no grip marks
The drag strip beside the tabs, the column bar, the floating title bar and the strip above an icon group stay draggable, with the grab cursor and the hover outline, but paint no grip lines.
2026-10-21 04:12:09 +00:00
aiongg f9a65e813f keymap ui: the chip-click test uses the node's rect as is 2026-10-20 21:42:25 +00:00
aiongg 5a8f119a70 keymap ui: test that one pointer click on another row's chip records 2026-10-20 21:30:40 +00:00
aiongg 1aef62823a keymap ui: no command id in the row tooltip; say who draws the title
The detail pane already shows the command id. Options::title is drawn
by show(); with ui() the host's container draws its own title.
2026-10-20 21:06:07 +00:00
aiongg a03f6ab0c3 keymap ui: app errors in the dialog, and the reader's dropped entries
DialogState::show_error shows an app's message under the table until the
user dismisses it (a new Dismiss button on every message) or the next
action replaces it. ForeignSet::truncated carries the entries the app's
reader dropped; plan counts them in ImportReport::truncated, which the
import review shows.
2026-10-20 21:05:56 +00:00
aiongg 636fc8b850 keymap: import-only paths on Bindable
Bindable::import_paths (with_import_path) are read by import matching
like menu paths, and make no areas or groups in the dialog, so a tool's
["Tools", label] path no longer shows a Tools Menu entry.
2026-10-20 20:59:43 +00:00
aiongg 02ba09ee9a keymap ui: Options::visible hides catalog entries from the table
Hidden entries keep their bindings and still count in conflicts; they are
left out of the rows, search and the Show entries.
2026-10-20 20:53:13 +00:00
aiongg 0bff6f4c96 keymap ui: commands that share a default key are no conflict in the dialog
The dialog's conflict count, Conflicts filter and row warnings leave out
pairs whose commands both have the chord among their defaults, as
Keymap::clashing does.
2026-10-20 20:48:54 +00:00
aiongg d9b1a89950 Merge branch 'craft-keymap' into keymap-ui
# Conflicts:
#	.github/workflows/keymap.yml
#	crates/keymap/README.md
#	crates/keymap/src/egui.rs
2026-10-20 16:01:22 +00:00
aiongg b778a764af keymap: format the profiles test 2026-10-20 15:52:45 +00:00
aiongg f501cae73b keymap: settle the public API before release
Outcome, ConflictMode, ProfileError and Options are non_exhaustive, with Options::with for
options built in one expression. Profiles keeps its fields private behind active() and sets(),
lists the sets loading dropped in problems(), and stores a format version (a store without one
reads as version 1).
2026-10-20 15:49:51 +00:00
aiongg 60daca3770 keymap: name the selected row to screen readers, announce conflicts and messages, and make group headers and key caps Tab stops 2026-10-20 15:46:56 +00:00
aiongg 9aaf9dfd38 keymap: format, and keep the dispatcher's Default clear of clippy's derive lint 2026-10-20 15:46:00 +00:00
aiongg 352a8308c5 docking: rustfmt and clippy 2026-10-20 15:32:26 +00:00
aiongg 5f48f1e1eb docking: per-frame lookups scale with the panel count
The renderer looked up each panel's place with a tree walk, found
recorded content heights by linear search and named every possible
control of every panel to record hit rects. Places come from one
traversal per frame, content heights through an index, and hit rects
are named only when hit_rects asks.
2026-10-20 15:32:26 +00:00
aiongg 6d96b4f684 keymap: mark public enums and report structs that will grow non_exhaustive 2026-10-20 15:29:50 +00:00
aiongg ad79cbcf31 keymap: translate shortcut parse errors and give translators whole sentences with placeholders 2026-10-20 15:29:42 +00:00
aiongg 0fe98b3be9 docking: Target, Side, ResizeEdge, Profile and DockStyle are non_exhaustive
New variants and style fields can then be added without breaking apps.
DockStyle gains from_visuals and Default for building a style without a Ui.
2026-10-20 15:26:57 +00:00
aiongg 501e2cf1fc keymap: while typing, text-editing chords go to the text field unless an active context binds them 2026-10-20 15:21:54 +00:00
aiongg bc4addb8d4 docking: opening works when locked, and hiding respects closable
OpenAt checked the opened panel's movable, so a locked workspace refused
OpenAt while Open worked. It checks movable only for a panel already
shown. Workspace::set_visible takes the app's permissions, so hiding
cannot close a protected canvas.
2026-10-20 15:21:51 +00:00
aiongg b19b2638a1 docking: validate rejects empty frames and accordions
No action leaves a Tabs or Stack node without panels, and no app
fixture has one; a file that does is invalid, as an empty group is.
2026-10-20 15:21:51 +00:00
aiongg 0781c48870 docking: screen-reader resize values follow the column width on either edge
On a dock at the right edge the column handle passed accessibility
values through the physical axis, so SetValue 300 gave width 180 and
Increment shrank the column. ResizeHandle::reversed applies
accessibility actions in value space; the pointer and arrow keys stay
physical.
2026-10-20 15:21:46 +00:00
aiongg c084db9c78 docking: a pointer drag on a divider or resize grip leaves no focus behind
Keeping focus on the handle after a pointer drag broke app shortcuts
that defer to a focused widget (egui_wants_keyboard_input), and arrow
keys moved both the canvas selection and the divider. A handle focused
by the pointer gives the focus up on release; one reached with Tab or
F6 keeps it, and arrow keys resize it.
2026-10-20 15:21:46 +00:00
aiongg 423524c1bc keymap: clipboard chords with more modifiers run their bindings with clipboard events off 2026-10-20 15:18:05 +00:00
aiongg 41a14168ea docking: reconcile and restore keep a protected canvas shown
Restoring beside a sibling subtree needed the exact same set of panels,
so a migrated layout without the canvas put the canvas in hidden. Restore
splits the anchor alone when the subtree changed. reconcile takes the
panels' permissions and never leaves a registered panel that cannot
close in hidden: it goes back to its recorded or default place, else to
the outer edge of the docked area.
2026-10-20 15:12:06 +00:00
aiongg 5160611bad keymap: while typing, a Ctrl+Alt press runs unless it typed text in the frame 2026-10-20 15:11:46 +00:00
aiongg 79747aeaae keymap: remove the Text event a bound press typed, also when the web build sends it first 2026-10-20 15:11:21 +00:00
aiongg fd2386b2ba keymap: hold the set row, table and edit actions while a prompt or the import review is open
Switching sets closes an open prompt, deleting a set reloads only when it was the active one, and
deleting the last set with no built-ins loads no overrides.
2026-10-20 15:10:58 +00:00