cga/Gtk.hs

159 lines
5.0 KiB
Haskell
Raw Normal View History

2014-10-01 18:26:57 +00:00
module Gtk where
import Control.Monad.IO.Class
import Diagram
import Diagrams.Prelude
import Diagrams.Backend.Cairo
import Diagrams.Backend.Cairo.Internal
import Graphics.UI.Gtk
import Graphics.UI.Gtk.Windows.MessageDialog
import System.Directory
import Util
2014-10-01 18:26:57 +00:00
2014-10-01 21:02:43 +00:00
-- |Handle the whole GTK gui.
2014-10-02 11:14:16 +00:00
makeGUI :: FilePath -> IO ()
makeGUI startFile = do
2014-10-01 18:26:57 +00:00
homedir <- getHomeDirectory
-- init gui
_ <- initGUI
-- create window and widgets
window <- windowNew
da <- drawingAreaNew
fileButton <- fileChooserButtonNew "Select mesh"
FileChooserActionOpen
2014-10-01 18:26:57 +00:00
drawButton <- buttonNew
saveButton <- buttonNew
quitButton <- buttonNew
box1 <- vBoxNew False 0
box2 <- hButtonBoxNew
box3 <- hBoxNew False 0
2014-10-01 19:49:39 +00:00
hscale <- hScaleNewWithRange 0.1 10 0.5
2014-10-01 18:26:57 +00:00
drawButtonLabel <- labelNew $ Just "Draw"
saveButtonLabel <- labelNew $ Just "Save"
quitButtonLabel <- labelNew $ Just "Quit"
-- containers and boxing
containerAdd drawButton drawButtonLabel
containerAdd saveButton saveButtonLabel
containerAdd quitButton quitButtonLabel
containerAdd window box1
boxPackStart box1 da PackGrow 0
boxPackStart box1 box2 PackNatural 0
boxPackStart box1 box3 PackNatural 0
boxPackStart box2 drawButton PackNatural 0
boxPackStart box2 saveButton PackNatural 0
boxPackStart box2 quitButton PackNatural 0
boxPackStart box3 fileButton PackGrow 5
boxPackStart box3 hscale PackGrow 5
2014-10-01 18:26:57 +00:00
-- adjust properties
set window [windowDefaultWidth := 600, windowDefaultHeight := 700,
windowTitle := "Computergrafik"]
set box2 [buttonBoxLayoutStyle := ButtonboxCenter]
containerSetBorderWidth box2 10
_ <- windowSetTypeHint window WindowTypeHintDialog
2014-10-01 18:26:57 +00:00
_ <- fileChooserSetCurrentFolder fileButton homedir
2014-10-01 19:47:54 +00:00
_ <- fileChooserSetFilename fileButton startFile
adjustment <- rangeGetAdjustment hscale
_ <- adjustmentSetValue adjustment 2
2014-10-01 18:26:57 +00:00
-- callbacks
_ <- onDestroy window mainQuit
_ <- onClicked drawButton $ onClickedDrawButton fileButton
da hscale
2014-10-01 18:26:57 +00:00
_ <- onClicked saveButton $ onClickedSaveButton fileButton
_ <- onClicked quitButton mainQuit
-- hotkeys
_ <- window `on` keyPressEvent $ tryEvent $ do
[Control] <- eventModifier
"q" <- eventKeyName
liftIO $ mainQuit
_ <- window `on` keyPressEvent $ tryEvent $ do
[Control] <- eventModifier
"s" <- eventKeyName
liftIO $ onClickedSaveButton fileButton
_ <- window `on` keyPressEvent $ tryEvent $ do
[Control] <- eventModifier
"d" <- eventKeyName
liftIO $ onClickedDrawButton fileButton da hscale
2014-10-01 18:26:57 +00:00
-- draw widgets and start main loop
widgetShowAll window
mainGUI
2014-10-01 21:02:43 +00:00
-- |Callback when the "Draw" Button is clicked.
onClickedDrawButton :: (WidgetClass widget, RangeClass scale)
2014-10-01 18:26:57 +00:00
=> FileChooserButton
-> widget
-> scale
2014-10-01 18:26:57 +00:00
-> IO ()
onClickedDrawButton fcb da scale' = do
2014-10-01 18:26:57 +00:00
filename <- fileChooserGetFilename fcb
case filename of
Just x -> do
drawDiag' x da scale'
2014-10-01 18:26:57 +00:00
Nothing -> do
showErrorDialog "No valid Mesh file!"
2014-10-01 21:02:43 +00:00
-- |Callback when the "Save" Button is clicked.
2014-10-01 18:26:57 +00:00
onClickedSaveButton :: FileChooserButton
-> IO ()
onClickedSaveButton fcb = do
filename <- fileChooserGetFilename fcb
case filename of
Just x -> do
saveDiag' x
2014-10-01 18:26:57 +00:00
Nothing -> do
showErrorDialog "No valid Mesh file!"
2014-10-01 21:02:43 +00:00
-- |Pops up an error Dialog with the given String.
2014-10-01 18:26:57 +00:00
showErrorDialog :: String -> IO ()
showErrorDialog str = do
errorDialog <- messageDialogNew Nothing
[DialogDestroyWithParent]
MessageError
ButtonsClose
str
_ <- dialogRun errorDialog
widgetDestroy errorDialog
2014-10-01 21:02:43 +00:00
-- |Draws a Diagram which is built from a given file to
-- the gtk DrawingArea.
-- Prints an error dialog if no valid mesh file is found.
drawDiag' :: (WidgetClass widget, RangeClass scale)
=> FilePath
-> widget
-> scale
-> IO ()
drawDiag' fp da scale' =
case cmpExt "obj" fp of
True -> do
mesh <- readFile fp
dw <- widgetGetDrawWindow da
adjustment <- rangeGetAdjustment scale'
scaleVal <- adjustmentGetValue adjustment
let (_, r) = renderDia Cairo
(CairoOptions "" (Width 600) SVG False)
(diagFromString (MkProp scaleVal) mesh)
renderWithDrawable dw r
False -> showErrorDialog "No valid Mesh file!"
2014-10-01 21:02:43 +00:00
-- |Saves a Diagram which is built from a given file as an SVG.
-- Prints an error dialog if no valid mesh file is found.
saveDiag' :: FilePath -> IO ()
saveDiag' fp =
case cmpExt "obj" fp of
True -> do
mesh <- readFile fp
renderCairo "out.svg" (Width 600) (diagFromString (MkProp 2) mesh)
False -> showErrorDialog "No valid Mesh file!"