/*
*
*/
package xplayer.visualizer.view;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import application.Main;
import application.tools.ActionTool;
import application.tools.InfoTool;
import application.tools.JavaFXTools;
import application.tools.NotificationType;
import borderless.BorderlessScene;
import javafx.animation.PauseTransition;
import javafx.beans.binding.Bindings;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Cursor;
import javafx.scene.control.Button;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuButton;
import javafx.scene.control.MenuItem;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.Slider;
import javafx.scene.control.ToggleGroup;
import javafx.scene.image.Image;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCombination;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundImage;
import javafx.scene.layout.BackgroundPosition;
import javafx.scene.layout.BackgroundRepeat;
import javafx.scene.layout.BackgroundSize;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.scene.media.MediaView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.util.Duration;
import xplayer.presenter.XPlayerController;
import xplayer.visualizer.model.VisualizerDrawer;
/**
* The Class VisualizerWindow.
*
* @author GOXR3PLUS
*/
public class VisualizerWindowController extends StackPane {
//------------------
@FXML
private BorderPane visualizerPane;
@FXML
private StackPane centerStackPane;
@FXML
private MediaView mediaView;
@FXML
private BorderPane topBar;
@FXML
private Button minimize;
@FXML
private StackPane progressBarStackPane;
@FXML
private ProgressBar progressBar;
@FXML
private MenuButton menuPopButton;
@FXML
private ContextMenu visualizerContextMenu;
@FXML
private Menu spectrumMenu;
@FXML
private ToggleGroup visualizerTypeGroup;
@FXML
private MenuItem setBackground;
@FXML
private MenuItem setDefaultBackground;
@FXML
private MenuItem clearBackground;
@FXML
private MenuItem setForeground;
@FXML
private MenuItem setDefaultForeground;
@FXML
private Slider transparencySlider;
// ------------------------------------
/** The window. */
private Stage window;
/** The x player UI. */
// Controller of an XPlayer
private XPlayerController xPlayerController;
/** The pause transition. */
private PauseTransition pauseTransition = new PauseTransition(Duration.seconds(2));
/**
* Constructor.
*
* @param xPlayerController
* xPlayerController
*/
public VisualizerWindowController(XPlayerController xPlayerController) {
this.xPlayerController = xPlayerController;
window = new Stage();
window.setTitle("XR3Player Visualizer");
window.getIcons().add(InfoTool.getImageFromResourcesFolder("icon.png"));
window.setWidth(InfoTool.getScreenHeight() / 2);
window.setHeight(InfoTool.getScreenHeight() / 2);
window.centerOnScreen();
window.setFullScreenExitHint("");
window.setFullScreenExitKeyCombination(KeyCombination.NO_MATCH);
window.setOnCloseRequest(c -> removeVisualizer());
// FXMLLOADER
FXMLLoader loader = new FXMLLoader(getClass().getResource(InfoTool.FXMLS + "VisualizerWindowController.fxml"));
loader.setController(this);
loader.setRoot(this);
try {
loader.load();
} catch (IOException ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, "VisualizerWindowController FXML can't be loaded!", ex);
}
}
//public MediaPlayer videoPlayer;
/**
* Called as soon as .fxml has been loaded
*/
@FXML
private void initialize() {
// -- Scene
BorderlessScene scene = new BorderlessScene(window, StageStyle.TRANSPARENT, this, 150, 150);
scene.setMoveControl(topBar);
scene.setFill(Color.rgb(0, 0, 0, transparencySlider.getValue()));
scene.getStylesheets().add(getClass().getResource(InfoTool.STYLES + InfoTool.APPLICATIONCSS).toExternalForm());
// ---Size Listeners
// width-height Listeners
window.widthProperty().addListener((observable , oldValue , newValue) -> {
if (newValue.intValue() <= 200 && progressBarStackPane.isVisible()) {
progressBarStackPane.setVisible(false);
progressBarStackPane.setManaged(false);
} else if (newValue.intValue() > 200 && !progressBarStackPane.isVisible()) {
progressBarStackPane.setVisible(true);
progressBarStackPane.setManaged(true);
}
});
// --- MouseListeners
addEventHandler(MouseEvent.MOUSE_MOVED, m -> {
pauseTransition.playFromStart();
topBar.setVisible(true);
setCursor(Cursor.HAND);
xPlayerController.getVisualizer().setCursor(Cursor.HAND);
});
// -- KeyListeners
scene.setOnKeyReleased(key -> {
if (key.getCode() == KeyCode.ESCAPE) {
if (!window.isFullScreen())
removeVisualizer();
else
window.setFullScreen(false);
}
});
// ----------Drag && Drop Listeners
scene.setOnDragOver(dragOver -> dragOver.acceptTransferModes(TransferMode.LINK));
scene.setOnDragDropped(drop -> xPlayerController.dragDrop(drop, 2));
window.setScene(scene);
// -------------Top Bar Elements---------------
// menuPopButton
menuPopButton.textProperty()
.bind(Bindings.max(0, progressBar.progressProperty()).multiply(100.00).asString("[%.02f %%]").concat("Deck [" + xPlayerController.getKey() + "]"));
// ----------------------------- Minimize
minimize.setOnAction(action ->
removeVisualizer());
// transparencySlider
transparencySlider.valueProperty().addListener(list -> scene.setFill(Color.rgb(0, 0, 0, transparencySlider.getValue())));
// PauseTransition
pauseTransition.setOnFinished(f -> {
if (!topBar.isHover() && window.isShowing() && !menuPopButton.isShowing()) {
topBar.setVisible(false);
setCursor(Cursor.NONE);
xPlayerController.getVisualizer().setCursor(Cursor.NONE);
}
});
// /** The media. */
// Media media = new Media(new
// File("C:\\\\Users\\\\GOXR3PLUS\\\\Desktop\\\\Twerking
// Dog.mp4").toURI().toString());
//
// /** The video player. */
// videoPlayer = new MediaPlayer(media);
//
// mediaView.setMediaPlayer(videoPlayer);
// mediaView.fitHeightProperty().bind(super.widthProperty());
// mediaView.fitHeightProperty().bind(super.heightProperty());
// mediaView.setSmooth(true);
//
// if (xPlayerUI.getKey() == 0) {
// videoPlayer.setRate(0.5);
// videoPlayer.setCycleCount(50000);
// videoPlayer.setMute(true);
// videoPlayer.setAutoPlay(true);
// }
//--------------------------
// setBackground
setBackground.setOnAction(a -> changeImage(Type.BACKGROUND));
//setDefaultBackground
setDefaultBackground.setOnAction(a -> resetDefaultImage(Type.BACKGROUND));
// clearBackground
clearBackground.setOnAction(a -> {
//Delete the background image
JavaFXTools.deleteAnyImageWithTitle("XPlayer" + this.xPlayerController.getKey() + Type.BACKGROUND, InfoTool.getXPlayersImageFolderAbsolutePathPlain());
//Set the Image to null
xPlayerController.getVisualizer().backgroundImage = null;
});
// setForeground
setForeground.setOnAction(a -> changeImage(Type.FOREGROUND));
//setDefaultForeground
setDefaultForeground.setOnAction(a -> resetDefaultImage(Type.FOREGROUND));
}
/**
* The Enum Type.
*/
public enum Type {
/** The background. */
BACKGROUND {
@Override
public String toString() {
return "Background";
}
},
/** The foreground. */
FOREGROUND {
@Override
public String toString() {
return "Foreground";
}
};
}
/**
* Replaces the background image of visualizer.
*
* @param type
* the type
*/
public void changeImage(Type type) {
//Check the response
JavaFXTools.selectAndSaveImage("XPlayer" + this.xPlayerController.getKey() + type, InfoTool.getXPlayersImageFolderAbsolutePathPlain(), Main.specialChooser, window)
.ifPresent(image -> {
if (type == Type.BACKGROUND)
xPlayerController.getVisualizer().backgroundImage = image;
else if (type == Type.FOREGROUND)
xPlayerController.getVisualizer().foregroundImage = image;
});
}
/**
* Find the appropriate background or foreground Image , based on if any
* Images have been ever selected from the User
*
* @param type
* the type
*/
public void determineImage(Type type) {
//Check if it returns null
Image image = JavaFXTools.findAnyImageWithTitle("XPlayer" + this.xPlayerController.getKey() + type, InfoTool.getXPlayersImageFolderAbsolutePathPlain());
System.out.println("image is null?" + type + " .... " + ( image == null ));
//Replace the Image
if (type == Type.BACKGROUND)
xPlayerController.getVisualizer().backgroundImage = ( image != null ? image : VisualizerDrawer.DEFAULT_BACKGROUND_IMAGE );
else if (type == Type.FOREGROUND)
xPlayerController.getVisualizer().foregroundImage = ( image != null ? image : VisualizerDrawer.DEFAULT_FOREGROUND_IMAGE );
}
/**
* Resets the default background or foreground Image
*
* @param type
* the type
*/
public void resetDefaultImage(Type type) {
//Delete the background image
JavaFXTools.deleteAnyImageWithTitle("XPlayer" + this.xPlayerController.getKey() + type, InfoTool.getXPlayersImageFolderAbsolutePathPlain());
//Replace the Image
if (type == Type.BACKGROUND)
xPlayerController.getVisualizer().backgroundImage = VisualizerDrawer.DEFAULT_BACKGROUND_IMAGE;
else if (type == Type.FOREGROUND)
xPlayerController.getVisualizer().foregroundImage = VisualizerDrawer.DEFAULT_FOREGROUND_IMAGE;
}
/*-----------------------------------------------------------------------
*
*
* -----------------------------------------------------------------------
*
*
* -----------------------------------------------------------------------
*
*
* GETTERS
*
* -----------------------------------------------------------------------
*
* -----------------------------------------------------------------------
*
* -----------------------------------------------------------------------
*
* -----------------------------------------------------------------------
*/
/**
* Gets the stage.
*
* @return The Actual Stage of the Window
*/
public Stage getStage() {
return window;
}
/*-----------------------------------------------------------------------
*
*
* -----------------------------------------------------------------------
*
*
* -----------------------------------------------------------------------
*
*
* Methods
*
* -----------------------------------------------------------------------
*
* -----------------------------------------------------------------------
*
* -----------------------------------------------------------------------
*
* -----------------------------------------------------------------------
*/
/**
* Adds a visualizer to the Window.
*/
public void displayVisualizer() {
// Add the visualizer
centerStackPane.getChildren().add(1, xPlayerController.getVisualizerStackController());
// show the window
window.show();
}
/**
* Removes the visualizer from the Window.
*/
public void removeVisualizer() {
pauseTransition.stop();
xPlayerController.getVisualizer().setCursor(Cursor.HAND);
xPlayerController.reAddVisualizer();
window.close();
}
/**
* @return the visualizerContextMenu
*/
public ContextMenu getVisualizerContextMenu() {
return visualizerContextMenu;
}
/**
* @return the visualizerTypeGroup
*/
public ToggleGroup getVisualizerTypeGroup() {
return visualizerTypeGroup;
}
/**
* @return the progressBar
*/
public ProgressBar getProgressBar() {
return progressBar;
}
// -----------------Rubbish code.......------------------------------
// topBar.setOnMousePressed(m -> {
// if (window.getWidth() < InfoTool.screenWidth && m.getButton() ==
// MouseButton.PRIMARY) {
// topBar.setCursor(Cursor.MOVE);
// initialX = (int) ( window.getX() - m.getScreenX() );
// initialY = (int) ( window.getY() - m.getScreenY() );
// }
// });
//
// topBar.setOnMouseDragged(m -> {
// if (window.getWidth() < InfoTool.screenWidth && m.getButton() ==
// MouseButton.PRIMARY) {
// window.setX(m.getScreenX() + initialX);
// window.setY(m.getScreenY() + initialY);
// }
//
// });
//
// topBar.setOnMouseReleased(m -> topBar.setCursor(Cursor.DEFAULT));
}