Advertisement
Guest User

Untitled

a guest
Feb 13th, 2015
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 7.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.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)
  79.                     clickX = -1.0
  80.                     clickY = -1.0
  81.                     paint
  82.                 }
  83.             }))
  84.         setOnMouseClicked(handleEvt(evt => {
  85.             if (evt.getButton == MouseButton.PRIMARY)
  86.             {
  87.                 if (toolGroup.getSelectedToggle.equals(toolGroup.getToggles.get(1)))
  88.                 {
  89.                     val (x, y) = (math.floor(evt.getX / 32).toInt, math.floor(evt.getY / 32).toInt)
  90.                     for (i <- 0 until grid.length)
  91.                         for (j <- 0 until grid(i).length)
  92.                             if (grid(i)(j).equals("P"))
  93.                                 grid(i)(j) = "-"
  94.                     grid(y)(x) = "P"
  95.                 }
  96.             }
  97.             else if (evt.getButton == MouseButton.SECONDARY)
  98.                 grid(math.floor(math.min(clickY, evt.getY) / 32).toInt)(math.floor(math.min(clickX, evt.getX) / 32).toInt) = "-"
  99.             paint
  100.         }))
  101.        
  102.         def paint =
  103.         {
  104.             sp.setMinHeight(math.min(javafx.stage.Screen.getPrimary.getBounds.getMaxX - 400, cols.getText.toInt * scale + size + 2))
  105.             sp.setMinWidth(math.min(javafx.stage.Screen.getPrimary.getBounds.getMaxX - 400, rows.getText.toInt * scale + size + 2))
  106.             setHeight(cols.getText.toInt * scale + size)
  107.             setWidth(rows.getText.toInt * scale + size)
  108.  
  109.             {
  110.                 stg.setWidth(math.min(javafx.stage.Screen.getPrimary.getBounds.getMaxX - 100, math.max(150, getWidth + 200)))
  111.                 stg.setHeight(math.min(javafx.stage.Screen.getPrimary.getBounds.getMaxY - 100, getHeight + 160 + 50))
  112.             }.fx
  113.  
  114.             newGridBounds(rows.getText.toInt, cols.getText.toInt)
  115.             val gc = getGraphicsContext2D
  116.             gc.clearRect(0, 0, getWidth, getHeight)
  117.             gc.setFill(Color.BLACK)
  118.             for (x <- 0 to getWidth.toInt by scale)
  119.                 gc.fillRect(x, 0, size, getHeight)
  120.             for (y <- 0 to getHeight.toInt by scale)
  121.                 gc.fillRect(0, y, getWidth, size)
  122.  
  123.             for (i <- 0 until grid.length)
  124.                 for (j <- 0 until grid(i).length)
  125.                     if (grid(i)(j).equals("P"))
  126.                     {
  127.                         gc.setFill(Color.PURPLE)
  128.                         gc.fillRect(j * scale + size, i * scale + size, scale - size, scale - size)
  129.                     }
  130.                     else if (!grid(i)(j).equals("-"))
  131.                     {
  132.                         val wAndH = grid(i)(j).split(",")
  133.                         gc.setFill(Color.GREEN)
  134.                         for (l <- 0 until wAndH(0).toInt)
  135.                             for (k <- 0 until wAndH(1).toInt)
  136.                                 gc.fillRect((j + l) * scale + size, (i + k) * scale + size, scale - size, scale - size)
  137.                         gc.setFill(Color.DARKGREEN)
  138.                         gc.fillRect(j * scale + size, i * scale + size, scale - size, scale - size)
  139.                     }
  140.         }
  141.     }
  142.  
  143.     def start(stg: Stage) =
  144.     {
  145.         toolGroup = new ToggleGroup
  146.  
  147.         val toggles = new VBox
  148.         val terrain = new ToggleButton("Terrain")
  149.         terrain.setSelected(true)
  150.         terrain.setToggleGroup(toolGroup)
  151.         val player = new ToggleButton("Player")
  152.         player.setToggleGroup(toolGroup)
  153.         toggles.getChildren.addAll(terrain, player)
  154.  
  155.         val canvas = new MyCanvas
  156.         sp = new ScrollPane(canvas)
  157.         sp.setBorder(Border.EMPTY)
  158.  
  159.         val rowsL = new Label("Rows:")
  160.         rows = new TextField("20")
  161.         rows.focusedProperty.addListener(new ChangeListener[Boolean] {def changed(observable: ObservableValue[_ <: Boolean], oldValue: Boolean, newValue: Boolean) = if (!newValue) canvas.paint})
  162.         rows.setOnAction(handle(canvas.paint%))
  163.         val colsL = new Label("Cols:")
  164.         cols = new TextField("20")
  165.         cols.focusedProperty.addListener(new ChangeListener[Boolean] {def changed(observable: ObservableValue[_ <: Boolean], oldValue: Boolean, newValue: Boolean) = if (!newValue) canvas.paint})
  166.         cols.setOnAction(handle(canvas.paint%))
  167.  
  168.         val gp = new GridPane
  169.         gp.setAlignment(Pos.CENTER)
  170.         gp.setHgap(20)
  171.         gp.setVgap(10)
  172.         gp.add(rowsL, 0, 0)
  173.         gp.add(rows, 1, 0)
  174.         gp.add(colsL, 0, 1)
  175.         gp.add(cols, 1, 1)
  176.  
  177.         canvas.setWidth(rows.getText.toInt * scale + canvas.size)
  178.         canvas.setHeight(cols.getText.toInt * scale + canvas.size)
  179.  
  180.         val load = new Button("Load Map File")
  181.         load.setOnAction(handle({
  182.             val fc = new FileChooser
  183.             fc.setInitialDirectory(currentDir)
  184.             val openFile = fc.showOpenDialog(stg)
  185.             if (openFile != null)
  186.             {
  187.                 currentDir = openFile.getParentFile
  188.                 val ar = ArrayBuffer[Array[String]]()
  189.                 val in = new Scanner(openFile)
  190.                 while (in.hasNextLine)
  191.                     ar += in.nextLine.split("\\|")
  192.                 in.close
  193.                 rows.setText(ar(0).length.toString)
  194.                 cols.setText(ar.length.toString)
  195.                 newGridBounds(ar(0).length, ar.length)
  196.                 for (i <- 0 until grid.length)
  197.                     for (j <- 0 until grid(i).length)
  198.                         grid(i)(j) = ar(i)(j)
  199.                 canvas.paint
  200.             }
  201.         }%))
  202.         val save = new Button("Save Map Layout")
  203.         save.setOnAction(handle({
  204.             val fc = new FileChooser
  205.             fc.setInitialDirectory(new File(System.getProperty("user.dir")))
  206.             fc.setInitialDirectory(currentDir)
  207.             val saveFile = fc.showSaveDialog(stg)
  208.             if (saveFile != null)
  209.             {
  210.                 currentDir = saveFile.getParentFile
  211.                 if (!saveFile.exists)
  212.                     saveFile.createNewFile
  213.                 val fw = new FileWriter(saveFile)
  214.                 for (i <- 0 until grid.length)
  215.                     fw.write(grid(i).mkString("|") + "\r\n")
  216.                 fw.close
  217.             }
  218.         }%))
  219.  
  220.         val hb = new HBox
  221.         hb.setSpacing(15)
  222.         hb.getChildren.addAll(toggles, sp)
  223.  
  224.         val vb = new VBox
  225.         VBox.setVgrow(sp, Priority.ALWAYS)
  226.         vb.setStyle("-fx-font-family: Consolas; -fx-font-size: 10pt; -fx-font-weight: normal")
  227.         vb.setPadding(new Insets(10))
  228.         vb.setSpacing(15)
  229.         vb.setAlignment(Pos.CENTER)
  230.         vb.getChildren.addAll(gp, hb, load, save)
  231.  
  232.         stg.setScene(new Scene(vb))
  233.         stg.show
  234.         this.stg = stg
  235.  
  236.         canvas.paint.fx
  237.     }
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement