Skip to content

build: migrate to tui-realm 4.0#418

Merged
veeso merged 1 commit into
1.0.0from
build/migrate-to-tuirealm-4.0
Apr 18, 2026
Merged

build: migrate to tui-realm 4.0#418
veeso merged 1 commit into
1.0.0from
build/migrate-to-tuirealm-4.0

Conversation

@veeso
Copy link
Copy Markdown
Owner

@veeso veeso commented Apr 18, 2026

Summary

  • Upgrade tuirealm (3.x → 4.0), tui-realm-stdlib (3 → 4) and tui-term (0.2 → 0.3)
  • Apply all breaking changes from the tui-realm 4.0 migration guide across termscp's UI (78 files)
  • Make Theme deserialization backwards compatible so pre-existing theme files keep working

Migration highlights

  • Root-level re-exports removed → module-qualified imports (tuirealm::application, component, event, props, state, subscription, listener, ratatui; tui_realm_stdlib::components::*)
  • MockComponentComponent; old Component trait → AppComponent; fn on now takes &Event<_>; #[derive(Component)] replaces #[derive(MockComponent)]
  • TextSpanSpanStatic/LineStatic/TextStatic; (String, Alignment) titles → Title builder; Alignment split into HorizontalAlignment/VerticalAlignment; stdlib components use .alignment_horizontal
  • State::One/PropPayload::OneSingle; CmdResult::NoneNoChange; Props::get_or removed and Props::get now borrows; Component::query returns Option<QueryResult<'a>>
  • Attribute::HighlightedColorHighlightStyle (full Style); .highlighted_* helpers → .highlight_*
  • PollStrategy::UpTo(n) now requires a Duration; tick timeout moved from EventListenerCfg::poll_timeout into PollStrategy
  • TerminalBridge removed → Context now owns a CrosstermTerminalAdapter directly
  • Update trait removed → activity update methods are plain inherent functions
  • stdlib ProgressBarGauge; Paragraph .wrap.wrap_trim; .text now takes Into<Text>; stdlib List rows are Vec<Span> per row (custom FileList/Log convert between the old Table model and the new one)

UX fixes needed after the migration

  • Radio builders drop .foreground(color) so unselected entries use the terminal default foreground, and set highlight_style(Style::default().fg(color).add_modifier(REVERSED)) so only the selected entry is colored
  • Custom FileList keeps the full highlight style on the selected row when focused, and falls back to a foreground-only style when unfocused
  • Borders use stdlib defaults on blur (no .inactive override), keeping the unfocused fg at terminal default

Theme backwards compatibility

Theme now uses a custom Deserialize through an intermediate ThemeFile with optional string fields. Missing fields, unknown values or legacy aliases (transfer_progress_bar_full/_partial) fall back to defaults on a per-field basis instead of failing the whole theme load. Covered by new tests in src/config/themes.rs and an updated expectation in src/config/serialization.rs.

Test plan

  • cargo build --no-default-features
  • cargo clippy --no-default-features -- -Dwarnings
  • cargo +nightly fmt --all -- --check
  • cargo test --no-default-features --features github-actions --no-fail-fast
  • Manual: auth activity (forms, bookmarks, protocol radio colors)
  • Manual: file transfer activity (focus/blur on file lists, popups, progress bar)
  • Manual: setup activity (config/theme/ssh tabs)
  • Manual: verify an existing theme file (including one with legacy transfer_progress_bar_* or malformed colors) still loads and applies saved colors

Upgrade tuirealm (3.x -> 4.0.0), tui-realm-stdlib (3 -> 4), tui-term
(0.2 -> 0.3). Apply all breaking changes from the 4.0 migration guide
across the termscp UI.

Key changes:

- Root-level re-exports removed; imports moved to module-qualified
  paths (`tuirealm::application`, `::component`, `::event`, `::props`,
  `::state`, `::subscription`, `::listener`, `::ratatui`). Same for
  stdlib component types (`tui_realm_stdlib::components::*`).
- `MockComponent` trait renamed to `Component`; old `Component` trait
  renamed to `AppComponent`. `#[derive(MockComponent)]` is now
  `#[derive(Component)]`. `Component::on` now takes `&Event<_>`.
- `TextSpan` replaced with `SpanStatic`/`LineStatic`/`TextStatic`
  (ratatui-based); tuple `(String, Alignment)` titles replaced with
  the new `Title` builder; `Alignment` split into
  `HorizontalAlignment`/`VerticalAlignment`; stdlib components use
  `.alignment_horizontal` instead of `.alignment`.
- `State::One`/`PropPayload::One` -> `Single`. `CmdResult::None`
  -> `NoChange`. `Props::get_or` removed; `Props::get` now returns a
  borrowed `Option<&AttrValue>` (call sites switched to
  `.and_then(AttrValue::as_*)`). `Component::query` returns
  `Option<QueryResult<'a>>`.
- `Attribute::HighlightedColor` -> `HighlightStyle` (a full `Style`).
  `.highlighted_*` helpers renamed to `.highlight_*`.
- `PollStrategy::UpTo(n)` now requires a `Duration`; tick timeout moved
  from `EventListenerCfg::poll_timeout` into `PollStrategy`.
- `TerminalBridge` removed; `Context` now holds
  `CrosstermTerminalAdapter` directly and enables raw mode + alternate
  screen explicitly. The `TerminalAdapter` trait is imported where its
  methods are used.
- `Update` trait removed; activity `update` methods are plain inherent
  functions.
- `ProgressBar` replaced by stdlib `Gauge`. Paragraph `.wrap` renamed
  to `.wrap_trim`; `.text` now takes an `Into<Text>`. Stdlib `List` row
  items are now individual lines (`Vec<Span>` per row) rather than a
  `Table` of spans; custom `FileList`/`Log` convert between the two
  models.
- Radio builders drop `.foreground(color)` so unselected items render
  with the terminal default foreground, and set
  `highlight_style(Style::default().fg(color).add_modifier(REVERSED))`
  so the selected entry is visibly highlighted only with the theme
  color.
- Custom `FileList` keeps the selected row highlighted with the full
  highlight style when focused and falls back to a foreground-only
  style when unfocused.
- Theme loading is now backwards compatible: `Theme` uses a custom
  `Deserialize` through an intermediate `ThemeFile` with optional
  fields, so missing keys, unknown values or legacy aliases
  (`transfer_progress_bar_full`/`_partial`) fall back to defaults on a
  per-field basis instead of failing the whole load.
@cocogitto-bot
Copy link
Copy Markdown

cocogitto-bot Bot commented Apr 18, 2026

✔️ 7fde801 - Conventional commits check succeeded.

@veeso veeso merged commit 80bedaf into 1.0.0 Apr 18, 2026
5 checks passed
@veeso veeso deleted the build/migrate-to-tuirealm-4.0 branch April 18, 2026 15:35
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.

1 participant