Add: Casono manual via help button and taskbar dragging with screen boundary clamping and scaling

This commit is contained in:
Julian Kropff
2026-04-25 14:19:47 +02:00
parent 7a6c876017
commit 6e640f7fde
@@ -20,6 +20,9 @@ import javafx.scene.layout.HBox;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.nio.file.Path;
import java.nio.file.Paths;
/**
* Controller for the interactive taskbar within the poker UI.
*
@@ -865,6 +868,9 @@ public class TaskbarController {
*/
@FXML
private void onTaskbarPressed(MouseEvent event) {
if (taskbar == null || event == null) {
return;
}
xOffset = event.getSceneX() - taskbar.getLayoutX();
yOffset = event.getSceneY() - taskbar.getLayoutY();
}
@@ -879,11 +885,21 @@ public class TaskbarController {
*/
@FXML
private void onTaskbarDragged(MouseEvent event) {
taskbar.setLayoutX(event.getSceneX() - xOffset);
taskbar.setLayoutY(event.getSceneY() - yOffset);
if (taskbar == null || event == null || taskbar.getScene() == null) {
return;
}
taskbar.setScaleX(TASKBAR_SCALE);
taskbar.setScaleY(TASKBAR_SCALE);
double targetX = event.getSceneX() - xOffset;
double targetY = event.getSceneY() - yOffset;
double maxX = Math.max(0, taskbar.getScene().getWidth() - scaledNodeWidth());
double maxY = Math.max(0, taskbar.getScene().getHeight() - scaledNodeHeight());
taskbar.setLayoutX(clamp(targetX, 0, maxX));
taskbar.setLayoutY(clamp(targetY, 0, maxY));
}
/**
@@ -894,8 +910,59 @@ public class TaskbarController {
*/
@FXML
private void onTaskbarReleased(MouseEvent event) {
if (taskbar == null) {
return;
}
taskbar.setScaleX(SCALE_NORMAL);
taskbar.setScaleY(SCALE_NORMAL);
if (taskbar.getScene() == null) {
return;
}
double maxX = Math.max(0, taskbar.getScene().getWidth() - scaledNodeWidth());
double maxY = Math.max(0, taskbar.getScene().getHeight() - scaledNodeHeight());
taskbar.setLayoutX(clamp(taskbar.getLayoutX(), 0, maxX));
taskbar.setLayoutY(clamp(taskbar.getLayoutY(), 0, maxY));
}
/**
* Calculates the scaled width of the taskbar node based on its current bounds and scale factor.
*
* @return The scaled width of the taskbar node, ensuring it is non-negative and accounts for the current scale applied to the node.
*/
private double scaledNodeWidth() {
double width = taskbar.getBoundsInLocal().getWidth();
if (width <= 0) {
width = taskbar.prefWidth(-1);
}
return Math.max(0, width * taskbar.getScaleX());
}
/**
* Calculates the scaled height of the taskbar node based on its current bounds and scale factor.
*
* @return The scaled height of the taskbar node, ensuring it is non-negative and accounts for the current scale applied to the node.
*/
private double scaledNodeHeight() {
double height = taskbar.getBoundsInLocal().getHeight();
if (height <= 0) {
height = taskbar.prefHeight(-1);
}
return Math.max(0, height * taskbar.getScaleY());
}
/**
* Clamps a value between a minimum and maximum bound.
*
* @param value the value to clamp
* @param min the lower bound
* @param max the upper bound
* @return the clamped value in the range [min, max]
*/
private double clamp(double value, double min, double max) {
return Math.max(min, Math.min(value, max));
}
/**
@@ -1074,12 +1141,24 @@ public class TaskbarController {
/**
* Opens the integrated Casono web browser.
*
* <p>TODO: Replace the start URL with the official project website (e.g., Tips & Tricks page)
* once the content for strategies and support is available.
*/
@FXML
private void onBrowserButtonClick() {
CasinoBrowserController.open("wikipedia.org");
try {
Path path = Paths.get(
System.getProperty("user.dir"),
"documents",
"docs",
"game-engine",
"manual.html" // Tippfehler korrigiert!
);
CasinoBrowserController.open(path.toUri().toString());
} catch (Exception e) {
e.printStackTrace();
}
}
/** Opens the highscore popup window from the taskbar. */
@@ -1124,4 +1203,23 @@ public class TaskbarController {
LOGGER.error("Could not open highscore window from taskbar: {}", e.getMessage());
}
}
/**
* Highlight or unhighlight the taskbar when it is the player's turn.
*
* @param highlighted true to highlight, false to remove highlight
*/
public void setTurnHighlighted(boolean highlighted) {
if (taskbar == null) {
return;
}
if (highlighted) {
if (!taskbar.getStyleClass().contains("player-active-turn")) {
taskbar.getStyleClass().add("player-active-turn");
}
} else {
taskbar.getStyleClass().remove("player-active-turn");
}
}
}