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.
magic-crypt has known vulnerabilities. Replace it with aes-gcm for new
encryption (authenticated, with random nonces) while keeping a legacy
AES-128-CBC decryption path to transparently handle existing bookmarks.
Comprehensive design for incremental refactoring of the 13k-line
FileTransferActivity god-struct using a unified Pane abstraction.
Detailed step-by-step plan covering 6 phases: split monoliths,
error handling, Pane struct, action dedup, session split, view reorg.
Extract 26 popup components from the monolithic 1,868-line popups.rs
into 20 individual files under popups/. Each file contains one or two
related components with their own imports. The popups.rs module file
now contains only module declarations and re-exports.
Replace 8 panic!() calls with error!() logging and early returns/fallthrough.
These panics documented invariants (e.g. "this tab can't do X") but would crash
the app if somehow triggered. Error logging is safer and more resilient.
Replace raw FileExplorer fields in Browser with Pane structs that bundle
the explorer and connected state. Move host_bridge_connected and
remote_connected from FileTransferActivity into the panes. Add navigation
API (fs_pane, opposite_pane, is_find_tab) for future unification tasks.
Rename private get_selected_file to get_selected_file_by_id and add three
new unified methods (get_selected_entries, get_selected_file, is_selected_one)
that dispatch based on self.browser.tab(). Old per-tab methods are kept for
now until their callers are migrated in subsequent tasks.
Collapse _local_/_remote_ action method pairs (mkdir, delete, symlink,
chmod, rename, copy) into unified methods that branch internally on
is_local_tab(). This halves the number of action methods and simplifies
the update.rs dispatch logic. Also unifies ShowFileInfoPopup and
ShowChmodPopup dispatching to use get_selected_entries().
Move `host_bridge` and `client` filesystem fields from FileTransferActivity
into the Pane struct, enabling tab-agnostic dispatch via `fs_pane()`/
`fs_pane_mut()`. This eliminates most `is_local_tab()` branching across
15+ action files.
Key changes:
- Add `fs: Box<dyn HostBridge>` to Pane, remove from FileTransferActivity
- Replace per-side method pairs with unified pane-dispatched methods
- Unify navigation (changedir, reload, scan, file_exists, has_file_changed)
- Replace 147-line popup if/else chain with data-driven priority table
- Replace assert!/panic!/unreachable! with proper error handling
- Fix typo "filetransfer_activiy" across ~29 files
- Add unit tests for Pane
Net result: -473 lines, single code path for most file operations.
* feat: Import bookmarks from ssh config with a CLI command
Use import-ssh-hosts to import all the possible hosts by the configured ssh config or the default one on your machine
closes#331
* feat: Replaced the `Exec` popup with a fully functional terminal emulator
closes#340
* fix: colors and fmt for terminal
* feat: Handle exit and cd on terminal
* fix: Fmt pah