Skip to content

Instantly share code, notes, and snippets.

@rahulmutt
Last active January 14, 2017 04:46
Show Gist options
  • Save rahulmutt/4470b67078d54d7ded55b3ec011aac1c to your computer and use it in GitHub Desktop.
Save rahulmutt/4470b67078d54d7ded55b3ec011aac1c to your computer and use it in GitHub Desktop.
FFI Import Generation

Rendering.hs:

{-# LANGUAGE FlexibleContexts #-}
module JavaFX.Rendering where

import Java
import JavaFX.Types

type Render a = Java GraphicsContext a

-- Scene
foreign import java unsafe "@new"
  newScene :: (Extends a Parent, Extends b Paint)
           => a -> Double -> Double -> b -> Java c Scene

foreign import java unsafe "@new"
  newGroup :: Java c Group

foreign import java unsafe getWidth :: Java Stage Double
foreign import java unsafe getHeight :: Java Stage Double

foreign import java unsafe "@new" newCanvas :: Double -> Double -> Java a Canvas

-- Graphics Context
foreign import java unsafe getGraphicsContext2D :: Java Canvas GraphicsContext

foreign import java unsafe
  clearRect :: Double -> Double -> Double -> Double -> Render ()

foreign import java unsafe
  fillRect :: Double -> Double -> Double -> Double -> Render ()

foreign import java unsafe
  fillRoundRect :: Double -> Double -> Double -> Double
                -> Double -> Double -> Render ()

foreign import java unsafe setFill :: (Extends a Paint) => a -> Render ()

foreign import java unsafe setStroke :: (Extends a Paint) => a -> Render ()

foreign import java unsafe translate :: Double -> Double -> Render ()

foreign import java unsafe scale :: Double -> Double -> Render ()

foreign import java unsafe rotate :: Double -> Render ()

foreign import java unsafe save :: Render ()

foreign import java unsafe restore :: Render ()

foreign import java unsafe "@static @field javafx.scene.text.TextAlignment.CENTER"
  alignCenter :: TextAlignment

foreign import java unsafe "@static @field javafx.geometry.VPos.CENTER"
  vposCenter :: VPos

foreign import java unsafe setTextAlign    :: TextAlignment -> Render ()
foreign import java unsafe setTextBaseline :: VPos -> Render ()

foreign import java unsafe "strokeText" strokeText :: String -> Double -> Double -> Render ()

foreign import java unsafe "fillText" fillText :: String -> Double -> Double -> Render ()

-- Main Loop
foreign import java unsafe "@wrapper @abstract handle"
  animationTimer :: (Int64 -> Java AnimationTimer ()) -> AnimationTimer

foreign import java unsafe "start" animationStart :: Java AnimationTimer ()

-- Color
foreign import java unsafe "@static javafx.scene.paint.Color.rgb"
  makeColor :: Int -> Int -> Int -> Double -> Color

makeColorI :: Int -> Int -> Int -> Int -> Color
makeColorI r g b a = makeColor r g b (fromIntegral a / 255)

black, white :: Color
black = makeColorI 0   0   0   255
white = makeColorI 255 255 255 255

-- KeyCodes
foreign import java unsafe "@static @field javafx.scene.input.KeyCode.UP" keyUP :: KeyCode
foreign import java unsafe "@static @field javafx.scene.input.KeyCode.DOWN" keyDOWN :: KeyCode
foreign import java unsafe "@static @field javafx.scene.input.KeyCode.LEFT" keyLEFT :: KeyCode
foreign import java unsafe "@static @field javafx.scene.input.KeyCode.RIGHT" keyRIGHT :: KeyCode

-- KeyEvent
foreign import java unsafe getCode :: KeyEvent -> KeyCode

-- Event Handling
foreign import java unsafe "@wrapper handle"
  handleEvent :: (Extends a Event)
              => (a -> Java (EventHandler a) ())
              -> EventHandler a

foreign import java unsafe "setOnKeyPressed" setOnKeyPressed' ::
  EventHandler KeyEvent -> Java Scene ()

setOnKeyPressed :: (KeyEvent -> Java (EventHandler KeyEvent) ()) -> Java Scene ()
setOnKeyPressed f = setOnKeyPressed' (handleEvent f)

foreign import java unsafe "getChildren" getChildren :: (Extends c Parent) => Java c (ObservableList Node)

foreign import java unsafe "@interface add" addChild :: (Extends a Object, Extends b a) => b -> Java (ObservableList a) Bool

foreign import java unsafe "show" showStage :: Java Stage ()

foreign import java unsafe "setTitle" setTitle :: String -> Java Stage ()

foreign import java unsafe "setScene" setScene :: Scene -> Java Stage ()

foreign import java safe "@static javafx.application.Application.launch"
  launch :: JClass a -> JStringArray -> IO ()

Rendering.hs-ffi:

{-# LANGUAGE FlexibleContexts #-}
module JavaFX.Rendering where

import Java
import JavaFX.Types
@import java [
  javafx.[
    animation.AnimationTimer wrapped animationTimer[handle](start),
    collections.ObservableList(add),
    event.EventHandler wrapped handleEvent[handle],
    scene.[
      Scene(new(4,Paint),setOnKeyPressed),
      Parent(getChildren),
      Group(new(0)),
      canvas.[
        Canvas(new(2), getGraphicsContext2D),
        GraphicsContext(
          setFill,
          setStroke,
          translate,
          scale,
          rotate,
          save,
          restore,
          setTextAlign,
          setTextBaseline,
          strokeText,
          fillText,

        )
      ],
      text.TextAlignment(CENTER as alignCenter),
      paint.Color[pure](rgb, BLACK as black, WHITE as white),
      input.[
        KeyCode(UP as keyUP, DOWN as keyDOWN, LEFT as keyLEFT, RIGHT as keyRIGHT),
        KeyEvent[pure](getCode),
      ]
    ],
    stage.[Stage(getWidth, getHeight, show as showStage, setTitle, setScene)],
    geometry.VPos(CENTER as vposCenter)
  ],
  java.lang.Object(equals),
]

type Render a = Java GraphicsContext a
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment