Compare commits

...
2 Commits
Author SHA1 Message Date
haraldandClaude Opus 5.5 e8a7675f8d chore(release): bump version to 0.34.1
Build & Publish Release / Build Packages & Publish to Gitea (push) Successful in 6m39s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 11:17:21 +01:00
haraldandClaude Opus 5.5 0992b9bc0e fix: keep the measured swipe when the view touches the notebook edge (Issue #28)
Clamping the continuous or endless view reset the fling while the finger was
still down, so the release measured 0 px/s. Only an active glide stops there
now. The fling diagnostics also log moves, path length and the time since
the last move.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 11:15:32 +01:00
6 changed files with 27 additions and 7 deletions

No files matched your search

Generated
+1 -1
View File
@@ -1393,7 +1393,7 @@ dependencies = [
[[package]] [[package]]
name = "ink-notes" name = "ink-notes"
version = "0.34.0" version = "0.34.1"
dependencies = [ dependencies = [
"ab_glyph", "ab_glyph",
"arboard", "arboard",
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "ink-notes" name = "ink-notes"
version = "0.34.0" version = "0.34.1"
edition = "2021" edition = "2021"
description = "Notizbuch-App für Stift, Touch und Maus unter Linux" description = "Notizbuch-App für Stift, Touch und Maus unter Linux"
repository = "https://gitea.pansi.eu/harald/ink-notes" repository = "https://gitea.pansi.eu/harald/ink-notes"
@@ -84,6 +84,11 @@
</branding> </branding>
<content_rating type="oars-1.1" /> <content_rating type="oars-1.1" />
<releases> <releases>
<release version="0.34.1" date="2026-10-25">
<description>
<p>A finger swipe is measured reliably again for gliding, also when the view touches the edge of the notebook. The fling diagnostics log more details.</p>
</description>
</release>
<release version="0.34.0" date="2026-10-23"> <release version="0.34.0" date="2026-10-23">
<description> <description>
<p>The eraser size is set in a menu like the pens, with presets and a slider. Corners of snapped shapes stay pointed. Slides get flat tiles in the page overview.</p> <p>The eraser size is set in a menu like the pens, with presets and a slider. Corners of snapped shapes stay pointed. Slides get flat tiles in the page overview.</p>
+5
View File
@@ -84,6 +84,11 @@
</branding> </branding>
<content_rating type="oars-1.1" /> <content_rating type="oars-1.1" />
<releases> <releases>
<release version="0.34.1" date="2026-10-25">
<description>
<p>A finger swipe is measured reliably again for gliding, also when the view touches the edge of the notebook. The fling diagnostics log more details.</p>
</description>
</release>
<release version="0.34.0" date="2026-10-23"> <release version="0.34.0" date="2026-10-23">
<description> <description>
<p>The eraser size is set in a menu like the pens, with presets and a slider. Corners of snapped shapes stay pointed. Slides get flat tiles in the page overview.</p> <p>The eraser size is set in a menu like the pens, with presets and a slider. Corners of snapped shapes stay pointed. Slides get flat tiles in the page overview.</p>
+1
View File
@@ -3,6 +3,7 @@
Notebook app for pen, touch and mouse on Linux (tested on Zorin OS 18 / Ubuntu 24.04). Notebook app for pen, touch and mouse on Linux (tested on Zorin OS 18 / Ubuntu 24.04).
### Highlights: ### Highlights:
- **Fling fix**: A finger swipe is no longer lost when the view touches the edge of the notebook, so the page glides on after a fast swipe; the fling diagnostics (`INK_NOTES_DEBUG_FLING=1`) log moves, distance and timing
- **Feedback round**: The eraser size is set in a menu like the pens (four presets and a slider); corners of snapped triangles and polygons stay pointed; slides (landscape PDFs) get flat tiles in the page overview without an empty strip - **Feedback round**: The eraser size is set in a menu like the pens (four presets and a slider); corners of snapped triangles and polygons stay pointed; slides (landscape PDFs) get flat tiles in the page overview without an empty strip
- **Palm rejection & more feedback**: A hand resting on the screen while the pen is near is ignored (also on the title bar, no more accidental paste menu or window moving); the eraser has four sizes (button below the eraser modes, remembered); the page overview shows imported PDF pages; snapped triangles, rectangles and polygons have the same width on every side; a selection made with the pen's select button can be moved with the bare pen - **Palm rejection & more feedback**: A hand resting on the screen while the pen is near is ignored (also on the title bar, no more accidental paste menu or window moving); the eraser has four sizes (button below the eraser modes, remembered); the page overview shows imported PDF pages; snapped triangles, rectangles and polygons have the same width on every side; a selection made with the pen's select button can be moved with the bare pen
- **Feedback round**: The endless canvas starts at the top left and only grows to the right and down; new text fields start short and grow with the text; toolbar buttons are larger again on small screens; on Wayland the title bar buttons (close, minimize, maximize) and moving the window work with a finger - **Feedback round**: The endless canvas starts at the top left and only grows to the right and down; new text fields start short and grow with the text; toolbar buttons are larger again on small screens; on Wayland the title bar buttons (close, minimize, maximize) and moving the window work with a finger
+14 -5
View File
@@ -1428,6 +1428,8 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
// Langes Drücken mit einem Finger öffnet das Kontextmenü // Langes Drücken mit einem Finger öffnet das Kontextmenü
let mut long_press = ui::LongPress::default(); let mut long_press = ui::LongPress::default();
let mut touch_pan_last_pos = (0.0_f32, 0.0_f32); let mut touch_pan_last_pos = (0.0_f32, 0.0_f32);
// Diagnostics for the fling: moves, path length (px) and time of the last move of this swipe
let mut touch_pan_trace: (u32, f32, Option<Instant>) = (0, 0.0, None);
// Nachgleiten nach schnellem Wischen mit dem Finger (Issue #28) // Nachgleiten nach schnellem Wischen mit dem Finger (Issue #28)
let mut fling = ink_notes::viewport::Fling::default(); let mut fling = ink_notes::viewport::Fling::default();
// Diagnosis for Issue #28: log every finger lift and the swipe speed // Diagnosis for Issue #28: log every finger lift and the swipe speed
@@ -3047,6 +3049,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
// Standard: 1 Finger scrollt / verschiebt den Canvas (Pan) // Standard: 1 Finger scrollt / verschiebt den Canvas (Pan)
is_touch_panning = true; is_touch_panning = true;
touch_pan_last_pos = (tx, ty); touch_pan_last_pos = (tx, ty);
touch_pan_trace = (0, 0.0, None);
} else { } else {
// Modus Finger-Zeichnen aktiv // Modus Finger-Zeichnen aktiv
focus_page_at!((tx, ty)); focus_page_at!((tx, ty));
@@ -3123,6 +3126,9 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
touch_pan_last_pos = (tx, ty); touch_pan_last_pos = (tx, ty);
canvas.pan(dx, dy); canvas.pan(dx, dy);
fling.track(Vec2::new(dx, dy), Instant::now()); fling.track(Vec2::new(dx, dy), Instant::now());
touch_pan_trace.0 += 1;
touch_pan_trace.1 += Vec2::new(dx, dy).length();
touch_pan_trace.2 = Some(Instant::now());
window.request_redraw(); window.request_redraw();
} else if is_touch_drawing { } else if is_touch_drawing {
current_pressure = pressure; current_pressure = pressure;
@@ -3184,10 +3190,12 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
fling.track(Vec2::new(dx, dy), Instant::now()); fling.track(Vec2::new(dx, dy), Instant::now());
let velocity = fling.release(Instant::now()); let velocity = fling.release(Instant::now());
if debug_fling { if debug_fling {
let (moves, path, last_move) = touch_pan_trace;
eprintln!( eprintln!(
"[Nachgleiten] {:.0} px/s beim Abheben, gleitet: {}", "[Nachgleiten] {:.0} px/s beim Abheben, gleitet: {} ({moves} Bewegungen, {path:.0} px, letzte vor {} ms)",
velocity.length(), velocity.length(),
fling.is_active() fling.is_active(),
last_move.map_or(-1, |t| t.elapsed().as_millis() as i64)
); );
} }
window.request_redraw(); window.request_redraw();
@@ -3255,13 +3263,14 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
// schreibt, bleibt dort, bis wieder gescrollt wird (Undo betrifft sie). // schreibt, bleibt dort, bis wieder gescrollt wird (Undo betrifft sie).
canvas.set_fit_box(notebook.fit_box()); canvas.set_fit_box(notebook.fit_box());
if notebook.is_endless() { if notebook.is_endless() {
if canvas.clamp_endless(notebook.current_page().endless_scroll_limit()) { if canvas.clamp_endless(notebook.current_page().endless_scroll_limit()) && fling.is_active() {
fling.stop(); fling.stop();
} }
} else if ui_state.continuous_scroll { } else if ui_state.continuous_scroll {
let stack = notebook.page_stack(); let stack = notebook.page_stack();
if canvas.clamp_scroll(&stack) { if canvas.clamp_scroll(&stack) && fling.is_active() {
// Am Anfang oder Ende des Notizbuchs angekommen // Am Anfang oder Ende des Notizbuchs angekommen (only a glide stops
// here; a finger still on the screen keeps its measured swipe)
fling.stop(); fling.stop();
} }
// Unabhängig von der Bezugsseite: Lage bezogen auf die erste Seite // Unabhängig von der Bezugsseite: Lage bezogen auf die erste Seite