Package org.ugate.gui.components

Source Code of org.ugate.gui.components.Digit

package org.ugate.gui.components;

import javafx.scene.CacheHint;
import javafx.scene.Parent;
import javafx.scene.effect.Effect;
import javafx.scene.effect.Glow;
import javafx.scene.effect.InnerShadow;
import javafx.scene.paint.Color;
import javafx.scene.shape.Polygon;
import javafx.scene.transform.Shear;

/**
* Simple 7 segment LED style digit. It supports the numbers 0 through 9.
*/
public class Digit extends Parent {
  public static final int NEGATIVE_SIGN_DIGIT = 10;
  private static final boolean[][] DIGIT_COMBINATIONS = new boolean[][] {
      new boolean[] { true, false, true, true, true, true, true },
      new boolean[] { false, false, false, false, true, false, true },
      new boolean[] { true, true, true, false, true, true, false },
      new boolean[] { true, true, true, false, true, false, true },
      new boolean[] { false, true, false, true, true, false, true },
      new boolean[] { true, true, true, true, false, false, true },
      new boolean[] { true, true, true, true, false, true, true },
      new boolean[] { true, false, false, false, true, false, true },
      new boolean[] { true, true, true, true, true, true, true },
      new boolean[] { true, true, true, true, true, false, true },
      new boolean[] { false, true, false, false, false, false, false } };
  private final Polygon[] polygons;
  private final Color onColor;
  private final Color offColor;
  private final Effect onEffect;
  private final Effect offEffect;
  private int number = 0;

  public Digit() {
    this(1, 0, null, null, null, null);
  }
 
  public Digit(final double scale) {
    this(scale, 0, null, null, null, null);
  }
 
  public Digit(final double scale, final int number) {
    this(scale, number, null, null, null, null);
  }

  public Digit(final double scale, final int number, final Color onColor, final Color offColor) {
    this(scale, number, onColor, offColor, null, null);
  }

  public Digit(final double scale, final int number, final Color onColor, final Color offColor,
      final Effect onEffect, final Effect offEffect) {
    setCache(true);
    setCacheHint(CacheHint.SPEED);
    polygons = createPolygons(scale);
    this.onColor = onColor != null ? onColor : getDefaultOnColor();
    this.offColor = offColor != null ? offColor : getDefaultOffColor();
    this.onEffect = onEffect != null ? onEffect : createDefaultOnEffect(scale);
    this.offEffect = offEffect != null ? offEffect
        : createDefaultOffEffect(scale);
    getChildren().addAll(polygons);
    getTransforms().add(new Shear(-0.1, 0));
    showNumber(number);
  }

  /**
   * Shows a polygon number as a 7-segment LED
   *
   * @param number
   *            the number to show
   */
  public void showNumber(final int number) {
    // default to 0 for non-valid numbers
    this.number = (number < 0 || number > NEGATIVE_SIGN_DIGIT) ? 0 : number;
    for (int i=0; i<7; i++) {
      polygons[i].setFill(DIGIT_COMBINATIONS[getNumber()][i] ? onColor
          : offColor);
      polygons[i].setEffect(DIGIT_COMBINATIONS[getNumber()][i] ? onEffect
          : offEffect);
    }
  }

  /**
   * @return the numeric value of the digit
   */
  public int getNumber() {
    return number;
  }
 
  /**
   * @return the default segment color when it's on
   */
  protected static Color getDefaultOnColor() {
    return Color.ORANGERED;
  }
 
  /**
   * @return the default segment color when it's off
   */
  protected static Color getDefaultOffColor() {
    return Color.rgb(50, 50, 50);
  }

  /**
   * @return the default effect for a segment when it's on
   */
  public static Effect createDefaultOnEffect(final double scale) {
    final Glow onEffect = new Glow(1.7f * scale);
    onEffect.setInput(createDefaultOffEffect(scale));
    return onEffect;
  }

  /**
   * @return the default effect for a segment when it's off
   */
  public static Effect createDefaultOffEffect(final double scale) {
    final InnerShadow is = new InnerShadow();
    is.setRadius(10 * scale);
    is.setWidth(21 * scale);
    is.setHeight(21 * scale);
    return is;
  }
 
  protected static Polygon[] createPolygons(final double scale) {
    return new Polygon[] {
        createPolygon(new double[] { 2f * scale, 0f * scale, 52f * scale, 0f * scale, 42f * scale, 10f * scale, 12f * scale, 10f * scale }),
        createPolygon(new double[] { 12 * scale, 49 * scale, 42 * scale, 49 * scale, 52 * scale, 54 * scale, 42 * scale, 59 * scale, 12 * scale,
            59 * scale, 2 * scale, 54 * scale }),
        createPolygon(new double[] { 12 * scale, 98 * scale, 42 * scale, 98 * scale, 52 * scale, 108 * scale, 2 * scale, 108 * scale }),
        createPolygon(new double[] { 0 * scale, 2 * scale, 10 * scale, 12 * scale, 10 * scale, 47 * scale, 0 * scale, 52 * scale }),
        createPolygon(new double[] { 44 * scale, 12 * scale, 54 * scale, 2 * scale, 54 * scale, 52 * scale, 44 * scale, 47 * scale }),
        createPolygon(new double[] { 0 * scale, 56 * scale, 10 * scale, 61 * scale, 10 * scale, 96 * scale, 0 * scale, 106 * scale }),
        createPolygon(new double[] { 44 * scale, 61 * scale, 54 * scale, 56 * scale, 54 * scale, 106 * scale, 44 * scale, 96 * scale }) };
  }
 
  protected static Polygon createPolygon(final double... points) {
    final Polygon pg = new Polygon(points);
    pg.setCache(true);
    pg.setCacheHint(CacheHint.SPEED);
    pg.setSmooth(false);
    return pg;
  }
}
TOP

Related Classes of org.ugate.gui.components.Digit

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.