package com.soundlooper.gui.customComponent.playerbutton;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBase;
import javafx.scene.control.SkinBase;
import javafx.scene.effect.DropShadow;
import javafx.scene.effect.InnerShadow;
import javafx.scene.image.ImageView;
import javafx.scene.shape.Ellipse;
import com.soundlooper.system.SoundLooperColor;
import com.soundlooper.system.SoundLooperLigthing;
public class PlayerButtonSkin extends SkinBase<PlayerButton> {
private Ellipse ellipse;
private boolean keyDown;
private static final int RADIUS = 16;
protected PlayerButtonSkin(PlayerButton control) {
super(control);
control.setPadding(Insets.EMPTY);
ellipse = new Ellipse(RADIUS, RADIUS);
ellipse.setFill(SoundLooperColor.DARK_GRAY);
getChildren().add(ellipse);
DropShadow shadow = new DropShadow();
shadow.setRadius(2);
ellipse.setEffect(shadow);
control.setEffect(SoundLooperLigthing.getPotentiometerLighting());
if (control.getGraphic() instanceof ImageView) {
ImageView graphic = (ImageView) control.getGraphic();
getChildren().add(graphic);
InnerShadow innerShadow = new InnerShadow();
innerShadow.setRadius(1);
graphic.setEffect(innerShadow);
graphic.setMouseTransparent(true);
}
ellipse.setOnMouseEntered(e -> {
control.setEffect(SoundLooperLigthing.getPotentiometerLightingOver());
});
ellipse.setOnMouseExited(e -> {
control.setEffect(SoundLooperLigthing.getPotentiometerLighting());
});
ellipse.setOnMouseClicked(e -> {
keyReleased();
});
ellipse.setOnMousePressed(e -> {
keyPressed();
});
}
private void keyPressed() {
Button button = getSkinnable();
if (!button.isArmed()) {
keyDown = true;
button.arm();
}
}
/**
* Invoked when a valid keystroke release occurs which causes the button to
* fire if it was armed by a keyPress.
*/
private void keyReleased() {
final ButtonBase button = getSkinnable();
if (keyDown) {
keyDown = false;
if (button.isArmed()) {
button.disarm();
button.fire();
}
}
}
@Override
protected void layoutChildren(double contentX, double contentY, double contentWidth, double contentHeight) {
ellipse.resize(contentWidth, contentHeight);
ellipse.relocate(contentX, contentY);
}
@Override
protected double computeMaxHeight(double width, double topInset, double rightInset, double bottomInset,
double leftInset) {
return RADIUS * 2;
}
@Override
protected double computeMinHeight(double width, double topInset, double rightInset, double bottomInset,
double leftInset) {
return RADIUS * 2;
}
@Override
protected double computePrefHeight(double width, double topInset, double rightInset, double bottomInset,
double leftInset) {
return RADIUS * 2;
}
@Override
protected double computeMaxWidth(double width, double topInset, double rightInset, double bottomInset,
double leftInset) {
return RADIUS * 2;
}
@Override
protected double computeMinWidth(double width, double topInset, double rightInset, double bottomInset,
double leftInset) {
return RADIUS * 2;
}
@Override
protected double computePrefWidth(double width, double topInset, double rightInset, double bottomInset,
double leftInset) {
return RADIUS * 2;
}
}