metabrush/app/Main.hs

240 lines
6.9 KiB
Haskell
Raw Normal View History

2020-08-05 20:23:16 +00:00
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeApplications #-}
2020-08-04 06:15:06 +00:00
module Main
( main )
where
2020-08-05 20:23:16 +00:00
-- base
import Data.Int
( Int32 )
import System.Exit
( exitSuccess )
-- directory
import qualified System.Directory as Directory
( canonicalizePath )
2020-08-04 06:15:06 +00:00
-- 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
2020-08-05 20:23:16 +00:00
-- text
import qualified Data.Text as Text
( pack )
2020-08-04 06:15:06 +00:00
-- MetaBrush
2020-08-05 20:23:16 +00:00
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
2020-08-04 06:15:06 +00:00
( getDataFileName )
--------------------------------------------------------------------------------
main :: IO ()
main = do
---------------------------------------------------------
-- Initialise GTK
_ <- GTK.init Nothing
Just screen <- GDK.screenGetDefault
2020-08-05 20:23:16 +00:00
themePath <- Text.pack <$> ( Directory.canonicalizePath =<< Cabal.getDataFileName "theme.css" )
2020-08-04 06:15:06 +00:00
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
2020-08-05 20:23:16 +00:00
GTK.setWindowDecorated window True
2020-08-04 06:15:06 +00:00
GTK.setWindowTitle window "MetaBrush"
GTK.windowSetDefaultSize window 800 600
let
baseMinWidth, baseMinHeight :: Int32
2020-08-05 20:23:16 +00:00
baseMinWidth = 480
2020-08-04 06:15:06 +00:00
baseMinHeight = 240
windowGeometry <- GDK.newZeroGeometry
GDK.setGeometryMinWidth windowGeometry baseMinWidth
GDK.setGeometryMinHeight windowGeometry baseMinHeight
GTK.windowSetGeometryHints window ( Nothing @GTK.Widget )
( Just windowGeometry )
[ GDK.WindowHintsMinSize ]
2020-08-05 20:23:16 +00:00
Colours { .. } <- colours windowWidgetPath
2020-08-04 06:15:06 +00:00
---------------------------------------------------------
-- Create base UI elements
baseOverlay <- GTK.overlayNew
2020-08-05 20:23:16 +00:00
GTK.setContainerChild window baseOverlay
2020-08-04 06:15:06 +00:00
uiGrid <- GTK.gridNew
2020-08-05 20:23:16 +00:00
GTK.setContainerChild baseOverlay uiGrid
2020-08-04 06:15:06 +00:00
2020-08-05 21:30:36 +00:00
logo <- GTK.boxNew GTK.OrientationVertical 0
titleBar <- GTK.boxNew GTK.OrientationHorizontal 0
toolBar <- GTK.boxNew GTK.OrientationVertical 0
fileBar <- GTK.boxNew GTK.OrientationHorizontal 0
mainPane <- GTK.panedNew GTK.OrientationHorizontal
2020-08-04 06:15:06 +00:00
panelGrid <- GTK.gridNew
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
2020-08-05 21:30:36 +00:00
GTK.gridAttach uiGrid mainPane 2 2 2 3
mainView <- GTK.boxNew GTK.OrientationVertical 0
viewportGrid <- GTK.gridNew
infoBar <- GTK.boxNew GTK.OrientationHorizontal 0
GTK.panedPack1 mainPane mainView True False
GTK.panedPack2 mainPane panelGrid False False
GTK.boxPackStart mainView viewportGrid True True 0
GTK.boxPackStart mainView infoBar False False 0
2020-08-04 06:15:06 +00:00
2020-08-05 20:23:16 +00:00
---------------------------------------------------------
-- 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
2020-08-05 21:30:36 +00:00
windowIcons <- GTK.boxNew GTK.OrientationHorizontal 0
widgetAddClasses windowIcons [ "windowIcon" ]
GTK.boxPackEnd titleBar windowIcons False False 0
2020-08-05 20:23:16 +00:00
title <- GTK.labelNew ( Just "● New Document MetaBrush" )
widgetAddClasses title [ "text", "title", "plain" ]
2020-08-05 21:30:36 +00:00
GTK.boxSetCenterWidget titleBar ( Just title )
2020-08-05 20:23:16 +00:00
---------------------------------------------------------
-- Tool bar
widgetAddClass toolBar "toolBar"
---------------------------------------------------------
-- File bar
widgetAddClass fileBar "fileBar"
---------------------------------------------------------
-- Main viewport
2020-08-05 21:30:36 +00:00
widgetAddClass viewportGrid "viewport_bg"
2020-08-05 20:23:16 +00:00
rvRulerCorner <- GTK.revealerNew
rvLeftRuler <- GTK.revealerNew
rvTopRuler <- GTK.revealerNew
viewport <- GTK.drawingAreaNew
2020-08-05 21:30:36 +00:00
GTK.gridAttach viewportGrid rvRulerCorner 0 0 1 1
GTK.gridAttach viewportGrid rvLeftRuler 0 1 1 1
GTK.gridAttach viewportGrid rvTopRuler 1 0 1 1
GTK.gridAttach viewportGrid viewport 1 1 1 1
2020-08-05 20:23:16 +00:00
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"
---------------------------------------------------------
2020-08-04 06:15:06 +00:00
-- Actions
2020-08-05 20:23:16 +00:00
---------------------------------------------------------
-- GTK main loop
2020-08-04 06:15:06 +00:00
2020-08-05 20:23:16 +00:00
GTK.widgetAddEvents window [GDK.EventMaskKeyPressMask, GDK.EventMaskKeyReleaseMask]
_ <- GTK.onWidgetKeyPressEvent window handleKeyboardPressEvent
_ <- GTK.onWidgetKeyReleaseEvent window handleKeyboardReleaseEvent
_ <- GTK.onWidgetDestroy window GTK.mainQuit
2020-08-04 06:15:06 +00:00
GTK.widgetShowAll window
GTK.main
2020-08-05 20:23:16 +00:00
exitSuccess