feat: 实现取色功能
This commit is contained in:
38
src/paint.rs
38
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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user