module Graphics.Vty.Widgets.Limits
( VLimit
, HLimit
, hLimit
, vLimit
, boxLimit
, setVLimit
, setHLimit
, addToVLimit
, addToHLimit
, getVLimit
, getHLimit
)
where
import Control.Monad
import Graphics.Vty
import Graphics.Vty.Widgets.Core
import Graphics.Vty.Widgets.Util
data HLimit a = (Show a) => HLimit Int (Widget a)
instance Show (HLimit a) where
show (HLimit i _) = "HLimit { width = " ++ show i ++ ", ... }"
hLimit :: (Show a) => Int -> Widget a -> IO (Widget (HLimit a))
hLimit maxWidth child = do
let initSt = HLimit maxWidth child
wRef <- newWidget initSt $ \w ->
w { growHorizontal_ = const $ return False
, growVertical_ = const $ growVertical child
, render_ = \this s ctx -> do
HLimit width ch <- getState this
let region = s `withWidth` fromIntegral (min (toEnum width) (region_width s))
render ch region ctx
, setCurrentPosition_ =
\this pos -> do
HLimit _ ch <- getState this
setCurrentPosition ch pos
, getCursorPosition_ = \this -> do
HLimit _ ch <- getState this
getCursorPosition ch
}
wRef `relayKeyEvents` child
wRef `relayFocusEvents` child
return wRef
data VLimit a = (Show a) => VLimit Int (Widget a)
instance Show (VLimit a) where
show (VLimit i _) = "VLimit { height = " ++ show i ++ ", ... }"
vLimit :: (Show a) => Int -> Widget a -> IO (Widget (VLimit a))
vLimit maxHeight child = do
let initSt = VLimit maxHeight child
wRef <- newWidget initSt $ \w ->
w { growHorizontal_ = const $ growHorizontal child
, growVertical_ = const $ return False
, render_ = \this s ctx -> do
VLimit height ch <- getState this
let region = s `withHeight` fromIntegral (min (toEnum height) (region_height s))
render ch region ctx
, setCurrentPosition_ =
\this pos -> do
VLimit _ ch <- getState this
setCurrentPosition ch pos
, getCursorPosition_ = \this -> do
VLimit _ ch <- getState this
getCursorPosition ch
}
wRef `relayKeyEvents` child
wRef `relayFocusEvents` child
return wRef
setVLimit :: Widget (VLimit a) -> Int -> IO ()
setVLimit wRef lim =
when (lim >= 1) $
updateWidgetState wRef $ \(VLimit _ ch) -> VLimit lim ch
setHLimit :: Widget (HLimit a) -> Int -> IO ()
setHLimit wRef lim =
when (lim >= 1) $
updateWidgetState wRef $ \(HLimit _ ch) -> HLimit lim ch
addToVLimit :: Widget (VLimit a) -> Int -> IO ()
addToVLimit wRef delta = do
lim <- getVLimit wRef
setVLimit wRef $ lim + delta
addToHLimit :: Widget (HLimit a) -> Int -> IO ()
addToHLimit wRef delta = do
lim <- getHLimit wRef
setHLimit wRef $ lim + delta
getVLimit :: Widget (VLimit a) -> IO Int
getVLimit wRef = do
(VLimit lim _) <- state <~ wRef
return lim
getHLimit :: Widget (HLimit a) -> IO Int
getHLimit wRef = do
(HLimit lim _) <- state <~ wRef
return lim
boxLimit :: (Show a) =>
Int
-> Int
-> Widget a
-> IO (Widget (VLimit (HLimit a)))
boxLimit maxWidth maxHeight w = do
ch <- hLimit maxWidth w
vLimit maxHeight ch