chore: sync upstream (162 Commits) #9
No reviewers
Labels
No labels
herkunft/alpha-feedback
status
blockiert
status
zu-testen
typ
bug
typ
docs
typ
enhancement
typ
feature
typ
idea
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
iris/gridcraft!9
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "chore/sync-upstream-20261026"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Upstream-Sync von
upstream/main(162 Commits). Fast-Forward.f6b0cec6Merge pull request #2619 from aiongg/g4862dfc19Merge pull request #2618 from aiongg/g31b63c3f3Merge pull request #2617 from aiongg/g2ecb0e546Merge pull request #2616 from aiongg/g11f2da404Merge g3 into g4dbec5c58Merge g2 into g357da3d46Merge g1 into g2380be36aG1: the W, W key tip opens Switch Windows through its control5c250a7fMerge g3 into g4c7911c83G3: craft-libs at storytold main b926b5c00f5fc81aMerge g2 into g303167652Merge g1 into g2320bcfcfG1: regenerate the key tip tests7fdceaddMerge g3 into g4ec56e80fMerge g2 into g3- The workbook's active sheet is an atomic set in place (Workbook::active_sheet / set_active_sheet), so a window swap or sheet switch never clones the Arc<Workbook> or marks it dirty. Selections already live in DocState and the window views. Save records the sheet of the most recently active window. - A dialog taken out of its window while it runs goes back to that window when a command run from it switched windows (dialogs::show, ui.dialog.confirm). - view.arrangeAll {arrange?: tiled|horizontal|vertical|cascade, activeWorkbook?} returns the visible windows, active first; the desktop moves and sizes the native windows over the main window's monitor. New Window and Arrange All buttons on the View ribbon; Arrange Windows dialog. - Docs: ui-parity, hardware-parity, gaps #20, target-app-parity, ROADMAP.Ctrl+Shift+U ran the Ctrl+U shortcut on Windows and Linux and underlined the selection. In Excel it expands or collapses the formula bar, on Windows and as Control+Shift+U on a Mac. It now does that on the grid and in the cell editor or formula bar while editing, and the entry stays open. The new UI command view.expandFormulaBar {on?} sets the state, or toggles it without a parameter, and returns {on}. The chevron at the end of the formula bar is unchanged.Agile decryption checked only the password verifier, which authenticates the key — not the package. An attacker who could replace EncryptedPackage ciphertext could change workbook content undetected ([MS-OFFCRYPTO] 2.3.4.14, the descriptor's dataIntegrity element). The reader now requires the dataIntegrity pair, decrypts it with the recovered package key, and checks HMAC(hash, hmacKey) over the whole EncryptedPackage stream (StreamSize field included) against the stored value before any plaintext is returned. Excel always writes the element ("SHOULD" in the spec); descriptors without it are refused as damaged rather than accepted unauthenticated. - crypto: RFC 2104/4231 HMAC test vectors, RFC-test cases for a key longer than the block size - fixtures write the pair like Excel; new tests: missing/empty/ragged integrity fields, tampered ciphertext and descriptor, a changed StreamSize fieldA PivotTable has an Enable show details option, set with the new pivot.options command ({pivot?, enableShowDetails?: bool}). While it is off, pivot.showDetails and double-clicking a value cell list no records: the double-click shows a message and does not open the cell for editing. Labels and headers still edit. Changing the option is one undo step and does not refresh the report. pivot.fields reports the setting. XLSX files keep it: an off option is written as enableDrill="0" on the pivotTableDefinition, and enableDrill is read on open (on when absent).Data > Outline > Settings now has Summary rows below detail and Summary columns to right of detail. With one cleared, each group's - / + button sits on the line before the group, its bracket runs down to the last detail line, and Hide Detail, Show Detail, the level buttons and Ungroup mark or clear the collapsed flag on that line. Changing a direction moves the flags of collapsed groups to their new summary lines. - model: Sheet::summary_below and summary_right (on by default, also for older JSON). - xlsx: read and written as sheetPr/outlinePr summaryBelow and summaryRight; files that set them no longer lose them on save. - engine: data.outlineSettings {sheet?, summaryBelow?, summaryRight?}, undoable; outline::groups_with places the summary line. - ui: a Settings button in the Data tab's Outline group opens the dialog; the outline band follows the setting.formulas.errorChecking listed each circular reference as Sheet!A1 with the sheet name as it is, so a sheet named Bob's Q1 gave Bob's Q1!B2, which a formula does not accept as a reference. The list now quotes the name with quote_sheet, as references are written elsewhere in the engine ('Bob''s Q1'!B2), and the status bar's Circular References label uses the same form.* UI: theme tokens for icon, reference and sheet-control colours; WCAG contrast test Tokens gains the colours the chrome was hard-coding, each with a light and a dark value: on_accent (text on an accent fill), an eight-colour category palette (theme::Cat), the paper colour inside icons, reference colours for the formula bar and for the sheet, the message box warning disc, the tab bar scroll thumb, and sheet_control_* colours that follow the sheet and so stay light in both themes. What now comes from the tokens: - icons: paper (white pages glared in dark mode) and the accent constants; icons placed on the sheet use icons::paint_on_sheet, which keeps the light colours; - reference colours (editor::REF_COLORS), which were hard to read on the dark formula field; - white text on the accent in OK, Solve, slicer tiles and the AutoSave switch, 2:1 on the dark accent; - the comments pane (a white card with light text in dark mode), gallery hover and swatch outlines, the message box disc, the tab bar thumb, chart selection frames, and the sheet's filter and validation buttons. A unit test (theme::contrast_tests) checks every token pair used by the ribbon, popups, dialogs, panes, formula bar, status bar and sheet in both themes against WCAG 2: 4.5:1 for text and 3:1 for glyphs. It caught the dark danger red (3.5:1 on hover) and the selected header text (4.1:1 light), which are adjusted. * UI: ribbon scroll arrows, large split button for Formulas › AutoSum - widgets::big_split_button: the icon runs the default action, the label and its arrow open the menu. It returns both responses, with accessible names ("AutoSum" and "AutoSum options"). big_button shares its label layout. - Formulas › AutoSum uses it: the icon inserts SUM as before, and the arrow, which used to do the same, opens the Sum / Average / Count / Max / Min / More Functions menu that Home › AutoSum already had (shared as autosum_menu). Its keytip is unchanged. - When a tab's groups are wider than the window, arrows at the card's edges scroll them; before, only the mouse wheel did and nothing showed that the tab went on. ribbon::RibbonOverflow records the groups' and the card's sizes each frame. - A test checks every tab fits the card's three rows. It found View › Show stacking four checkboxes, with Headings cut off; Show is now two columns (Ruler, Gridlines / Formula Bar, Headings). Tests: tests/ribbon_layout.rs (the split button's two parts, AutoSum's icon and menu, the scroll arrows, the card height). * UI: formula bar grows from one to five lines; code editor widget The formula bar is a top-aligned row: the Name Box and the cancel, enter and fx buttons stay on the first line while the field grows. Its height is the content's laid-out line count (Alt+Enter or wrapped text) times the font's row height, from one line (30 px, as before) to five, then the field scrolls with the caret in view. This holds while editing and while viewing a cell. The height eases over 120 ms when the line count changes, and the chevron pins it at five lines (it used to give a fixed 72 px). The in-cell editor likewise stops at five lines and scrolls. formula_bar::BarLayout records where the parts went, for tests. widgets::code_editor(ui, id, &mut text, Lang, max_lines) is a small code editor for features that edit code: the monospace font, syntax colours from Tokens::syntax (new, with light and dark values in the contrast test) for Python (keywords, strings including triple-quoted ones, numbers, comments and builtins) and LaTeX (commands, scripts and comments), Tab inserting four spaces (or indenting every selected line, Shift+Tab dedenting), Enter keeping the line's indentation (one level more after a Python colon), and a scroll area that follows the caret. The tokenizer and the edits are pure functions with tests, including hostile input that must keep spans on char boundaries. kittest (tests/formula_bar.rs) covers Alt+Enter up to eight lines with the Name Box and buttons fixed and the caret visible, the commit, viewing the committed cell, the chevron, the ease, the in-cell cap and the code editor's Tab and Enter. * UI: Shift+Tab in the code editor dedents instead of indenting The editor consumed plain Tab before Shift+Tab, and egui's key match ignores Shift when the pattern lacks it, so a Shift+Tab was taken as Tab and indented the line. Shift+Tab is now consumed first; a plain Tab still inserts spaces. * UI: the ribbon card stays inside a narrow window, so its right scroll arrow is on screen The row above the ribbon can be wider than a narrow window, and the card took that width, so the right scroll arrow was drawn past the window's edge and couldn't be clicked: below about 640 px on macOS, and at 700 px with Linux's wider default fonts, where CI's ribbon test failed. The card is now kept within the window with the same margin it has on the left. * UI: each ribbon tab keeps a scroll offset of its own The ribbon's scroll area used one identity for every tab, so scrolling an overflowing tab and switching to another overflowing one hid that tab's first groups. Each tab now has its own scroll state: a tab opened after another was scrolled starts at its left edge, and a tab keeps its offset while others are used. * UI: the in-cell editor keeps its whole width for the text and shows every line Merged with main, the grid's own test asked the in-cell editor to wrap its text at the field's full width and to show every line (the editor never scrolls); the editor widget wrapped it inside the formula bar's scroll area, which took the bar's width off the text (168 px tall where 156 was right), and the grid capped it at five lines. The in-cell editor now shows the text field on its own, through the one show_edit helper the formula bar also uses, and grows with every line; the formula bar keeps its five lines and its caret scroll. The branch's five-line test for the cell editor becomes a grows-with-every-line test. * Docs: the UI building blocks' revision rows carry the date they land The rows said 2026-10-11, older than upstream rows above them, and the ui-parity row said the in-cell editor is capped at five lines. * UI: the formula bar's view of a cell starts at the cell's top The bar's read-only view kept one scroll offset for every cell, so a cell shown after scrolling another's text started scrolled. The offset is kept per cell now. * UI: the editor's field does nothing with Enter on its own The editor handles Enter (commit) and Alt+Enter (a line break) itself, and a message box over the editor takes Enter to close. The field under it is a multi-line TextEdit since the bar grew, whose own return key would add a line if it ever saw Enter; return_key(None) keeps that from depending on where focus sits. A test shows Enter over a message box adds nothing to the entry (focus is off the field then, so it passed before too: this is hardening, not a repair). The doc comment split by the show_edit helper is mended. * Docs: ui-parity says the in-cell editor shows every line, and its revision table is whole A sentence still said the in-cell editor stops at five lines, and a blank line between the table's separator and its first row ended the table. * UI: the split button's tooltip carries the shortcut hint like every ribbon button's big_split_button built its tooltip with the bare translation, so AutoSum, which became a split button, lost its shortcut hint. It uses tip_text now; the split-button test hovers the button and looks for the hint. * UI: a selection that ends at the start of a line leaves that line alone Selecting "a\n" in "a\nb" and pressing Tab also indented b, and Shift+Tab could take its indentation: the line after the selection was counted as touched. It is touched only when the selection reaches into it. * UI: the code editor applies its keys in input order, with the typing around them The editor consumed Enter, Tab and Shift+Tab before the text field saw the frame's events, so a frame carrying typed text followed by Enter (events gather between repaints, and under key repeat) put the newline before the text, and two Enters in one frame made one line. The editor now walks the frame's events in order and applies typed text, pastes, Enter, Tab, Shift+Tab, Backspace and Delete itself, taking them from the queue; the first event it does not handle and everything after it stay for the field, which runs next, so the order holds either way. * UI: the code editor keeps the input order past the keys the text field handles The editor applied its keys up to the first event it did not handle and left that event and everything after it to the text field, which has its own Tab and Enter: select all followed by Tab in one frame replaced the code with a tab character, and since the platform sends a key event before each text event, an Enter after ordinary typing lost its indentation. The editor now applies its keys up to the first event the field acts on (a caret or selection key, a key under a command modifier, IME, a click); that event and the run after it stay for the field; from the editor's next key on, the keyboard events are held back under the editor's id for its next pass, where it puts them ahead of that pass's input and splits again. They go only to the editor they were typed into, only while it still has the focus, and only in the pass right after; otherwise they are dropped rather than typed into another widget. Printable key presses do not split the stream. Tab under a command or option modifier is taken off the queue, and Enter under Shift or Option is the editor's newline, so the field never gets a Tab or an Enter of a focused editor. * UI: the ribbon layout and formula bar tests join the crate's integration test binary Since #2372 the crate's integration tests are one binary built from tests/it/, one module per file; only tests that set process-wide state stay separate. These two set none. * UI: the formula bar's one-line height follows the font, so five lines fit on Windows One line was a fixed 30 px and the bar grew by one row height per line. The panel's and the field's margins take 12 px of that, and rounding to the pixel grid up to another, so a row taller than 17 px lost the last counted line: with the Windows UI font (17.28 px rows) five lines showed four, and bar_grows_to_five_lines_then_scrolls_with_name_box_pinned failed there. formula_bar::one_line(row_h) is 30 px unless the rows need more, and every counted line fits whatever the font. The kittest heights are computed from it rather than from 30, and a unit test checks the arithmetic for rows of 15.6 to 20 px. * UI: Paste Special's OK button uses the on-accent colour It was the one OK button still drawn white on the accent: 2.14:1 in the dark theme, where every other OK uses on_accent (7.1:1).