From 657a5ff16ee05fc7cd065400185e0ce94d369ccf Mon Sep 17 00:00:00 2001 From: Harald Date: Sun, 18 Oct 2026 21:44:51 +0200 Subject: [PATCH] feat: Stifte der Werkzeugleiste in ihrer Farbe (Issue #31) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Statt eines dünnen Strichs auf grauem Papier zeigt jeder Stift jetzt einen schräg liegenden Stift, dessen Schaft und Mine in seiner Farbe gefüllt sind. Eine helle Kontur hält dunkle Farben auf der dunklen Leiste sichtbar; die Stärke steht weiter im Tooltip. Co-Authored-By: Claude Opus 5.5 --- src/ui.rs | 59 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/src/ui.rs b/src/ui.rs index 522f029..6720cd5 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -1187,8 +1187,8 @@ fn color_editor( changed } -/// Stift der Werkzeugleiste: ein Strich in Farbe und (angedeuteter) Stärke auf einem -/// Stück Papier, damit auch schwarze Tinte auf der dunklen Leiste sichtbar ist. +/// Stift der Werkzeugleiste: ein schräg liegender Stift in seiner Farbe; die Stärke steht +/// im Tooltip. fn pen_preset_swatch( ui: &mut egui::Ui, preset: PenPreset, @@ -1198,22 +1198,49 @@ fn pen_preset_swatch( ) -> egui::Response { let (rect, response) = ui.allocate_exact_size(egui::vec2(size, size), egui::Sense::click()); if ui.is_rect_visible(rect) { - let paper = rect.shrink(2.0); - ui.painter().rect_filled( - paper, - egui::Rounding::same(5.0), - egui::Color32::from_gray(245), - ); + // Schräg liegender Stift ganz in seiner Farbe, damit die Stifte auf einen Blick zu + // unterscheiden sind (Issue #31); die helle Kontur hält dunkle Farben sichtbar let [r, g, b, _] = preset.color.map(|c| (c.clamp(0.0, 1.0) * 255.0) as u8); - let width = (1.0 + preset.width_mm * 2.5).clamp(1.5, paper.height() * 0.35); - let inset = 3.0 + width / 2.0; - ui.painter().line_segment( - [ - egui::pos2(paper.left() + inset, paper.bottom() - inset), - egui::pos2(paper.right() - inset, paper.top() + inset), + let ink = egui::Color32::from_rgb(r, g, b); + let c = rect.center(); + let dir = egui::vec2(1.0, -1.0).normalized(); + let perp = egui::vec2(dir.y, -dir.x); + let half_len = size * 0.44; + let half_w = size * 0.17; + let p = |along: f32, across: f32| c + dir * along + perp * across; + let tip_start = -half_len * 0.3; + let lead_start = -half_len * 0.72; + let lead_w = half_w * (lead_start + half_len) / (tip_start + half_len); + let outline = egui::Stroke::new(1.0_f32, egui::Color32::from_gray(200)); + let painter = ui.painter(); + painter.add(egui::Shape::convex_polygon( + vec![ + p(tip_start, -half_w), + p(half_len, -half_w), + p(half_len, half_w), + p(tip_start, half_w), ], - egui::Stroke::new(width, egui::Color32::from_rgb(r, g, b)), - ); + ink, + outline, + )); + painter.add(egui::Shape::convex_polygon( + vec![ + p(-half_len, 0.0), + p(tip_start, -half_w), + p(tip_start, half_w), + ], + egui::Color32::from_rgb(235, 210, 170), + outline, + )); + painter.add(egui::Shape::convex_polygon( + vec![ + p(-half_len, 0.0), + p(lead_start, -lead_w), + p(lead_start, lead_w), + ], + ink, + egui::Stroke::NONE, + )); if is_selected { ui.painter().rect_stroke( rect.shrink(0.5),