feat: 侧边栏两态重构(统一视图身份)+ 第四轮触控化走查
侧边栏(真机验证): - 砍掉悬浮态,只留收起⇄固定展开;TerminalSidebar 单一视图身份, 内容恒按 288pt 排版、收起=左侧裁切(clipped 宽度动画), 图标列两态同尺寸同位置,明细淡入淡出,终端随宽度盖上/让开 - 开合入口收敛:Logo 位(收起态=»展开键/展开态=Logo)+ 头部«; 删底部开合键与 Pin;LeadingHitShape 修 clipped 不裁触摸 - 修 GridBox 从不通知 UI:onGridChange→objectWillChange, 标题胶囊格子数随开合实时刷新 触控化走查(上一轮,真机部署验证): - 窗口按钮 13pt 色点→22pt 圆角方块常显字形;动作条改可点按钮 - TXTech 拼写/配色规范(SSH/mosh/tmux 官方写法+品牌色映射) - 首页会话卡固定 3 列 4:3;去掉未实现的 ⌘K 提示 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -128,15 +128,20 @@ final class TmuxByteChannel: @unchecked Sendable {
|
||||
final class GridBox: @unchecked Sendable {
|
||||
private let lock = NSLock()
|
||||
private var cols = 80, rows = 24, cellW = 0, cellH = 0
|
||||
/// 格子数**变化**时回调(去重)。网格并非「首次布局后稳定」——侧边栏开合就会 resize,
|
||||
/// 标题胶囊的格子数要跟着走;TerminalSession 用它转发 objectWillChange。
|
||||
var onGridChange: (@Sendable () -> Void)?
|
||||
var value: (cols: Int, rows: Int, cellW: Int, cellH: Int) {
|
||||
lock.lock(); defer { lock.unlock() }; return (cols, rows, cellW, cellH)
|
||||
}
|
||||
func set(cols: Int, rows: Int, cellW: Int, cellH: Int) {
|
||||
lock.lock()
|
||||
let changed = self.cols != max(1, cols) || self.rows != max(1, rows)
|
||||
self.cols = max(1, cols); self.rows = max(1, rows)
|
||||
if cellW > 0 { self.cellW = cellW } // cell 尺寸稳定,保留最后有效值
|
||||
if cellH > 0 { self.cellH = cellH }
|
||||
lock.unlock()
|
||||
if changed { onGridChange?() }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -371,6 +376,11 @@ final class TerminalSession: ObservableObject, Identifiable {
|
||||
self.state = state
|
||||
self.gate = OutputGate(session: session)
|
||||
|
||||
// 格子数变化 → 主线程转发发布(标题胶囊等读 screenGrid 的视图才会刷新)。
|
||||
screenGrid.onGridChange = { [weak self] in
|
||||
Task { @MainActor in self?.objectWillChange.send() }
|
||||
}
|
||||
|
||||
// tmux 网关字节:单消费者按序处理(enter 建 controller+喂初始,bytes 续喂)。
|
||||
let ch = tmuxChannel
|
||||
Task { @MainActor [weak self] in
|
||||
|
||||
Reference in New Issue
Block a user