Skip to content

Redesign settings with reusable form design system - #872

Open
pseudoramdom wants to merge 12 commits into
bitcoin-core:qt6from
pseudoramdom:settings-redesign-v2
Open

Redesign settings with reusable form design system#872
pseudoramdom wants to merge 12 commits into
bitcoin-core:qt6from
pseudoramdom:settings-redesign-v2

Conversation

@pseudoramdom

Copy link
Copy Markdown
Contributor

Summary

The legacy settings pages evolved through several different layout systems, producing inconsistent widths, typography, spacing, navigation patterns, and information hierarchy. This redesign intends to consolidate them in to one coherent, reusable system.

  • Add shared settings page, heading, form section, row, text-field, link, value, and picker controls
  • Group related destinations under Wallet, General, Network, and Advanced
  • Redesign the wallet, external signer, display, window behavior, storage, connection, proxy, network traffic, mempool, debug log, and about pages
  • Delete the replaced legacy settings pages
  • Update QML and functional tests for the new settings hierarchy
  • Move the RPC console into the settings

Implementation details

  • Introduce generic controls such as FormSection, FormRow, ValueRow, LinkRow, TextFieldRow, and PopupPicker provide consistent layout and interaction behavior.
  • SettingsView owns the fixed sidebar, destination definitions, visibility rules, and selected section.
  • SettingsPageContainer lazily creates a navigation stack for each visited section and preserves nested navigation when switching sections.
  • SettingsPage standardizes page headings, scrolling, horizontal padding, and readable content widths.
  • Simple choices use inline segmented controls or popup pickers instead of dedicated selection pages.
  • Standard form pages use a bounded readable width, while Network Traffic and Debug Log can use the available width with responsive side padding.
  • Network Traffic, Debug Log, and RPC Console activity follows page visibility to avoid unnecessary background work.
  • Wallet availability, desktop-only destinations, and mempool availability continue to control which sidebar items are shown.
  • Existing settings entry points now open the redesigned view, while the superseded legacy pages and top-bar RPC Console entry are removed.
  • Onboarding retains its existing connection and storage flows.

Preview

Settingsv2.mp4

@johnny9 johnny9 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

GUI: qrc:/qml/controls/TextFieldRow.qml: Cannot instantiate bound component outside its creation context
2026-08-20T22:43:42Z GUI: qrc:/qml/controls/TextFieldRow.qml: Cannot instantiate bound component outside its creation context
2026-08-20T22:43:42Z GUI: qrc:/qml/controls/ValueRow.qml: Cannot instantiate bound component outside its creation context
2026-08-20T22:43:42Z GUI: qrc:/qml/controls/LinkRow.qml: Cannot instantiate bound component outside its creation context
2026-08-20T22:43:42Z GUI: qrc:/qml/controls/LinkRow.qml: Cannot instantiate bound component outside its creation context
2026-08-20T22:43:42Z GUI: qrc:/qml/pages/settings/SettingsDesignSystem.qml: Cannot instantiate bound component outside its creation context
2026-08-20T22:43:42Z GUI: qrc:/qml/pages/settings/SettingsDesignSystem.qml: Cannot instantiate bound component outside its creation context
2026-08-20T22:43:42Z GUI: qrc:/qml/pages/settings/SettingsDesignSystem.qml: Cannot instantiate bound component outside its creation context
2026-08-20T22:43:42Z GUI: qrc:/qml/pages/settings/SettingsDesignSystem.qml: Cannot instantiate bound component outside its creation context
2026-08-20T22:43:54Z GUI: qrc:/qml/controls/TextFieldRow.qml: Cannot instantiate bound component outside its creation context
2026-08-20T22:43:54Z GUI: qrc:/qml/controls/ValueRow.qml: Cannot instantiate bound component outside its creation context
2026-08-20T22:43:54Z GUI: qrc:/qml/controls/ValueRow.qml: Cannot instantiate bound component outside its creation context from

Getting these errors in the new settings pages. I think its related to the Loaders in the FormRow. My suggestion is to remove the Loaders and use a different container and I think it should force constructing the pages in a way where this wont happen. This might be 6.4 specific too (ubuntu 24.04).

@pseudoramdom
pseudoramdom force-pushed the settings-redesign-v2 branch 4 times, most recently from 0262899 to 19c4c50 Compare August 24, 2026 20:52
@pseudoramdom

Copy link
Copy Markdown
Contributor Author

CI is happy now

Introduce reusable SettingsPage, PageHeading, and FormSection controls.

These provide constrained scrollable page content, consistent heading
typography, and card-style sections with optional headers and footers.
They are not wired into existing settings screens yet.
Add generic form, list, link, value, and textfield rows for settings
screens.

The controls provide consistent typography, dividers, disclosure
indicators, disabled states, and composable leading, trailing, and body
content. They are not wired into settings pages just yet.
Add PopupPicker, a compact control that composes a DropdownButton,
ContextMenu, and ContextMenuPicker.

The control displays the current selection and manages opening, selecting,
and closing the menu. It is intended for composition as the trailing
control of a FormRow rather than as a settings row itself.

Extend ContextMenuPicker with optional leading icons and icon-aware
layout for richer selection choices.
Update context-menu surfaces and hover states to use the revised neutral
palette.

Improve segmented-picker contrast in light mode and standardize
disclosure indicators to the compact settings-row size.
Rework the design-system page to use SettingsPage, FormSection, and the
generic row controls.

Add representative examples for switches, pickers, navigation, values,
links, inline text fields, and supporting content. Cover the shared form
components and their composition with QML tests.
Add a settings sidebar and a container that lazily creates and preserves
a navigation stack for each visited section.
Add a second Settings tab alongside the existing settings interface so
the redesign can be reviewed while pages are migrated incrementally.

Lazily create the redesigned settings view on first use and retain it
across top-level tab switches to preserve its navigation state.
Populate the sidebar-based settings view with redesigned Wallet,
External signer, Display, Window behavior, Storage, Connection, Network
traffic, Mempool information, and About pages. Integrate Debug log into
the same constrained page container.

Compose the pages from the shared settings controls while preserving
existing models, validation, actions, and nested navigation flows. Wire
wallet-related actions back to the desktop wallet view.

Suspend Network Traffic and Debug Log activity while their cached pages
are hidden. Add QML coverage for section navigation, stack preservation,
page layout, picker mappings, proxy draft handling, lifecycle behavior,
and top-level destination creation.
Add a prominent Settings heading and organize sidebar destinations under
Wallet, General, Network, and Advanced group labels.
Delete unused legacy settings pages and tests, update navigation and
resource wiring, and migrate functional coverage to Settings v2.
Move the redesigned settings pages into the main settings directory and
remove the settingsv2 prefix from QML object names and test selectors.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants