package lighthouse.subwindows;
import javafx.animation.*;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import lighthouse.Main;
import java.util.Arrays;
import java.util.List;
import static javafx.util.Duration.millis;
/**
* A class that manages an FXML based on the window template (with titletabs).
*/
public class InnerWindow {
public Main.OverlayUI<InnerWindow> overlayUI;
public static class TabSection {
public Label label;
public Pane content;
public TabSection(String label, Pane content) {
this.label = new Label(label);
this.label.getStyleClass().add(INACTIVE_STYLE);
this.content = content;
}
}
@FXML public BorderPane rootPane;
@FXML public HBox tabLabelBox;
@FXML public Label closeWidget;
private List<TabSection> tabs;
protected IntegerProperty currentTabIndex = new SimpleIntegerProperty(-1);
private static final String INACTIVE_STYLE = "windows-titlebar-tab-inactive";
public void initialize(TabSection... tabs) {
// Make the window fit into the main window and stretch.
rootPane.prefWidthProperty().bind(Main.instance.scene.widthProperty().multiply(0.8));
rootPane.prefHeightProperty().bind(Main.instance.scene.heightProperty().multiply(0.6));
this.tabs = Arrays.asList(tabs);
for (int i = 0; i < this.tabs.size(); i++) {
final int index = i;
final Label label = this.tabs.get(index).label;
label.setOnMouseClicked(ev -> currentTabIndex.set(index));
tabLabelBox.getChildren().add(0, label);
}
currentTabIndex.addListener((val, before, now) -> {
final TabSection prevSection = this.tabs.get(before.intValue() == -1 ? 0 : before.intValue());
final TabSection nextSection = this.tabs.get(now.intValue());
Label prevLabel = prevSection.label;
Label nextLabel = nextSection.label;
// It'd be nice to find a way of eliminating this duplication with the CSS file, but during initialisation
// it seems styles were not applied yet. And JFX doesn't support CSS animations yet.
Color inactiveColor = Color.web("#ff8888");
Color activeColor = Color.RED;
// Don't animate the tab transition the first time we appear.
if (before.intValue() != -1) {
final Animation colorAnim = new Transition() {
{
setCycleDuration(millis(400));
}
@Override
protected void interpolate(double v) {
Color color = inactiveColor.interpolate(activeColor, v);
nextLabel.setBackground(new Background(new BackgroundFill(color, null, null)));
}
};
colorAnim.play();
TranslateTransition slide = new TranslateTransition(millis(200));
slide.setFromX(0.0);
slide.setByX(-50);
FadeTransition fade = new FadeTransition(millis(200));
fade.setFromValue(1.0);
fade.setToValue(0.0);
prevSection.content.setCache(true);
ParallelTransition together = new ParallelTransition(prevSection.content, slide, fade);
together.play();
} else {
nextLabel.setBackground(new Background(new BackgroundFill(activeColor, null, null)));
}
prevLabel.getStyleClass().add(INACTIVE_STYLE);
nextLabel.getStyleClass().removeAll(INACTIVE_STYLE);
});
currentTabIndex.set(0);
}
@FXML
public void cancelClicked(ActionEvent event) {
overlayUI.done();
}
@FXML
public void closeWidgetClicked(MouseEvent event) {
overlayUI.done();
}
}