Refactoring. Quickly looked and remove some dumb things in IPC part. Align package/classes names to some appropriate naming convention, move PlayerToolbar to separate FXML+controller.

master
Dmitry Isaenko 2021-09-15 04:30:18 +03:00
parent 9d8ab59361
commit d9ccb3a90a
27 changed files with 390 additions and 300 deletions

View File

@ -1,3 +0,0 @@
Manifest-Version: 1.0
Main-Class: mplayer4anime.Main

View File

@ -1,50 +0,0 @@
package mplayer4anime.IPC;
import mplayer4anime.Controller;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
// TODO: Rewrite and remove. Or just remove.
public class SingleInstanceHandler implements Runnable{
private ServerSocket servSock;
public SingleInstanceHandler(Controller mainCntrl, String argument){
int PORT = 65042;
// Creating client server socket;
try {
servSock = new ServerSocket(PORT, 10, InetAddress.getLocalHost());
Thread ssp = new Thread(new ServerSocketProvider(mainCntrl, servSock));
ssp.start();
} catch (IOException e) {
if (argument != null){
// Creating client socket;
try {
Socket clientSocket = new Socket(InetAddress.getLocalHost(), PORT);
OutputStream outStream = clientSocket.getOutputStream();
OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream);
outStreamWriter.write(argument + "\n");
outStreamWriter.flush();
outStream.close();
clientSocket.close();
} catch (IOException ex){
System.out.println("Internal issue: unable to create client socket.");
}
}
else
System.out.println("Application is already running.");
System.exit(0);
}
}
@Override
public void run() {
while (! Thread.currentThread().isInterrupted());
try {
servSock.close();
} catch (IOException ignore) {}
}
}

View File

