package AndroidDevToolbox; import AndroidDevToolbox.StatefulButtonController.OnStyleSetListener; import AndroidDevToolbox.StatefulButtonController.State; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.embed.swing.SwingFXUtils; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.control.Slider; import javafx.scene.control.TextField; import javafx.scene.image.ImageView; import javafx.stage.Stage; import java.awt.image.BufferedImage; import java.awt.image.RescaleOp; import java.net.URL; import java.util.ResourceBundle; public class EditStyleDialogController implements Initializable { public Button styleDialogOkBtn; public ImageView previewImageView; public Slider brightnessSlider; public Slider transparencySlider; public TextField brightnessTextField; public TextField transparencyTextField; private static final int SLIDER_MID_VAL = 100; private ResourceBundle resourceBundle; private OnStyleSetListener onStyleSetListener; private State state; private BufferedImage sourceBufferedImage; private float defaultBrightness; private float defaultTransparency; private float initBrightness; private float initTransparency; private boolean updateSkipped; @Override public void initialize(URL url, ResourceBundle resourceBundle) { this.resourceBundle = resourceBundle; brightnessSlider.valueProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> ov, Number old_val, Number new_val) { onBrightnessDragged(); updateSkipped = !updateSkipped; if (updateSkipped || Math.abs(old_val.intValue() - new_val.intValue()) > 3) { updateStyle(); } } }); transparencySlider.valueProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> ov, Number old_val, Number new_val) { onTransparencysDragged(); updateSkipped = !updateSkipped; if (updateSkipped || Math.abs(old_val.intValue() - new_val.intValue()) > 3) { updateStyle(); } } }); } public void initImage(State state, BufferedImage sourceBufferedImage, float defaultBrightness , float defaultTransparency , float initBrightness, float initTransparency) { this.defaultBrightness = defaultBrightness; this.defaultTransparency = defaultTransparency; this.initBrightness = initBrightness; this.initTransparency = initTransparency; this.sourceBufferedImage = sourceBufferedImage; this.state = state; setBrightness(initBrightness); setTransparency(initTransparency); setupImageView(); } public void setOnStyleSetListener(OnStyleSetListener listener) { onStyleSetListener = listener; } public void resetToDefaultValue() { setBrightness(defaultBrightness); setTransparency(defaultTransparency); updateStyle(); } private void setBrightness(float value) { float sliderValue = convertToBrightnessSliderValue(value); brightnessSlider.setValue(sliderValue); brightnessTextField.setText(getStringFromBrightnessSliderValue(sliderValue)); } private void setTransparency(float value) { int roundedValue = (int) Math.round(value); transparencySlider.setValue(roundedValue); transparencyTextField.setText(String.valueOf(roundedValue)); } private void setupImageView() { updateStyle(); } private void updateStyle() { float brightnessFactor = (float) convertToBrightnessExactValue(brightnessSlider.getValue())/100.0f + 1; float transparencyFactor = (float) Math.abs(transparencySlider.getValue()/100.0f - 1.0f); RescaleOp rescale = new RescaleOp( new float[]{brightnessFactor, brightnessFactor, brightnessFactor, transparencyFactor}, new float[]{0f, 0f, 0f, 0f}, null); previewImageView.setImage(SwingFXUtils.toFXImage(rescale.filter(sourceBufferedImage, null), null)); } public void dismissStyleDialog() { if (onStyleSetListener != null) { int brightnessValue = (int) Math.round(brightnessSlider.getValue()) - SLIDER_MID_VAL; onStyleSetListener.onSet(brightnessValue, (int) Math.round(transparencySlider.getValue()) , state); } ((Stage)styleDialogOkBtn.getScene().getWindow()).close(); } public void cancelDialog() { ((Stage)styleDialogOkBtn.getScene().getWindow()).close(); } public void onBrightnessDragged() { brightnessTextField.setText(getStringFromBrightnessSliderValue(brightnessSlider.getValue())); } public void onTransparencysDragged() { int value = (int) Math.round(transparencySlider.getValue()); transparencyTextField.setText(String.valueOf(value)); } private String getStringFromBrightnessSliderValue(double value) { double exactValue = convertToBrightnessExactValue(value); int roundedValue = (int) Math.round(exactValue); return (roundedValue >= 0 ? "+" : "") + String.valueOf(roundedValue); } private float convertToBrightnessSliderValue(float value) { return value + SLIDER_MID_VAL; } private double convertToBrightnessExactValue(double value) { return value - SLIDER_MID_VAL; } }