diff --git a/src/de/brickedleveleditor/game/levels/LevelPackWriter.java b/src/de/brickedleveleditor/game/levels/LevelPackWriter.java index c242fcb78108e52798568fc509c67d9bdbd73e16..f07befe5451bfdf6796bff5c3f6bc0a2a0e95c7a 100644 --- a/src/de/brickedleveleditor/game/levels/LevelPackWriter.java +++ b/src/de/brickedleveleditor/game/levels/LevelPackWriter.java @@ -49,4 +49,9 @@ public class LevelPackWriter Level level = new Level(levelname, author, position, difficulty, startLives, paddleSize, getBoard(bricks)); levels.add(level); } + + public ArrayList<Level> getLevels() + { + return levels; + } } diff --git a/src/de/brickedleveleditor/main/Main.java b/src/de/brickedleveleditor/main/Main.java index 9eb6bc50cb093993b38fdc548d6785edda84b0f6..a946ae6057bb2913258df1f796e5cd03f274cf0f 100644 --- a/src/de/brickedleveleditor/main/Main.java +++ b/src/de/brickedleveleditor/main/Main.java @@ -4,7 +4,7 @@ import java.util.Arrays; import java.util.Locale; import java.util.ResourceBundle; -import de.brickedleveleditor.ui.Controller; +import de.brickedleveleditor.ui.controller.MainController; import javafx.application.Application; import javafx.event.EventHandler; import javafx.fxml.FXMLLoader; @@ -25,13 +25,10 @@ public class Main extends Application { try { - FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("de/brickedleveleditor/ui/GUI.fxml")); + FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("de/brickedleveleditor/ui/fxml/main_controller.fxml")); Parent root = (Parent)loader.load(); - Scene scene = new Scene(root, 800, 600); - - ((Controller)loader.getController()).init(stage); - + Scene scene = new Scene(root, 800, 600); stage.setTitle(bundle.getString("app.name")); stage.setScene(scene); stage.setResizable(true); @@ -44,8 +41,8 @@ public class Main extends Application System.exit(0); } }); - stage.show(); + ((MainController)loader.getController()).init(stage, null); } catch(Exception e) { diff --git a/src/de/brickedleveleditor/main/_de.properties b/src/de/brickedleveleditor/main/_de.properties index 5882f88395a5a5ffed32a3892767ab419021dc0b..824b21f68a9542a7ae02bb7b5efaf3b477de70bb 100644 --- a/src/de/brickedleveleditor/main/_de.properties +++ b/src/de/brickedleveleditor/main/_de.properties @@ -2,4 +2,6 @@ app.name=Bricked LevelEditor version.code=0 version.name=0.0.0 version.date=19.10.16 -author=Max Wittig, Robert Goldmann \ No newline at end of file +author=Max Wittig, Robert Goldmann + +level.saver=Save Level diff --git a/src/de/brickedleveleditor/ui/controller/AbstractController.java b/src/de/brickedleveleditor/ui/controller/AbstractController.java new file mode 100644 index 0000000000000000000000000000000000000000..2fa8ad793684d0dd86d6839de66aa35d8efc0f45 --- /dev/null +++ b/src/de/brickedleveleditor/ui/controller/AbstractController.java @@ -0,0 +1,20 @@ +package de.brickedleveleditor.ui.controller; + +import javafx.stage.Stage; + + +public abstract class AbstractController +{ + protected AbstractController parentController; + protected Stage stage; + + public void init(Stage stage, AbstractController parentController) + { + this.parentController = parentController; + this.stage = stage; + initController(); + } + + protected abstract void initController(); + +} diff --git a/src/de/brickedleveleditor/ui/controller/LevelPackDialogController.java b/src/de/brickedleveleditor/ui/controller/LevelPackDialogController.java new file mode 100644 index 0000000000000000000000000000000000000000..1ced35cffb950eb9589fcf44daa66cc9e4a31783 --- /dev/null +++ b/src/de/brickedleveleditor/ui/controller/LevelPackDialogController.java @@ -0,0 +1,58 @@ +package de.brickedleveleditor.ui.controller; + + +import de.bricked.game.paddle.PaddleSize; +import de.brickedleveleditor.utils.AlertGenerator; +import javafx.fxml.FXML; +import javafx.scene.control.Alert; +import javafx.scene.control.ComboBox; +import javafx.scene.control.Spinner; +import javafx.scene.control.TextField; + +public class LevelPackDialogController extends AbstractController +{ + @FXML private Spinner difficultySpinner; + @FXML private ComboBox paddleSizeComboBox; + @FXML private Spinner startLivesSpinner; + @FXML private TextField authorTextField; + @FXML private TextField levelNameTextField; + + @Override + protected void initController() + { + initPaddleSizeComboBox(); + } + + private void initPaddleSizeComboBox() + { + paddleSizeComboBox.getItems().addAll(PaddleSize.values()); + paddleSizeComboBox.getSelectionModel().selectFirst(); + } + + @FXML + private void onSaveButtonClicked() + { + String levelName = levelNameTextField.getText(); + String author = authorTextField.getText(); + if(levelName.equals("") || author.equals("")) + { + AlertGenerator.showAlert(Alert.AlertType.WARNING, "Levelname or Author missing!", null); + } + else + { + int position = ((MainController) parentController).getLevelPackWriter().getLevels().size(); + int difficulty = (int) difficultySpinner.getValue(); + int startLives = (int) startLivesSpinner.getValue(); + PaddleSize initPadSize = (PaddleSize) paddleSizeComboBox.getSelectionModel().getSelectedItem(); + ((MainController) parentController).getLevelPackWriter().addLevel(levelName, author, position, difficulty, startLives, initPadSize, ((MainController) parentController).getBrickArrayList()); + stage.close(); + } + } + + @FXML + private void onBackButtonClicked() + { + stage.close(); + } + +} diff --git a/src/de/brickedleveleditor/ui/Controller.java b/src/de/brickedleveleditor/ui/controller/MainController.java similarity index 83% rename from src/de/brickedleveleditor/ui/Controller.java rename to src/de/brickedleveleditor/ui/controller/MainController.java index 0fd204c7412333e650a839331c5ae2c16e1b3a25..84ea30ceef0eff97235f3275c04b306d0116cff0 100644 --- a/src/de/brickedleveleditor/ui/Controller.java +++ b/src/de/brickedleveleditor/ui/controller/MainController.java @@ -1,38 +1,24 @@ -package de.brickedleveleditor.ui; - -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Locale; -import java.util.ResourceBundle; +package de.brickedleveleditor.ui.controller; import de.bricked.game.bricks.Brick; import de.bricked.game.bricks.BrickType; -import de.bricked.game.paddle.PaddleSize; import de.bricked.game.powerups.PowerUpType; import de.brickedleveleditor.game.levels.LevelPackWriter; -import javafx.event.ActionEvent; +import de.brickedleveleditor.ui.BrickLabel; import javafx.event.EventHandler; import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; import javafx.geometry.Insets; import javafx.geometry.Pos; +import javafx.scene.Parent; +import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.Label; import javafx.scene.control.MenuItem; import javafx.scene.image.Image; import javafx.scene.input.MouseEvent; -import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.Background; -import javafx.scene.layout.BackgroundImage; -import javafx.scene.layout.BackgroundPosition; -import javafx.scene.layout.BackgroundRepeat; -import javafx.scene.layout.BackgroundSize; -import javafx.scene.layout.ColumnConstraints; -import javafx.scene.layout.GridPane; -import javafx.scene.layout.HBox; -import javafx.scene.layout.RowConstraints; -import javafx.scene.layout.VBox; +import javafx.scene.layout.*; import javafx.scene.paint.Paint; import javafx.stage.Stage; import javafx.stage.WindowEvent; @@ -40,7 +26,13 @@ import logger.LogLevel; import logger.Logger; import tools.Worker; -public class Controller +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Locale; +import java.util.ResourceBundle; + +public class MainController extends AbstractController { @FXML private AnchorPane anchorPane; @@ -48,25 +40,24 @@ public class Controller private VBox sidebarVBox; @FXML private GridPane gridPane; - @FXML private MenuItem saveMenuItem; + @FXML + private MenuItem saveMenuItem; private BrickType[] brickTypes = BrickType.values(); private Image currentlySelectedBrickImage; private Image currentlySelectedPowerupImage; private final int WIDTH = 18; private final int HEIGHT = 18; - - public Stage stage; public final ResourceBundle bundle = ResourceBundle.getBundle("de/brickedleveleditor/main/", Locale.GERMANY); private HashMap<BrickType, Image> bricksTextures; private ArrayList<Image> powerupTextures; private LevelPackWriter levelPackWriter; - public void init(Stage stage) + @Override + protected void initController() { powerupTextures = new ArrayList<>(); levelPackWriter = new LevelPackWriter(); gridPane.setMaxSize(50, 50); - this.stage = stage; bricksTextures = new HashMap<>(); loadPowerupTextures(); addPowerupsToVBox(); @@ -83,21 +74,30 @@ public class Controller System.exit(0); } }); + } - saveMenuItem.setOnAction(new EventHandler<ActionEvent>() + @FXML + private void onSaveMenuItemClicked() + { + try { - @Override - public void handle(ActionEvent event) - { - String levelName = ""; - String author = ""; - int position = 0; - int difficulty = 1; - int startLives = 1; - PaddleSize initPadSize = PaddleSize.EXTRA_LARGE; - levelPackWriter.addLevel(levelName, author, position, difficulty, startLives, initPadSize, getBrickArrayList()); - } - }); + FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("de/brickedleveleditor/ui/fxml/level_pack_dialog_controller.fxml")); + Parent root = (Parent) loader.load(); + + Scene scene = new Scene(root); + + Stage dialogControllerStage = new Stage(); + + dialogControllerStage.setTitle(bundle.getString("level.saver")); + dialogControllerStage.setScene(scene); + dialogControllerStage.setResizable(true); + dialogControllerStage.show(); + ((LevelPackDialogController) loader.getController()).init(dialogControllerStage,this); + } + catch (Exception e) + { + Logger.log(LogLevel.ERROR, Logger.exceptionToString(e)); + } } private void loadPowerupTextures() @@ -106,7 +106,7 @@ public class Controller String rootPath = "de/bricked/resources/textures/powerups/"; //powerup[0] means no powerup --> set to null powerupTextures.add(null); - for (int i=1; i < PowerUpType.types.length; i++) + for (int i = 1; i < PowerUpType.types.length; i++) { File powerupPath = new File(rootPath + PowerUpType.types[i].getID() + fileExt); try @@ -155,11 +155,11 @@ public class Controller { ArrayList<Brick> bricks = new ArrayList<>(); Object[] gridPaneChildren = gridPane.getChildren().toArray(); - for(int i = 0; i < gridPaneChildren.length; i++) + for (int i = 0; i < gridPaneChildren.length; i++) { - if(gridPaneChildren[i] instanceof BrickLabel) + if (gridPaneChildren[i] instanceof BrickLabel) { - BrickLabel currentLabel = (BrickLabel)gridPaneChildren[i]; + BrickLabel currentLabel = (BrickLabel) gridPaneChildren[i]; Brick brick = new Brick(currentLabel.getBrickType(), PowerUpType.getInstance(currentLabel.getPowerUpType())); bricks.add(brick); @@ -190,7 +190,7 @@ public class Controller private void addPowerupsToVBox() { - for(int i=1; i < powerupTextures.size(); i++) + for (int i = 1; i < powerupTextures.size(); i++) { Image powerupImage = powerupTextures.get(i); Label powerupLabel = new Label(PowerUpType.types[i].toString()); @@ -212,8 +212,8 @@ public class Controller private Background getBackGroundFromImage(Image image) { BackgroundImage backgroundImage = new BackgroundImage(image, - BackgroundRepeat.NO_REPEAT,BackgroundRepeat.NO_REPEAT, - BackgroundPosition.CENTER,BackgroundSize.DEFAULT); + BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT, + BackgroundPosition.CENTER, BackgroundSize.DEFAULT); Background background = new Background(backgroundImage); return background; } @@ -271,6 +271,11 @@ public class Controller } } + public LevelPackWriter getLevelPackWriter() + { + return levelPackWriter; + } + public void about() { Alert alert = new Alert(AlertType.INFORMATION); diff --git a/src/de/brickedleveleditor/ui/fxml/level_pack_dialog_controller.fxml b/src/de/brickedleveleditor/ui/fxml/level_pack_dialog_controller.fxml new file mode 100644 index 0000000000000000000000000000000000000000..785f7da21fc60e704b900acb7b67a652829d7374 --- /dev/null +++ b/src/de/brickedleveleditor/ui/fxml/level_pack_dialog_controller.fxml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.ComboBox?> +<?import javafx.scene.control.Label?> +<?import javafx.scene.control.Spinner?> +<?import javafx.scene.control.TextField?> +<?import javafx.scene.layout.AnchorPane?> +<?import javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory?> + +<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="317.0" prefWidth="397.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.brickedleveleditor.ui.controller.LevelPackDialogController"> + <children> + <Label layoutX="14.0" layoutY="22.0" prefHeight="16.0" prefWidth="112.0" text="Levelname:" AnchorPane.leftAnchor="14.0" /> + <Label layoutX="14.0" layoutY="61.0" prefHeight="16.0" prefWidth="112.0" text="Author:" AnchorPane.leftAnchor="14.0" /> + <TextField fx:id="authorTextField" layoutX="212.0" layoutY="56.0" AnchorPane.rightAnchor="14.0" /> + <TextField fx:id="levelNameTextField" layoutX="212.0" layoutY="17.0" AnchorPane.rightAnchor="14.0" /> + <Label layoutX="14.0" layoutY="99.0" prefHeight="16.0" prefWidth="112.0" text="Difficulty:" AnchorPane.leftAnchor="14.0" /> + <Spinner fx:id="difficultySpinner" layoutX="212.0" layoutY="94.0" prefHeight="26.0" prefWidth="171.0" AnchorPane.rightAnchor="14.0"> + <valueFactory> + <SpinnerValueFactory.IntegerSpinnerValueFactory min="1" max="10"/> + </valueFactory> + </Spinner> + <Label layoutX="14.0" layoutY="138.0" prefHeight="16.0" prefWidth="112.0" text="Start-Lives:" AnchorPane.leftAnchor="14.0" /> + <Label layoutX="14.0" layoutY="174.0" prefHeight="16.0" prefWidth="112.0" text="Paddle-Size" AnchorPane.leftAnchor="14.0" /> + <ComboBox fx:id="paddleSizeComboBox" layoutX="212.0" layoutY="169.0" prefHeight="26.0" prefWidth="171.0" AnchorPane.rightAnchor="14.0" /> + <Button layoutX="126.0" layoutY="277.0" mnemonicParsing="false" onAction="#onSaveButtonClicked" text="Save" AnchorPane.bottomAnchor="14.0" /> + <Button layoutX="212.0" layoutY="277.0" mnemonicParsing="false" onAction="#onBackButtonClicked" text="Back" AnchorPane.bottomAnchor="14.0" /> + <Spinner fx:id="startLivesSpinner" layoutX="212.0" layoutY="133.0"> + <valueFactory> + <SpinnerValueFactory.IntegerSpinnerValueFactory min="1" max="5"/> + </valueFactory> + </Spinner> + </children> +</AnchorPane> diff --git a/src/de/brickedleveleditor/ui/GUI.fxml b/src/de/brickedleveleditor/ui/fxml/main_controller.fxml similarity index 91% rename from src/de/brickedleveleditor/ui/GUI.fxml rename to src/de/brickedleveleditor/ui/fxml/main_controller.fxml index 23f129a13b8fad3dbf6a562d6aee370145a4e33a..7cb5639cd153f7b315a81d67be59f00f9d9e17c2 100644 --- a/src/de/brickedleveleditor/ui/GUI.fxml +++ b/src/de/brickedleveleditor/ui/fxml/main_controller.fxml @@ -9,17 +9,17 @@ <?import javafx.scene.layout.RowConstraints?> <?import javafx.scene.layout.VBox?> -<AnchorPane fx:id="anchorPane" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.brickedleveleditor.ui.Controller"> +<AnchorPane fx:id="anchorPane" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.brickedleveleditor.ui.controller.MainController"> <children> <MenuBar layoutX="40.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> <menus> <Menu mnemonicParsing="false" text="File"> <items> - <MenuItem fx:id="saveMenuItem" mnemonicParsing="false" text="Save" /> + <MenuItem fx:id="saveMenuItem" mnemonicParsing="false" onAction="#onSaveMenuItemClicked" text="Save" /> <MenuItem mnemonicParsing="false" text="Unspecified Action" /> </items> </Menu> - <Menu mnemonicParsing="false" text="Hilfe"> + <Menu mnemonicParsing="false" text="Help"> <items> <MenuItem mnemonicParsing="false" onAction="#about" text="Über" /> </items> diff --git a/src/de/brickedleveleditor/utils/AlertGenerator.java b/src/de/brickedleveleditor/utils/AlertGenerator.java new file mode 100644 index 0000000000000000000000000000000000000000..fa58b2a85386c8b292cec0e8e56bedb25fbdfaf0 --- /dev/null +++ b/src/de/brickedleveleditor/utils/AlertGenerator.java @@ -0,0 +1,37 @@ +package de.brickedleveleditor.utils; + +import javafx.scene.control.Alert; +import javafx.scene.control.Alert.AlertType; +import javafx.scene.image.Image; +import javafx.stage.Stage; + +public class AlertGenerator +{ + public static void showAlert(AlertType type, String contentText, Image icon) + { + show(type, type.name(), "", contentText, icon, true); + } + + public static void showAlert(AlertType type, String title, String headerText, String contentText, Image icon, boolean centerOnScreen) + { + show(type, title, headerText, contentText, icon, centerOnScreen); + } + + private static void show(AlertType type, String title, String headerText, String contentText, Image icon, boolean centerOnScreen) + { + Alert alert = new Alert(type); + alert.setTitle(title); + alert.setHeaderText(headerText); + alert.setContentText(contentText); + Stage dialogStage = (Stage) alert.getDialogPane().getScene().getWindow(); + if(icon != null) + { + dialogStage.getIcons().add(icon); + } + if (centerOnScreen) + { + dialogStage.centerOnScreen(); + } + alert.showAndWait(); + } +} \ No newline at end of file