更新ui中

This commit is contained in:
lenn
2026-07-21 17:36:46 +08:00
parent 0a9fea0f0a
commit 0d1296c482
16 changed files with 323 additions and 190 deletions

View File

@@ -3,7 +3,7 @@ use crate::connection::ConnectionManager;
use crate::force::{ForceEstimatorState, HudSpatialForce};
use crate::recording::Recorder;
use crate::render::{ActiveMode, FingerMode, HandGatewayMode};
use crate::style::{ONE_DARK_PRO, apply_fonts, apply_theme, layout};
use crate::style::{self, ONE_DARK_PRO, apply_fonts, apply_theme, dim_text, layout};
use crate::ui::SerialMode;
use crate::{
matrix::{MATRIX_COLS, MATRIX_ROWS},
@@ -13,8 +13,8 @@ use crate::{
},
ui::{
ConfigPanelState, ConnectPanelState, FloatingPanelState, MatrixConfigState,
draw_config_panel, draw_export_panel, draw_hand_force_panels, draw_matrix_config_panel,
draw_stats_panel, panel_restore_item,
draw_config_panel, draw_export_panel, draw_hand_force_panels, draw_stats_panel,
panel_restore_item,
},
};
use eframe::{egui, egui_wgpu};
@@ -159,15 +159,15 @@ impl EskinDesktopApp {
let color = egui::Color32::from_rgb(255, 196, 54);
let glow = egui::Color32::from_rgba_unmultiplied(255, 196, 54, 58);
painter.line_segment([center, end], egui::Stroke::new(9.0, glow));
painter.line_segment([center, end], egui::Stroke::new(2.4, color));
painter.line_segment([center, end], egui::Stroke::new(9.0_f32, glow));
painter.line_segment([center, end], egui::Stroke::new(2.4_f32, color));
painter.line_segment(
[end, end - direction * 14.0 + side * 7.0],
egui::Stroke::new(2.4, color),
egui::Stroke::new(2.4_f32, color),
);
painter.line_segment(
[end, end - direction * 14.0 - side * 7.0],
egui::Stroke::new(2.4, color),
egui::Stroke::new(2.4_f32, color),
);
painter.circle_filled(center, 4.2, color);
}
@@ -265,7 +265,7 @@ impl EskinDesktopApp {
);
ui.painter().line_segment(
[title_bar_rect.left_bottom(), title_bar_rect.right_bottom()],
egui::Stroke::new(1.0, ONE_DARK_PRO.border),
egui::Stroke::new(1.0_f32, ONE_DARK_PRO.border),
);
// Drag-to-move: double-click to maximize, drag to move
@@ -306,14 +306,14 @@ impl EskinDesktopApp {
btn_close_center + egui::vec2(-3.0, -3.0),
btn_close_center + egui::vec2(3.0, 3.0),
],
egui::Stroke::new(1.5, egui::Color32::from_rgb(80, 0, 0)),
egui::Stroke::new(1.5_f32, egui::Color32::from_rgb(80, 0, 0)),
);
ui.painter().line_segment(
[
btn_close_center + egui::vec2(3.0, -3.0),
btn_close_center + egui::vec2(-3.0, 3.0),
],
egui::Stroke::new(1.5, egui::Color32::from_rgb(80, 0, 0)),
egui::Stroke::new(1.5_f32, egui::Color32::from_rgb(80, 0, 0)),
);
}
if close_resp.clicked() {
@@ -332,7 +332,7 @@ impl EskinDesktopApp {
btn_min_center + egui::vec2(-3.0, 0.0),
btn_min_center + egui::vec2(3.0, 0.0),
],
egui::Stroke::new(1.5, egui::Color32::from_rgb(120, 80, 0)),
egui::Stroke::new(1.5_f32, egui::Color32::from_rgb(120, 80, 0)),
);
}
if min_resp.clicked() {
@@ -351,7 +351,7 @@ impl EskinDesktopApp {
ui.painter().rect_stroke(
egui::Rect::from_center_size(btn_max_center, egui::vec2(s * 2.0, s * 2.0)),
egui::CornerRadius::same(1),
egui::Stroke::new(1.5, egui::Color32::from_rgb(0, 80, 10)),
egui::Stroke::new(1.5_f32, egui::Color32::from_rgb(0, 80, 10)),
egui::StrokeKind::Outside,
);
}
@@ -362,7 +362,11 @@ impl EskinDesktopApp {
}
}
fn draw_floating_panels(&mut self, ctx: &egui::Context) {
fn draw_floating_panels(
&mut self,
ctx: &egui::Context,
stats: crate::serial_core::serial::SerialIoStats,
) {
// draw_scene_panel(ctx, &mut self.scene_panel);
// if self.config_state.mode == SerialMode::Hand && self.stats_panel.visible {
// self.config_panel.visible = false;
@@ -376,6 +380,9 @@ impl EskinDesktopApp {
&mut self.config_state,
&self.connection,
&self.recorder,
stats,
100.0,
100.0,
) {
self.switch_mode(next_mode);
}
@@ -398,7 +405,7 @@ impl EskinDesktopApp {
&self.recorder,
&mut self.export_path,
);
draw_matrix_config_panel(ctx, &mut self.matrix_config_panel, &mut self.matrix_config);
// draw_matrix_config_panel(ctx, &mut self.matrix_config_panel, &mut self.matrix_config);
}
fn draw_panel_context_menu(&mut self, ctx: &egui::Context) {
@@ -590,7 +597,7 @@ fn paint_split_viewport_shell(
painter.rect_stroke(
rect,
egui::CornerRadius::same(8),
egui::Stroke::new(1.0, ONE_DARK_PRO.border_soft),
egui::Stroke::new(1.0_f32, ONE_DARK_PRO.border_soft),
egui::StrokeKind::Outside,
);
painter.line_segment(
@@ -598,7 +605,7 @@ fn paint_split_viewport_shell(
rect.left_top() + egui::vec2(12.0, 34.0),
rect.right_top() + egui::vec2(-12.0, 34.0),
],
egui::Stroke::new(1.0, ONE_DARK_PRO.border_soft),
egui::Stroke::new(1.0_f32, ONE_DARK_PRO.border_soft),
);
painter.text(
rect.left_top() + egui::vec2(14.0, 16.0),
@@ -660,14 +667,50 @@ fn normalize_pressure_value(value: u32) -> [f32; 2] {
[mapped, display_value]
}
fn draw_config_bar_mode(ui: &mut egui::Ui, config: &mut ConfigPanelState) -> Option<SerialMode> {
let mut changed_to = None;
ui.horizontal(|ui| {
ui.colored_label(dim_text(), "单面指尖");
if mode_button(ui, &mut config.mode, SerialMode::Finger, "单面指尖") {
changed_to = Some(SerialMode::Finger);
}
// if mode_button(ui, &mut config.mode, SerialMode::Finger3D, "3D指尖") {
// changed_to = Some(SerialMode::Finger3D);
// }
if mode_button(ui, &mut config.mode, SerialMode::Hand, "展示手掌") {
changed_to = Some(SerialMode::Hand);
}
});
changed_to
}
fn mode_button(
ui: &mut egui::Ui,
mode: &mut SerialMode,
value: SerialMode,
label: &'static str,
) -> bool {
let clicked = ui.add(style::mode_button(label, *mode == value)).clicked();
if clicked && *mode != value {
*mode = value;
true
} else {
false
}
}
impl eframe::App for EskinDesktopApp {
fn ui(&mut self, ui: &mut egui::Ui, frame: &mut eframe::Frame) {
let ctx = ui.ctx().clone();
let stats = self.connection.stats();
self.update_pressure_matrix();
self.draw_workspace(ui);
self.draw_title_bar(ui, frame);
self.draw_floating_panels(&ctx);
self.draw_floating_panels(&ctx, stats);
self.draw_panel_context_menu(&ctx);
// Keep repainting while the wgpu background is a realtime viewport.