Skip to content

Window zoom: Ctrl + wheel / Ctrl ± / Ctrl+0 (split from #326) - #440

Merged
KnifeLemon merged 5 commits into
KnifeLemon:mainfrom
flexeykinDev:feature/ui-zoom
Oct 23, 2026
Merged

KnifeLemon merged 5 commits into
KnifeLemon:mainfrom
flexeykinDev:feature/ui-zoom

Conversation

@flexeykinDev

Copy link
Copy Markdown
Contributor

What does this change?

Point 4 of the #326 review, split out for discussion: window zoom. Everything in Filee's windows gets larger or smaller, the way a browser zooms a page:

  • Ctrl + mouse wheel, Ctrl + plus / minus: 70 % to 180 %, in 10 % steps;
  • Ctrl + 0: back to 100 %.

All windows change together, and the size is remembered in settings.json (UiScale, default 1). No schema bump is needed: a missing value reads as 1. The content of each window is scaled with a LayoutTransformControl, so layouts that adapt to their width see the room they really have. The donut, the toasts and the overlays aren't scaled.

Services/UiZoom is the whole feature. App.ApplySettings configures it, and the main window, the preset and group editors, engine setup, the LibreOffice options, the merge order and rename windows call UiZoom.Track(this).

Open question, from the review: there is no visible setting to undo it. Ctrl + 0 resets it, but someone who zoomed by accident may not know that. Options I can add here:

  • (a) a "Window size" slider with a reset on the Theme page;
  • (b) a small "110 % · Reset" chip that shows for a few seconds after each zoom change;
  • (c) both.

Or leave it out, if you'd rather not have zoom at all.

How was it tested?

  • dotnet format --verify-no-changes
  • dotnet test. New test: UiZoomTests — Ctrl + plus, Ctrl + wheel and Ctrl + 0 change the scale and the window's transform; values beyond the limits are clamped.

Checklist

  • No new UI strings.
  • No new third-party code.

@KnifeLemon KnifeLemon added the feature New features label Oct 22, 2026
@KnifeLemon KnifeLemon self-assigned this Oct 22, 2026

@KnifeLemon KnifeLemon left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @flexeykinDev for splitting this out and for spelling out the open question.

To answer it: we'd go with (a), a "Window size" setting on the Theme page that shows the current size and has a Reset button, with a hint that mentions Ctrl + wheel, Ctrl + plus / minus and Ctrl + 0. That's where people look when everything suddenly got bigger, and it helps someone who doesn't know the shortcuts. The chip in (b) would be a nice extra, but it's optional. The new strings need to go into all 13 language files, ne.json included. If another language lands before this PR, we'll fill that one ourselves.

I built it with today's main merged in. dotnet format is clean, UiZoomTests, RenderTests and LocalizationTests pass, and so do the Core tests (457, 3 skipped as usual). In CI everything passed except "Package on Ubuntu 22.04 (linux-arm64)", where the smoke launch (Filee --settings …) didn't finish within 15 s. The same arm64 smoke step also timed out on #439, and x64 passed, so it doesn't look related to this PR. We'll re-run it.

What needs another pass:

  1. Touchpads and smooth wheels. Each wheel event zooms a full 10 %, whatever its size. Precision touchpads send many small deltas, and on Windows so does pinch-to-zoom, which arrives as Ctrl + wheel. In a quick headless test, ten events of 0.1 took the zoom from 100 % straight to 180 %. Please add up Delta.Y and step once per whole notch, starting the count again when the direction changes.
  2. Every step saves and re-applies all settings. The save callback calls UserDataStore.SaveSettings(), which raises SettingsChanged. So each notch re-runs App.ApplySettings: the custom theme is read from disk, the theme resources are rebuilt for every window, and the trigger detector and system integration run again. Each notch also re-applies the watch folders and notifies the General and Shortcuts pages. Please store the value without raising SettingsChanged (a small store method for it is fine) and debounce the write, so turning the wheel a few notches writes settings.json once.
  3. Fixed-size windows get cut off. EngineSetupWindow (560 wide) and LibreOfficeOptionsWindow (520 wide) have CanResize="False" and only grow in height. In a render at 150 % and at 180 %, the engine setup's title and cards are cut off on the right. The window also grows to the full screen height, so its buttons can end up below the screen, and the user can't resize it to get them back. Please scale those windows' Width with the zoom or let their content scroll. The first-run engine setup in particular has to stay usable at any size.
  4. Keys.
    • Ctrl + Shift + = does nothing, because the modifiers have to be exactly Ctrl. That's "Ctrl +" as printed on a US keyboard, and on some layouts, such as Japanese, it's the only way to type +. Please accept Shift for zooming in.
    • Meta is the Windows key on Windows and Super on Linux, so Super + = and Super + wheel zoom Filee on Linux. Please use the platform's command modifier (PlatformSettings.HotkeyConfiguration.CommandModifiers), which is Ctrl on Windows and Linux and Cmd on macOS.
  5. What isn't scaled. The description says all windows change together, but some aren't tracked: the notice windows (update, what's new, close, elevation, sponsor, feedback, format request, engine update) and the message dialog from WindowService. Drop-down lists, context menus and tooltips aren't scaled either, because they open in their own popups outside the LayoutTransformControl, so they stay at 100 % next to enlarged text. Please track the notice windows too, or list the windows that are left out and why.
  6. Docs. Please add a short paragraph to docs/ARCHITECTURE.md covering UiZoom, the wrapper, which windows it covers (and what stays at 100 %), and UiScale in settings.json.

On tests: the existing test is a good start. One test that small wheel deltas add up and one for Ctrl + Shift + = would cover points 1 and 4. You're right that UiScale needs no settings schema change, since a missing value reads as 1.

Thanks!

KnifeLemon and others added 2 commits October 23, 2026 21:29
…t debounced save

Finishes the review of KnifeLemon#440:
- Theme → Window size: − / + and Reset, with a hint naming the shortcuts (Ctrl, or Cmd on a Mac); all 14 languages.
- Small wheel deltas (precision touchpads, smooth wheels, pinch on a Windows touchpad) add up to one step per
  whole notch; turning the other way or a pause starts the count again.
- The size is written by UserDataStore.SaveUiScale 0.6 s after the last change (and on exit) without raising
  SettingsChanged, so zooming no longer re-applies every setting. UiZoom is configured once at start.
- Keys use the platform's command modifier; Shift is allowed (Ctrl + Shift + = is "Ctrl +"), Alt is not (AltGr);
  they are handled after the controls inside, so the Triggers page's shortcut recorder still gets them.
- Windows that can't be resized grow with the zoom up to their screen and scroll; the engine setup keeps itself on
  screen and scrolls its list. Close, sponsor, what's new, update progress and the message dialog are tracked too;
  the donut, toast, corner notices and crop overlay stay at 100 %.
- docs/ARCHITECTURE.md describes UiZoom, what it covers and UiScale in settings.json.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@flexeykinDev

flexeykinDev commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor Author

Thanks! I see you already pushed 2b606f7 with all of the review points (the Window size setting, touchpad notches, the quiet debounced save, the command key with Shift, fixed-size windows, the notice windows and the docs), so I've dropped my own version of the same changes. It looks good to me.

KnifeLemon and others added 2 commits October 24, 2026 00:32
# Conflicts:
#	src/Filee.App/ViewModels/Pages/ThemePageViewModel.cs
…m wrapper

UiZoom wraps a dialog's content in a LayoutTransformControl, so the test can't
cast the content to the StackPanel the dialog was built with.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@KnifeLemon
KnifeLemon merged commit 75ce483 into KnifeLemon:main Oct 23, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature New features

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants