eu.hansolo.tilesfx.weather.WeatherSymbol Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of tilesfx Show documentation
Show all versions of tilesfx Show documentation
TilesFX is a JavaFX library containing tiles for dashboards
package eu.hansolo.tilesfx.weather;
import eu.hansolo.tilesfx.Tile;
import eu.hansolo.tilesfx.weather.DarkSky.ConditionAndIcon;
import javafx.beans.DefaultProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.ObjectPropertyBase;
import javafx.collections.ObservableList;
import javafx.css.CssMetaData;
import javafx.css.Styleable;
import javafx.css.StyleableObjectProperty;
import javafx.css.StyleableProperty;
import javafx.css.StyleablePropertyFactory;
import javafx.scene.Node;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import java.util.List;
/**
* User: hansolo
* Date: 18.01.14
* Time: 14:39
*/
@DefaultProperty("children")
public class WeatherSymbol extends Region {
private static final double PREFERRED_WIDTH = 64;
private static final double PREFERRED_HEIGHT = 64;
private static final double MINIMUM_WIDTH = 10;
private static final double MINIMUM_HEIGHT = 10;
private static final double MAXIMUM_WIDTH = 1024;
private static final double MAXIMUM_HEIGHT = 1024;
private static final StyleablePropertyFactory FACTORY = new StyleablePropertyFactory<>(Region.getClassCssMetaData());
private static final CssMetaData SYMBOL_COLOR = FACTORY.createColorCssMetaData("-symbol-symbolColor", s -> s.symbolColor, Color.WHITE, false);
private ObjectProperty condition;
private StyleableProperty symbolColor;
private double size;
private Region conditionIcon;
private Pane pane;
// ******************** Constructor ***************************************
public WeatherSymbol() {
this(ConditionAndIcon.NONE, PREFERRED_WIDTH, Color.WHITE);
}
public WeatherSymbol(final ConditionAndIcon CONDITION, final double SIZE, final Color COLOR) {
condition = new ObjectPropertyBase(null == CONDITION ? ConditionAndIcon.NONE : CONDITION) {
@Override protected void invalidated() {
conditionIcon.setId(get().styleClass);
resize();
}
@Override public Object getBean() { return WeatherSymbol.this; }
@Override public String getName() { return "condition"; }
};
symbolColor = new StyleableObjectProperty(null == COLOR ? Tile.FOREGROUND : COLOR) {
@Override public Object getBean() { return WeatherSymbol.this; }
@Override public String getName() { return "symbolColor"; }
@Override public CssMetaData getCssMetaData() { return SYMBOL_COLOR; }
};
size = SIZE;
initGraphics();
registerListeners();
}
// ******************** Initialization ************************************
private void initGraphics() {
if (Double.compare(getPrefWidth(), 0.0) <= 0 || Double.compare(getPrefHeight(), 0.0) <= 0 ||
Double.compare(getWidth(), 0.0) <= 0 || Double.compare(getHeight(), 0.0) <= 0) {
if (getPrefWidth() > 0 && getPrefHeight() > 0) {
setPrefSize(getPrefWidth(), getPrefHeight());
} else {
setPrefSize(PREFERRED_WIDTH, PREFERRED_HEIGHT);
}
}
getStyleClass().setAll("weather-symbol");
conditionIcon = new Region();
conditionIcon.setId(condition.get().styleClass);
conditionIcon.setStyle("-symbol-color: " + getSymbolColor().toString().replace("0x", "#") + ";");
pane = new Pane(conditionIcon);
getChildren().setAll(pane);
}
private void registerListeners() {
widthProperty().addListener(o -> resize());
heightProperty().addListener(o -> resize());
}
// ******************** Methods *******************************************
@Override protected double computeMinWidth(final double HEIGHT) { return MINIMUM_WIDTH; }
@Override protected double computeMinHeight(final double WIDTH) { return MINIMUM_HEIGHT; }
@Override protected double computePrefWidth(final double HEIGHT) { return super.computePrefWidth(HEIGHT); }
@Override protected double computePrefHeight(final double WIDTH) { return super.computePrefHeight(WIDTH); }
@Override protected double computeMaxWidth(final double HEIGHT) { return MAXIMUM_WIDTH; }
@Override protected double computeMaxHeight(final double WIDTH) { return MAXIMUM_HEIGHT; }
@Override public ObservableList getChildren() { return super.getChildren(); }
public final ConditionAndIcon getCondition() { return condition.get(); }
public final void setCondition(final ConditionAndIcon CONDITION) { condition.set(CONDITION); }
public final ObjectProperty conditionProperty() { return condition; }
public final Color getSymbolColor() { return symbolColor.getValue(); }
public final void setSymbolColor(final Color COLOR) { symbolColor.setValue(COLOR); }
public final StyleableProperty symbolColorProperty() { return symbolColor; }
public static List> getClassCssMetaData() { return FACTORY.getCssMetaData(); }
@Override public List> getCssMetaData() { return getClassCssMetaData(); }
public void resize() {
double width = getWidth() - getInsets().getLeft() - getInsets().getRight();
double height = getHeight() - getInsets().getTop() - getInsets().getBottom();
size = width < height ? width : height;
if (width > 0 && height > 0) {
pane.setMaxSize(size, size);
pane.setPrefSize(size, size);
pane.relocate((getWidth() - size) * 0.5, (getHeight() - size) * 0.5);
conditionIcon.setPrefSize(size * getCondition().widthFactor, size * getCondition().heightFactor);
conditionIcon.relocate((size - conditionIcon.getPrefWidth()) * 0.5, (size - conditionIcon.getPrefHeight()) * 0.5);
}
}
}