feat(ui): 界面体验一轮打磨(快捷键/暂停滚动/会话恢复/JSON 预览)

- 全局 Ctrl+Enter 发送;订阅框 Enter 提交、Esc 退出编辑;过滤框 Esc 清空
- 消息流新增「暂停/恢复」:暂停时画面不随新消息跳动,消息仍入环形缓冲
- JSON 负载折叠态预览按原始数据美化展示(多行缩进,超 40 行兜底截断)
- 标签页持久化(ui-state.json),重启恢复工作区;无可恢复标签时自动打开
  首个自连连接的工作区,避免「已连上却演空态」
- 侧边栏 Error 连接行内红字显示失败原因;侧边栏/订阅面板补竖分隔线
- 消息订阅色条上下留隙,不再连成一整条竖线
- 发布被当前过滤条件隐藏时给出「已发送」提示
- 连接表单:主机+端口同行;TLS 证书三个路径字段加「浏览…」(rfd)
- 主题切换/系统外观变化后强制整窗重绘,修未收敛区域的旧色残影
- 设置主题文案改「跟随系统」(跟随逻辑此前已实现)
This commit is contained in:
2026-09-30 16:15:58 +08:00
parent f5cd0cdc4f
commit 967bf9dd78
15 changed files with 407 additions and 51 deletions
+22
View File
@@ -207,6 +207,28 @@ impl Storage {
elog!("保存设置失败: {e}");
}
}
// ── ui state(标签页会话恢复) ──
pub fn load_ui_state(&self) -> UiState {
self.read_json("ui-state.json")
.ok()
.flatten()
.unwrap_or_default()
}
pub fn save_ui_state(&self, state: &UiState) {
if let Err(e) = self.write_json("ui-state.json", state) {
elog!("保存界面状态失败: {e}");
}
}
}
/// 会话 UI 状态:打开的标签页与活动标签,用于重启后恢复工作区。
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct UiState {
#[serde(default)]
pub open_tabs: Vec<String>,
#[serde(default)]
pub active_tab: Option<String>,
}
impl Default for Storage {