From d694a69723eed3b23a25a26c41b9181e31d1e4c1 Mon Sep 17 00:00:00 2001 From: yeqing Date: Thu, 5 Mar 2026 14:20:43 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E5=8F=96=E8=89=B2?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/paint.rs | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/paint.rs b/src/paint.rs index 05af759..21d18c5 100644 --- a/src/paint.rs +++ b/src/paint.rs @@ -87,6 +87,8 @@ enum Message { MouseReleased(Point), MouseMoved(Point), MouseDoubleClick(Point), + MouseRightPressed(Point), + MouseRightReleased(Point), Clear, SavePNG, @@ -301,6 +303,7 @@ enum ControlState { struct PaintApp { tool_states: [bool; Tool::Count as usize], tool_selected: Tool, + prev_tool_selected: Tool, /// 画图层 canvas: MSCanvas, @@ -352,6 +355,7 @@ impl PaintApp { let mut ins = Self { tool_states: [false; Tool::Count as usize], tool_selected: Tool::Count, + prev_tool_selected: Tool::Count, canvas, view_canvas, is_drawing: false, @@ -377,6 +381,8 @@ impl PaintApp { .stroke_color(MSColor::BLACK) .line_width(1); + ins.update_tool_states(Tool::Pencil); + ins } @@ -391,7 +397,9 @@ impl PaintApp { .on_press(|pos| Message::MousePressed(pos)) // 占位,实际逻辑在 on_drag 或自定义 .on_release(|pos| Message::MouseReleased(pos)) .on_move(|pos| Message::MouseMoved(pos)) - .on_double_click(|pos| Message::MouseDoubleClick(pos)); + .on_double_click(|pos| Message::MouseDoubleClick(pos)) + .on_right_press(|pos| Message::MouseRightPressed(pos)) + .on_right_release(|pos| Message::MouseRightReleased(pos)); // 注意:mouse_area 的 on_move 给出的坐标通常是相对于 widget 左上角的,这正是我们需要的! let canvas_area = container(canvas_area) .width(Length::Fill) @@ -598,6 +606,9 @@ impl PaintApp { Tool::FillWithColor => { self.update_with_fill_with_color(message); } + Tool::PickColor => { + self.update_with_pick_color(message); + } Tool::Pencil => { self.update_with_pencil(message); } @@ -934,6 +945,30 @@ impl PaintApp { } } + pub fn update_with_pick_color(&mut self, message: Message) { + match message { + Message::MousePressed(pos) => { + let color_option = self.canvas.pixel_at(pos.x as i32, pos.y as i32); + if let Some(color) = color_option { + self.foreground_color = color; + self.canvas.stroke_color(color); + self.canvas.fill_color(color); + } + } + Message::MouseRightPressed(pos) => { + let color_option = self.canvas.pixel_at(pos.x as i32, pos.y as i32); + if let Some(color) = color_option { + self.background_color = color; + } + } + Message::MouseReleased(_) | Message::MouseRightReleased(_) => { + self.update_tool_states(self.prev_tool_selected); + } + + _ => {} + } + } + pub fn update_with_pencil(&mut self, message: Message) { match message { Message::MousePressed(pos) => { @@ -1345,6 +1380,7 @@ impl PaintApp { self.tool_states[i] = false; } self.tool_states[idx] = !old_value; + self.prev_tool_selected = self.tool_selected; self.tool_selected = idx.into(); }