Bug fixes. A lot of things added <3
This commit is contained in:
Dmitry Isaenko 2018-11-28 07:10:35 +03:00
parent 7c6103bd00
commit fb51e2c469
24 changed files with 580 additions and 481 deletions

View file

@ -40,7 +40,7 @@ public class AboutController implements Initializable {
@FXML
private void bloggerUrl(){
try {
hostServices.showDocument("https://developersu.blogspot.com/");
hostServices.showDocument("https://developersu.blogspot.com/search/label/mplayer4anime");
} catch (Exception e){
e.printStackTrace();
}
@ -53,6 +53,16 @@ public class AboutController implements Initializable {
e.printStackTrace();
}
}
@FXML
private void iconsMaterial(){
try {
hostServices.showDocument("https://materialdesignicons.com/");
} catch (Exception e){
e.printStackTrace();
}
}
//TODO note icons meaterial design
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {

View file

@ -52,6 +52,7 @@
</HBox>
<Hyperlink onAction="#libGSON" text="GSON" />
<TextArea fx:id="GSONLicense" editable="false" prefHeight="200.0" />
<Hyperlink onAction="#iconsMaterial" text="Material Design Icons" />
<HBox alignment="BOTTOM_LEFT" VBox.vgrow="ALWAYS">
<children>
<Pane HBox.hgrow="ALWAYS" />

View file

@ -18,7 +18,7 @@ public class AboutWindow {
Stage stageAbout = new Stage();
stageAbout.setMinWidth(500);
stageAbout.setMinHeight(450);
stageAbout.setMinHeight(500);
FXMLLoader loaderAbout = new FXMLLoader(getClass().getResource("AboutLayout.fxml"));
ResourceBundle resourceBundle;
@ -42,7 +42,7 @@ public class AboutWindow {
new Image(Main.class.getResourceAsStream("/mplayer4anime/res/app_icon64x64.png")),
new Image(Main.class.getResourceAsStream("/mplayer4anime/res/app_icon128x128.png"))
); // TODO: change to something reliable
stageAbout.setScene(new Scene(parentAbout, 500, 450));
stageAbout.setScene(new Scene(parentAbout, 500, 500));
stageAbout.show();

View file

@ -32,15 +32,6 @@ public class AppPreferences {
preferences.putBoolean("SUBS_TAB_FIRST", set);
}
// Set option, that tells that we have to save/restore lists on startup
public void setLoadListsOnStart(boolean set){
preferences.putBoolean("LOAD_LISTS_ON_START", set);
}
// Returns settings for the save/restore lists option
public boolean getLoadListsOnStart(){
return preferences.getBoolean("LOAD_LISTS_ON_START", false); // Don't populate lists by-default
}
/** Convert strings array to singls string.
* Used in:
* setSubsExtensionsList
@ -50,23 +41,25 @@ public class AppPreferences {
StringBuilder collect = new StringBuilder();
for (String e : strArr) {
collect.append(e);
collect.append("@@@"); // If there is some idiot who will use @@@ in file extension I'll find him.
collect.append(" ");
}
String strToStore = collect.toString();
preferences.put(whichList, strToStore);
}
/** Handle lists of the video files extensions */
public void setVideoExtensionsList(String[] videoExtensionsList){ storeSingleStringList("VIDEO_EXTENSIONS_LIST", videoExtensionsList); }
public String[] getVideoExtensionsList(){ return preferences.get("VIDEO_EXTENSIONS_LIST", "*.mkv *.avi *.mp4").split(" "); }
/** Handle lists of the audio files extensions */
public void setAudioExtensionsList(String[] audioExtensionsList){ storeSingleStringList("AUDIO_EXTENSIONS_LIST", audioExtensionsList); }
public String[] getAudioExtensionsList(){ return preferences.get("AUDIO_EXTENSIONS_LIST", "*.mka *.ac3").split(" "); }
/** Handle lists of the subtitles extensions selector */
public void setSubsExtensionsList(String[] subsList){ storeSingleStringList("SUBS_EXTENSIONS_LIST", subsList); }
public String[] getSubsExtensionsList(){ return preferences.get("SUBS_EXTENSIONS_LIST", ".ass@@@.crt@@@").split("@@@"); }
public String[] getSubsExtensionsList(){ return preferences.get("SUBS_EXTENSIONS_LIST", "*.ass *.crt ").split(" "); }
/** Handle lists of the subtitles encodings selector */
public void setSubsEncodingList(String[] subsEncodingList){ storeSingleStringList("SUBS_ENCODINGS_LIST", subsEncodingList); }
public String[] getSubsEncodingList(){ return preferences.get("SUBS_ENCODINGS_LIST", "default@@@utf8@@@cp1251@@@koi8-r").split("@@@"); }
/** Save & recover selected by user Subtitles format */
public void setLastTimeUsedSusExt(String selected){ preferences.put("SUBS_EXT_LAST_TIME_SELECTED", selected); }
public String getLastTimeUsedSubsExt(){ return preferences.get("SUBS_EXT_LAST_TIME_SELECTED", ""); }
public String[] getSubsEncodingList(){ return preferences.get("SUBS_ENCODINGS_LIST", "default utf8 cp1251 koi8-r").split(" "); }
/** Save & recover selected by user Subtitles encoding */
public void setLastTimeUsedSubsEncoding(String selected){ preferences.put("SUBS_ENCODING_LAST_TIME_SELECTED", selected); }
@ -100,7 +93,7 @@ public class AppPreferences {
preferences.put("RECENT_PLS_" + i, recentPlaylists[i]);
else
preferences.put("RECENT_PLS_" + i, "");
for (;i<10;i++) // Not needed. Logic may handle recieved String to be less or greater then String[10], but it never happened.
for (;i<10;i++) // Not needed. Logic may handle received String to be less or greater then String[10], but it never happened.
preferences.put("RECENT_PLS_" + i, "");
}
}

View file

@ -13,8 +13,7 @@ import mplayer4anime.About.AboutWindow;
import mplayer4anime.Playlists.JsonStorage;
import mplayer4anime.Playlists.Playlists;
import mplayer4anime.Settings.SettingsWindow;
import mplayer4anime.appPanes.ControllerMKA;
import mplayer4anime.appPanes.ControllerMKV;
import mplayer4anime.appPanes.ControllerPane;
import mplayer4anime.appPanes.ControllerSUB;
import java.io.*;
@ -24,12 +23,12 @@ import java.util.ResourceBundle;
public class Controller implements Initializable {
@FXML
private ControllerMKV mkvPaneController;
private ControllerPane mkvPaneController;
@FXML
private ControllerPane mkaPaneController;
@FXML
private ControllerSUB subPaneController;
@FXML
private ControllerMKA mkaPaneController;
@FXML
private Label statusLbl;
@FXML
private Menu recentlyOpenedMenu;
@ -53,14 +52,14 @@ public class Controller implements Initializable {
private String currentPlaylistLocation = null; //TODO: move to the constructor?
@Override
public void initialize(URL url, ResourceBundle rb) {
mkvPaneController.setPaneType("Video");
mkaPaneController.setPaneType("Audio");
subPaneController.setPaneType("Subtitles");
// Register this controller in mediator
MediatorControl.getInstance().registerMainController(this);
resourceBundle = rb;
// Set default extension of the subtitles files:
subPaneController.setSubtExt(appPreferences.getSubsExtensionsList(), appPreferences.getLastTimeUsedSubsExt());// Receive list from storage & set selected value
// Set default list of encodings of the subtitles files:
subPaneController.setEncoding(appPreferences.getSubsEncodingList(), appPreferences.getLastTimeUsedSubsEncoding());
@ -217,7 +216,6 @@ public class Controller implements Initializable {
// Will be used to store lists previously opened.
// Linkage established by ohHidden in Main.java class
void shutdown(){
appPreferences.setLastTimeUsedSusExt(subPaneController.getSelectedExt());
appPreferences.setLastTimeUsedSubsEncoding(subPaneController.getSelectedEncoding());
appPreferences.setFullScreenSelected(fullScreen.isSelected());
appPreferences.setSubtitlesHideSelected(subsHide.isSelected());
@ -240,12 +238,6 @@ 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(){
/* update list of extensions */
// Clear and update list
subPaneController.setSubtExt(appPreferences.getSubsExtensionsList(), null);
// In case of application failure should be better to save this immediately
appPreferences.setLastTimeUsedSusExt(subPaneController.getSelectedEncoding());
/* update list of encoding */
subPaneController.setEncoding(appPreferences.getSubsEncodingList(), null);
// In case of application failure should be better to save this immediately
@ -255,14 +247,20 @@ public class Controller implements Initializable {
@FXML
private void openBtn() {
JsonStorage jsonStorage = Playlists.Read(resourceBundle);
setAllLists(jsonStorage);
}
private void setAllLists(JsonStorage jsonStorage){
if (jsonStorage != null) {
mkvPaneController.cleanList();
mkaPaneController.cleanList();
subPaneController.cleanList();
mkvPaneController.setFilesFromList(jsonStorage.getVideo());
mkaPaneController.setFilesFromList(jsonStorage.getAudio());
subPaneController.setFilesFromList(jsonStorage.getSubs());
subPaneController.selectEncodingValue(jsonStorage.getSubEncoding(), appPreferences);
this.currentPlaylistLocation = Playlists.getPlaylistLocation(); // TODO: Implement listener? mmm...
this.statusLbl.setText(currentPlaylistLocation);
currentPlaylistLocation = Playlists.getPlaylistLocation(); // TODO: Implement listener? mmm...
statusLbl.setText(currentPlaylistLocation);
addRecentlyOpened(currentPlaylistLocation);
}
}
@ -326,16 +324,7 @@ public class Controller implements Initializable {
@Override
public void handle(ActionEvent actionEvent) {
JsonStorage jsonStorage = Playlists.ReadByPath(resourceBundle, new File(playlistPath));
if (jsonStorage != null) {
mkvPaneController.setFilesFromList(jsonStorage.getVideo());
mkaPaneController.setFilesFromList(jsonStorage.getAudio());
subPaneController.setFilesFromList(jsonStorage.getSubs());
subPaneController.selectEncodingValue(jsonStorage.getSubEncoding(), appPreferences);
currentPlaylistLocation = Playlists.getPlaylistLocation(); // TODO: Implement listener? mmm...
statusLbl.setText(currentPlaylistLocation);
addRecentlyOpened(currentPlaylistLocation);
}
setAllLists(jsonStorage);
}
});
// Limit list to 13 elements (2 in the end are separator and clear button)

View file

@ -3,8 +3,9 @@ package mplayer4anime;
Name: mplayer4anime
@author Dmitry Isaenko
License: GNU GPL v.3
@version 0.10
@see https://developersu.blogspot.com/
@version 0.11
@see https://developersu.blogspot.com/search/label/mplayer4anime
@see https://github.com/developersu/mplayer4anime
2018, Russia
*/

View file

@ -6,6 +6,14 @@ mplayer4anime is mplayer launcher to play mkv file with mka audio and subtitles
Source code spreads under the GNU General Public License v.3. You can find it in LICENSE file or just visit www.gnu.org (it should be there for sure).
Note: Since 0.10 application supports playlists management and implements own json-based format that (somehow) could be used in third-party application,
it would be nice to leave it as is. At least, I would prefer to have .alpr file extension used for this. As for the format of playlist format, please
refer to WFTPL license.
## Used libraries
GSON: https://github.com/google/gson
Pay attention, that this lib uses Apache-2.0 license
## Requirements
JRE and JavaFX should be installed on your PC.
@ -18,9 +26,6 @@ Just start it as usual Java application:
$ java -jar mplayer4anime.jar
```
## Used libraries
GSON: https://github.com/google/gson
## Run on windows
Step 1.
Download and install JRE (8 or later):

View file

@ -1,6 +1,7 @@
package mplayer4anime;
import javafx.scene.control.Alert;
import javafx.scene.layout.Region;
public class ServiceWindow {
/**
@ -11,6 +12,7 @@ public class ServiceWindow {
alertBox.setTitle(title);
alertBox.setHeaderText(null);
alertBox.setContentText(body);
alertBox.getDialogPane().setMinHeight(Region.USE_PREF_SIZE); // Java bug workaround for linux
alertBox.show();
}
}

View file

@ -0,0 +1,101 @@
package mplayer4anime.Settings;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyEvent;
import mplayer4anime.ServiceWindow;
import java.net.URL;
import java.util.Arrays;
import java.util.ResourceBundle;
public class ControllerListsSelector implements Initializable {
@FXML
private ListView<String> listView;
@FXML
private TextField newRecordText;
private ObservableList<String> observableList;
private ResourceBundle resourceBundle;
private boolean listOfExtensions; // Handle validation of the format importing items
@Override
public void initialize(URL url, ResourceBundle rb) {
resourceBundle = rb;
}
/**
* Must be run on start
* Set list content
*/
void setList(String[] listFromStorage, boolean isListOfExtensions){
observableList = FXCollections.observableArrayList(listFromStorage);
listView.setItems(observableList);
this.listOfExtensions = isListOfExtensions;
}
/**
* Return list content
* */
String[] getList(){
return Arrays.copyOf(observableList.toArray(), observableList.toArray().length, String[].class);
}
@FXML
private void listKeyPressed(KeyEvent event){
if (event.getCode().toString().equals("DELETE"))
removeRecord();
}
@FXML
private void upRecord(){
int index;
index = listView.getSelectionModel().getSelectedIndex();
if (index >0){
observableList.add(index-1, listView.getSelectionModel().getSelectedItem());
observableList.remove(index+1);
listView.getSelectionModel().select(index-1);
}
}
@FXML
private void downRecord(){
int index;
index = listView.getSelectionModel().getSelectedIndex();
if (index+1 < observableList.size() ){
observableList.add(index+2, listView.getSelectionModel().getSelectedItem());
observableList.remove(index);
listView.getSelectionModel().select(index+1);
}
}
@FXML
private void removeRecord(){ observableList.remove(listView.getSelectionModel().getSelectedItem()); }
@FXML
private void addNewRecord(){
String addingItem = newRecordText.getText().trim();
if (!addingItem.isEmpty()) // If this field is non-empty
if (!addingItem.contains(" ") && !addingItem.contains("\t")) {
if (this.listOfExtensions) {
if (addingItem.startsWith("*."))
if (addingItem.substring(2).contains("*")) {
ServiceWindow.getErrorNotification(resourceBundle.getString("Error"), resourceBundle.getString("settings_fieldContainUnacceptedChars"));
} else {
observableList.add(addingItem);
}
else if (addingItem.contains("*")) {
ServiceWindow.getErrorNotification(resourceBundle.getString("Error"), resourceBundle.getString("settings_fieldContainUnacceptedChars"));
} else if (addingItem.startsWith(".")) {
observableList.add("*" + addingItem);
} else {
observableList.add("*." + addingItem);
}
}
else {
observableList.add(addingItem);
}
}
else{
ServiceWindow.getErrorNotification(resourceBundle.getString("Error"), resourceBundle.getString("settings_fieldContainUnacceptedChars"));
}
newRecordText.clear();
}
}

View file

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.HBox?>
<?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.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mplayer4anime.Settings.ControllerListsSelector">
<children>
<HBox alignment="CENTER_LEFT" spacing="5.0" VBox.vgrow="ALWAYS">
<children>
<ListView fx:id="listView" onKeyPressed="#listKeyPressed" prefWidth="200.0" HBox.hgrow="ALWAYS" />
<VBox spacing="5.0">
<children>
<Button mnemonicParsing="false" onAction="#upRecord">
<graphic>
<SVGPath content="M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z" />
</graphic>
</Button>
<Button mnemonicParsing="false" onAction="#downRecord">
<graphic>
<SVGPath content="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z" />
</graphic>
</Button>
<Button mnemonicParsing="false" onAction="#removeRecord">
<graphic>
<SVGPath content="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z" fill="#cc0101" />
</graphic>
</Button>
</children>
</VBox>
</children>
</HBox>
<HBox spacing="5.0" VBox.vgrow="NEVER">
<children>
<TextField fx:id="newRecordText" HBox.hgrow="ALWAYS" />
<Button mnemonicParsing="false" onAction="#addNewRecord">
<graphic>
<SVGPath content="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z" fill="#007f08" />
</graphic>
</Button>
</children>
</HBox>
</children>
</VBox>

View file

@ -1,154 +1,46 @@
package mplayer4anime.Settings;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.scene.input.KeyEvent;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import mplayer4anime.AppPreferences;
import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.ResourceBundle;
import mplayer4anime.MediatorControl;
public class SettingsController implements Initializable {
private ResourceBundle resourceBundle;
// Class of settings used
private AppPreferences appPreferences;
@FXML
private Label pathToMplayerLbl,
unixOsInfoLbl;
private ControllerListsSelector subExtensionListController;
@FXML
private CheckBox subtitlesFirstCheckBox,
listsLoadOnStartCheckBox;
// subs extensions and codepages error handle
private void showFormattingError(){
Alert alertBox = new Alert(Alert.AlertType.ERROR);
alertBox.setTitle(resourceBundle.getString("Error"));
alertBox.setHeaderText(null);
alertBox.setContentText(resourceBundle.getString("settings_fieldContainSpacesTabs"));
alertBox.show();
}
// subs extensions
private ControllerListsSelector subEncodingListController;
@FXML
private ListView<String> subsExtListView;
private ObservableList<String> subsExtObservableList;
private ControllerListsSelector videoExtensionListController;
@FXML
private TextField subsExtNewRecordText;
private ControllerListsSelector audioExtensionListController;
@FXML
private void subsExtAddNewRecord(){
String add = subsExtNewRecordText.getText().trim();
if (!add.isEmpty()) // If this field is non-empty
if (!add.contains(" ") && !add.contains("\t"))
subsExtObservableList.add(subsExtNewRecordText.getText().trim());
else{
showFormattingError();
}
subsExtNewRecordText.clear();
}
private Label pathToMplayerLbl;
@FXML
private void subsExtListKeyPressed(KeyEvent event){
if (event.getCode().toString().equals("DELETE"))
subsExtRemoveRecord();
}
@FXML
private void subsExtRemoveRecord(){ subsExtObservableList.remove(subsExtListView.getSelectionModel().getSelectedItem()); }
@FXML
private void subsExtUpRecord(){
int index;
index = subsExtListView.getSelectionModel().getSelectedIndex();
if (index >0){
subsExtObservableList.add(index-1, subsExtListView.getSelectionModel().getSelectedItem());
subsExtObservableList.remove(index+1);
subsExtListView.getSelectionModel().select(index-1);
}
}
@FXML
private void subsExtDownRecord(){
int index;
index = subsExtListView.getSelectionModel().getSelectedIndex();
if (index+1 < subsExtObservableList.size() ){
subsExtObservableList.add(index+2, subsExtListView.getSelectionModel().getSelectedItem());
subsExtObservableList.remove(index);
subsExtListView.getSelectionModel().select(index+1);
}
}
// subs codepage
@FXML
private ListView<String> subsCodepageListView;
private ObservableList<String> subsCodepageObservableList;
@FXML
private TextField subsCodepageNewRecordText;
@FXML
private void subsCodepageAddNewRecord(){
String add = subsCodepageNewRecordText.getText().trim();
if (!add.isEmpty()) // If this field is non-empty
if (!add.contains(" ") && !add.contains("\t"))
subsCodepageObservableList.add(subsCodepageNewRecordText.getText().trim());
else{
showFormattingError();
}
subsCodepageNewRecordText.clear();
}
@FXML
private void subsCodepageListKeyPressed(KeyEvent event){
if (event.getCode().toString().equals("DELETE"))
subsCodepageRemoveRecord();
}
@FXML
private void subsCodepageRemoveRecord(){ subsCodepageObservableList.remove(subsCodepageListView.getSelectionModel().getSelectedItem()); }
@FXML
private void subsCodepageUpRecord(){
int index;
index = subsCodepageListView.getSelectionModel().getSelectedIndex();
if (index >0){
subsCodepageObservableList.add(index-1, subsCodepageListView.getSelectionModel().getSelectedItem());
subsCodepageObservableList.remove(index+1);
subsCodepageListView.getSelectionModel().select(index-1);
}
}
@FXML
private void subsCodepageDownRecord(){
int index;
index = subsCodepageListView.getSelectionModel().getSelectedIndex();
if (index+1 < subsCodepageObservableList.size() ){
subsCodepageObservableList.add(index+2, subsCodepageListView.getSelectionModel().getSelectedItem());
subsCodepageObservableList.remove(index);
subsCodepageListView.getSelectionModel().select(index+1);
}
}
private CheckBox subtitlesFirstCheckBox;
@Override
public void initialize(URL url, ResourceBundle resBundle) {
resourceBundle = resBundle;
appPreferences = new AppPreferences();
pathToMplayerLbl.setText(appPreferences.getPath());
// unixOsInfoLbl.setVisible(false);
// Subtitles should be shown first? If TRUE, then set checkbox.
subtitlesFirstCheckBox.setSelected(appPreferences.getSubtilesFirst());
// Should application restore lists after startup?
listsLoadOnStartCheckBox.setSelected(appPreferences.getLoadListsOnStart());
//---------------------------------------------------------
// Populate list of avaliable subtitles extensions
subsExtObservableList = FXCollections.observableArrayList(appPreferences.getSubsExtensionsList());
subsExtListView.setItems(subsExtObservableList);
//---------------------------------------------------------
// Populate list of avaliable codepages
subsCodepageObservableList = FXCollections.observableArrayList(appPreferences.getSubsEncodingList());
subsCodepageListView.setItems(subsCodepageObservableList);
// Fill lists of extensions and encodings
subExtensionListController.setList(appPreferences.getSubsExtensionsList(), true);
subEncodingListController.setList(appPreferences.getSubsEncodingList(), false);
videoExtensionListController.setList(appPreferences.getVideoExtensionsList(), true);
audioExtensionListController.setList(appPreferences.getAudioExtensionsList(), true);
}
@FXML
@ -189,9 +81,10 @@ public class SettingsController implements Initializable {
Stage thisStage = (Stage) pathToMplayerLbl.getScene().getWindow(); // TODO: consider refactoring. Non-urgent.
appPreferences.setPath(pathToMplayerLbl.getText());
appPreferences.setSubtilesFirst(subtitlesFirstCheckBox.isSelected());
appPreferences.setLoadListsOnStart(listsLoadOnStartCheckBox.isSelected());
appPreferences.setSubsExtensionsList(Arrays.copyOf(subsExtObservableList.toArray(), subsExtObservableList.toArray().length, String[].class));
appPreferences.setSubsEncodingList(Arrays.copyOf(subsCodepageObservableList.toArray(), subsCodepageObservableList.toArray().length, String[].class));
appPreferences.setSubsExtensionsList(subExtensionListController.getList());
appPreferences.setSubsEncodingList(subEncodingListController.getList());
appPreferences.setVideoExtensionsList(videoExtensionListController.getList());
appPreferences.setAudioExtensionsList(audioExtensionListController.getList());
MediatorControl.getInstance().sentUpdates(); // TODO: implement list to track what should be updated

View file

@ -4,15 +4,21 @@
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.SVGPath?>
<?import javafx.scene.text.Font?>
<VBox spacing="5.0" 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.Settings.SettingsController">
<children>
<TabPane side="LEFT" tabClosingPolicy="UNAVAILABLE" tabMaxHeight="100.0" tabMaxWidth="500.0" tabMinHeight="100.0" tabMinWidth="80.0" VBox.vgrow="ALWAYS">
<tabs>
<Tab closable="false">
<content>
<VBox spacing="5.0">
<children>
<HBox alignment="CENTER_LEFT" spacing="5.0" VBox.vgrow="NEVER">
<children>
@ -31,7 +37,7 @@
</Button>
</children>
</HBox>
<Label fx:id="unixOsInfoLbl" disable="true" minHeight="35.0" text="%settings_unixOsInformation" wrapText="true">
<Label disable="true" minHeight="35.0" text="%settings_unixOsInformation" wrapText="true">
<font>
<Font name="System Italic" size="12.0" />
</font>
@ -43,103 +49,95 @@
<CheckBox fx:id="subtitlesFirstCheckBox" mnemonicParsing="false" />
</children>
</HBox>
<HBox alignment="CENTER_LEFT" VBox.vgrow="NEVER">
<children>
<Label text="%settings_LoadListsOnStart" />
<Pane HBox.hgrow="ALWAYS" />
<CheckBox fx:id="listsLoadOnStartCheckBox" mnemonicParsing="false" />
</children>
</HBox>
<Label text="%settings_subsExtensionList" />
<VBox prefHeight="200.0" prefWidth="100.0" spacing="5.0" VBox.vgrow="ALWAYS">
<children>
<HBox alignment="CENTER_LEFT" spacing="5.0" VBox.vgrow="ALWAYS">
<children>
<ListView fx:id="subsExtListView" onKeyPressed="#subsExtListKeyPressed" prefWidth="200.0" HBox.hgrow="ALWAYS" />
<VBox spacing="5.0">
<children>
<Button mnemonicParsing="false" onAction="#subsExtUpRecord">
<graphic>
<SVGPath content="M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z" />
</graphic>
</Button>
<Button mnemonicParsing="false" onAction="#subsExtDownRecord">
<graphic>
<SVGPath content="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z" />
</graphic>
</Button>
<Button mnemonicParsing="false" onAction="#subsExtRemoveRecord">
<graphic>
<SVGPath content="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z" fill="#cc0101" />
</graphic>
</Button>
</children>
</VBox>
</children>
</HBox>
<HBox spacing="5.0" VBox.vgrow="NEVER">
<children>
<TextField fx:id="subsExtNewRecordText" HBox.hgrow="ALWAYS" />
<Button mnemonicParsing="false" onAction="#subsExtAddNewRecord">
<graphic>
<SVGPath content="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z" fill="#007f08" />
</graphic>
</Button>
</children>
</HBox>
</children>
</VBox>
<Label text="%settings_subsCodepageList" />
<VBox prefHeight="200.0" prefWidth="100.0" spacing="5.0" VBox.vgrow="ALWAYS">
<children>
<HBox prefHeight="100.0" prefWidth="200.0" spacing="5.0" VBox.vgrow="ALWAYS">
<children>
<ListView fx:id="subsCodepageListView" onKeyPressed="#subsCodepageListKeyPressed" prefWidth="200.0" HBox.hgrow="ALWAYS" />
<VBox spacing="5.0">
<children>
<Button mnemonicParsing="false" onAction="#subsCodepageUpRecord">
<graphic>
<SVGPath content="M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z" />
</graphic>
</Button>
<Button mnemonicParsing="false" onAction="#subsCodepageDownRecord">
<graphic>
<SVGPath content="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z" />
</graphic>
</Button>
<Button mnemonicParsing="false" onAction="#subsCodepageRemoveRecord">
<graphic>
<SVGPath content="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z" fill="#cc0101" />
</graphic>
</Button>
</children>
</VBox>
</children>
</HBox>
<HBox spacing="5.0" VBox.vgrow="NEVER">
<children>
<TextField fx:id="subsCodepageNewRecordText" HBox.hgrow="ALWAYS" />
<Button mnemonicParsing="false" onAction="#subsCodepageAddNewRecord">
<graphic>
<SVGPath content="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z" fill="#007f08" />
</graphic>
</Button>
</children>
</HBox>
</children>
<padding>
<Insets bottom="5.0" />
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</VBox>
</content>
<graphic>
<VBox alignment="CENTER">
<children>
<SVGPath content="M19,4C20.11,4 21,4.9 21,6V18A2,2 0 0,1 19,20H5C3.89,20 3,19.1 3,18V6A2,2 0 0,1 5,4H19M19,18V8H5V18H19Z" />
<Label text="%settings_Tab_General" />
</children>
</VBox>
</graphic>
</Tab>
<Tab closable="false">
<graphic>
<VBox alignment="CENTER">
<children>
<SVGPath content="M17,10.5V7A1,1 0 0,0 16,6H4A1,1 0 0,0 3,7V17A1,1 0 0,0 4,18H16A1,1 0 0,0 17,17V13.5L21,17.5V6.5L17,10.5Z" />
<Label text="%settings_Tab_Video" />
</children>
</VBox>
</graphic>
<content>
<VBox spacing="5.0">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
<children>
<Label text="%settings_videoExtensionList" />
<fx:include fx:id="videoExtensionList" source="ListSelector.fxml" />
</children>
</VBox>
</content>
</Tab>
<Tab closable="false">
<graphic>
<VBox alignment="CENTER">
<children>
<SVGPath content="M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z" />
<Label text="%settings_Tab_Audio" />
</children>
</VBox>
</graphic>
<content>
<VBox spacing="5.0">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
<children>
<Label text="%settings_audioExtensionList" />
<fx:include fx:id="audioExtensionList" source="ListSelector.fxml" />
</children>
</VBox>
</content>
</Tab>
<Tab closable="false">
<graphic>
<VBox alignment="CENTER">
<children>
<SVGPath content="M20,4H4A2,2 0 0,0 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6A2,2 0 0,0 20,4M4,12H8V14H4V12M14,18H4V16H14V18M20,18H16V16H20V18M20,14H10V12H20V14Z" />
<Label text="%settings_Tab_Subtitles" />
</children>
</VBox>
</graphic>
<content>
<VBox spacing="5.0">
<Label text="%settings_subsExtensionList" />
<fx:include fx:id="subExtensionList" source="ListSelector.fxml" />
<Label text="%settings_subsCodepageList" />
<fx:include fx:id="subEncodingList" source="ListSelector.fxml" />
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</VBox>
</content>
</Tab>
</tabs>
</TabPane>
<HBox prefWidth="200.0" spacing="5.0" VBox.vgrow="NEVER">
<children>
<Pane HBox.hgrow="ALWAYS" />
<Button cancelButton="true" mnemonicParsing="false" onAction="#Cancel" text="%CancelBtn" />
<Button mnemonicParsing="false" onAction="#Save" text="%SaveBtn" />
</children>
</HBox>
</children>
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</HBox>
</children>
</VBox>

View file

@ -1,7 +0,0 @@
package mplayer4anime.appPanes;
public class ControllerMKA extends ControllerPane {
@Override
protected void openAction() { openFileChooser(".mka"); }
}

View file

@ -1,7 +0,0 @@
package mplayer4anime.appPanes;
public class ControllerMKV extends ControllerPane {
@Override
protected void openAction() { openFileChooser(".mkv"); }
}

View file

@ -4,32 +4,62 @@ import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.input.KeyEvent;
import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser;
import javafx.util.Callback;
import mplayer4anime.AppPreferences;
import java.io.File;
import java.io.FilenameFilter;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.ResourceBundle;
public abstract class ControllerPane implements Initializable {
public class ControllerPane implements Initializable {
private ResourceBundle resourceBundle;
// use folderToOpen same variable in all panes
private static String folderToOpen;
private AppPreferences appPreferences;
@FXML
private ListView<File> paneListView;
private ObservableList<File> paneFileList = FXCollections.observableArrayList();
@FXML
private Label paneLbl;
private String paneType;
@Override
public void initialize(URL url, ResourceBundle resBundle) {
SetCellFactory(paneListView);
resourceBundle = resBundle;
appPreferences = new AppPreferences();
}
public void setPaneType(String paneType){
this.paneType = paneType;
switch (paneType) {
case "Video":
paneLbl.setText(resourceBundle.getString("lbl_VideoPane"));
break;
case "Audio":
paneLbl.setText(resourceBundle.getString("lbl_AudioPane"));
break;
case "Subtitles":
paneLbl.setText(resourceBundle.getString("lbl_SubsPane"));
break;
default:
paneLbl.setText(resourceBundle.getString("?"));
break;
}
}
/** Get index of the selected in pane element */
@ -94,7 +124,24 @@ public abstract class ControllerPane implements Initializable {
/**
* Open file selector (Open folder button in UI).
* */
void openFileChooser (String key){
@FXML
void openDirChooser(){
String[] filesExtension;
switch (paneType) {
case "Video":
filesExtension = appPreferences.getVideoExtensionsList();
break;
case "Audio":
filesExtension = appPreferences.getAudioExtensionsList();
break;
case "Subtitles":
filesExtension = appPreferences.getSubsExtensionsList();
break;
default:
filesExtension = new String[]{"*"};
break;
}
File directoryReceived; // Store files (folder) received from selector
DirectoryChooser dirSelect;
@ -109,13 +156,6 @@ public abstract class ControllerPane implements Initializable {
// GET LIST OF FILES from directory
if (directoryReceived != null) {
setFilesFromFolder(directoryReceived, key);
} else {
System.out.println("\tNo folder selected");
}
}
private void setFilesFromFolder(File directoryReceived, String key) {
File[] files; // Store files mkv/mka
files = directoryReceived.listFiles(new FilenameFilter() {
@ -124,8 +164,10 @@ public abstract class ControllerPane implements Initializable {
if (Name.lastIndexOf('.') > 0) {
int lastindex = Name.lastIndexOf('.');
String ext = Name.substring(lastindex);
if (ext.equals(key))
for (String key : filesExtension){
if (ext.equals(key.substring(1)))
return true;
}
} else
return false;
return false;
@ -133,6 +175,49 @@ public abstract class ControllerPane implements Initializable {
});
displayFiles(files);
} else {
System.out.println("No folder selected");
}
}
/**
* Open file selector (Open files button in UI).
* */
@FXML
void openFilesChooser(){
String[] filesExtension;
switch (paneType) {
case "Video":
filesExtension = appPreferences.getVideoExtensionsList();
break;
case "Audio":
filesExtension = appPreferences.getAudioExtensionsList();
break;
case "Subtitles":
filesExtension = appPreferences.getSubsExtensionsList();
break;
default:
filesExtension = new String[]{"*"};
break;
}
List<File> filesRecievedList;
FileChooser fc = new FileChooser();
fc.setTitle(resourceBundle.getString("SelectFile"));
if (folderToOpen == null)
fc.setInitialDirectory(new File(System.getProperty("user.home")));
else
fc.setInitialDirectory(new File(folderToOpen));
fc.getExtensionFilters().addAll(new FileChooser.ExtensionFilter(paneType, filesExtension));
filesRecievedList = fc.showOpenMultipleDialog(paneListView.getScene().getWindow());
if (filesRecievedList != null){
File[] filesRecieved = new File[filesRecievedList.size()];
filesRecievedList.toArray(filesRecieved);
displayFiles(filesRecieved);
} else {
System.out.println("No files selected");
}
}
/**
* Set files using lists. Used if playlist loaded
@ -151,16 +236,10 @@ public abstract class ControllerPane implements Initializable {
// spiced java magic
Arrays.sort(files);
/* DEBUG START
for (File eachFile : files)
System.out.println(eachFile.getAbsoluteFile());
DEBUG END */
// Remember the folder used for MKV and reuse it when user opens MKA/subs folder (as new default path instead of user.home)
folderToOpen = files[0].getParent();
//System.out.println(folderToOpen);
paneListView.getItems().clear(); // wipe elements from ListView
paneFileList.addAll(files);
paneListView.setItems(paneFileList);
paneListView.getSelectionModel().select(0);
@ -169,6 +248,11 @@ public abstract class ControllerPane implements Initializable {
System.out.println("\tNo files in this folder");
}
}
@FXML
public void cleanList(){
paneListView.getItems().clear(); // wipe elements from ListView
}
@FXML
private void Up(){
int index;
@ -197,7 +281,4 @@ public abstract class ControllerPane implements Initializable {
if (event.getCode().toString().equals("DELETE"))
Del();
}
// TO IMPLEMENT IN REAL CLASS
@FXML
protected abstract void openAction();
}

View file

@ -11,64 +11,39 @@ import java.util.Arrays;
import java.util.ResourceBundle;
public class ControllerSUB extends ControllerPane {
// TODO: Move file extension filtering options to the OS-selector and remove drop-down with file ext. filtering options
@FXML
private ChoiceBox<String> subtExt;
// Observable list of the content subtExt
private ObservableList<String> subtExtList;
@FXML
private ChoiceBox<String> subtEncoding;
// Observable list of the content subtEncoding
private ObservableList<String> subEncodingList;
public void initialize(URL url, ResourceBundle rb) {
super.initialize(url, rb);
this.subtExtList = FXCollections.observableArrayList();
this.subEncodingList = FXCollections.observableArrayList();
}
@Override
protected void openAction() { openFileChooser(subtExt.getValue());} // TODO: check if non-empty and show error if needed
/** Return selected file extension */
// Walking on the thin ice..
public String getSelectedExt(){
return subtExt.getSelectionModel().getSelectedItem();
}
/** Return selected file encoding */
public String getSelectedEncoding(){
return subtEncoding.getSelectionModel().getSelectedItem();
}
/**
* Set Files extensions list and select element
* */
public void setSubtExt(String[] list, String selection){
setMenuElements(subtExt, subtExtList, list, selection);
}
/**
* Set encoding list and select element
* */
public void setEncoding(String[] list, String selection){
setMenuElements(subtEncoding, subEncodingList, list, selection);
}
/* Encoding and Extension common setter */
private void setMenuElements(ChoiceBox<String> menu, ObservableList<String> obsList, String[] list, String selection){
String currentlySelectedValue = menu.getValue();
String currentlySelectedValue = subtEncoding.getValue();
obsList.clear();
obsList.setAll(list);
menu.setItems(obsList);
subEncodingList.clear();
subEncodingList.setAll(list);
subtEncoding.setItems(subEncodingList);
if (selection == null || selection.isEmpty())
// Try to restore previously selected value if it existed before and exists in the new list
if (currentlySelectedValue !=null && !currentlySelectedValue.isEmpty() && obsList.contains(currentlySelectedValue))
menu.getSelectionModel().select(currentlySelectedValue);
if (currentlySelectedValue !=null && !currentlySelectedValue.isEmpty() && subEncodingList.contains(currentlySelectedValue))
subtEncoding.getSelectionModel().select(currentlySelectedValue);
else
menu.setValue(obsList.get(0));
subtEncoding.setValue(subEncodingList.get(0));
else {
if (obsList.contains(selection))
menu.getSelectionModel().select(selection);
if (subEncodingList.contains(selection))
subtEncoding.getSelectionModel().select(selection);
else
menu.setValue(obsList.get(0));
subtEncoding.setValue(subEncodingList.get(0));
}
}
/**
@ -76,7 +51,8 @@ public class ControllerSUB extends ControllerPane {
* Updates stored lists/selection of encoding
* */
public void selectEncodingValue(String encodingValue, AppPreferences preferences){
if (encodingValue != null && !encodingValue.isEmpty()) {
if (encodingValue != null && !(encodingValue = encodingValue.trim()).isEmpty()) {
if (!encodingValue.contains("\t") && !encodingValue.contains(" ")){ // If contains spaces or tabs, ignore.
if (!subEncodingList.contains(encodingValue)) {
subEncodingList.add(encodingValue);
preferences.setSubsEncodingList(Arrays.copyOf(subEncodingList.toArray(), subEncodingList.toArray().length, String[].class));
@ -88,3 +64,4 @@ public class ControllerSUB extends ControllerPane {
}
}
}
}

View file

@ -2,6 +2,7 @@
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
@ -9,29 +10,41 @@
<?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.ControllerMKV">
<AnchorPane minWidth="200.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mplayer4anime.appPanes.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>
<HBox spacing="3.0" VBox.vgrow="NEVER">
<HBox alignment="CENTER" spacing="3.0" VBox.vgrow="NEVER">
<children>
<Button mnemonicParsing="false" onAction="#openAction" text="%key_mkv_open">
<Button minHeight="28.0" mnemonicParsing="false" onAction="#openDirChooser">
<graphic>
<SVGPath content="M19,20H4C2.89,20 2,19.1 2,18V6C2,4.89 2.89,4 4,4H10L12,6H19A2,2 0 0,1 21,8H21L4,8V18L6.14,10H23.21L20.93,18.5C20.7,19.37 19.92,20 19,20Z" />
<SVGPath content="M10,4L12,6H20A2,2 0 0,1 22,8V18A2,2 0 0,1 20,20H4C2.89,20 2,19.1 2,18V6C2,4.89 2.89,4 4,4H10M15,9V12H12V14H15V17H17V14H20V12H17V9H15Z" />
</graphic>
</Button>
<Button minHeight="28.0" mnemonicParsing="false" onAction="#openFilesChooser">
<graphic>
<SVGPath content="M14,10H19.5L14,4.5V10M5,3H15L21,9V19A2,2 0 0,1 19,21H5C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3M9,18H11V15H14V13H11V10H9V13H6V15H9V18Z" />
</graphic></Button>
<Pane minWidth="5.0" HBox.hgrow="NEVER" />
<Button minHeight="28.0" mnemonicParsing="false" onAction="#cleanList">
<graphic>
<SVGPath content="m 4,2 h 7 c 1.104569,0 2,0.8954305 2,2 v 11 c 0,1.104569 -0.895431,2 -2,2 H 4 C 2.8954305,17 2,16.104569 2,15 V 4 C 2,2.8954305 2.8954305,2 4,2 m 0,6 v 3 h 7 V 8 H 4 m 0,4 v 3 h 7 V 12 H 4 M 4,4 v 3 h 7 V 4 H 4 M 17.59,9.5 15,6.91 16.41,5.5 19,8.09 21.59,5.5 23,6.91 20.41,9.5 23,12.09 21.59,13.5 19,10.91 16.41,13.5 15,12.09 Z" fill="#cc0101" />
</graphic>
</Button>
<Pane HBox.hgrow="ALWAYS" />
<Button mnemonicParsing="false" onAction="#Up">
<Label fx:id="paneLbl" text="%lbl_VideoPane" />
<Pane HBox.hgrow="ALWAYS" />
<Button minHeight="28.0" mnemonicParsing="false" onAction="#Up">
<graphic>
<SVGPath content="M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z" />
</graphic>
</Button>
<Button mnemonicParsing="false" onAction="#Down">
<Button minHeight="28.0" mnemonicParsing="false" onAction="#Down">
<graphic>
<SVGPath content="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z" />
</graphic>
</Button>
<Button mnemonicParsing="false" onAction="#Del">
<Button minHeight="28.0" mnemonicParsing="false" onAction="#Del">
<graphic>
<SVGPath content="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z" fill="#cc0101" />
</graphic>

View file

@ -1,48 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ListView?>
<?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 xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mplayer4anime.appPanes.ControllerMKA">
<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>
<HBox spacing="3.0" VBox.vgrow="NEVER">
<children>
<Button mnemonicParsing="false" onAction="#openAction" text="%key_mka_open">
<graphic>
<SVGPath content="M19,20H4C2.89,20 2,19.1 2,18V6C2,4.89 2.89,4 4,4H10L12,6H19A2,2 0 0,1 21,8H21L4,8V18L6.14,10H23.21L20.93,18.5C20.7,19.37 19.92,20 19,20Z" />
</graphic>
</Button>
<Pane HBox.hgrow="ALWAYS" />
<Button mnemonicParsing="false" onAction="#Up">
<graphic>
<SVGPath content="M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z" />
</graphic>
</Button>
<Button mnemonicParsing="false" onAction="#Down">
<graphic>
<SVGPath content="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z" />
</graphic>
</Button>
<Button mnemonicParsing="false" onAction="#Del">
<graphic>
<SVGPath content="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z" fill="#b90505" />
</graphic>
</Button>
</children>
<VBox.margin>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</VBox.margin>
</HBox>
<ListView fx:id="paneListView" onKeyPressed="#KeyPressed" styleClass="landing" stylesheets="@../res/landing.css" VBox.vgrow="ALWAYS" />
</children>
</VBox>
</children>
</AnchorPane>

View file

@ -3,6 +3,7 @@
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ChoiceBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
@ -14,27 +15,39 @@
<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>
<HBox spacing="3.0" VBox.vgrow="NEVER">
<HBox alignment="CENTER" spacing="3.0" VBox.vgrow="NEVER">
<children>
<Button mnemonicParsing="false" onAction="#openAction" text="%key_subt_open">
<Button minHeight="28.0" mnemonicParsing="false" onAction="#openDirChooser">
<graphic>
<SVGPath content="M19,20H4C2.89,20 2,19.1 2,18V6C2,4.89 2.89,4 4,4H10L12,6H19A2,2 0 0,1 21,8H21L4,8V18L6.14,10H23.21L20.93,18.5C20.7,19.37 19.92,20 19,20Z" />
<SVGPath content="M10,4L12,6H20A2,2 0 0,1 22,8V18A2,2 0 0,1 20,20H4C2.89,20 2,19.1 2,18V6C2,4.89 2.89,4 4,4H10M15,9V12H12V14H15V17H17V14H20V12H17V9H15Z" />
</graphic>
</Button>
<Button minHeight="28.0" mnemonicParsing="false" onAction="#openFilesChooser">
<graphic>
<SVGPath content="M14,10H19.5L14,4.5V10M5,3H15L21,9V19A2,2 0 0,1 19,21H5C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3M9,18H11V15H14V13H11V10H9V13H6V15H9V18Z" />
</graphic>
</Button>
<Pane minWidth="5.0" />
<Button mnemonicParsing="false" onAction="#cleanList">
<graphic>
<SVGPath content="m 4,2 h 7 c 1.104569,0 2,0.8954305 2,2 v 11 c 0,1.104569 -0.895431,2 -2,2 H 4 C 2.8954305,17 2,16.104569 2,15 V 4 C 2,2.8954305 2.8954305,2 4,2 m 0,6 v 3 h 7 V 8 H 4 m 0,4 v 3 h 7 V 12 H 4 M 4,4 v 3 h 7 V 4 H 4 M 17.59,9.5 15,6.91 16.41,5.5 19,8.09 21.59,5.5 23,6.91 20.41,9.5 23,12.09 21.59,13.5 19,10.91 16.41,13.5 15,12.09 Z" fill="#cc0101" />
</graphic>
</Button>
<ChoiceBox fx:id="subtExt" prefWidth="60.0" />
<ChoiceBox fx:id="subtEncoding" prefWidth="100.0" />
<Pane HBox.hgrow="ALWAYS" />
<Button mnemonicParsing="false" onAction="#Up">
<Label fx:id="paneLbl" text="%lbl_SubsPane" />
<Pane HBox.hgrow="ALWAYS" />
<Button minHeight="28.0" mnemonicParsing="false" onAction="#Up">
<graphic>
<SVGPath content="M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z" />
</graphic>
</Button>
<Button mnemonicParsing="false" onAction="#Down">
<Button minHeight="28.0" mnemonicParsing="false" onAction="#Down">
<graphic>
<SVGPath content="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z" />
</graphic>
</Button>
<Button mnemonicParsing="false" onAction="#Del">
<Button minHeight="28.0" mnemonicParsing="false" onAction="#Del">
<graphic>
<SVGPath content="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z" fill="#b90505" />
</graphic>

View file

@ -27,25 +27,40 @@
<menus>
<Menu mnemonicParsing="false" text="%menu_File">
<items>
<MenuItem mnemonicParsing="false" onAction="#openBtn" text="%menu_File_Open" />
<MenuItem mnemonicParsing="false" onAction="#openBtn" text="%menu_File_Open">
<graphic>
<SVGPath content="M19,20H4C2.89,20 2,19.1 2,18V6C2,4.89 2.89,4 4,4H10L12,6H19A2,2 0 0,1 21,8H21L4,8V18L6.14,10H23.21L20.93,18.5C20.7,19.37 19.92,20 19,20Z" />
</graphic></MenuItem>
<Menu fx:id="recentlyOpenedMenu" mnemonicParsing="false" text="%menu_File_Recent">
<items>
<SeparatorMenuItem mnemonicParsing="false" />
<MenuItem mnemonicParsing="false" onAction="#cleanAllRecentlyOpened" text="%menu_File_Recent_CleanAll" />
</items>
<graphic>
<SVGPath content="M13.5,8H12V13L16.28,15.54L17,14.33L13.5,12.25V8M13,3A9,9 0 0,0 4,12H1L4.96,16.03L9,12H6A7,7 0 0,1 13,5A7,7 0 0,1 20,12A7,7 0 0,1 13,19C11.07,19 9.32,18.21 8.06,16.94L6.64,18.36C8.27,20 10.5,21 13,21A9,9 0 0,0 22,12A9,9 0 0,0 13,3" />
</graphic>
</Menu>
<SeparatorMenuItem mnemonicParsing="false" />
<MenuItem mnemonicParsing="false" onAction="#saveBtn" text="%menu_File_Save" />
<MenuItem mnemonicParsing="false" onAction="#saveAsBtn" text="%menu_File_SaveAs" />
<MenuItem mnemonicParsing="false" onAction="#saveBtn" text="%menu_File_Save">
<graphic>
<SVGPath content="M15,9H5V5H15M12,19A3,3 0 0,1 9,16A3,3 0 0,1 12,13A3,3 0 0,1 15,16A3,3 0 0,1 12,19M17,3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V7L17,3Z" />
</graphic></MenuItem>
<MenuItem mnemonicParsing="false" onAction="#saveAsBtn" text="%menu_File_SaveAs">
<graphic>
<SVGPath content="M15,9H5V5H15M12,19A3,3 0 0,1 9,16A3,3 0 0,1 12,13A3,3 0 0,1 15,16A3,3 0 0,1 12,19M17,3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V7L17,3Z" />
</graphic></MenuItem>
<SeparatorMenuItem mnemonicParsing="false" />
<MenuItem mnemonicParsing="false" onAction="#closeBtn" text="%menu_File_Close" />
<MenuItem mnemonicParsing="false" onAction="#closeBtn" text="%menu_File_Close">
<graphic>
<SVGPath content="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z" />
</graphic></MenuItem>
</items>
</Menu>
<Menu mnemonicParsing="false" text="%menu_Tools">
<items>
<MenuItem mnemonicParsing="false" onAction="#settingsBtn" text="%menu_Tools_Settings">
<graphic>
<SVGPath content="M12,15.5A3.5,3.5 0 0,1 8.5,12A3.5,3.5 0 0,1 12,8.5A3.5,3.5 0 0,1 15.5,12A3.5,3.5 0 0,1 12,15.5M19.43,12.97C19.47,12.65 19.5,12.33 19.5,12C19.5,11.67 19.47,11.34 19.43,11L21.54,9.37C21.73,9.22 21.78,8.95 21.66,8.73L19.66,5.27C19.54,5.05 19.27,4.96 19.05,5.05L16.56,6.05C16.04,5.66 15.5,5.32 14.87,5.07L14.5,2.42C14.46,2.18 14.25,2 14,2H10C9.75,2 9.54,2.18 9.5,2.42L9.13,5.07C8.5,5.32 7.96,5.66 7.44,6.05L4.95,5.05C4.73,4.96 4.46,5.05 4.34,5.27L2.34,8.73C2.21,8.95 2.27,9.22 2.46,9.37L4.57,11C4.53,11.34 4.5,11.67 4.5,12C4.5,12.33 4.53,12.65 4.57,12.97L2.46,14.63C2.27,14.78 2.21,15.05 2.34,15.27L4.34,18.73C4.46,18.95 4.73,19.03 4.95,18.95L7.44,17.94C7.96,18.34 8.5,18.68 9.13,18.93L9.5,21.58C9.54,21.82 9.75,22 10,22H14C14.25,22 14.46,21.82 14.5,21.58L14.87,18.93C15.5,18.67 16.04,18.34 16.56,17.94L19.05,18.95C19.27,19.03 19.54,18.95 19.66,18.73L21.66,15.27C21.78,15.05 21.73,14.78 21.54,14.63L19.43,12.97Z" fill="#686868" />
<SVGPath content="M3,17V19H9V17H3M3,5V7H13V5H3M13,21V19H21V17H13V15H11V21H13M7,9V11H3V13H7V15H9V9H7M21,13V11H11V13H21M15,9H17V7H21V5H17V3H15V9Z" fill="#686868" />
</graphic></MenuItem>
</items>
</Menu>
@ -53,12 +68,28 @@
<items>
<MenuItem mnemonicParsing="false" onAction="#infoBtn" text="%menu_Help_AboutApp">
<graphic>
<SVGPath content="M13.5,4A1.5,1.5 0 0,0 12,5.5A1.5,1.5 0 0,0 13.5,7A1.5,1.5 0 0,0 15,5.5A1.5,1.5 0 0,0 13.5,4M13.14,8.77C11.95,8.87 8.7,11.46 8.7,11.46C8.5,11.61 8.56,11.6 8.72,11.88C8.88,12.15 8.86,12.17 9.05,12.04C9.25,11.91 9.58,11.7 10.13,11.36C12.25,10 10.47,13.14 9.56,18.43C9.2,21.05 11.56,19.7 12.17,19.3C12.77,18.91 14.38,17.8 14.54,17.69C14.76,17.54 14.6,17.42 14.43,17.17C14.31,17 14.19,17.12 14.19,17.12C13.54,17.55 12.35,18.45 12.19,17.88C12,17.31 13.22,13.4 13.89,10.71C14,10.07 14.3,8.67 13.14,8.77Z" fill="#686868f7" />
<SVGPath content="M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M11,17H13V11H11V17Z" fill="#686868f7" />
</graphic></MenuItem>
</items>
</Menu>
</menus>
</MenuBar>
<SplitPane dividerPositions="0.5" prefHeight="257.0" prefWidth="313.0" VBox.vgrow="ALWAYS">
<items>
<!-- PAY ATTENTION! IN MAIN CONTROLLER THIS CONTROLLER CALLED AS @"fx:id"+"Controller" -->
<fx:include fx:id="mkvPane" source="appPanes/genericPane.fxml" />
<TabPane fx:id="tabPane" minWidth="200.0" prefHeight="200.0" prefWidth="200.0" side="RIGHT" tabClosingPolicy="UNAVAILABLE">
<tabs>
<Tab text="%main_tab_audio">
<fx:include fx:id="mkaPane" source="appPanes/genericPane.fxml" />
</Tab>
<Tab text="%main_tab_subtitles">
<fx:include fx:id="subPane" source="appPanes/subPane.fxml" />
</Tab>
</tabs>
</TabPane>
</items>
</SplitPane>
<ToolBar prefHeight="40.0" prefWidth="200.0" styleClass="topToolBar" stylesheets="@res/landing.css">
<items>
<HBox>
@ -128,25 +159,12 @@
</SplitMenuButton>
</items>
</ToolBar>
<SplitPane dividerPositions="0.5" prefHeight="257.0" prefWidth="313.0" VBox.vgrow="ALWAYS">
<items>
<!-- PAY ATTENTION! IN MAIN CONTROLLER THIS CONTROLLER CALLED AS @"fx:id"+"Controller" -->
<fx:include fx:id="mkvPane" source="appPanes/mkvPane.fxml" />
<TabPane fx:id="tabPane" minWidth="200.0" prefHeight="200.0" prefWidth="200.0" side="RIGHT" tabClosingPolicy="UNAVAILABLE">
<tabs>
<Tab text="%main_tab_audio">
<fx:include fx:id="mkaPane" source="appPanes/mkaPane.fxml" />
</Tab>
<Tab text="%main_tab_subtitles">
<fx:include fx:id="subPane" source="appPanes/subPane.fxml" />
</Tab>
</tabs>
</TabPane>
</items>
</SplitPane>
<Pane VBox.vgrow="NEVER">
<children>
<Label fx:id="statusLbl" />
<Label fx:id="statusLbl">
<padding>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</padding></Label>
</children>
</Pane>
</children>

View file

@ -1,14 +1,14 @@
about_line1=mplayer4amine distributes under GNU GPLv3 license.
about_line2=Release: v0.10
about_line2=Release: v0.11
about_line3=Development & maintenance by Dmitry Isaenko.
about_AboutName=About
main_tab_audio=Audio
CancelBtn=Cancel
Error=Error
fullscreen_option=Always start in fullscreen
key_mka_open=Audio *.mka
key_mkv_open=Video *.mkv
key_subt_open=Subtitles
lbl_AudioPane=Audio
lbl_VideoPane=Video
lbl_SubsPane=Subtitles
settings_PathToMplayerLbl=Path to mplayer executable:
SaveBtn=Save
settings_SettingsName=Settings
@ -20,10 +20,11 @@ ErrorUnableToStartMplayer=Unable to execute 'mplayer'.\n\
settings_unixOsInformation=Unix-like OS uses system $PATH to find mplayer location.\n\
Please don't change it if not sure.
SelectDirectoryTitle=Select directory
settings_LoadListsOnStart=Save & restore previously opened lists after application starts:
settings_subsExtensionList=Avaliable subtitles extensions:
settings_subsCodepageList=Avaliable codepages for subtitles:
settings_fieldContainSpacesTabs=Spaces and tab symbols are not allowed.
settings_fieldContainUnacceptedChars=Spaces and tab symbols are not allowed.\n\
'*' symbol could be only in the starting position.\n\
Example: *.mp3
subsShow_option=Don't show subtitles.
menu_File=File
menu_Tools=Tools
@ -48,5 +49,12 @@ ErrorOnSaveIncorrectEncoding=Unable to save file:\n\
Internal problem: unsupported encoding.
ErrorUnableToSaveEmptyPlaylist=Unable to save playlist with no videos files.
AboutUsedLibraries=Used libraries:
settings_Tab_General=General
settings_Tab_Video=Video
settings_Tab_Audio=Audio
settings_Tab_Subtitles=Subtitles
settings_videoExtensionList=Avaliable video files extensions:
settings_audioExtensionList=Avaliable audio layer extensions:

View file

@ -1,15 +1,15 @@
menu_File_Recent=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u044B...
about_line1=mplayer4amine \u0440\u0430\u0441\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u044F\u0435\u0442\u0441\u044F \u043F\u043E \u043B\u0438\u0446\u0435\u043D\u0437\u0438\u0438 GNU GPLv3.
about_line2=\u0420\u0435\u043B\u0438\u0437: v0.10
about_line2=\u0420\u0435\u043B\u0438\u0437: v0.11
about_line3=\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0430\u043D\u043E \u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0414\u043C\u0438\u0442\u0440\u0438\u0435\u043C \u0418\u0441\u0430\u0435\u043D\u043A\u043E.
about_AboutName=\u041E \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438
main_tab_audio=\u0410\u0443\u0434\u0438\u043E
CancelBtn=\u041E\u0442\u043C\u0435\u043D\u0430
Error=\u041E\u0448\u0438\u0431\u043A\u0430
fullscreen_option=\u0412\u0441\u0435\u0433\u0434\u0430 \u043F\u043E\u043B\u043D\u043E\u044D\u043A\u0440\u0430\u043D\u043D\u044B\u0439 \u0440\u0435\u0436\u0438\u043C
key_mka_open=\u0410\u0443\u0434\u0438\u043E *.mka
key_mkv_open=\u0412\u0438\u0434\u0435\u043E *.mkv
key_subt_open=\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044B
lbl_AudioPane=\u0410\u0443\u0434\u0438\u043E
lbl_VideoPane=\u0412\u0438\u0434\u0435\u043E
lbl_SubsPane=\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044B
settings_PathToMplayerLbl=\u0420\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435 mplayer:
SaveBtn=\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C
settings_SettingsName=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438
@ -21,10 +21,11 @@ ErrorUnableToStartMplayer=\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D
settings_unixOsInformation=Unix-\u043F\u043E\u0434\u043E\u0431\u043D\u044B\u0435 \u041E\u0421 \u0441\u0438\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u044B\u0435 \u043F\u0443\u0442\u0438, \u0447\u0442\u043E\u0431\u044B \u043D\u0430\u0439\u0442\u0438 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435 mplayer.\n\
\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043D\u0435 \u0442\u0440\u043E\u0433\u0430\u0439\u0442\u0435 \u044D\u0442\u043E \u0435\u0441\u043B\u0438 \u043D\u0435 \u0443\u0432\u0435\u0440\u0435\u043D\u044B.
SelectDirectoryTitle=\u0412\u044B\u0431\u043E\u0440 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0438
settings_LoadListsOnStart=\u0417\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u0442\u044C \u0438 \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0442\u044C \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0435 \u0432 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u0439 \u0440\u0430\u0437 \u0441\u043F\u0438\u0441\u043A\u0438:
settings_subsExtensionList=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043E\u0432:
settings_subsCodepageList=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u043A\u043E\u0434\u0438\u0440\u043E\u0432\u043A\u0438 \u0434\u043B\u044F \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043E\u0432:
settings_fieldContainSpacesTabs=\u041F\u0440\u043E\u0431\u0435\u043B\u044B \u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B.
settings_fieldContainUnacceptedChars=\u041F\u0440\u043E\u0431\u0435\u043B\u044B \u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B.\n\
\u0421\u0438\u043C\u0432\u043E\u043B "*" \u043C\u043E\u0436\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u043D\u0430\u0447\u0430\u043B\u0435.\n\
\u041F\u0440\u0438\u043C\u0435\u0440: *.mp3
subsShow_option=\u041D\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u044B.
menu_File=\u0424\u0430\u0439\u043B
menu_Tools=\u0418\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B
@ -48,3 +49,10 @@ ErrorOnSaveIncorrectEncoding=\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u0
\u0412\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u044F\u044F \u043E\u0448\u0438\u0431\u043A\u0430: \u043A\u043E\u0434\u0438\u0440\u043E\u0432\u043A\u0430 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F.
ErrorUnableToSaveEmptyPlaylist=\u041D\u0435\u043B\u044C\u0437\u044F \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u043F\u043B\u0435\u0439\u043B\u0438\u0441\u0442 \u0431\u0435\u0437 \u0432\u0438\u0434\u0435\u043E \u0444\u0430\u0439\u043B\u043E\u0432.
AboutUsedLibraries=\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0438:
settings_Tab_General=\u041E\u0441\u043D\u043E\u0432\u043D\u044B\u0435
settings_Tab_Audio=\u0410\u0443\u0434\u0438\u043E
settings_Tab_Subtitles=\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044B
settings_Tab_Video=\u0412\u0438\u0434\u0435\u043E
settings_videoExtensionList=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u0444\u0430\u0439\u043B\u043E\u0432 \u0432\u0438\u0434\u0435\u043E:
settings_audioExtensionList=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u0430\u0443\u0434\u0438\u043E\u0434\u043E\u0440\u043E\u0436\u0435\u043A:

BIN
res/gjel.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View file

@ -6,7 +6,7 @@
.btnLeft {
-fx-background-radius: 0.3em 0em 0em 0.3em;
-fx-background-color: #263e48;
-fx-background-color: #267a9e;
}
.btnLeft:hover {
-fx-background-radius: 0.3em 0em 0em 0.3em;
@ -18,7 +18,7 @@
}
.btnCenter {
-fx-background-radius: 0em 0em 0em 0em ;
-fx-background-color: #263e48;
-fx-background-color: #267a9e;
}
.btnCenter:hover {
-fx-background-radius: 0em 0em 0em 0em ;
@ -30,7 +30,7 @@
}
.btnRight {
-fx-background-radius: 0em 0.3em 0.3em 0em ;
-fx-background-color: #263e48;
-fx-background-color: #267a9e;
}
.btnRight:hover {
-fx-background-radius: 0em 0.3em 0.3em 0em ;
@ -41,7 +41,7 @@
-fx-background-color: #1c2e35;
}
.btnSimple {
-fx-background-color: #263e48;
-fx-background-color: #267a9e;
}
.btnSimple:hover {
-fx-background-color: #2c4954;
@ -51,7 +51,7 @@
}
/* SplitMenuButton */
.splitMenuButton .arrow-button{
-fx-background-color: #263e48;
-fx-background-color: #267a9e;
}
.splitMenuButton .arrow-button:hover{
-fx-background-color: #2c4954;
@ -63,7 +63,7 @@
-fx-background-color: #e1e1e1;
}
.splitMenuButton .label{
-fx-background-color: #263e48;
-fx-background-color: #267a9e;
}
.splitMenuButton .label:hover{
-fx-background-color: #2c4954;
@ -72,7 +72,7 @@
-fx-background-color: #1c2e35;
}
.splitMenuButton {
-fx-background-color: #263e48;
-fx-background-color: #267a9e;
}
.splitMenuButton .menu-item .label{
@ -86,5 +86,8 @@
/* END */
.topToolBar{
-fx-background-color: #4f6f8f;
/*-fx-background-color: #4f6f8f;*/
-fx-background-image: url(gjel.png);
-fx-background-position: center;
-fx-background-repeat: repeat;
}