first commit
[jalview-fx.git] / src / jalviewfx / controllers / engine / ScreensController.java
1 package jalviewfx.controllers.engine;
2
3 import java.util.HashMap;
4
5 import javafx.animation.KeyFrame;
6 import javafx.animation.KeyValue;
7 import javafx.animation.Timeline;
8 import javafx.beans.property.DoubleProperty;
9 import javafx.event.Event;
10 import javafx.event.EventHandler;
11 import javafx.fxml.FXMLLoader;
12 import javafx.scene.Node;
13 import javafx.scene.Parent;
14 import javafx.scene.layout.StackPane;
15 import javafx.util.Duration;
16 import application.App.Screens;
17
18 public class ScreensController extends StackPane {
19         private HashMap<String, Node> screens = new HashMap<>();
20
21         public void addScreen(String name, Node screen) {
22                 screens.put(name, screen);
23         }
24
25         public boolean loadScreen(String name, String resource) {
26                 try {
27                         FXMLLoader myLoader = new FXMLLoader(getClass().getResource(resource));
28                         Parent loadScreen = (Parent) myLoader.load();
29                         ControlledScreen myScreenControler = ((ControlledScreen) myLoader.getController());
30                         myScreenControler.setScreenParent(this);
31                         addScreen(name, loadScreen);
32                         return true;
33                 } catch (Exception e) {
34                         System.out.println(e.getMessage());
35                         return false;
36                 }
37         }
38
39         public boolean setScreen(final Screens screen) {
40
41                 if (screens.get(screen.getName()) != null) { // screen loaded
42                         final DoubleProperty opacity = opacityProperty();
43
44                         // Is there is more than one screen
45                         if (!getChildren().isEmpty()) {
46                                 @SuppressWarnings({ "unchecked", "rawtypes" })
47                                 Timeline fade = new Timeline(new KeyFrame(Duration.ZERO, new KeyValue(opacity, 1.0)), new KeyFrame(new Duration(1000),
48
49                                 new EventHandler() {
50                                         @Override
51                                         public void handle(Event t) {
52                                                 // remove displayed screen
53                                                 getChildren().remove(0);
54                                                 // add new screen
55                                                 getChildren().add(0, screens.get(screen.getName()));
56                                                 Timeline fadeIn = new Timeline(new KeyFrame(Duration.ZERO, new KeyValue(opacity, 0.0)), 
57                                                                 new KeyFrame(new Duration(800), new KeyValue(opacity, 1.0)));
58                                                 fadeIn.play();
59                                         }
60
61                                 }, new KeyValue(opacity, 0.0)));
62                                 fade.play();
63                         } else {
64                                 // no one else been displayed, then just show
65                                 setOpacity(0.0);
66                                 getChildren().add(screens.get(screen.getName()));
67                                 Timeline fadeIn = new Timeline(new KeyFrame(Duration.ZERO, new KeyValue(opacity, 0.0)), 
68                                                 new KeyFrame(new Duration(2500), new KeyValue(opacity, 1.0)));
69                                 fadeIn.play();
70                         }
71                         return true;
72                 } else {
73                         System.out.println("screen hasn't been loaded!\n");
74                         return false;
75                 }
76         }
77
78         public boolean unloadScreen(String name) {
79                 if (screens.remove(name) == null) {
80                         System.out.println("Screen didn't exist");
81                         return false;
82                 } else {
83                         return true;
84                 }
85         }
86 }