@ -24,7 +24,8 @@ import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;
import mplayer4anime.IPC.SingleInstanceHandler;
import mplayer4anime.ipc.SingleInstanceHandler;
import mplayer4anime.ui.landing.LandingController;
import java.util.Locale;
import java.util.ResourceBundle;
@ -39,7 +40,7 @@ public class MainFX extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
FXMLLoader loader = new FXMLLoader(getClass().getResource("/landingPage.fxml"));
FXMLLoader loader = new FXMLLoader(getClass().getResource("/LandingPage.fxml"));
Locale userLocale = new Locale(Locale.getDefault().getISO3Language()); // NOTE: user locale based on ISO3 Language codes
ResourceBundle rb = ResourceBundle.getBundle("locale", userLocale);
@ -47,21 +48,14 @@ public class MainFX extends Application {
Parent root = loader.load();
// tmp?
Controller controller = loader.getController();
controller.setHostServices(getHostServices());
SingleInstanceHandler sih;
LandingController landingController = loader.getController();
landingController.setHostServices(getHostServices());
SingleInstanceHandler singleInstanceHandler;
if (!getParameters().getUnnamed().isEmpty())
sih = new SingleInstanceHandler(controller, getParameters().getUnnamed().get(0));
if (getParameters().getUnnamed().isEmpty())
singleInstanceHandler = new SingleInstanceHandler(landingController, null);
else
sih = new SingleInstanceHandler(controller, null);
// end
Thread tsih = new Thread(sih);
tsih.start();
// TODO: refactor needed?
Runtime.getRuntime().addShutdownHook(new Thread(() -> tsih.interrupt()));
singleInstanceHandler = new SingleInstanceHandler(landingController, getParameters().getUnnamed().get(0));
primaryStage.getIcons().addAll(
new Image(getClass().getResourceAsStream("/res/app_icon32x32.png")),
@ -80,10 +74,10 @@ public class MainFX extends Application {
primaryStage.setOnHidden(e -> {
AppPreferences.getINSTANCE().setSceneHeight(scene.getHeight());
AppPreferences.getINSTANCE().setSceneWidth(scene.getWidth());
tsih.interrupt();
controller.shutdown();
singleInstanceHandler.finishWork();
landingController.shutdown();
});
//Runtime.getRuntime().addShutdownHook(new Thread(sihThread::interrupt));
primaryStage.show();
}
}

View File

@ -1,14 +1,30 @@
/*
Copyright 2018-2021 Dmitry Isaenko
This file is part of mplayer4anime.
mplayer4anime is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
mplayer4anime is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with mplayer4anime. If not, see <https://www.gnu.org/licenses/>.
*/
package mplayer4anime;
public class MediatorControl{
private Controller mainController;
import mplayer4anime.ui.landing.LandingController;
public void registerMainController(Controller mc) {
mainController = mc;
}
public class MediatorControl {
private LandingController mainLandingController;
public void sentUpdates() {
mainController.updateAfterSettingsChanged();
private static class MediatorControlHold {
private static final MediatorControl INSTANCE = new MediatorControl();
}
private MediatorControl() {}
@ -17,7 +33,12 @@ public class MediatorControl{
return MediatorControlHold.INSTANCE;
}
private static class MediatorControlHold {
private static final MediatorControl INSTANCE = new MediatorControl();
public void registerMainController(LandingController mainLandingController) {
this.mainLandingController = mainLandingController;
}
public void updateAfterSettingsChanged() {
mainLandingController.updateAfterSettingsChanged();
}
}

View File

@ -16,10 +16,10 @@
You should have received a copy of the GNU General Public License
along with mplayer4anime. If not, see <https://www.gnu.org/licenses/>.
*/
package mplayer4anime.IPC;
package mplayer4anime.ipc;
import javafx.application.Platform;
import mplayer4anime.Controller;
import mplayer4anime.ui.landing.LandingController;
import java.io.BufferedReader;
import java.io.IOException;
@ -30,38 +30,29 @@ import java.net.Socket;
class ServerSocketProvider implements Runnable{
private final ServerSocket serverSocket;
private final Controller controller;
private final LandingController landingController;
ServerSocketProvider(Controller mainCntrl, ServerSocket srvSock){
ServerSocketProvider(LandingController mainLandingController, ServerSocket srvSock){
this.serverSocket = srvSock;
this.controller = mainCntrl;
this.landingController = mainLandingController;
}
@Override
public void run() {
Socket servSockClient;
try{
Socket servSockClient;
while (!serverSocket.isClosed()){
servSockClient = serverSocket.accept();
BufferedReader servInpRdr = new BufferedReader(
new InputStreamReader(servSockClient.getInputStream())
);
new InputStreamReader(servSockClient.getInputStream()));
String line = servInpRdr.readLine();
// Avoid 'Not on FX application thread' error.
Platform.runLater(new Runnable() {
@Override
public void run() {
controller.setPlaylistAsArgument(line);
}
});
Platform.runLater(() -> landingController.setPlaylistAsArgument(line));
servSockClient.close();
}
}
catch (IOException ex){
ex.printStackTrace();
System.out.println("Socket has been closed.");
}
catch (IOException ignore){}
}
}

View File

@ -0,0 +1,72 @@
package mplayer4anime.ipc;
import mplayer4anime.ui.landing.LandingController;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
// TODO: Rewrite and remove. Or just remove.
public class SingleInstanceHandler{
private ServerSocket servSocket;
private final LandingController mainLandingController;
private final String argument;
private final int PORT = 65042;
public SingleInstanceHandler(LandingController mainLandingController, String argument){
this.mainLandingController = mainLandingController;
this.argument = argument;
if (firstInstanceScenario())
secondInstanceScenario();
}
/**
* Creating client server socket;
* @return true of failure
* */
private boolean firstInstanceScenario(){
try {
servSocket = new ServerSocket(PORT, 10, InetAddress.getLocalHost());
Thread ssp = new Thread(new ServerSocketProvider(mainLandingController, servSocket));
ssp.start();
return false;
}
catch (IOException ignored){
return true;
}
}
/**
* If socked occupied then send arguments to the running instance
* */
private void secondInstanceScenario(){
try {
if (argument != null){
// Creating client socket;
Socket clientSocket = new Socket(InetAddress.getLocalHost(), PORT);
OutputStream outStream = clientSocket.getOutputStream();
OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream);
outStreamWriter.write(argument + "\n");
outStreamWriter.flush();
outStream.close();
clientSocket.close();
}
else
System.out.println("Application is already running.");
}
catch (IOException ex){
ex.printStackTrace();
System.out.println("Internal issue: unable to create client socket.");
}
System.exit(0);
}
public void finishWork(){
try {
servSocket.close();
} catch (IOException ignore) {}
}
}

View File

@ -19,7 +19,7 @@
package mplayer4anime.mplayer;
import mplayer4anime.ISlaveModeAppOrchestration;
import mplayer4anime.ServiceWindow;
import mplayer4anime.ui.ServiceWindow;
import java.io.*;
import java.util.ResourceBundle;

View File

@ -19,7 +19,7 @@
package mplayer4anime.mpv;
import com.sun.jna.ptr.IntByReference;
import mplayer4anime.ServiceWindow;
import mplayer4anime.ui.ServiceWindow;
public class MpvProcess implements Runnable{
private String videoFilename;

View File

@ -1,4 +1,4 @@
package mplayer4anime.Playlists;
package mplayer4anime.playlists;
public class JsonStorage {
private final String Ver;

View File

@ -16,11 +16,11 @@
You should have received a copy of the GNU General Public License
along with mplayer4anime. If not, see <https://www.gnu.org/licenses/>.
*/
package mplayer4anime.Playlists;
package mplayer4anime.playlists;
import com.google.gson.*;
import javafx.stage.FileChooser;
import mplayer4anime.ServiceWindow;
import mplayer4anime.ui.ServiceWindow;
import java.io.*;
import java.nio.charset.StandardCharsets;

View File

@ -16,7 +16,7 @@
You should have received a copy of the GNU General Public License
along with mplayer4anime. If not, see <https://www.gnu.org/licenses/>.
*/
package mplayer4anime;
package mplayer4anime.ui;
import javafx.scene.control.Alert;
import javafx.scene.layout.Region;

View File

@ -1,4 +1,4 @@
package mplayer4anime.About;
package mplayer4anime.ui.about;
import javafx.application.HostServices;
import javafx.fxml.FXML;

View File

@ -1,4 +1,4 @@
package mplayer4anime.About;
package mplayer4anime.ui.about;
import javafx.application.HostServices;
import javafx.fxml.FXMLLoader;

View File

@ -16,7 +16,7 @@
You should have received a copy of the GNU General Public License
along with mplayer4anime. If not, see <https://www.gnu.org/licenses/>.
*/
package mplayer4anime;
package mplayer4anime.ui.landing;
import javafx.application.HostServices;
import javafx.application.Platform;
@ -26,12 +26,16 @@ import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.stage.Stage;
import mplayer4anime.About.AboutWindow;
import mplayer4anime.Playlists.JsonStorage;
import mplayer4anime.Playlists.Playlists;
import mplayer4anime.Settings.SettingsWindow;
import mplayer4anime.appPanes.ControllerPane;
import mplayer4anime.appPanes.ControllerSUB;
import mplayer4anime.ui.about.AboutWindow;
import mplayer4anime.AppPreferences;
import mplayer4anime.ISlaveModeAppOrchestration;
import mplayer4anime.MediatorControl;
import mplayer4anime.playlists.JsonStorage;
import mplayer4anime.playlists.Playlists;
import mplayer4anime.ui.ServiceWindow;
import mplayer4anime.ui.settings.SettingsWindow;
import mplayer4anime.ui.landing.panes.ControllerPane;
import mplayer4anime.ui.landing.panes.ControllerPaneSubtitles;
import mplayer4anime.mplayer.MplayerSlave;
import mplayer4anime.mpv.MpvSlave;
@ -39,21 +43,20 @@ import java.io.*;
import java.net.URL;
import java.util.ResourceBundle;
public class Controller implements Initializable {
public class LandingController implements Initializable {
@FXML
private ControllerPane mkvPaneController, mkaPaneController;
ControllerPane mkvPaneController, mkaPaneController;
@FXML
private ControllerSUB subPaneController;
ControllerPaneSubtitles subPaneController;
@FXML
private PlayerToolbarController playerToolbarController;
@FXML
private Label statusLbl;
@FXML
private Menu recentlyOpenedMenu;
@FXML
private CheckMenuItem fullScreen;
@FXML
private TabPane tabPane;
@FXML
private CheckMenuItem subsHide;
private final AppPreferences appPreferences = AppPreferences.getINSTANCE();
@ -61,7 +64,8 @@ public class Controller implements Initializable {
private HostServices hostServices;
private String currentPlaylistLocation;
private String backend;
private ISlaveModeAppOrchestration player;
ISlaveModeAppOrchestration player;
// If application started with playlist passed as an argument, then we'll try to load it (if it's valid).
public void setPlaylistAsArgument(String playlist) {
@ -71,11 +75,12 @@ public class Controller implements Initializable {
@Override
public void initialize(URL url, ResourceBundle rb) {
// Register this controller in mediator
MediatorControl.getInstance().registerMainController(this);
mkvPaneController.setPaneType("Video");
mkaPaneController.setPaneType("Audio");
subPaneController.setPaneType("Subtitles");
// Register this controller in mediator
MediatorControl.getInstance().registerMainController(this);
resourceBundle = rb;
@ -87,9 +92,6 @@ public class Controller implements Initializable {
tabPane.getSelectionModel().select(1); // 0 is mka 1 is subs
}
fullScreen.setSelected(appPreferences.getFullScreenSelected());
subsHide.setSelected(appPreferences.getSubtitlesHideSelected());
String[] recentPlaylists = appPreferences.getRecentPlaylists();
for (int i = recentPlaylists.length-1; i >= 0; i--) {
if (recentPlaylists[i].isEmpty())
@ -104,9 +106,11 @@ public class Controller implements Initializable {
backend = "mpv";
player = new MpvSlave(resourceBundle);
}
playerToolbarController.initializeMainUiController(this);
}
void setHostServices(HostServices hostServices) {
public void setHostServices(HostServices hostServices) {
this.hostServices = hostServices;
}
@ -118,11 +122,10 @@ public class Controller implements Initializable {
// Will be used to store lists previously opened.
// Linkage established by ohHidden in MainFX.java class
void shutdown(){
public void shutdown(){
appPreferences.setLastTimeUsedSubsEncoding(subPaneController.getSelectedEncoding());
appPreferences.setFullScreenSelected(fullScreen.isSelected());
appPreferences.setSubtitlesHideSelected(subsHide.isSelected());
playerToolbarController.shutdown();
// TODO: remove from here; too sophisticated
String[] storeRecentArr = new String[10];
for (int i =0; i < recentlyOpenedMenu.getItems().size() - 2 && !(i > 9); i++) { // Don't take separator and Clean button
storeRecentArr[i] = (String) recentlyOpenedMenu.getItems().get(i).getUserData();
@ -143,7 +146,7 @@ public class Controller implements Initializable {
}
// Get event that notify application in case some settings has been changed
// This function called from MediatorControl after mediator receives request form SettingsController indicating that user updated some required fields.
void updateAfterSettingsChanged(){
public void updateAfterSettingsChanged(){
/* update list of encoding */
subPaneController.setEncoding(appPreferences.getSubsEncodingList(), null);
// In case of application failure should be better to save this immediately
@ -248,86 +251,5 @@ public class Controller implements Initializable {
items.remove(9, recentlyOpenedMenu.getItems().size() - 2);
items.add(0, menuItem);
}
/* PLAYER */
@FXML
private void subsTriggerBtn(){
player.subtitlesSwitch();
}
@FXML
private void fullscreenBtn(){
player.fullscreenSwitch();
}
@FXML
private void muteBtn(){
player.mute();
}
@FXML
private void playPrevTrackBtn(){
int index = mkvPaneController.getElementSelectedIndex();
if (index <= 0)
return;
mkvPaneController.setElementSelectedByIndex(index-1);
player.forcePlay(appPreferences.getPath(),
mkvPaneController.getElementSelected(),
mkaPaneController.getElementSelected(),
subPaneController.getElementSelected(),
subPaneController.getSelectedEncoding(),
subsHide.isSelected(),
fullScreen.isSelected()
);
}
@FXML
private void playNextTrackBtn(){
int index = mkvPaneController.getElementSelectedIndex();
if (index + 1 < mkvPaneController.getElementsCount()) {
mkvPaneController.setElementSelectedByIndex(index + 1);
}
index = mkaPaneController.getElementSelectedIndex();
if (index + 1 < mkaPaneController.getElementsCount()) {
mkaPaneController.setElementSelectedByIndex(index + 1);
}
index = subPaneController.getElementSelectedIndex();
if (index + 1 < subPaneController.getElementsCount()) {
subPaneController.setElementSelectedByIndex(index + 1);
}
player.forcePlay(appPreferences.getPath(),
mkvPaneController.getElementSelected(),
mkaPaneController.getElementSelected(),
subPaneController.getElementSelected(),
subPaneController.getSelectedEncoding(),
subsHide.isSelected(),
fullScreen.isSelected()
);
}
@FXML
private void playBtn(){
if (mkvPaneController.getElementSelected() == null)
return;
player.playPause(appPreferences.getPath(),
mkvPaneController.getElementSelected(),
mkaPaneController.getElementSelected(),
subPaneController.getElementSelected(),
subPaneController.getSelectedEncoding(),
subsHide.isSelected(),
fullScreen.isSelected()
);
}
@FXML
private void stopBtn(){
player.stop();
}
@FXML
private void volumeUpBtn(){
player.volumeUp();
}
@FXML
private void volumeDownBtn(){
player.volumeDown();
}
}

View File

@ -0,0 +1,133 @@
/*
Copyright 2018-2021 Dmitry Isaenko
This file is part of mcontroller.player.anime.
mcontroller.player.anime is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
mcontroller.player.anime is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with mcontroller.player.anime. If not, see <https://www.gnu.org/licenses/>.
*/
package mplayer4anime.ui.landing;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.CheckMenuItem;
import mplayer4anime.AppPreferences;
import java.net.URL;
import java.util.ResourceBundle;
public class PlayerToolbarController implements Initializable {
@FXML
private CheckMenuItem fullScreen;
@FXML
private CheckMenuItem subsHide;
private AppPreferences appPreferences;
private LandingController landingController;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
this.appPreferences = AppPreferences.getINSTANCE();
fullScreen.setSelected(appPreferences.getFullScreenSelected());
subsHide.setSelected(appPreferences.getSubtitlesHideSelected());
}
public void initializeMainUiController(LandingController landingController){
this.landingController = landingController;
}
@FXML
private void subsTriggerBtn(){
landingController.player.subtitlesSwitch();
}
@FXML
private void fullscreenBtn(){
landingController.player.fullscreenSwitch();
}
@FXML
private void muteBtn(){
landingController.player.mute();
}
@FXML
private void playPrevTrackBtn(){
int index = landingController.mkvPaneController.getElementSelectedIndex();
if (index <= 0)
return;
landingController.mkvPaneController.setElementSelectedByIndex(index-1);
landingController.player.forcePlay(appPreferences.getPath(),
landingController.mkvPaneController.getElementSelected(),
landingController.mkaPaneController.getElementSelected(),
landingController.subPaneController.getElementSelected(),
landingController.subPaneController.getSelectedEncoding(),
subsHide.isSelected(),
fullScreen.isSelected()
);
}
@FXML
private void playNextTrackBtn(){
int index = landingController.mkvPaneController.getElementSelectedIndex();
if (index + 1 < landingController.mkvPaneController.getElementsCount()) {
landingController.mkvPaneController.setElementSelectedByIndex(index + 1);
}
index = landingController.mkaPaneController.getElementSelectedIndex();
if (index + 1 < landingController.mkaPaneController.getElementsCount()) {
landingController.mkaPaneController.setElementSelectedByIndex(index + 1);
}
index = landingController.subPaneController.getElementSelectedIndex();
if (index + 1 < landingController.subPaneController.getElementsCount()) {
landingController.subPaneController.setElementSelectedByIndex(index + 1);
}
landingController.player.forcePlay(appPreferences.getPath(),
landingController.mkvPaneController.getElementSelected(),
landingController.mkaPaneController.getElementSelected(),
landingController.subPaneController.getElementSelected(),
landingController.subPaneController.getSelectedEncoding(),
subsHide.isSelected(),
fullScreen.isSelected()
);
}
@FXML
private void playBtn(){
if (landingController.mkvPaneController.getElementSelected() == null)
return;
landingController.player.playPause(appPreferences.getPath(),
landingController.mkvPaneController.getElementSelected(),
landingController.mkaPaneController.getElementSelected(),
landingController.subPaneController.getElementSelected(),
landingController.subPaneController.getSelectedEncoding(),
subsHide.isSelected(),
fullScreen.isSelected()
);
}
@FXML
private void stopBtn(){
landingController.player.stop();
}
@FXML
private void volumeUpBtn(){
landingController.player.volumeUp();
}
@FXML
private void volumeDownBtn(){
landingController.player.volumeDown();
}
void shutdown(){
appPreferences.setFullScreenSelected(fullScreen.isSelected());
appPreferences.setSubtitlesHideSelected(subsHide.isSelected());
}
}

View File

@ -16,7 +16,7 @@
You should have received a copy of the GNU General Public License
along with mplayer4anime. If not, see <https://www.gnu.org/licenses/>.
*/
package mplayer4anime.appPanes;
package mplayer4anime.ui.landing.panes;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

View File

@ -1,4 +1,4 @@
package mplayer4anime.appPanes;
package mplayer4anime.ui.landing.panes;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
@ -10,7 +10,7 @@ import java.net.URL;
import java.util.Arrays;
import java.util.ResourceBundle;
public class ControllerSUB extends ControllerPane {
public class ControllerPaneSubtitles extends ControllerPane {
@FXML
private ChoiceBox<String> subtEncoding;
private ObservableList<String> subEncodingList;

View File

@ -16,7 +16,7 @@
You should have received a copy of the GNU General Public License
along with mplayer4anime. If not, see <https://www.gnu.org/licenses/>.
*/
package mplayer4anime.Settings;
package mplayer4anime.ui.settings;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

View File

@ -16,7 +16,7 @@
You should have received a copy of the GNU General Public License
along with mplayer4anime. If not, see <https://www.gnu.org/licenses/>.
*/
package mplayer4anime.Settings;
package mplayer4anime.ui.settings;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
@ -109,7 +109,7 @@ public class SettingsController implements Initializable {
appPreferences.setAudioExtensionsList(audioExtensionListController.getList());
appPreferences.setBackendEngineIndexId(backEndEngineChoiceBox.getSelectionModel().getSelectedIndex());
MediatorControl.getInstance().sentUpdates(); // TODO: implement list to track what should be updated
MediatorControl.getInstance().updateAfterSettingsChanged(); // TODO: implement list to track what should be updated
}
private void close(){

View File

@ -16,7 +16,7 @@
You should have received a copy of the GNU General Public License
along with mplayer4anime. If not, see <https://www.gnu.org/licenses/>.
*/
package mplayer4anime.Settings;
package mplayer4anime.ui.settings;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;

View File

@ -12,7 +12,7 @@
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.SVGPath?>
<VBox spacing="5.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mplayer4anime.About.AboutController">
<VBox spacing="5.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mplayer4anime.ui.about.AboutController">
<children>
<HBox>
<children>

View File

@ -1,25 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.CheckMenuItem?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.SeparatorMenuItem?>
<?import javafx.scene.control.SplitMenuButton?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.ToolBar?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.SVGPath?>
<AnchorPane minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mplayer4anime.Controller">
<AnchorPane minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mplayer4anime.ui.landing.LandingController">
<children>
<VBox prefHeight="400.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
@ -90,75 +85,7 @@
</TabPane>
</items>
</SplitPane>
<ToolBar prefHeight="40.0" prefWidth="200.0" styleClass="topToolBar" stylesheets="@res/landing.css">
<items>
<HBox>
<children>
<Button minHeight="28.0" mnemonicParsing="false" onAction="#playPrevTrackBtn" styleClass="btnLeft" stylesheets="@res/landing.css">
<graphic>
<SVGPath content="M 12,12 3.5,6 12,0 Z M 0,0 V 12 H 2 V 0 Z" fill="#e1e1e1" />
</graphic></Button>
<Button minHeight="28.0" minWidth="53.0" mnemonicParsing="false" onAction="#playBtn" styleClass="btnCenter" stylesheets="@res/landing.css" textAlignment="CENTER">
<graphic>
<SVGPath content="M3,5V19L11,12M13,19H16V5H13M18,5V19H21V5" fill="#61dd4e" />
</graphic>
</Button>
<Button minHeight="28.0" mnemonicParsing="false" onAction="#stopBtn" styleClass="btnCenter" stylesheets="@res/landing.css">
<graphic>
<SVGPath content="M18,18H6V6H18V18Z" fill="#e1e1e1" />
</graphic>
</Button>
<Button minHeight="28.0" mnemonicParsing="false" onAction="#playNextTrackBtn" styleClass="btnRight" stylesheets="@res/landing.css">
<graphic>
<SVGPath content="M0,12 L8.5,6 L0,0 L0,12 L0,12 Z M10,0 L10,12 L12,12 L12,0 L10,0 L10,0 Z" fill="#e1e1e1" />
</graphic></Button>
</children>
<opaqueInsets>
<Insets />
</opaqueInsets>
</HBox>
<Pane minWidth="20.0" />
<HBox>
<children>
<Button minHeight="28.0" minWidth="36.0" mnemonicParsing="false" onAction="#volumeDownBtn" styleClass="btnLeft" stylesheets="@res/landing.css">
<opaqueInsets>
<Insets />
</opaqueInsets>
<graphic>
<SVGPath content="M13.5,8 C13.5,6.2 12.5,4.7 11,4 L11,12 C12.5,11.3 13.5,9.8 13.5,8 L13.5,8 Z M0,5 L0,11 L4,11 L9,16 L9,0 L4,5 L0,5 L0,5 Z" fill="#e1e1e1" />
</graphic>
</Button>
<Button minHeight="28.0" minWidth="36.0" mnemonicParsing="false" onAction="#volumeUpBtn" styleClass="btnRight" stylesheets="@res/landing.css">
<graphic>
<SVGPath content="M0,6 L0,12 L4,12 L9,17 L9,1 L4,6 L0,6 L0,6 Z M13.5,9 C13.5,7.2 12.5,5.7 11,5 L11,13 C12.5,12.3 13.5,10.8 13.5,9 L13.5,9 Z M11,0.2 L11,2.3 C13.9,3.2 16,5.8 16,9 C16,12.2 13.9,14.8 11,15.7 L11,17.8 C15,16.9 18,13.3 18,9 C18,4.7 15,1.1 11,0.2 L11,0.2 Z" fill="#e1e1e1" />
</graphic>
</Button>
</children>
</HBox>
<Button minHeight="28.0" mnemonicParsing="false" onAction="#muteBtn" styleClass="btnSimple" stylesheets="@res/landing.css">
<graphic>
<SVGPath content="M3,9H7L12,4V20L7,15H3V9M16.59,12L14,9.41L15.41,8L18,10.59L20.59,8L22,9.41L19.41,12L22,14.59L20.59,16L18,13.41L15.41,16L14,14.59L16.59,12Z" fill="#e1e1e1" />
</graphic>
</Button>
<Pane HBox.hgrow="ALWAYS" />
<SplitMenuButton mnemonicParsing="false" onAction="#subsTriggerBtn" styleClass="splitMenuButton" stylesheets="@res/landing.css">
<graphic>
<SVGPath content="M 4,18 C 2.8954305,18 2,17.104569 2,16 V 4 C 2,2.89 2.9,2 4,2 h 16 c 1.104569,0 2,0.8954305 2,2 v 12 c 0,1.104569 -0.895431,2 -2,2 m -6,-7 v 1 h 5 V 11 M 5,12 h 8 V 11 H 5 m 0,3 v 1 h 14 v -1 z" fill="#e1e1e1" />
</graphic>
<items>
<CheckMenuItem fx:id="subsHide" mnemonicParsing="false" text="%subsShow_option" />
</items>
</SplitMenuButton>
<SplitMenuButton mnemonicParsing="false" onAction="#fullscreenBtn" styleClass="splitMenuButton" stylesheets="@res/landing.css">
<items>
<CheckMenuItem fx:id="fullScreen" mnemonicParsing="false" text="%fullscreen_option" />
</items>
<graphic>
<SVGPath content="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z" fill="#e1e1e1" />
</graphic>
</SplitMenuButton>
</items>
</ToolBar>
<fx:include fx:id="playerToolbar" source="PlayerToolbar.fxml" />
<Pane VBox.vgrow="NEVER">
<children>
<Label fx:id="statusLbl">

View File

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.CheckMenuItem?>
<?import javafx.scene.control.SplitMenuButton?>
<?import javafx.scene.control.ToolBar?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.shape.SVGPath?>
<AnchorPane xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mplayer4anime.ui.landing.PlayerToolbarController">
<ToolBar styleClass="topToolBar" stylesheets="@res/landing.css" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<items>
<HBox>
<children>
<Button minHeight="28.0" mnemonicParsing="false" onAction="#playPrevTrackBtn" styleClass="btnLeft" stylesheets="@res/landing.css">
<graphic>
<SVGPath content="M 12,12 3.5,6 12,0 Z M 0,0 V 12 H 2 V 0 Z" fill="#e1e1e1" />
</graphic></Button>
<Button minHeight="28.0" minWidth="53.0" mnemonicParsing="false" onAction="#playBtn" styleClass="btnCenter" stylesheets="@res/landing.css" textAlignment="CENTER">
<graphic>
<SVGPath content="M3,5V19L11,12M13,19H16V5H13M18,5V19H21V5" fill="#61dd4e" />
</graphic>
</Button>
<Button minHeight="28.0" mnemonicParsing="false" onAction="#stopBtn" styleClass="btnCenter" stylesheets="@res/landing.css">
<graphic>
<SVGPath content="M18,18H6V6H18V18Z" fill="#e1e1e1" />
</graphic>
</Button>
<Button minHeight="28.0" mnemonicParsing="false" onAction="#playNextTrackBtn" styleClass="btnRight" stylesheets="@res/landing.css">
<graphic>
<SVGPath content="M0,12 L8.5,6 L0,0 L0,12 L0,12 Z M10,0 L10,12 L12,12 L12,0 L10,0 L10,0 Z" fill="#e1e1e1" />
</graphic></Button>
</children>
<opaqueInsets>
<Insets />
</opaqueInsets>
</HBox>
<Pane minWidth="20.0" />
<HBox>
<children>
<Button minHeight="28.0" minWidth="36.0" mnemonicParsing="false" onAction="#volumeDownBtn" styleClass="btnLeft" stylesheets="@res/landing.css">
<opaqueInsets>
<Insets />
</opaqueInsets>
<graphic>
<SVGPath content="M13.5,8 C13.5,6.2 12.5,4.7 11,4 L11,12 C12.5,11.3 13.5,9.8 13.5,8 L13.5,8 Z M0,5 L0,11 L4,11 L9,16 L9,0 L4,5 L0,5 L0,5 Z" fill="#e1e1e1" />
</graphic>
</Button>
<Button minHeight="28.0" minWidth="36.0" mnemonicParsing="false" onAction="#volumeUpBtn" styleClass="btnRight" stylesheets="@res/landing.css">
<graphic>
<SVGPath content="M0,6 L0,12 L4,12 L9,17 L9,1 L4,6 L0,6 L0,6 Z M13.5,9 C13.5,7.2 12.5,5.7 11,5 L11,13 C12.5,12.3 13.5,10.8 13.5,9 L13.5,9 Z M11,0.2 L11,2.3 C13.9,3.2 16,5.8 16,9 C16,12.2 13.9,14.8 11,15.7 L11,17.8 C15,16.9 18,13.3 18,9 C18,4.7 15,1.1 11,0.2 L11,0.2 Z" fill="#e1e1e1" />
</graphic>
</Button>
</children>
</HBox>
<Button minHeight="28.0" mnemonicParsing="false" onAction="#muteBtn" styleClass="btnSimple" stylesheets="@res/landing.css">
<graphic>
<SVGPath content="M3,9H7L12,4V20L7,15H3V9M16.59,12L14,9.41L15.41,8L18,10.59L20.59,8L22,9.41L19.41,12L22,14.59L20.59,16L18,13.41L15.41,16L14,14.59L16.59,12Z" fill="#e1e1e1" />
</graphic>
</Button>
<Pane HBox.hgrow="ALWAYS" />
<SplitMenuButton mnemonicParsing="false" onAction="#subsTriggerBtn" styleClass="splitMenuButton" stylesheets="@res/landing.css">
<graphic>
<SVGPath content="M 4,18 C 2.8954305,18 2,17.104569 2,16 V 4 C 2,2.89 2.9,2 4,2 h 16 c 1.104569,0 2,0.8954305 2,2 v 12 c 0,1.104569 -0.895431,2 -2,2 m -6,-7 v 1 h 5 V 11 M 5,12 h 8 V 11 H 5 m 0,3 v 1 h 14 v -1 z" fill="#e1e1e1" />
</graphic>
<items>
<CheckMenuItem fx:id="subsHide" mnemonicParsing="false" text="%subsShow_option" />
</items>
</SplitMenuButton>
<SplitMenuButton mnemonicParsing="false" onAction="#fullscreenBtn" styleClass="splitMenuButton" stylesheets="@res/landing.css">
<items>
<CheckMenuItem fx:id="fullScreen" mnemonicParsing="false" text="%fullscreen_option" />
</items>
<graphic>
<SVGPath content="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z" fill="#e1e1e1" />
</graphic>
</SplitMenuButton>
</items>
</ToolBar>
</AnchorPane>

View File

@ -7,7 +7,7 @@
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.SVGPath?>
<VBox prefHeight="200.0" prefWidth="100.0" spacing="5.0" VBox.vgrow="ALWAYS" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mplayer4anime.Settings.ControllerListsSelector">
<VBox prefHeight="200.0" prefWidth="100.0" spacing="5.0" VBox.vgrow="ALWAYS" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mplayer4anime.ui.settings.ControllerListsSelector">
<children>
<HBox alignment="CENTER_LEFT" spacing="5.0" VBox.vgrow="ALWAYS">
<children>

View File

@ -13,7 +13,7 @@
<?import javafx.scene.shape.SVGPath?>
<?import javafx.scene.text.Font?>
<VBox xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mplayer4anime.Settings.SettingsController">
<VBox xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mplayer4anime.ui.settings.SettingsController">
<children>
<TabPane side="LEFT" styleClass="tab-paneSettings" stylesheets="@../res/landing.css" tabClosingPolicy="UNAVAILABLE" tabMaxHeight="100.0" tabMaxWidth="500.0" tabMinHeight="100.0" tabMinWidth="80.0" VBox.vgrow="ALWAYS">
<tabs>

View File

@ -10,7 +10,7 @@
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.SVGPath?>
<AnchorPane minWidth="200.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mplayer4anime.appPanes.ControllerPane">
<AnchorPane minWidth="200.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mplayer4anime.ui.landing.panes.ControllerPane">
<children>
<VBox layoutX="87.0" layoutY="-11.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>

View File

@ -11,7 +11,7 @@
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.SVGPath?>
<AnchorPane xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mplayer4anime.appPanes.ControllerSUB">
<AnchorPane xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mplayer4anime.ui.landing.panes.ControllerPaneSubtitles">
<children>
<VBox layoutX="39.0" layoutY="42.0" prefHeight="398.0" prefWidth="316.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>