From 64a11aee26d1f1948556b1a962fad9e884ac3f35 Mon Sep 17 00:00:00 2001 From: jzitnik-dev Date: Sun, 31 May 2026 10:23:18 +0200 Subject: [PATCH] chore: Smooth scroller (kinda) --- .../controllers/AbsencesController.java | 1 + .../ClassroomDetailController.java | 1 + .../controllers/ClassroomsController.java | 1 + .../jzitnik/controllers/GradesController.java | 1 + .../controllers/TeachersController.java | 1 + .../controllers/TimetableController.java | 1 + .../java/cz/jzitnik/util/ScrollUtils.java | 35 +++++++++++++++++++ 7 files changed, 41 insertions(+) create mode 100644 src/main/java/cz/jzitnik/util/ScrollUtils.java diff --git a/src/main/java/cz/jzitnik/controllers/AbsencesController.java b/src/main/java/cz/jzitnik/controllers/AbsencesController.java index 50ee2e0..c211bfd 100644 --- a/src/main/java/cz/jzitnik/controllers/AbsencesController.java +++ b/src/main/java/cz/jzitnik/controllers/AbsencesController.java @@ -62,6 +62,7 @@ public class AbsencesController extends DashboardBaseController { loadingIndicator.setVisible(false); if (result.isSuccess() && result.getData().isPresent()) { + cz.jzitnik.util.ScrollUtils.enableSmoothScrolling(scrollPane); currentPage = result.getData().get(); renderAbsences(); scrollPane.setVisible(true); diff --git a/src/main/java/cz/jzitnik/controllers/ClassroomDetailController.java b/src/main/java/cz/jzitnik/controllers/ClassroomDetailController.java index ee18df0..c9a2c38 100644 --- a/src/main/java/cz/jzitnik/controllers/ClassroomDetailController.java +++ b/src/main/java/cz/jzitnik/controllers/ClassroomDetailController.java @@ -62,6 +62,7 @@ public class ClassroomDetailController extends DashboardBaseController { loadingIndicator.setVisible(false); if (result.isSuccess() && result.getData().isPresent()) { + cz.jzitnik.util.ScrollUtils.enableSmoothScrolling(scrollPane); renderRoom(result.getData().get()); scrollPane.setVisible(true); } else { diff --git a/src/main/java/cz/jzitnik/controllers/ClassroomsController.java b/src/main/java/cz/jzitnik/controllers/ClassroomsController.java index 838c0e5..efe6666 100644 --- a/src/main/java/cz/jzitnik/controllers/ClassroomsController.java +++ b/src/main/java/cz/jzitnik/controllers/ClassroomsController.java @@ -61,6 +61,7 @@ public class ClassroomsController extends DashboardBaseController { loadingIndicator.setVisible(false); if (result.isSuccess() && result.getData().isPresent()) { + cz.jzitnik.util.ScrollUtils.enableSmoothScrolling(scrollPane); RoomsPage page = result.getData().get(); allRooms = new ArrayList<>(page.getRoomReferences()); // Sort by name diff --git a/src/main/java/cz/jzitnik/controllers/GradesController.java b/src/main/java/cz/jzitnik/controllers/GradesController.java index cc1643b..ff95a91 100644 --- a/src/main/java/cz/jzitnik/controllers/GradesController.java +++ b/src/main/java/cz/jzitnik/controllers/GradesController.java @@ -64,6 +64,7 @@ public class GradesController extends DashboardBaseController { loadingIndicator.setVisible(false); if (result.isSuccess() && result.getData().isPresent()) { + cz.jzitnik.util.ScrollUtils.enableSmoothScrolling(scrollPane); scrollPane.setVisible(true); currentPage = result.getData().get(); renderAllSubjects(); diff --git a/src/main/java/cz/jzitnik/controllers/TeachersController.java b/src/main/java/cz/jzitnik/controllers/TeachersController.java index 2775e8a..c07c5c1 100644 --- a/src/main/java/cz/jzitnik/controllers/TeachersController.java +++ b/src/main/java/cz/jzitnik/controllers/TeachersController.java @@ -60,6 +60,7 @@ public class TeachersController extends DashboardBaseController { loadingIndicator.setVisible(false); if (result.isSuccess() && result.getData().isPresent()) { + cz.jzitnik.util.ScrollUtils.enableSmoothScrolling(scrollPane); TeachersPage page = result.getData().get(); allTeachers = new ArrayList<>(page.getTeachersReferences()); allTeachers.sort((t1, t2) -> t1.getFullName().compareToIgnoreCase(t2.getFullName())); diff --git a/src/main/java/cz/jzitnik/controllers/TimetableController.java b/src/main/java/cz/jzitnik/controllers/TimetableController.java index ca86ab0..2e50eb8 100644 --- a/src/main/java/cz/jzitnik/controllers/TimetableController.java +++ b/src/main/java/cz/jzitnik/controllers/TimetableController.java @@ -61,6 +61,7 @@ public class TimetableController extends DashboardBaseController { loadingIndicator.setVisible(false); if (result.isSuccess() && result.getData().isPresent()) { + cz.jzitnik.util.ScrollUtils.enableSmoothScrolling(scrollPane); scrollPane.setVisible(true); currentPage = result.getData().get(); renderTimetable(); diff --git a/src/main/java/cz/jzitnik/util/ScrollUtils.java b/src/main/java/cz/jzitnik/util/ScrollUtils.java new file mode 100644 index 0000000..5522b5b --- /dev/null +++ b/src/main/java/cz/jzitnik/util/ScrollUtils.java @@ -0,0 +1,35 @@ +package cz.jzitnik.util; + +import javafx.animation.KeyFrame; +import javafx.animation.KeyValue; +import javafx.animation.Timeline; +import javafx.scene.control.ScrollPane; +import javafx.scene.input.ScrollEvent; +import javafx.util.Duration; + +public class ScrollUtils { + + public static void enableSmoothScrolling(ScrollPane scrollPane) { + scrollPane.addEventFilter(ScrollEvent.SCROLL, event -> { + double deltaY = event.getDeltaY(); + double contentHeight = scrollPane.getContent().getBoundsInLocal().getHeight(); + double viewportHeight = scrollPane.getViewportBounds().getHeight(); + + // Calculate new VValue based on delta + double deltaV = (-deltaY * 2.0) / (contentHeight - viewportHeight); + double newValue = scrollPane.getVvalue() + deltaV; + + // Constrain to [0, 1] + newValue = Math.max(0, Math.min(1, newValue)); + + // Animate + Timeline timeline = new Timeline(); + KeyValue kv = new KeyValue(scrollPane.vvalueProperty(), newValue); + KeyFrame kf = new KeyFrame(Duration.millis(120), kv); + timeline.getKeyFrames().add(kf); + timeline.play(); + + event.consume(); + }); + } +}