package kioskfx; import java.util.Vector; import javafx.beans.InvalidationListener; import javafx.beans.property.IntegerProperty; import javafx.beans.property.ReadOnlyDoubleProperty; import javafx.beans.property.SimpleDoubleProperty; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.geometry.VPos; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.image.Image; import javafx.scene.paint.Color; import javafx.scene.paint.CycleMethod; import javafx.scene.paint.Paint; import javafx.scene.paint.RadialGradient; import javafx.scene.paint.Stop; import javafx.scene.shape.Rectangle; import javafx.scene.text.Font; import javafx.scene.text.Text; //~--- JDK imports ------------------------------------------------------------ public class KiMenu { private SimpleIntegerProperty currentSection; private SimpleDoubleProperty currentShift; private SimpleObjectProperty<Color> fogColor; private SimpleDoubleProperty height; private SimpleDoubleProperty iconHeight; private SimpleDoubleProperty iconWidth; // private ImageView imageView; private Text label; private SimpleDoubleProperty leftMargin; private Node node; private Vector<KiSection> sections; private Group sectionsGroup; private Group actionsGroup; private KiBackground background; private SimpleDoubleProperty topMargin; private SimpleDoubleProperty width; private Image defaultImage; private SimpleObjectProperty<Color> itemColor; private SimpleObjectProperty<Color> titleColor; // Polygon polygon; Rectangle fog; private SimpleDoubleProperty itemHeight; private int titleSize; private int itemSize; public KiMenu() { width = new SimpleDoubleProperty(900); height = new SimpleDoubleProperty(600); fogColor = new SimpleObjectProperty<Color>(Color.web("#000000")); iconWidth = new SimpleDoubleProperty(150); iconHeight = new SimpleDoubleProperty(120); leftMargin = new SimpleDoubleProperty(250); topMargin = new SimpleDoubleProperty(100); currentSection = new SimpleIntegerProperty(-1); currentShift = new SimpleDoubleProperty(0.0); itemColor = new SimpleObjectProperty<Color>(Color.web("#ffffff")); titleColor = new SimpleObjectProperty<Color>(Color.web("#ffffff")); Group root = new Group(); titleSize = 99; itemSize = 64; itemHeight = new SimpleDoubleProperty(70); /* * Rectangle t = new Rectangle(); t.setFill(Color.web("#330000")); * t.widthProperty().bind(width); t.heightProperty().bind(height); * root.getChildren().add(t); */ sections = new Vector<KiSection>(); // Image backgroundImage = new // Image(this.getClass().getResourceAsStream("background.jpg")); // KiBackground ff=new // KiBackground().height(height).width(width).image(backgroundImage); // imageView = new ImageView(); // imageView.setImage(backgroundImage); // defaultImageView.fitWidthProperty().bind(width); // imageView.setPreserveRatio(true); defaultImage = new Image(this.getClass().getResourceAsStream( "background.jpg")); background = new KiBackground().height(height).width(width) .image(defaultImage); root.getChildren().add(background.node()); fog = new Rectangle(); fog.widthProperty().bind(width); fog.heightProperty().bind(height.multiply(2)); fog.translateYProperty().bind(height.divide(-2.0)); fog.setFill(getFogFill()); fog.setMouseTransparent(true); root.getChildren().add(fog); label = new Text(); // Font font = // Font.loadFont(this.getClass().getResourceAsStream("font.ttf"), 99); label.setFont(Font.loadFont( this.getClass().getResourceAsStream("font.ttf"), titleSize)); // new Font("Verdana", 90)); // label.setTranslateX(300); label.setTranslateY(0); label.setTextOrigin(VPos.TOP); // label.setText("Text label"); // label.setFill(Color.web("#ffffff66")); label.fillProperty().bind(titleColor); label.translateXProperty().bind(leftMargin); root.getChildren().add(label); /* * polygon = new Polygon(); Stop[] st = new Stop[]{new Stop(0, * Color.web("#ffffff33")), new Stop(1, Color.web("#ffffff00"))}; * LinearGradient gr = new LinearGradient(0, 0, 0, 0.5, true, * CycleMethod.NO_CYCLE, st); polygon.setFill(gr); */ // root.getChildren().add(polygon); sectionsGroup = new Group(); sectionsGroup.translateXProperty().bind( iconWidth.add(16).multiply(currentShift).negate() .add(leftMargin)); actionsGroup = new Group(); actionsGroup.translateXProperty().bind(leftMargin); actionsGroup.translateYProperty().bind( topMargin.add(iconHeight).add(16)); // currentSection.multiply(sectionWidth). // leftMargin); sectionsGroup.translateYProperty().bind(topMargin); root.getChildren().add(sectionsGroup); root.getChildren().add(actionsGroup); addWatchers(); // currentSection.set(0); Rectangle clip = new Rectangle(); clip.widthProperty().bind(width); clip.heightProperty().bind(height); root.setClip(clip); node = root; } public static String version() { return "v1.2.1 for JavaFX v40"; } public KiMenu itemHeight(double it) { itemHeight.set(it); return this; } public double itemHeight() { return itemHeight.get(); } public KiMenu itemSize(int it) { itemSize = it; for (int i = 0; i < this.sections.size(); i++) { this.sections.get(i).itemSize(it); } return this; } public int itemSize() { return itemSize; } public KiMenu image(Image it) { if (it == null) { background.image(defaultImage); } else { background.image(it); } return this; } public KiMenu itemColor(Color it) { itemColor.set(it); return this; } public KiMenu titleSize(int it) { titleSize = it; label.setFont(Font.loadFont( this.getClass().getResourceAsStream("font.ttf"), titleSize)); return this; } public int titleSize() { return titleSize; } public KiMenu titleColor(Color it) { titleColor.set(it); return this; } public KiMenu fog(Color it) { if (it == null) { fogColor.set(Color.web("#000000")); } else { fogColor.set(it); } fog.setFill(getFogFill()); return this; } public KiMenu currentSection(IntegerProperty it) { // System.out.println(it); // this.currentSection.bindBidirectional(it); /* * it.addListener(new ChangeListener () { * * public void invalidated(javafx.beans.Observable observable) { * System.out.println(observable); } * * public void changed(ObservableValue observable, Object oldValue, * Object newValue) { System.out.println(observable); } }); */ return this; } private Paint getFogFill() { Color dark = new Color(fogColor.get().getRed(), fogColor.get() .getGreen(), fogColor.get().getBlue(), 1.0); Color light = new Color(fogColor.get().getRed(), fogColor.get() .getGreen(), fogColor.get().getBlue(), 0.5); Stop[] stops = new Stop[] { new Stop(0, light), new Stop(1, dark) }; RadialGradient gr = new RadialGradient(0.0, 0.0, 0.5, 0.5, 0.5, true, CycleMethod.NO_CYCLE, stops); return gr; } private void setFar() { // System.out.println("far"); double rtsz = 1.0 / ((0.0 + width.get() - leftMargin.get()) / iconWidth .get()); double ltsz = 1.0 / ((0.0 + leftMargin.get() + iconWidth.get()) / iconWidth .get()); for (int i = 0; i < sections.size(); i++) { if (i != this.currentSection.get()) { sections.get(i).active(false); int diff = currentSection.get() - i; if (diff < 0) { // right double rOpcty = 1.0 + diff * rtsz; if (rOpcty < 0) { rOpcty = 0; } if (rOpcty > 1) { rOpcty = 1; } sections.get(i).opacity(0.5 * rOpcty); } else { // if (diff > 0) { // left double lOpcty = 1.0 - diff * ltsz; if (lOpcty < 0) { lOpcty = 0; } if (lOpcty > 1) { lOpcty = 1; } sections.get(i).opacity(0.5 * lOpcty); // } else { // sections.get(i).opacity(1.0); // } } } else { sections.get(i).active(true); } } } void addWatchers() { width.addListener(new InvalidationListener() { public void invalidated(javafx.beans.Observable observable) { adjust(); } }); height.addListener(new InvalidationListener() { public void invalidated(javafx.beans.Observable observable) { adjust(); } }); currentSection.addListener(new ChangeListener<Number>() { public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { // System.out.println("changed "+oldValue+" to "+newValue); showCurrent(); } }); } public Node node() { adjust(); return node; } void adjust() { // double imageWidth = imageView.getBoundsInLocal().getWidth(); // double imageHeight = imageView.getBoundsInLocal().getHeight(); // double scaleWidth = width.get() / // imageView.getBoundsInLocal().getWidth(); // double scaleHeight = height.get() / // imageView.getBoundsInLocal().getHeight(); /* * if (width.get() / imageView.getBoundsInLocal().getWidth() > * height.get() / imageView.getBoundsInLocal().getHeight()) { * imageView.setFitHeight(0); imageView.setFitWidth(width.get()); } else * { imageView.setFitWidth(0); imageView.setFitHeight(height.get()); } */ // System.out.println(scaleWidth + "/" + scaleHeight); // polygon.getPoints().clear(); // polygon.getPoints().addAll(new Double[]{0.0, 0.0, width.get()/3, 0.0, // width.get()/5, height.get(),0.0, height.get()}); } public KiMenu width(ReadOnlyDoubleProperty nn) { this.width.bind(nn); adjust(); return this; } public KiMenu iconWidth(double nn) { this.iconWidth.set(nn); // adjust(); return this; } public KiMenu leftMargin(double nn) { this.leftMargin.set(nn); // adjust(); return this; } public double leftMargin() { return leftMargin.get(); } public double topMargin() { return topMargin.get(); } public KiMenu topMargin(double nn) { this.topMargin.set(nn); // adjust(); return this; } public KiMenu iconHeight(double nn) { this.iconHeight.set(nn); // adjust(); return this; } public double iconHeight() { return iconHeight.get(); } public double iconWidth() { return iconWidth.get(); } public KiMenu height(ReadOnlyDoubleProperty nn) { this.height.bind(nn); adjust(); return this; } private void showCurrent() { // System.out.println("show "+currentSection.get()); if (sections.size() > currentSection.get()) { label.setText(sections.get(currentSection.get()).title()); this.setFar(); moveToCurrent(); } } private void moveToCurrent() { final double delta = (currentShift.get() - currentSection.get()) / 10.0; KiTimeline kt = new KiTimeline().duration(500); KiJob j = new KiJob() { @Override public void start() { currentShift.set(currentShift.get() - delta); actionsGroup.setOpacity(actionsGroup.getOpacity() - 0.1); } }; for (int i = 0; i < 10; i++) { kt.job(j); // System.out.println(this.actionsGroup.getOpacity()); } KiJob lj = new KiJob() { @Override public void start() { currentShift.set(currentSection.get()); showActions(); } }; kt.job(lj); kt.start(); } private void showActions() { this.actionsGroup.getChildren().clear(); this.actionsGroup.setOpacity(1.0); KiSection s = this.sections.get(currentSection.get()); for (int i = 0; i < s.actions().size(); i++) { KiAction a = s.actions().get(i); this.actionsGroup.getChildren().add(a.node()); // System.out.println(a.title()); } } public KiMenu section(KiSection it) { // this.width.bind(nn); // adjust(); final int n = sections.size(); KiJob job = new KiJob() { @Override public void start() { // System.out.println("set "+n+": "+currentSection.get()); currentSection.set(n); // System.out.println("now "+currentSection.get()); } }; it.itemSize(itemSize); it.itemColor(itemColor); it.itemHeight(itemHeight); it.order(sections.size()).width(iconWidth).height(iconHeight) .onSelect(job); // it.image(new // Image(this.getClass().getResourceAsStream("section.png"))); sections.add(it); sectionsGroup.getChildren().add(it.node()); // move(0); currentSection.set(0); this.setFar(); return this; } } // ~ Formatted by Jindent --- http://www.jindent.com