All Downloads are FREE. Search and download functionalities are using the official Maven repository.

eu.hansolo.tilesfx.weather.WeatherSymbol Maven / Gradle / Ivy

There is a newer version: 21.0.9
Show newest version
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);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy