/* Copyright (c) 2010-2016 Jesper Öqvist <jesper@llbit.se>
*
* This file is part of Chunky.
*
* Chunky 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.
*
* Chunky 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 Chunky. If not, see <http://www.gnu.org/licenses/>.
*/
package se.llbit.chunky.ui;
import javafx.beans.property.ReadOnlyLongWrapper;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.control.Tooltip;
import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;
import se.llbit.chunky.PersistentSettings;
import se.llbit.chunky.map.WorldMapLoader;
import se.llbit.chunky.resources.MinecraftFinder;
import se.llbit.chunky.world.World;
import se.llbit.log.Log;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ResourceBundle;
public class WorldChooserController implements Initializable {
@FXML private TableView<World> worldTbl;
@FXML private TableColumn<World, String> worldNameCol;
@FXML private TableColumn<World, String> worldDirCol;
@FXML private TableColumn<World, String> gameModeCol;
@FXML private TableColumn<World, Number> seedCol;
@FXML private Button changeWorldDirBtn;
@FXML private Button browseBtn;
@FXML private Button loadSelectedBtn;
private Stage stage;
@Override public void initialize(URL location, ResourceBundle resources) {
worldNameCol
.setCellValueFactory(data -> new ReadOnlyStringWrapper(data.getValue().levelName()));
worldDirCol.setCellValueFactory(
data -> new ReadOnlyStringWrapper(data.getValue().getWorldDirectory().getName()));
gameModeCol.setCellValueFactory(data -> new ReadOnlyStringWrapper(data.getValue().gameMode()));
seedCol.setCellValueFactory(data -> new ReadOnlyLongWrapper(data.getValue().getSeed()));
}
public void setStage(Stage stage) {
this.stage = stage;
}
/**
* Populate the world table.
*/
public void populate(WorldMapLoader mapLoader) {
worldTbl.setRowFactory(tbl -> {
TableRow<World> row = new TableRow<>();
row.setOnMouseClicked(e -> {
if (e.getClickCount() == 2 && !row.isEmpty()) {
mapLoader.loadWorld(row.getItem());
e.consume();
stage.close();
}
});
return row;
});
fillWorldList(getWorldSavesDirectory());
changeWorldDirBtn
.setTooltip(new Tooltip("Select the directory where Minecraft worlds are saved."));
changeWorldDirBtn.setOnAction(e -> {
DirectoryChooser chooser = new DirectoryChooser();
chooser.setTitle("Choose Minecraft saves directory");
File initialDirectory = getWorldSavesDirectory();
if (initialDirectory != null && initialDirectory.isDirectory()) {
chooser.setInitialDirectory(initialDirectory);
}
File directory = chooser.showDialog(stage);
if (directory != null) {
if (directory.isDirectory()) {
fillWorldList(directory);
} else {
Log.warn("Non-directory selected.");
}
}
});
browseBtn.setOnAction(e -> {
DirectoryChooser chooser = new DirectoryChooser();
chooser.setTitle("Choose world directory");
File initialDirectory = PersistentSettings.getLastWorld();
if (initialDirectory != null && initialDirectory.isDirectory()) {
chooser.setInitialDirectory(initialDirectory);
}
File directory = chooser.showDialog(stage);
if (directory != null) {
if (directory.isDirectory()) {
mapLoader.loadWorld(new World(directory, false));
stage.close();
} else {
Log.warn("Non-directory selected.");
}
}
});
loadSelectedBtn.setOnAction(e -> {
if (!worldTbl.getSelectionModel().isEmpty()) {
mapLoader.loadWorld(worldTbl.getSelectionModel().getSelectedItem());
stage.close();
}
});
}
private void fillWorldList(File worldSavesDir) {
List<World> worlds = new ArrayList<>();
if (worldSavesDir != null) {
File[] worldDirs = worldSavesDir.listFiles();
if (worldDirs != null) {
for (File dir : worldDirs) {
if (World.isWorldDir(dir)) {
worlds.add(new World(dir, false));
}
}
}
}
Collections.sort(worlds);
worldTbl.setItems(FXCollections.observableArrayList(worlds));
if (!worlds.isEmpty()) {
worldTbl.getSelectionModel().select(0);
}
}
/**
* Get the directory where Minecraft worlds are stored.
* This is normally the parent of the active world directory.
*/
public File getWorldSavesDirectory() {
File worldDirectory = PersistentSettings.getLastWorld();
if (worldDirectory == null || !worldDirectory.isDirectory()) {
return MinecraftFinder.getSavesDirectory();
} else {
return worldDirectory.getParentFile();
}
}
}