fix: Auswählen, Text und Platz schaffen mit dem Finger (Issue #26)

Ohne „Mit dem Finger zeichnen“ verschob ein Finger immer das Blatt, auch
im Auswahlwerkzeug – Objekte ließen sich mit dem Finger weder auswählen
noch verschieben. Jetzt nehmen Text und Platz schaffen den Finger immer,
das Auswahlwerkzeug, wenn der Finger ein Objekt oder die Auswahl trifft;
auf leerer Fläche verschiebt er weiter das Blatt. Halten öffnet dabei
kein Kontextmenü.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-10 16:12:25 +02:00
co-authored by Claude Opus 5.5
parent 20792ed34f
commit dd702524ca
+48 -1
View File
@@ -596,6 +596,31 @@ fn insert_image_on_page(
));
}
/// Trifft ein Finger auf `screen` die Auswahl (Rahmen, Griffe) oder ein Objekt? Dann wählt bzw.
/// verschiebt er, sonst verschiebt er das Blatt.
fn finger_grabs_selection(
screen: (f32, f32),
canvas: &CanvasState,
page: &ink_notes::document::Page,
pixels_per_point: f32,
selection_state: &SelectionState,
) -> bool {
let on_selection = !selection_state.is_empty()
&& !matches!(
selection_state.hit_test_handles(
page,
canvas,
Vec2::new(screen.0, screen.1),
pixels_per_point
),
SelectionHandleHit::None
);
on_selection
|| canvas
.screen_to_page(screen.0, screen.1)
.is_some_and(|p| page.find_stroke_at(p, 25.0).is_some())
}
/// Auswahlwerkzeug: Druck auf `screen` (physische Pixel) greift einen Griff, die Auswahl
/// oder das Objekt darunter oder beginnt einen Auswahlrahmen. Mit `shift` wird die Auswahl
/// erweitert. `true`, wenn etwas begonnen wurde.
@@ -2820,7 +2845,29 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
cursor_screen_pos = (tx, ty);
current_pressure = pressure;
if !ui_state.touch_draw_enabled {
// Ohne Finger-Zeichnen verschiebt ein Finger das Blatt – außer bei
// Werkzeugen, die nicht zeichnen: Text und Platz schaffen nehmen den
// Finger immer, Auswählen, wenn er ein Objekt oder die Auswahl trifft
// (Issue #26)
let finger_uses_tool = match ui_state.active_tool {
ActiveTool::Text | ActiveTool::Space => true,
ActiveTool::Select => {
focus_page_at!((tx, ty));
finger_grabs_selection(
(tx, ty),
&canvas,
notebook.current_page(),
egui_ctx.pixels_per_point(),
&selection_state,
)
}
_ => false,
};
if finger_uses_tool {
// Halten soll hier kein Kontextmenü öffnen
long_press.cancel();
}
if !ui_state.touch_draw_enabled && !finger_uses_tool {
// Standard: 1 Finger scrollt / verschiebt den Canvas (Pan)
is_touch_panning = true;
touch_pan_last_pos = (tx, ty);