Type: the text caret shows on a white background (part of #6085)

In the Photoshop themes the caret was a 1.5 pt white line with a 0.75 pt
black hairline inside, so on a white background only a faint grey line
showed. It is now a solid 1 pt black line inside a 3 pt white halo, readable
on any background, in every theme.
This commit is contained in:
itsF4LCON committed 2026-10-16 00:38:48 +02:00
1 parent fdaa9b8316
commit a76d3295ba
2 files changed
+51 -3

No files matched your search

+8 -3
View File
@@ -1088,13 +1088,18 @@ pub fn draw_overlay(app: &mut PhotocraftApp, painter: &egui::Painter, xf: &ViewX
if ed.dragging || (time * 1000.0 / 530.0) as i64 % 2 == 0 {
let (x, top, bot) = l.caret(a);
let (x, top, bot) = if l.lines.is_empty() { (0.0, -(12.0 * l.px_per_pt.max(1.0)), 3.0) } else { (x, top, bot) };
let c = if crate::theme::Tokens::get(painter.ctx()).pro { Color32::WHITE } else { Color32::BLACK };
painter.line_segment([scr(x, top), scr(x, bot)], Stroke::new(1.5, c));
painter.line_segment([scr(x, top), scr(x, bot)], Stroke::new(0.75, Color32::BLACK));
for stroke in CARET_STROKES {
painter.line_segment([scr(x, top), scr(x, bot)], stroke);
}
}
}
}
/// The text caret, drawn in order: a white halo, then a solid black line inside it, so it reads on
/// any background (#6085). The black line used to be a 0.75 pt hairline inside a white one, which
/// on a white background left only a faint grey line.
const CARET_STROKES: [Stroke; 2] = [Stroke { width: 3.0, color: Color32::WHITE }, Stroke { width: 1.0, color: Color32::BLACK }];
/// The Type Mask tools while typing: Quick Mask's colour over the canvas with the glyphs clear,
/// as Photoshop shows the selection-to-be. The glyphs come from the hidden working layer's pixels.
fn draw_mask_overlay(app: &PhotocraftApp, painter: &egui::Painter, xf: &ViewXform, id: LayerId) {
+43
View File
@@ -2065,3 +2065,46 @@ fn type_mask_shift_adds_and_alt_subtracts_without_a_layer_row() {
assert!(at(&app, stem.0, stem.1) < 0.01, "⌥ subtracts the glyphs");
assert!(at(&app, 1050, 150) > 0.99, "and keeps the rest");
}
/// #6085: the text caret is a solid black line inside a white halo, so it shows on a white
/// background (the black used to be a 0.75 pt hairline inside a white line) and on a dark one.
#[test]
fn the_caret_reads_on_white_and_on_black() {
use crate::canvas::{ToolEvent, tool_event};
let mut app = new_app();
app.ui.tool = crate::state::Tool::Type;
tool_event(&mut app, ToolEvent::Down { x: 100.0, y: 100.0, pressure: 1.0 }, Modifiers::NONE);
tool_event(&mut app, ToolEvent::Up { x: 100.0, y: 100.0 }, Modifiers::NONE);
// A caret, not the placeholder's selection; solid, whatever the blink (as while dragging).
let ed = app.ui.text_edit.as_mut().expect("editing");
ed.anchor = ed.caret;
ed.dragging = true;
let xf = ViewXform {
rect: egui::Rect::from_min_size(Pos2::ZERO, vec2(400.0, 300.0)),
zoom: 1.0,
center: [100.0, 100.0],
flip: false,
rotation: 0.0,
aspect: 1.0,
};
let mut h =
Harness::builder().with_size(vec2(400.0, 300.0)).build_ui_state(move |ui, app: &mut PhotocraftApp| super::draw_overlay(app, ui.painter(), &xf), app);
PhotocraftApp::setup_context(&h.ctx, crate::theme::ThemeKind::ProMedium);
h.run();
// Vertical line segments are the caret (the frame and underline run sideways).
let caret: Vec<(f32, egui::Color32)> = h
.output()
.shapes
.iter()
.filter_map(|s| match &s.shape {
egui::Shape::LineSegment { points: [a, b], stroke } if (a.x - b.x).abs() < 0.01 && (a.y - b.y).abs() > 1.0 => Some((stroke.width, stroke.color)),
_ => None,
})
.collect();
assert_eq!(caret.len(), 2, "a halo and a line: {caret:?}");
let ((halo_w, halo), (line_w, line)) = (caret[0], caret[1]);
assert_eq!(line, egui::Color32::BLACK);
assert!(line_w >= 1.0, "a solid black line, not a hairline: {line_w}");
assert_eq!(halo, egui::Color32::WHITE);
assert!(halo_w >= line_w + 2.0, "at least 1 pt of white on each side: {halo_w}");
}