FLTKHS - Easy Native Guis in Haskell, Today!

FLTKHS - Easy Native Guis in Haskell, Today!

FLTKHS - Easy Native GUIs in Haskell, Today! Aditya Siram (@deech) February 5, 2016 Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 1 / 69 Outline Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 2 / 69 What FLTK (Fast Light Toolkit) C++ No multiple inheritance No exceptions No templates Stable, 20 yrs old Clean install on Win/Linux/Mac Embedded systems Almost no dependencies Not even glibc! Static zero-dependency binaries Fluid Interface Builder Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 3 / 69 What Native GUI's in pure, impure Haskell All in IO. Near Complete Integration With Fluid Fluid interfaces compile to straight Haskell! Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 4 / 69 Why Installs easily Yes, Windows too Very few dependencies base, bytestring, directory, lepath,mtl, parsec, c2hs Zero-dependency binaries Yes, Windows too Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 5 / 69 Why Easy To Learn Add a 3rd party widget Without recompiling! Type-safe, no unsafeCoerce! Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 6 / 69 Easy What is "easy"? Re-use existing FLTK documentation Find function & datatypes Straightforward translation of C++ to Haskell Ape the API What is not "easy"? Pure, functional Haskell Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 7 / 69 Easy Widget names Fl_Widget is Ref Widget Fl_Light_Button is Ref LightButton Widget Construction new Fl_Widget(..) is newWidget ... new Fl_Light_Button(..) is newLightButton ... Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 8 / 69 Easy Function names are the same as much as possible In FLTK Type Sig void Fl_Valuator::bounds(double a, double b) Call valuatorRef->bounds(1.0, 10.0) In FLTKHS bounds valuatorRef 1.0 10.0 Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 9 / 69 Easy Getters/Setters prexed with get/set In C++ Type sig double Fl_Valuator::value() void Fl_Valuator::value(double v) Call double v = valuatorRef->value() valuatorRef->value(1.0) In Haskell v <- getValue valuatorRef setValue valuatorRef 1.0 Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 10 / 69 Easy All FLTKHS methods have multiple dispatch! In C++ int Fl_Input_::value(const char* str, int len) In Haskell setValue :: Ref Input -> String -> Maybe Int -> IO (Int) Not the real signature! Previously it was: setValue :: Ref Valuator -> Double -> IO () Rest of the arguments depend on the rst! Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 11 / 69 Easy Error messages are decent too! Missing arguments setValue inputRef Error message Couldn't match type `IO t0' with \ `String -> Maybe Int -> IO Int' In a stmt of a 'do' block: setValue inputRef Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 12 / 69 Easy Missing everything setValue Less nice, but not horrible Couldn't match expected type `IO t0' with actual type `Ref a0 -> impl0' Probable cause: `setValue' is applied to too \ few arguments Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 13 / 69 Easy Wrong widget (a table does not have a setValue) setValue tableRef Ugly, the info is there but . Couldn't match type \ `NoFunction (SetValue ()) (Graphics.UI.FLTK.LowLevel.Hierarchy.CTable Group)' with `Match r0' GHC 8's custom type errors will help here Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 14 / 69 Easy Real type sigs. are ugly All widget docs show methods with friendly sigs! It's all clickable. Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 15 / 69 Easy And also the widget hierarchy Parent's functions transparently available! Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 16 / 69 Easy fltkhs-demos comes with 18 end-to-end demos 16 are exact copies of demos that ship with FLTK Learn by side-by-side comparison Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 17 / 69 Easy Browser demo (see select menu on bottom left) Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 18 / 69 Easy C++ and Haskell code that handles select menu callback. Don't worry about details, note the correspondence. Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 19 / 69 Easy C++ code void btype_cb(Fl_Widget *, void *) { for ( int t=1; t<=browser->size(); t++ ) browser->select(t,0); browser->select(1,0); // leave focus box on first line if ( strcmp(btype->text(),"Normal")==0) browser->type(FL_NORMAL_BROWSER); else if ( strcmp(btype->text(),"Select")==0) browser->type(FL_SELECT_BROWSER); else if ( strcmp(btype->text(),"Hold" )==0) browser->type(FL_HOLD_BROWSER); else if ( strcmp(btype->text(),"Multi" )==0) browser->type(FL_MULTI_BROWSER); browser->redraw(); } Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 20 / 69 Easy Equivalent Haskell code btypeCb :: Ref SelectBrowser -> Ref Choice -> IO () btypeCb browser' btype' = do numLines' <- getSize browser' forM_ [1..(numLines' - 1)] (\l -> select browser' l False) _ <- select browser' 1 False -- leave focus box on first line choice' <- getText btype' case choice' of "Normal" -> setType browser' NormalBrowserType "Select" -> setType browser' SelectBrowserType "Hold" -> setType browser' HoldBrowserType "Multi" -> setType browser' MultiBrowserType _ -> return () redraw browser' Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 21 / 69 Easy C++ for ( int t=1; t<=browser->size(); t++ ) browser->select(t,0); browser->select(1,0); // leave focus box on first line Haskell numLines' <- getSize browser' forM_ [1..(numLines' - 1)] (\l -> select browser' l False) _ <- select browser' 1 False -- leave focus box on first line Comments are preserved! Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 22 / 69 Easy C++ if ( strcmp(btype->text(),"Normal")==0) browser->type(FL_NORMAL_BROWSER); else if ( strcmp(btype->text(),"Select")==0) browser->type(FL_SELECT_BROWSER); ... Haskell choice' <- getText btype' case choice' of "Normal" -> setType browser' NormalBrowserType "Select" -> setType browser' SelectBrowserType ... _ -> return () Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 23 / 69 Easy Callstacks! Out-of-the-box in 7.10.x All FLTKHS "instance" methods check for a null Ref. Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 24 / 69 Easy Deletes itself in callback . buttonCb b' = do FL.deleteWidget b' l' <- getLabel b' ... main = do ... b' <- buttonNew ... setCallback b' buttonCb ... Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 25 / 69 Easy Callstack . Ref does not exist. \ ?loc, called at <full-path>/Fl_Types.chs:395:58 in ... toRefPtr, called at <full-path>/Fl_Types.chs:403:22 in ... withRef, called at <full-path>/Hierarchy.hs:1652:166 in ... getLabel, called at src/Main.hs:11:10 in main:Main Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 26 / 69 Easy Project skeleton available: http://github.com/deech/fltkhs-hello-word Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 27 / 69 Fluid A full edged, mature GUI builder Ships with FLTK Out-of-the-box integration with FLTKHS Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 28 / 69 Fluid Designed to generate C++ Now generates Haskell! fltkhs-fluidtohs ships with FLTKHS Migrate existing C++ projects easily fltkhs-fluid-examples Skeleton project available. https://github.com/deech/fltkhs-fluid-hello-world Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 29 / 69 Fluid Project structure + fltkhs-fluid-hello-world - ... + src - Callbacks.hs - fluid-hello-world.hs - HelloWorld.fl Installing > cabal install Running > fltkhs-fluid-hello-world Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 30 / 69 Fluid Unclicked Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 31 / 69 Fluid Clicking Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 32 / 69 Fluid Clicked Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 33 / 69 Fluid > fluid HelloWorld.fl Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 34 / 69 Fluid Widget Bin Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 35 / 69 Fluid Window properties Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 36 / 69 Fluid Set the button callback. Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 37 / 69 Fluid Callback logic module Callbacks where ... buttonCb :: Ref Button -> IO () buttonCb helloWorld = do l' <- getLabel helloWorld if (l' == "Hello World") then setLabel helloWorld "Goodbye World" else setLabel helloWorld "Hello World" Aditya Siram (@deech) FLTKHS - Easy Native GUIs in Haskell, Today! February 5, 2016 38 / 69 Fluid Imports Aditya Siram (@deech) FLTKHS - Easy Native

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    69 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us