{-# LANGUAGE BlockArguments #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TypeApplications #-} module Main ( main ) where -- base import Data.Int ( Int32 ) import System.Exit ( exitSuccess ) -- directory import qualified System.Directory as Directory ( canonicalizePath ) -- gi-cairo-connector import qualified GI.Cairo.Render.Connector as Cairo ( renderWithContext ) -- gi-gdk import qualified GI.Gdk as GDK -- gi-gtk import qualified GI.Gtk as GTK -- text import qualified Data.Text as Text ( pack ) -- MetaBrush import MetaBrush.Asset.Colours ( ColourRecord(..), colours ) import MetaBrush.Asset.Logo ( drawLogo ) import MetaBrush.Event ( handleKeyboardPressEvent, handleKeyboardReleaseEvent ) import MetaBrush.Render.Util ( widgetAddClass, widgetAddClasses ) import MetaBrush.UI.Menu ( newMenuBar ) import qualified Paths_MetaBrush as Cabal ( getDataFileName ) -------------------------------------------------------------------------------- main :: IO () main = do --------------------------------------------------------- -- Initialise GTK _ <- GTK.init Nothing Just screen <- GDK.screenGetDefault themePath <- Text.pack <$> ( Directory.canonicalizePath =<< Cabal.getDataFileName "theme.css" ) cssProvider <- GTK.cssProviderNew GTK.cssProviderLoadFromPath cssProvider themePath GTK.styleContextAddProviderForScreen screen cssProvider 1000 window <- GTK.windowNew GTK.WindowTypeToplevel windowWidgetPath <- GTK.widgetGetPath window widgetAddClass window "window" GTK.setWindowResizable window True GTK.setWindowDecorated window True GTK.setWindowTitle window "MetaBrush" GTK.windowSetDefaultSize window 800 600 let baseMinWidth, baseMinHeight :: Int32 baseMinWidth = 480 baseMinHeight = 240 windowGeometry <- GDK.newZeroGeometry GDK.setGeometryMinWidth windowGeometry baseMinWidth GDK.setGeometryMinHeight windowGeometry baseMinHeight GTK.windowSetGeometryHints window ( Nothing @GTK.Widget ) ( Just windowGeometry ) [ GDK.WindowHintsMinSize ] Colours { .. } <- colours windowWidgetPath --------------------------------------------------------- -- Create base UI elements baseOverlay <- GTK.overlayNew GTK.setContainerChild window baseOverlay uiGrid <- GTK.gridNew GTK.setContainerChild baseOverlay uiGrid logo <- GTK.boxNew GTK.OrientationVertical 0 titleBar <- GTK.boxNew GTK.OrientationHorizontal 0 toolBar <- GTK.boxNew GTK.OrientationVertical 0 fileBar <- GTK.boxNew GTK.OrientationHorizontal 0 mainView <- GTK.gridNew panelGrid <- GTK.gridNew infoBar <- GTK.boxNew GTK.OrientationHorizontal 0 GTK.gridAttach uiGrid logo 0 0 1 2 GTK.gridAttach uiGrid titleBar 1 0 3 1 GTK.gridAttach uiGrid toolBar 0 2 2 2 GTK.gridAttach uiGrid fileBar 2 1 1 1 GTK.gridAttach uiGrid mainView 2 2 1 1 GTK.gridAttach uiGrid panelGrid 3 2 1 2 GTK.gridAttach uiGrid infoBar 2 3 1 1 --------------------------------------------------------- -- Background widgetAddClass uiGrid "bg" --------------------------------------------------------- -- Logo widgetAddClass logo "logo" logoArea <- GTK.drawingAreaNew GTK.boxPackStart logo logoArea True True 0 _ <- GTK.onWidgetDraw logoArea $ Cairo.renderWithContext ( drawLogo logo_base logo_highlight logo_base ) --------------------------------------------------------- -- Title bar widgetAddClass titleBar "titleBar" ( menuBar, _menu ) <- newMenuBar widgetAddClasses menuBar [ "text", "plain" ] GTK.boxPackStart titleBar menuBar False False 0 title <- GTK.labelNew ( Just "● New Document – MetaBrush" ) widgetAddClasses title [ "text", "title", "plain" ] GTK.labelSetJustify title GTK.JustificationCenter GTK.widgetSetHalign title GTK.AlignCenter GTK.boxPackStart titleBar title True True 0 --------------------------------------------------------- -- Tool bar widgetAddClass toolBar "toolBar" --------------------------------------------------------- -- File bar widgetAddClass fileBar "fileBar" --------------------------------------------------------- -- Main viewport widgetAddClass mainView "viewport_bg" rvRulerCorner <- GTK.revealerNew rvLeftRuler <- GTK.revealerNew rvTopRuler <- GTK.revealerNew viewport <- GTK.drawingAreaNew GTK.gridAttach mainView rvRulerCorner 0 0 1 1 GTK.gridAttach mainView rvLeftRuler 0 1 1 1 GTK.gridAttach mainView rvTopRuler 1 0 1 1 GTK.gridAttach mainView viewport 1 1 1 1 rulerCorner <- GTK.boxNew GTK.OrientationVertical 0 leftRuler <- GTK.boxNew GTK.OrientationVertical 0 topRuler <- GTK.boxNew GTK.OrientationHorizontal 0 GTK.containerAdd rvRulerCorner rulerCorner GTK.containerAdd rvLeftRuler leftRuler GTK.containerAdd rvTopRuler topRuler widgetAddClass rulerCorner "ruler" widgetAddClass leftRuler "ruler" widgetAddClass topRuler "ruler" GTK.revealerSetRevealChild rvRulerCorner True GTK.revealerSetRevealChild rvLeftRuler True GTK.revealerSetRevealChild rvTopRuler True GTK.revealerSetTransitionType rvRulerCorner GTK.RevealerTransitionTypeSlideLeft GTK.revealerSetTransitionType rvLeftRuler GTK.RevealerTransitionTypeSlideLeft GTK.revealerSetTransitionType rvTopRuler GTK.RevealerTransitionTypeSlideUp rulerCornerArea <- GTK.drawingAreaNew GTK.boxPackStart rulerCorner rulerCornerArea True True 0 leftRulerArea <- GTK.drawingAreaNew GTK.boxPackStart leftRuler leftRulerArea True True 0 topRulerArea <- GTK.drawingAreaNew GTK.boxPackStart topRuler topRulerArea True True 0 GTK.widgetSetHexpand rulerCorner False GTK.widgetSetVexpand rulerCorner False GTK.widgetSetHexpand leftRuler False GTK.widgetSetVexpand leftRuler True GTK.widgetSetHexpand topRuler True GTK.widgetSetVexpand topRuler False GTK.widgetSetHexpand viewport True GTK.widgetSetVexpand viewport True --------------------------------------------------------- -- Panels widgetAddClass panelGrid "panels" --------------------------------------------------------- -- Info bar widgetAddClass infoBar "infoBar" --------------------------------------------------------- -- Actions --------------------------------------------------------- -- GTK main loop GTK.widgetAddEvents window [GDK.EventMaskKeyPressMask, GDK.EventMaskKeyReleaseMask] _ <- GTK.onWidgetKeyPressEvent window handleKeyboardPressEvent _ <- GTK.onWidgetKeyReleaseEvent window handleKeyboardReleaseEvent _ <- GTK.onWidgetDestroy window GTK.mainQuit GTK.widgetShowAll window GTK.main exitSuccess