Advertisement
Guest User

Untitled

a guest
Feb 19th, 2015
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 9.71 KB | None | 0 0
  1. import java.io.{File, FileWriter}
  2. import java.lang.Boolean
  3. import java.util.Scanner
  4. import javafx.application.Application
  5. import javafx.beans.value.{ChangeListener, ObservableValue}
  6. import javafx.geometry.{Insets, Pos}
  7. import javafx.scene.Scene
  8. import javafx.scene.canvas.Canvas
  9. import javafx.scene.control._
  10. import javafx.scene.input.{TransferMode, DataFormat, MouseButton}
  11. import javafx.scene.layout._
  12. import javafx.scene.paint.Color
  13. import javafx.stage.{FileChooser, Stage}
  14.  
  15. import sw.common.Tools
  16. import sw.common.ui.UIShortcuts
  17.  
  18. import scala.collection.mutable.ArrayBuffer
  19.  
  20. object Main extends App{new Main().launch}
  21. class Main extends Application with Tools with UIShortcuts
  22. {
  23.     def launch = javafx.application.Application.launch()
  24.  
  25.     var currentDir = new File(System.getProperty("user.dir"))
  26.     var stg: Stage = null
  27.     var grid: Array[Array[String]] = null
  28.    
  29.     def newGridBounds(x: Int, y: Int) =
  30.     {
  31.         val temp = new Array[Array[String]](y)
  32.         for (i <- 0 until temp.length)
  33.             temp(i) = Array.fill(x)("-")
  34.         if (grid != null)
  35.             for (i <- 0 until math.min(grid.length, temp.length))
  36.                 for (j <- 0 until math.min(grid(i).length, temp(i).length))
  37.                     temp(i)(j) = grid(i)(j)
  38.         grid = temp
  39.     }
  40.    
  41.     newGridBounds(20, 20)
  42.  
  43.     var scale = 32
  44.     var rows: TextField = null
  45.     var cols: TextField = null
  46.     var toolGroup: ToggleGroup = null
  47.     var sp: ScrollPane = null
  48.    
  49.     class MyCanvas extends Canvas
  50.     {
  51.         var size = 2
  52.         var clickX = -1.0
  53.         var clickY = -1.0
  54.         setOnMousePressed(handleEvt(evt =>
  55.         {
  56.             clickX = evt.getX
  57.             clickY = evt.getY
  58.         }))
  59.         setOnMouseDragged(handleEvt(evt =>
  60.         {
  61.             paint
  62.             val (left, right) = (math.min(clickX, evt.getX), math.max(clickX, evt.getX))
  63.             val (top, bottom) = (math.min(clickY, evt.getY), math.max(clickY, evt.getY))
  64.             val gc = getGraphicsContext2D
  65.             gc.setFill(Color.GREEN)
  66.             gc.fillRect(left, top, right - left, size)
  67.             gc.fillRect(left, top, size, bottom - top)
  68.             gc.fillRect(right, top, size, bottom - top)
  69.             gc.fillRect(left, bottom, right - left, size)
  70.         }))
  71.         setOnMouseReleased(handleEvt(evt =>
  72.             if (evt.getButton == MouseButton.PRIMARY)
  73.             {
  74.                 if (toolGroup.getSelectedToggle.equals(toolGroup.getToggles.get(0)))
  75.                 {
  76.                     val (left, right) = (math.max(0, math.floor(math.min(clickX, evt.getX) / 32).toInt), math.min(grid(0).length, math.ceil(math.max(clickX, evt.getX) / 32).toInt))
  77.                     val (top, bottom) = (math.max(0, math.floor(math.min(clickY, evt.getY) / 32).toInt), math.min(grid.length, math.ceil(math.max(clickY, evt.getY) / 32).toInt))
  78.                     grid(top)(left) = (right - left) + "," + (bottom - top) + ",G"
  79.                     clickX = -1.0
  80.                     clickY = -1.0
  81.                     paint
  82.                 }
  83.                 else if (toolGroup.getSelectedToggle.equals(toolGroup.getToggles.get(1)))
  84.                 {
  85.                     val (left, right) = (math.max(0, math.floor(math.min(clickX, evt.getX) / 32).toInt), math.min(grid(0).length, math.ceil(math.max(clickX, evt.getX) / 32).toInt))
  86.                     val (top, bottom) = (math.max(0, math.floor(math.min(clickY, evt.getY) / 32).toInt), math.min(grid.length, math.ceil(math.max(clickY, evt.getY) / 32).toInt))
  87.                     grid(top)(left) = (right - left) + "," + (bottom - top) + ",S"
  88.                     clickX = -1.0
  89.                     clickY = -1.0
  90.                     paint
  91.                 }
  92.             }))
  93.         setOnMouseClicked(handleEvt(evt => {
  94.             if (evt.getButton == MouseButton.PRIMARY)
  95.             {
  96.                 if (toolGroup.getSelectedToggle.equals(toolGroup.getToggles.get(3)))
  97.                 {
  98.                     grid(math.floor(evt.getY / 32).toInt)(math.floor(evt.getX / 32).toInt) = "D"
  99.                 }
  100.                 else if (toolGroup.getSelectedToggle.equals(toolGroup.getToggles.get(4)))
  101.                 {
  102.                     grid(math.floor(evt.getY / 32).toInt)(math.floor(evt.getX / 32).toInt) = "T"
  103.                 }
  104.                 else if (toolGroup.getSelectedToggle.equals(toolGroup.getToggles.get(2)))
  105.                 {
  106.                     val (x, y) = (math.floor(evt.getX / 32).toInt, math.floor(evt.getY / 32).toInt)
  107.                     for (i <- 0 until grid.length)
  108.                         for (j <- 0 until grid(i).length)
  109.                             if (grid(i)(j).equals("P"))
  110.                                 grid(i)(j) = "-"
  111.                     grid(y)(x) = "P"
  112.                 }
  113.             }
  114.             else if (evt.getButton == MouseButton.SECONDARY)
  115.                 grid(math.floor(math.min(clickY, evt.getY) / 32).toInt)(math.floor(math.min(clickX, evt.getX) / 32).toInt) = "-"
  116.             paint
  117.         }))
  118.        
  119.         def paint =
  120.         {
  121.             sp.setMinHeight(math.min(javafx.stage.Screen.getPrimary.getBounds.getMaxX - 400, cols.getText.toInt * scale + size + 2))
  122.             sp.setMinWidth(math.min(javafx.stage.Screen.getPrimary.getBounds.getMaxX - 400, rows.getText.toInt * scale + size + 2))
  123.             setHeight(cols.getText.toInt * scale + size)
  124.             setWidth(rows.getText.toInt * scale + size)
  125.  
  126.             {
  127.                 stg.setWidth(math.min(javafx.stage.Screen.getPrimary.getBounds.getMaxX - 100, math.max(150, getWidth + 200)))
  128.                 stg.setHeight(math.min(javafx.stage.Screen.getPrimary.getBounds.getMaxY - 100, getHeight + 160 + 50))
  129.             }.fx
  130.  
  131.             newGridBounds(rows.getText.toInt, cols.getText.toInt)
  132.             val gc = getGraphicsContext2D
  133.             gc.clearRect(0, 0, getWidth, getHeight)
  134.             gc.setFill(Color.BLACK)
  135.             for (x <- 0 to getWidth.toInt by scale)
  136.                 gc.fillRect(x, 0, size, getHeight)
  137.             for (y <- 0 to getHeight.toInt by scale)
  138.                 gc.fillRect(0, y, getWidth, size)
  139.  
  140.             for (i <- 0 until grid.length)
  141.                 for (j <- 0 until grid(i).length)
  142.                     if (grid(i)(j).equals("P"))
  143.                     {
  144.                         gc.setFill(Color.PURPLE)
  145.                         gc.fillRect(j * scale + size, i * scale + size, scale - size, scale - size)
  146.                     }
  147.                     else if (grid(i)(j).equals("D"))
  148.                     {
  149.                         gc.setFill(Color.BROWN)
  150.                         gc.fillRect(j * scale + size, i * scale + size, scale - size, scale - size)
  151.                     }
  152.                     else if (grid(i)(j).equals("T"))
  153.                     {
  154.                         gc.setFill(Color.RED)
  155.                         gc.fillRect(j * scale + size, i * scale + size, scale - size, scale - size)
  156.                     }
  157.                     else if (!grid(i)(j).equals("-"))
  158.                     {
  159.                         val wAndH = grid(i)(j).split(",")
  160.                         if (wAndH(2).equals("G"))
  161.                             gc.setFill(Color.GREEN)
  162.                         else
  163.                             gc.setFill(Color.GRAY)
  164.                         for (l <- 0 until wAndH(0).toInt)
  165.                             for (k <- 0 until wAndH(1).toInt)
  166.                                 gc.fillRect((j + l) * scale + size, (i + k) * scale + size, scale - size, scale - size)
  167.                         if (wAndH(2).equals("G"))
  168.                             gc.setFill(Color.DARKGREEN)
  169.                         else
  170.                             gc.setFill(Color.DARKGRAY)
  171.                         gc.fillRect(j * scale + size, i * scale + size, scale - size, scale - size)
  172.                     }
  173.         }
  174.     }
  175.  
  176.  
  177.  
  178.     def start(stg: Stage) =
  179.     {
  180.         toolGroup = new ToggleGroup
  181.  
  182.         val toggles = new VBox
  183.         val grass = new ToggleButton("Grass")
  184.         grass.setSelected(true)
  185.         grass.setToggleGroup(toolGroup)
  186.         val stone = new ToggleButton("Stone")
  187.         stone.setToggleGroup(toolGroup)
  188.         val player = new ToggleButton("Player")
  189.         player.setToggleGroup(toolGroup)
  190.         val door = new ToggleButton("Door")
  191.         door.setToggleGroup(toolGroup)
  192.         val trap = new ToggleButton("Trap")
  193.         trap.setToggleGroup(toolGroup)
  194.         toggles.getChildren.addAll(grass, stone, player, door, trap)
  195.  
  196.         val canvas = new MyCanvas
  197.         sp = new ScrollPane(canvas)
  198.         sp.setBorder(Border.EMPTY)
  199.  
  200.         val rowsL = new Label("Rows:")
  201.         rows = new TextField("20")
  202.         rows.focusedProperty.addListener(new ChangeListener[Boolean] {def changed(observable: ObservableValue[_ <: Boolean], oldValue: Boolean, newValue: Boolean) = if (!newValue) canvas.paint})
  203.         rows.setOnAction(handle(canvas.paint%))
  204.         val colsL = new Label("Cols:")
  205.         cols = new TextField("20")
  206.         cols.focusedProperty.addListener(new ChangeListener[Boolean] {def changed(observable: ObservableValue[_ <: Boolean], oldValue: Boolean, newValue: Boolean) = if (!newValue) canvas.paint})
  207.         cols.setOnAction(handle(canvas.paint%))
  208.  
  209.         val gp = new GridPane
  210.         gp.setAlignment(Pos.CENTER)
  211.         gp.setHgap(20)
  212.         gp.setVgap(10)
  213.         gp.add(rowsL, 0, 0)
  214.         gp.add(rows, 1, 0)
  215.         gp.add(colsL, 0, 1)
  216.         gp.add(cols, 1, 1)
  217.  
  218.         canvas.setWidth(rows.getText.toInt * scale + canvas.size)
  219.         canvas.setHeight(cols.getText.toInt * scale + canvas.size)
  220.  
  221.         def loadMapFile(f: File) =
  222.         {
  223.             currentDir = f.getParentFile
  224.             val ar = ArrayBuffer[Array[String]]()
  225.             val in = new Scanner(f)
  226.             while (in.hasNextLine)
  227.                 ar += in.nextLine.split("\\|")
  228.             in.close
  229.             rows.setText(ar(0).length.toString)
  230.             cols.setText(ar.length.toString)
  231.             newGridBounds(ar(0).length, ar.length)
  232.             for (i <- 0 until grid.length)
  233.                 for (j <- 0 until grid(i).length)
  234.                     grid(i)(j) = ar(i)(j)
  235.             canvas.paint
  236.         }
  237.  
  238.         canvas.setOnDragOver(handleEvt(evt =>
  239.             if (evt.getDragboard.getContentTypes.contains(DataFormat.FILES))
  240.                 evt.acceptTransferModes(TransferMode.COPY, TransferMode.MOVE, TransferMode.LINK)
  241.         ))
  242.         canvas.setOnDragDropped(handleEvt(evt => loadMapFile(evt.getDragboard.getContent(DataFormat.FILES).asInstanceOf[java.util.List[File]].get(0))))
  243.  
  244.         val load = new Button("Load Map File")
  245.         load.setOnAction(handle({
  246.             val fc = new FileChooser
  247.             fc.setInitialDirectory(currentDir)
  248.             val openFile = fc.showOpenDialog(stg)
  249.             if (openFile != null)
  250.                 loadMapFile(openFile)
  251.         }%))
  252.         val save = new Button("Save Map Layout")
  253.         save.setOnAction(handle({
  254.             val fc = new FileChooser
  255.             fc.setInitialDirectory(new File(System.getProperty("user.dir")))
  256.             fc.setInitialDirectory(currentDir)
  257.             val saveFile = fc.showSaveDialog(stg)
  258.             if (saveFile != null)
  259.             {
  260.                 currentDir = saveFile.getParentFile
  261.                 if (!saveFile.exists)
  262.                     saveFile.createNewFile
  263.                 val fw = new FileWriter(saveFile)
  264.                 for (i <- 0 until grid.length)
  265.                     fw.write(grid(i).mkString("|") + "\r\n")
  266.                 fw.close
  267.             }
  268.         }%))
  269.  
  270.         val hb = new HBox
  271.         hb.setSpacing(15)
  272.         hb.getChildren.addAll(toggles, sp)
  273.  
  274.         val vb = new VBox
  275.         VBox.setVgrow(sp, Priority.ALWAYS)
  276.         vb.setStyle("-fx-font-family: Consolas; -fx-font-size: 10pt; -fx-font-weight: normal")
  277.         vb.setPadding(new Insets(10))
  278.         vb.setSpacing(15)
  279.         vb.setAlignment(Pos.CENTER)
  280.         vb.getChildren.addAll(gp, hb, load, save)
  281.  
  282.         stg.setScene(new Scene(vb))
  283.         stg.show
  284.         this.stg = stg
  285.  
  286.         canvas.paint.fx
  287.     }
  288. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement