packages feed

phoityne-0.0.1.0: app/Phoityne/IO/GUI/GTK/ConsoleView.hs

{-# LANGUAGE GADTs               #-}
{-# LANGUAGE LambdaCase          #-}
{-# LANGUAGE MultiWayIf          #-}
{-# LANGUAGE BinaryLiterals      #-}
{-# LANGUAGE TemplateHaskell     #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DeriveDataTypeable  #-}

module Phoityne.IO.GUI.GTK.ConsoleView (
  ConsoleDoubleClickedHandler
, setupConsoleView
, putStrConsole
, putStrLnConsole
, clearConsole
) where

-- モジュール
import Phoityne.IO.GUI.GTK.Constant
import Phoityne.IO.GUI.GTK.Utility

-- システム
import GHC.Float
import Graphics.UI.Gtk
import Control.Monad.IO.Class
import qualified Data.Text as T

-- |
--
--
type ConsoleDoubleClickedHandler = String -> IO ()

-- |
--
--
setupConsoleView :: Builder -> ConsoleDoubleClickedHandler -> IO ()
setupConsoleView builder evh = do
  textView <- builderGetObject builder castToTextView _NAME_CONSOLE_TEXT_VIEW

  _ <- on textView buttonPressEvent $ consoleDoubleClickedHandler textView evh
  _ <- on textView keyPressEvent $ eventKeyName >>= \k->if k==T.pack("F7") then return True else return False

  let widget = castToWidget textView

  fontDesc <- fontDescriptionNew
  fontDescriptionSetFamily fontDesc (_FONT_DESC)
  fontDescriptionSetSize fontDesc 9
  widgetOverrideFont widget $ Just fontDesc


-- |
--
--
consoleDoubleClickedHandler :: TextView -> ConsoleDoubleClickedHandler -> EventM EButton Bool
consoleDoubleClickedHandler self evh = eventClick >>= \case
  DoubleClick -> doubleClicked >> return True
  _           -> return False

  where
    doubleClicked = do
      (_, posYd) <- eventCoordinates 
      liftIO $ do
        scrollY <- textViewGetVadjustment self >>= adjustmentGetValue
        let posY = scrollY + posYd

        (stIter, _) <- textViewGetLineAtY self $ double2Int posY
        edIter <- textIterCopy stIter
        _ <- textViewForwardDisplayLineEnd self edIter
        buf  <- textViewGetBuffer self
        str <- textBufferGetText buf stIter edIter True
        evh str


-- |
--
--
clearConsole :: Builder -> IO ()
clearConsole builder = do
  view <- builderGetObject builder castToTextView _NAME_CONSOLE_TEXT_VIEW
  buf <- textViewGetBuffer view
  textBufferSetText buf (""::String)


-- |
--
--
putStrConsole :: Builder -> String -> IO ()
putStrConsole = append2Console

-- |
--
--
putStrLnConsole :: Builder -> String -> IO ()
putStrLnConsole builder str = append2Console builder (str ++ "\n")

-- |
--
--
append2Console :: Builder -> String -> IO ()
append2Console builder msg = do

  textView <- builderGetObject builder castToTextView _NAME_CONSOLE_TEXT_VIEW
  buf <- textViewGetBuffer textView
  iter <- textBufferGetEndIter buf
  textBufferInsert buf iter msg

  window <- builderGetObject builder castToWindow _WINDOW_NAME
  widgetShowAll window

  scroll <- builderGetObject builder castToScrolledWindow _NAME_CONSOLE_SCROLLED_WINDOW
  widgetShowAll scroll

  forceEvent

  lineNum <- textBufferGetLineCount buf
  iter <- textBufferGetIterAtLine buf lineNum
  _ <- textViewScrollToIter textView iter 0.0 Nothing

  forceEvent

  return ()