Skip to content

Commit

Permalink
refactor out renderDialog
Browse files Browse the repository at this point in the history
  • Loading branch information
wavewave committed Sep 26, 2023
1 parent 07cadca commit 2dd8821
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 29 deletions.
45 changes: 19 additions & 26 deletions daemon/app/ghc-specter-daemon/Render.hs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import Control.Concurrent.STM
import Control.Monad (when)
import Control.Monad.Extra (loopM, whenM)
import Control.Monad.IO.Class (MonadIO (..))
import Control.Monad.Trans.State (execStateT, get, modify')
import Control.Monad.Trans.State (execStateT, get, modify', put)
import Data.Bits ((.|.))
import Data.List.NonEmpty (NonEmpty)
import Data.Maybe (isNothing)
Expand Down Expand Up @@ -42,8 +42,7 @@ import GHCSpecter.UI.Types.Event
import Handler (sendToControl)
import ImGui
import ImGui.Enum
( ImGuiCond_ (..),
ImGuiDir_ (..),
( ImGuiDir_ (..),
ImGuiKey (..),
ImGuiMouseButton_ (..),
ImGuiStyleVar_ (..),
Expand Down Expand Up @@ -88,6 +87,7 @@ import Util.Render
( SharedState (..),
c_detectScaleFactor,
loadAllFonts,
renderDialog,
)

singleFrame ::
Expand Down Expand Up @@ -161,30 +161,23 @@ singleFrame io window ui ss oldShared = do

-- dialog box test
when newShared.sharedPopup1 $ do
liftIO $ openPopup ("About ghc-specter" :: CString) 0
center <- liftIO $ imGuiViewport_GetCenter viewport
rel_pos <- liftIO $ newImVec2 0.5 0.5
liftIO $ setNextWindowPos center (fromIntegral (fromEnum ImGuiCond_Appearing)) rel_pos
liftIO $ delete rel_pos
let flag = fromIntegral (fromEnum ImGuiWindowFlags_AlwaysAutoResize)
whenM (toBool <$> liftIO (beginPopupModal ("About ghc-specter" :: CString) nullPtr flag)) $ do
liftIO $ textUnformatted ("ghc-specter 1.0.0.0" :: CString)
whenM (toBool <$> liftIO (button ("close" :: CString))) $
modify' (\s -> s {sharedPopup1 = False})
liftIO endPopup

newShared' <-
liftIO $
renderDialog
"About ghc-specter"
"ghc-specter 1.0.0.0"
(\b s -> s {sharedPopup1 = b})
newShared
put newShared'
when newShared.sharedPopup2 $ do
liftIO $ openPopup ("HelpABC" :: CString) 0
center <- liftIO $ imGuiViewport_GetCenter viewport
rel_pos <- liftIO $ newImVec2 0.5 0.5
liftIO $ setNextWindowPos center (fromIntegral (fromEnum ImGuiCond_Appearing)) rel_pos
-- liftIO $ delete rel_pos
let flag = fromIntegral (fromEnum ImGuiWindowFlags_AlwaysAutoResize)
whenM (toBool <$> liftIO (beginPopupModal ("HelpABC" :: CString) nullPtr flag)) $ do
liftIO $ textUnformatted ("I cannot help you now." :: CString)
whenM (toBool <$> liftIO (button ("close" :: CString))) $
modify' (\s -> s {sharedPopup2 = False})
liftIO endPopup
newShared' <-
liftIO $
renderDialog
"Help"
"I cannot help you now"
(\b s -> s {sharedPopup2 = b})
newShared
put newShared'

-- fullscreen window
let flags =
Expand Down
39 changes: 36 additions & 3 deletions daemon/app/ghc-specter-daemon/Util/Render.hs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ module Util.Render

-- * rendering console
renderConsoleItem,

-- * render dialog
renderDialog,
)
where

Expand All @@ -44,7 +47,7 @@ import Control.Concurrent.STM
writeTVar,
)
import Control.Monad (when)
import Control.Monad.Extra (whenM)
import Control.Monad.Extra (ifM, whenM)
import Control.Monad.IO.Class (MonadIO (liftIO))
import Control.Monad.Reader (MonadReader (..))
import Control.Monad.Trans.Class (lift)
Expand All @@ -66,7 +69,7 @@ import Foreign.C.String (CString, withCString)
import Foreign.C.Types (CFloat (..))
import Foreign.Marshal.Array (allocaArray)
import Foreign.Marshal.Utils (fromBool, toBool)
import Foreign.Ptr (Ptr, castPtr)
import Foreign.Ptr (Ptr, castPtr, nullPtr)
import Foreign.Storable (pokeElemOff)
import GHCSpecter.Graphics.DSL
( DrawText (..),
Expand All @@ -90,6 +93,10 @@ import GHCSpecter.UI.Types.Event
UserEvent (..),
)
import ImGui
import ImGui.Enum
( ImGuiCond_ (..),
ImGuiWindowFlags_ (..),
)
import ImGui.ImFont.Implementation (imFont_Scale_set)
import STD.Deletable (delete)
import Util.Color (getNamedColor)
Expand All @@ -109,6 +116,7 @@ data SharedState e = SharedState
sharedIsMouseMoved :: Bool,
sharedIsClicked :: Bool,
sharedTabState :: Maybe Tab,
-- TODO: this is impure. should be out of the pure state.
sharedChanQEv :: TQueue Event,
sharedFontsSans :: NonEmpty (Int, ImFont),
sharedFontsMono :: NonEmpty (Int, ImFont),
Expand All @@ -125,7 +133,8 @@ data SharedState e = SharedState
}

data ImRenderState = ImRenderState
{ currDrawList :: ImDrawList,
{ -- TODO: this is impure.
currDrawList :: ImDrawList,
currOriginInImGui :: (Double, Double),
currUpperLeftInGlobalViewport :: (Double, Double),
currUpperLeftInLocalViewport :: (Double, Double),
Expand Down Expand Up @@ -389,3 +398,27 @@ renderConsoleItem s (ConsoleButton buttonss) = do
renderConsoleItem _ (ConsoleCore forest) = liftIO $ T.withCString (T.unlines $ fmap render1 forest) textUnformatted
where
render1 tr = T.pack $ drawTree $ fmap show tr

renderDialog :: Text -> Text -> (Bool -> SharedState e -> SharedState e) -> SharedState e -> IO (SharedState e)
renderDialog id' content setter shared =
T.withCString id' $ \c_id ->
T.withCString content $ \c_content -> do
viewport <- getMainViewport
openPopup c_id 0
center <- imGuiViewport_GetCenter viewport
rel_pos <- newImVec2 0.5 0.5
setNextWindowPos center (fromIntegral (fromEnum ImGuiCond_Appearing)) rel_pos
delete rel_pos
let flag = fromIntegral (fromEnum ImGuiWindowFlags_AlwaysAutoResize)
ifM
(toBool <$> beginPopupModal c_id nullPtr flag)
( do
textUnformatted c_content
isClosePressed <- toBool <$> button ("close" :: CString)
let shared'
| isClosePressed = setter False shared
| otherwise = shared
endPopup
pure shared'
)
(pure shared)

0 comments on commit 2dd8821

Please sign in to comment.