Skip to content

Text & icon size: make it apply to the whole UI, and make it freely adjustable #945

Description

@AgreeDK

Background

A user on Facebook reported that OpenSAK's text is "far too small" for them and
that they couldn't find a way to change it. The Text and icon size setting
(Settings → General → Display, added in v1.14.0, #286/#287/#290, range widened
in #374/#375) exists, but with Large selected large parts of the UI are
still at the default size (see screenshot, v1.21.0-beta.1, Large).

Small/Medium/Large was chosen in June as a pragmatic first step (same pattern
as the date-format setting), not as a deliberate decision against a free
setting. The values live in TEXT_SIZE_MAP (utils/types.py), which makes
extending it fairly straightforward.

What follows the setting today

  • Cache list: row font, row height, type/container icons, header height
  • Detail panel: cache title, the meta values (GC code, type, D/T, container,
    country, coordinates), detail icon
  • Filter dialog: cache-type icons (capped at 16 px)

What does NOT follow the setting (from the screenshot + code)

Area Why it stays small Where
Menu bar, toolbar, quick-filter bar (GC code / Name / Where), combo boxes, tabs, bottom status line Global app font is fixed: Segoe UI 10 pt / SF Pro 13 pt / Ubuntu 10 pt theme.py _default_font() + app.setFont()
Column header text Only the header height scales, not its font cache_table.py
Status bar (Filter / caches in database / Center point / Count) Hardcoded font-size: 11px mainwindow.py (~line 100)
Detail panel captions ("GC Code", "Type", "D/T", …) hint_style() defaults to 10 px cache_detail.py + theme.py hint_style()
"Add corrected coordinates…" link Hardcoded 10 px cache_detail.py
"Placed by / Date" line hint_style(font_size=11) cache_detail.py
Description tab QWebEngineView HTML with fixed font-size: 13px cache_detail.py (~line 877)
Hint and Logs tabs QTextBrowser using the global font cache_detail.py
Map popups and labels Hardcoded 9/11/16 px in the Leaflet CSS/JS map_widget.py
Dialogs (Settings, Waypoint, Trip Planner, Welcome Wizard, GPS, …) Global font + hardcoded sizes 57 font-size literals across gui/, plus 48 hint_style() call sites

A related accessibility issue: because app.setFont() sets a fixed point size,
OpenSAK ignores the user's system font size preference on Linux and macOS.
Windows display scaling (%) still applies.

Options

A. Keep Small/Medium/Large, extend coverage.
Make the same three steps also scale the global font, web views and
hardcoded sizes. This is the smallest change, but it is still limited to three
steps. Large may still not be large enough for users with low vision.

B. Replace the presets with a UI scale factor (recommended).
A single "Text size" setting, as a percentage (e.g. 80–200 %, in 10 % steps,
or a slider). Everything is derived from it:

  • global app font = base size × scale
  • TEXT_SIZE_MAP values × scale (row height and icons follow automatically)
  • hint_style() and the hardcoded sizes become relative to the app font
    (e.g. "0.85 × base") instead of fixed px
  • QWebEngineView.setZoomFactor(scale) for the Description tab and the map,
    which makes the HTML/Leaflet sizes follow without touching their CSS

Small/Medium/Large can remain as quick presets (e.g. 85 / 100 / 130 %), and
existing settings migrate to the matching percentage. Everything applies live,
without a restart, like the current setting.

C. Qt's global scaling (QT_SCALE_FACTOR).
Scales everything (fonts, icons, spacing, web views) with almost no code
changes. However, it must be set before QApplication is created, so it
requires a restart, and fractional factors can look slightly blurry on some
platforms. It could be offered as an extra "Advanced → Interface scaling"
option for users who need more than B provides, but it should not be the
main mechanism.

Base size: in all options, start from the system's default font size
rather than a fixed pt value, so a user who has already enlarged system text
gets that respected out of the box.

Suggested phasing

  1. Quick win: central ui_scale() helper. Scale the global app font and
    setZoomFactor() on the Description view and the map. This covers most of
    the screenshot with a small change, and could ship in a beta quickly.
  2. Convert hint_style(), the status bar and the remaining hardcoded
    font-size literals to relative sizes. Add a CI test that fails on new
    hardcoded font-size: NNpx in gui/ (same idea as the existing
    language-key tests).
  3. Percentage setting in the UI (option B), migrating existing
    Small/Medium/Large values. Optionally, the base size from the system font.
  4. Optional: QT_SCALE_FACTOR as an advanced, restart-required option (C).

Acceptance criteria

  • At the largest setting, no text in the main window (menus, toolbar,
    quick-filter bar, column headers, status bar, detail captions, tabs,
    description/hint/logs, map popups) remains at the default size
  • Dialogs follow the setting
  • Changes apply live, no restart (except option C, if added)
  • Layout doesn't break at the maximum scale (dialog height clamp Apply dialog height clamp to remaining 14 dialogs (follow-up to #811) #816,
    toolbar overflow, detail meta row wrapping)
  • Existing Small/Medium/Large users keep their current look after upgrade
  • User Guide + docs/ updated

Related: roadmap item 9 (User Preferences & Theming), #735 (toolbar icons),
#654 (icon-only toolbar).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions