threepenny-gui-0.3.0.0: GUI framework that uses the web browser as a display.

Safe HaskellNone

Graphics.UI.Threepenny.Core

Contents

Synopsis

Synopsis

Core functionality of the Threepenny GUI library.

Server

To display the user interface, you have to start a server using startGUI. Then, visit the URL http://localhost:10000/ in your browser (assuming that you have set the port number to tpPort=10000 in the server configuration).

The server is multithreaded, a separate thread is used to communicate with a single browser Window. However, each window should only be accessed from a single thread, otherwise the behavior will be undefined, i.e. you could run an element search and get a click event as a result if you don't access each window in a single-threaded fashion.

data Config Source

Record for configuring the Threepenny GUI server.

Constructors

Config 

Fields

tpPort :: Int

Port number.

tpCustomHTML :: Maybe FilePath

Custom HTML file to replace the default one.

tpStatic :: Maybe FilePath

Directory that is served under /static.

tpLog :: ByteString -> IO ()

Print a single log message.

defaultConfig :: ConfigSource

Default configuration.

Port 10000, no custom HTML, no static directory, logging to stderr.

startGUISource

Arguments

:: Config

Server configuration.

-> (Window -> IO ())

Action to run whenever a client browser connects.

-> IO () 

Start server for GUI sessions.

loadFileSource

Arguments

:: Window

Browser window

-> String

MIME type

-> FilePath

Local path to the file

-> IO String

Generated URI

Make a local file available as a relative URI.

loadDirectory :: Window -> FilePath -> IO StringSource

Make a local directory available as a relative URI.

Browser Window

type Window = SessionSource

The client browser window.

title :: WriteAttr Window StringSource

Title of the client window.

cookies :: ReadAttr Window [(String, String)]Source

Cookies on the client.

getRequestLocation :: Window -> IO URISource

Get the request location.

DOM elements

Create and manipulate DOM elements.

data Element Source

Reference to an element in the DOM of the client window.

Instances

mkElementSource

Arguments

:: String

Tag name

-> IO Element 

Make a new DOM element.

getWindow :: Element -> IO (Maybe Window)Source

Retrieve the browser Window in which the element resides.

Note that elements do not reside in any browser window when they are first created. To move the element to a particular browser window, you have to append it to a parent, for instance with the `(#+)` operator.

WARNING: The ability to move elements from one browser window to another is currently not implemented yet.

delete :: Element -> IO ()Source

Delete the given element.

(#+) :: IO Element -> [IO Element] -> IO ElementSource

Append DOM elements as children to a given element.

string :: String -> IO ElementSource

Make a span element with a given text content.

getHead :: Window -> IO ElementSource

Get the head of the page.

getBody :: Window -> IO ElementSource

Get the body of the page.

children :: WriteAttr Element [Element]Source

Child elements of a given element.

text :: WriteAttr Element StringSource

Text content of an element.

html :: WriteAttr Element StringSource

Child elements of a given element as a HTML string.

attr :: String -> WriteAttr Element StringSource

HTML attributes of an element.

style :: WriteAttr Element [(String, String)]Source

Set CSS style of an Element

value :: Attr Element StringSource

Value attribute of an element. Particularly relevant for control widgets like input.

getValuesListSource

Arguments

:: [Element]

A list of elements to get the values of.

-> IO [String]

The list of plain text values.

Get values from inputs. Blocks. This is faster than many getValue invocations.

getElementsByTagNameSource

Arguments

:: Window

Browser window

-> String

The tag name.

-> IO [Element]

All elements with that tag name.

Get all elements of the given tag name. Blocks.

getElementByTagNameSource

Arguments

:: Window

Browser window

-> String

The tag name.

-> IO (Maybe Element)

An element (if any) with that tag name.

Get an element by its tag name. Blocks.

getElementsByIdSource

Arguments

:: Window

Browser window

-> [String]

The ID string.

-> IO [Element]

Elements with given ID.

Get a list of elements by particular IDs. Blocks.

getElementByIdSource

Arguments

:: Window

Browser window

-> String

The ID string.

-> IO (Maybe Element)

Element (if any) with given ID.

Get an element by a particular ID. Blocks.

getElementsByClassNameSource

Arguments

:: Window

Browser window

-> String

The class string.

-> IO [Element]

Elements with given class.

Get a list of elements by particular class. Blocks.

Layout

Combinators for quickly creating layouts. They can be adjusted with CSS later on.

grid :: [[IO Element]] -> IO ElementSource

Align given elements in a rectangular grid.

Layout is achieved by using the CSS display:table property. The following element tree will be generated

  <div class="table">
    <div class="table-row">
      <div class="table-cell"> ... </div>
      <div class="table-cell"> ... </div>
    </div>
    <div class="table-row">
      ...
    </div>
   ...
   </div>

You can customatize the actual layout by assigning an id to the element and changing the .table, .table-row and table-column classes in a custom CSS file.

row :: [IO Element] -> IO ElementSource

Align given elements in a row. Special case of grid.

column :: [IO Element] -> IO ElementSource

Align given elements in a column. Special case of grid.

Events

For a list of predefined events, see Graphics.UI.Threepenny.Events.

data EventData Source

Data from an event. At the moment it is empty.

Constructors

EventData [Maybe String] 

domEventSource

Arguments

:: String

Event name. A full list can be found at http://www.w3schools.com/jsref/dom_obj_event.asp. Note that the on-prefix is not included, the name is click and so on.

-> Element

Element where the event is to occur.

-> Event EventData 

Obtain DOM event for a given element.

on :: (element -> Event a) -> element -> (a -> IO void) -> IO ()Source

Convenience function to register Events for Elements.

Example usage.

 on click element $ \_ -> ...

disconnect :: Window -> Event ()Source

Event that occurs whenever the client has disconnected, be it by closing the browser window or by exception.

Note: DOM Elements in the browser window that has been closed can no longer be manipulated.

Attributes

For a list of predefined attributes, see Graphics.UI.Threepenny.Attributes.

(#) :: a -> (a -> b) -> bSource

Reverse function application. Allows convenient notation for setting properties.

Example usage.

 mkElement "div"
     # set style     [("color","#CCAABB")]
     # set draggable True
     # set children  otherElements

(#.) :: IO Element -> String -> IO ElementSource

Convenient combinator for setting the CSS class on element creation.

element :: Element -> IO ElementSource

Convience synonym for return to make elements work well with set.

Example usage.

 e <- mkElement "button"
 element e # set text "Ok"

type Attr x a = ReadWriteAttr x a aSource

Attributes can be set and get.

type WriteAttr x i = ReadWriteAttr x i ()Source

Attribute that only supports the set operation.

type ReadAttr x o = ReadWriteAttr x () oSource

Attribute that only supports the get operation.

data ReadWriteAttr x i o Source

Generalized attribute with different types for getting and setting.

Constructors

ReadWriteAttr 

Fields

get' :: x -> IO o
 
set' :: i -> x -> IO ()
 

set :: MonadIO m => ReadWriteAttr x i o -> i -> m x -> m xSource

Set value of an attribute in the IO monad. Best used in conjunction with '#'.

sink :: ReadWriteAttr x i o -> Behavior i -> IO x -> IO xSource

Set the value of an attribute to a Behavior, that is a time-varying value.

Note: For reasons of efficiency, the attribute is only updated when the value changes.

get :: ReadWriteAttr x i o -> x -> IO oSource

Get attribute value.

mkReadWriteAttrSource

Arguments

:: (x -> IO o)

Getter.

-> (i -> x -> IO ())

Setter.

-> ReadWriteAttr x i o 

Build an attribute from a getter and a setter.

mkWriteAttr :: (i -> x -> IO ()) -> WriteAttr x iSource

Build attribute from a setter.

mkReadAttr :: (x -> IO o) -> ReadAttr x oSource

Build attribute from a getter.

JavaScript FFI

Direct interface to JavaScript in the browser window.

debugSource

Arguments

:: Window

Client window

-> String

Some plain text to send to the client.

-> IO () 

Send a debug message to the client. The behaviour of the client is unspecified.

clear :: Window -> IO ()Source

Clear the client's DOM.

class ToJS a Source

Class for rendering Haskell types as JavaScript code.

class FFI a Source

Helper class for making a simple JavaScript FFI

Instances

FFI (JSFunction String) 
FFI (JSFunction ()) 
FFI (JSFunction JSValue) 
(ToJS a, FFI b) => FFI (a -> b) 

ffi :: FFI a => String -> aSource

Simple JavaScript FFI with string substitution.

Inspired by the Fay language. http://fay-lang.org/

 example :: String -> Int -> JSFunction String
 example = ffi "$(%1).prop('checked',%2)"

The ffi function takes a string argument representing the JavaScript code to be executed on the client. Occurrences of the substrings %1 to %9 will be replaced by subequent arguments.

Note: Always specify a type signature! The types automate how values are marshalled between Haskell and JavaScript. The class instances for the FFI class show which conversions are supported.

data JSFunction a Source

Representation of a JavaScript expression with a girven output type.

runFunction :: Window -> JSFunction () -> IO ()Source

Run the given JavaScript function and carry on. Doesn't block.

The client window uses JavaScript's eval() function to run the code.

callFunction :: Window -> JSFunction a -> IO aSource

Run the given JavaScript function and wait for results. Blocks.

The client window uses JavaScript's eval() function to run the code.

callDeferredFunctionSource

Arguments

:: Window

Browser window

-> String

The function name.

-> [String]

Parameters.

-> ([Maybe String] -> IO ())

The continuation to call if/when the function completes.

-> IO () 

Call the given function with the given continuation. Doesn't block.

atomic :: Window -> IO a -> IO aSource

Atomically execute the given computation in the context of a browser window

Internal and oddball functions

updateElement :: (Element -> IO ()) -> Element -> IO ()Source

fromProp :: String -> (JSValue -> a) -> (a -> JSValue) -> Attr Element aSource

audioPlay :: Element -> IO ()Source

Invoke the JavaScript expression audioElement.play();.

audioStop :: Element -> IO ()Source

Invoke the JavaScript expression audioElement.stop();.