From 1075c578da64698c07c0585515965f60444fb08f Mon Sep 17 00:00:00 2001 From: Francisco Vallarino Date: Wed, 2 Jun 2021 17:50:15 -0300 Subject: [PATCH] Add Monomer.Helper for not exported util functions --- src/Monomer/Core/SizeReq.hs | 1 + src/Monomer/Core/StyleUtil.hs | 13 +------ src/Monomer/Core/Util.hs | 38 ++++--------------- src/Monomer/Graphics/Color.hs | 7 +--- src/Monomer/Graphics/Drawing.hs | 5 +-- src/Monomer/Graphics/Text.hs | 1 + src/Monomer/Helper.hs | 28 ++++++++++++++ src/Monomer/Main/Handlers.hs | 1 + src/Monomer/Widgets/Animation/Slide.hs | 1 + src/Monomer/Widgets/Composite.hs | 1 + src/Monomer/Widgets/Containers/Dropdown.hs | 1 + src/Monomer/Widgets/Single.hs | 1 + .../Widgets/Singles/Base/InputField.hs | 1 + src/Monomer/Widgets/Singles/Dial.hs | 1 + src/Monomer/Widgets/Singles/Slider.hs | 1 + src/Monomer/Widgets/Singles/TextArea.hs | 1 + src/Monomer/Widgets/Util/Focus.hs | 1 + src/Monomer/Widgets/Util/Hover.hs | 1 + src/Monomer/Widgets/Util/Style.hs | 1 + tasks.md | 4 +- 20 files changed, 57 insertions(+), 52 deletions(-) create mode 100644 src/Monomer/Helper.hs diff --git a/src/Monomer/Core/SizeReq.hs b/src/Monomer/Core/SizeReq.hs index 3a682c6a..4f45e34b 100644 --- a/src/Monomer/Core/SizeReq.hs +++ b/src/Monomer/Core/SizeReq.hs @@ -34,6 +34,7 @@ import Monomer.Core.BasicTypes import Monomer.Core.StyleTypes import Monomer.Core.StyleUtil import Monomer.Core.Util +import Monomer.Helper import qualified Monomer.Core.Lens as L diff --git a/src/Monomer/Core/StyleUtil.hs b/src/Monomer/Core/StyleUtil.hs index c1f93a1e..4845fad6 100644 --- a/src/Monomer/Core/StyleUtil.hs +++ b/src/Monomer/Core/StyleUtil.hs @@ -31,8 +31,7 @@ module Monomer.Core.StyleUtil ( addOuterSize, addOuterBounds, removeOuterSize, - removeOuterBounds, - setStyleValue + removeOuterBounds ) where import Control.Lens ((&), (^.), (^?), (.~), (?~), _Just, non) @@ -258,13 +257,3 @@ borderWidths (Just border) = (bl, br, bt, bb) where justDef :: (Default a) => Maybe a -> a justDef val = fromMaybe def val - -setStyleValue style fieldL op value = newStyle where - val = _styleActive style - newStyle = style - & op (L.basic . non def . fieldL) value - & op (L.hover . non def . fieldL) value - & op (L.focus . non def . fieldL) value - & op (L.focusHover . non def . fieldL) value - & op (L.active . non def . fieldL) value - & op (L.disabled . non def . fieldL) value diff --git a/src/Monomer/Core/Util.hs b/src/Monomer/Core/Util.hs index c6be7536..98d7d278 100644 --- a/src/Monomer/Core/Util.hs +++ b/src/Monomer/Core/Util.hs @@ -25,6 +25,7 @@ import qualified Data.Text as T import Monomer.Core.BasicTypes import Monomer.Core.Style import Monomer.Core.WidgetTypes +import Monomer.Helper import qualified Monomer.Lens as L @@ -53,6 +54,13 @@ getLayoutDirection :: Bool -> LayoutDirection getLayoutDirection False = LayoutVertical getLayoutDirection True = LayoutHorizontal +-- | Filters user events from a list of WidgetRequests. +eventsFromReqs :: Seq (WidgetRequest s e) -> Seq e +eventsFromReqs reqs = seqCatMaybes mevents where + mevents = flip fmap reqs $ \case + RaiseEvent ev -> cast ev + _ -> Nothing + {-| Ignore events generated by the parent. Could be used to consume the tab key and avoid having the focus move to the next widget. @@ -267,36 +275,6 @@ isResizeAnyResult res = isResizeResult res || isResizeImmediateResult res isMacOS :: WidgetEnv s e -> Bool isMacOS wenv = _weOs wenv == "Mac OS X" --- | Checks if the first sequence is a prefix of the second. -seqStartsWith :: Eq a => Seq a -> Seq a -> Bool -seqStartsWith prefix seq = Seq.take (length prefix) seq == prefix - --- | Filters Nothing instances out of a Seq, and removes the Just wrapper. -seqCatMaybes :: Seq (Maybe a) -> Seq a -seqCatMaybes Empty = Empty -seqCatMaybes (x :<| xs) = case x of - Just val -> val :<| seqCatMaybes xs - _ -> seqCatMaybes xs - --- | Filters user events from a list of WidgetRequests. -eventsFromReqs :: Seq (WidgetRequest s e) -> Seq e -eventsFromReqs reqs = seqCatMaybes mevents where - mevents = flip fmap reqs $ \case - RaiseEvent ev -> cast ev - _ -> Nothing - --- Returns the maximum value of a given floating type. -maxNumericValue :: (RealFloat a) => a -maxNumericValue = x where - n = floatDigits x - b = floatRadix x - (_, u) = floatRange x - x = encodeFloat (b^n - 1) (u - n) - --- | Restricts a value to a given range. -clamp :: (Ord a) => a -> a -> a -> a -clamp mn mx = max mn . min mx - -- | Returns a string description of a node and its children. widgetTreeDesc :: Int -> WidgetNode s e -> String widgetTreeDesc level node = desc where diff --git a/src/Monomer/Graphics/Color.hs b/src/Monomer/Graphics/Color.hs index 0bcfa19b..bec8aa7d 100644 --- a/src/Monomer/Graphics/Color.hs +++ b/src/Monomer/Graphics/Color.hs @@ -20,6 +20,7 @@ module Monomer.Graphics.Color ( import Data.Char (digitToInt) import Monomer.Graphics.Types +import Monomer.Helper -- | Restricts a color channel to its valid range. clampChannel :: Int -> Int @@ -54,10 +55,6 @@ rgba r g b a = Color { _colorA = clampAlpha a } --- Creates a non visible color. +-- | Creates a non visible color. transparent :: Color transparent = rgba 0 0 0 0 - --- Helpers -clamp :: (Ord a) => a -> a -> a -> a -clamp mn mx = max mn . min mx diff --git a/src/Monomer/Graphics/Drawing.hs b/src/Monomer/Graphics/Drawing.hs index 224da87c..9b37749d 100644 --- a/src/Monomer/Graphics/Drawing.hs +++ b/src/Monomer/Graphics/Drawing.hs @@ -607,14 +607,11 @@ strokeBorder renderer from to (Just BorderSide{..}) = do renderLineTo renderer to stroke renderer -justDef :: (Default a) => Maybe a -> a -justDef val = fromMaybe def val - p2 :: Double -> Double -> Point p2 x y = Point x y radW :: Maybe RadiusCorner -> Double -radW r = _rcrWidth (justDef r) +radW r = _rcrWidth (fromMaybe def r) fixRadius :: Rect -> Radius -> Radius fixRadius (Rect _ _ w h) (Radius tl tr bl br) = newRadius where diff --git a/src/Monomer/Graphics/Text.hs b/src/Monomer/Graphics/Text.hs index 040b6914..105fe96d 100644 --- a/src/Monomer/Graphics/Text.hs +++ b/src/Monomer/Graphics/Text.hs @@ -39,6 +39,7 @@ import Monomer.Core.BasicTypes import Monomer.Core.StyleTypes import Monomer.Core.StyleUtil import Monomer.Graphics.Types +import Monomer.Helper import Monomer.Lens as L diff --git a/src/Monomer/Helper.hs b/src/Monomer/Helper.hs new file mode 100644 index 00000000..1cb33ad6 --- /dev/null +++ b/src/Monomer/Helper.hs @@ -0,0 +1,28 @@ +module Monomer.Helper where + +import Data.Sequence (Seq(..)) + +import qualified Data.Sequence as Seq + +-- | Checks if the first sequence is a prefix of the second. +seqStartsWith :: Eq a => Seq a -> Seq a -> Bool +seqStartsWith prefix seq = Seq.take (length prefix) seq == prefix + +-- | Filters Nothing instances out of a Seq, and removes the Just wrapper. +seqCatMaybes :: Seq (Maybe a) -> Seq a +seqCatMaybes Empty = Empty +seqCatMaybes (x :<| xs) = case x of + Just val -> val :<| seqCatMaybes xs + _ -> seqCatMaybes xs + +-- Returns the maximum value of a given floating type. +maxNumericValue :: (RealFloat a) => a +maxNumericValue = x where + n = floatDigits x + b = floatRadix x + (_, u) = floatRange x + x = encodeFloat (b^n - 1) (u - n) + +-- | Restricts a value to a given range. +clamp :: (Ord a) => a -> a -> a -> a +clamp mn mx = max mn . min mx diff --git a/src/Monomer/Main/Handlers.hs b/src/Monomer/Main/Handlers.hs index ff79b1b7..1e790f34 100644 --- a/src/Monomer/Main/Handlers.hs +++ b/src/Monomer/Main/Handlers.hs @@ -51,6 +51,7 @@ import qualified SDL.Raw.Types as SDLT import Monomer.Core import Monomer.Event +import Monomer.Helper import Monomer.Main.Types import Monomer.Main.Util diff --git a/src/Monomer/Widgets/Animation/Slide.hs b/src/Monomer/Widgets/Animation/Slide.hs index 534966dd..b65cbfda 100644 --- a/src/Monomer/Widgets/Animation/Slide.hs +++ b/src/Monomer/Widgets/Animation/Slide.hs @@ -45,6 +45,7 @@ import GHC.Generics import qualified Data.Sequence as Seq +import Monomer.Helper import Monomer.Widgets.Container import Monomer.Widgets.Animation.Types diff --git a/src/Monomer/Widgets/Composite.hs b/src/Monomer/Widgets/Composite.hs index 4b8b2308..ec37ed59 100644 --- a/src/Monomer/Widgets/Composite.hs +++ b/src/Monomer/Widgets/Composite.hs @@ -87,6 +87,7 @@ import Monomer.Core import Monomer.Core.Combinators import Monomer.Event import Monomer.Graphics +import Monomer.Helper import Monomer.Widgets.Singles.Spacer import Monomer.Widgets.Util diff --git a/src/Monomer/Widgets/Containers/Dropdown.hs b/src/Monomer/Widgets/Containers/Dropdown.hs index 1b1808c5..359b3c1d 100644 --- a/src/Monomer/Widgets/Containers/Dropdown.hs +++ b/src/Monomer/Widgets/Containers/Dropdown.hs @@ -56,6 +56,7 @@ import GHC.Generics import qualified Data.Sequence as Seq +import Monomer.Helper import Monomer.Widgets.Container import Monomer.Widgets.Containers.SelectList import Monomer.Widgets.Singles.Label diff --git a/src/Monomer/Widgets/Single.hs b/src/Monomer/Widgets/Single.hs index dd8e36ba..a85e7cd4 100644 --- a/src/Monomer/Widgets/Single.hs +++ b/src/Monomer/Widgets/Single.hs @@ -48,6 +48,7 @@ import Monomer.Core import Monomer.Core.Combinators import Monomer.Event import Monomer.Graphics +import Monomer.Helper import Monomer.Widgets.Util import qualified Monomer.Lens as L diff --git a/src/Monomer/Widgets/Singles/Base/InputField.hs b/src/Monomer/Widgets/Singles/Base/InputField.hs index 7ef7c2f0..9b691e72 100644 --- a/src/Monomer/Widgets/Singles/Base/InputField.hs +++ b/src/Monomer/Widgets/Singles/Base/InputField.hs @@ -37,6 +37,7 @@ import GHC.Generics import qualified Data.Sequence as Seq import qualified Data.Text as T +import Monomer.Helper import Monomer.Widgets.Single import qualified Monomer.Lens as L diff --git a/src/Monomer/Widgets/Singles/Dial.hs b/src/Monomer/Widgets/Singles/Dial.hs index f4891620..76d28950 100644 --- a/src/Monomer/Widgets/Singles/Dial.hs +++ b/src/Monomer/Widgets/Singles/Dial.hs @@ -48,6 +48,7 @@ import GHC.Generics import qualified Data.Sequence as Seq +import Monomer.Helper import Monomer.Widgets.Single import qualified Monomer.Lens as L diff --git a/src/Monomer/Widgets/Singles/Slider.hs b/src/Monomer/Widgets/Singles/Slider.hs index 1ea9cb3c..7f3236cc 100644 --- a/src/Monomer/Widgets/Singles/Slider.hs +++ b/src/Monomer/Widgets/Singles/Slider.hs @@ -54,6 +54,7 @@ import GHC.Generics import qualified Data.Sequence as Seq +import Monomer.Helper import Monomer.Widgets.Single import qualified Monomer.Lens as L diff --git a/src/Monomer/Widgets/Singles/TextArea.hs b/src/Monomer/Widgets/Singles/TextArea.hs index d7a32fef..a8be401f 100644 --- a/src/Monomer/Widgets/Singles/TextArea.hs +++ b/src/Monomer/Widgets/Singles/TextArea.hs @@ -49,6 +49,7 @@ import GHC.Generics import qualified Data.Sequence as Seq import qualified Data.Text as T +import Monomer.Helper import Monomer.Widgets.Containers.Scroll import Monomer.Widgets.Single diff --git a/src/Monomer/Widgets/Util/Focus.hs b/src/Monomer/Widgets/Util/Focus.hs index a951bf16..1d10a3ba 100644 --- a/src/Monomer/Widgets/Util/Focus.hs +++ b/src/Monomer/Widgets/Util/Focus.hs @@ -31,6 +31,7 @@ import qualified Data.Sequence as Seq import Monomer.Core import Monomer.Event.Types +import Monomer.Helper import Monomer.Widgets.Util.Hover import Monomer.Widgets.Util.Widget diff --git a/src/Monomer/Widgets/Util/Hover.hs b/src/Monomer/Widgets/Util/Hover.hs index 9440275e..ae93a819 100644 --- a/src/Monomer/Widgets/Util/Hover.hs +++ b/src/Monomer/Widgets/Util/Hover.hs @@ -31,6 +31,7 @@ import Monomer.Core import Monomer.Event.Types import Monomer.Event.Util import Monomer.Graphics.Types +import Monomer.Helper import qualified Monomer.Lens as L diff --git a/src/Monomer/Widgets/Util/Style.hs b/src/Monomer/Widgets/Util/Style.hs index c3a19f98..aa985821 100644 --- a/src/Monomer/Widgets/Util/Style.hs +++ b/src/Monomer/Widgets/Util/Style.hs @@ -37,6 +37,7 @@ import qualified Data.Sequence as Seq import Monomer.Core import Monomer.Event import Monomer.Graphics +import Monomer.Helper import Monomer.Widgets.Util.Focus import Monomer.Widgets.Util.Hover import Monomer.Widgets.Util.Types diff --git a/tasks.md b/tasks.md index e7281ec2..391bc204 100644 --- a/tasks.md +++ b/tasks.md @@ -644,10 +644,12 @@ - KeyReleased / BtnReleased is inconsistent. Use a single convention. - restrictValue -> clamp. - Split CmbImageFit + - Does adding all the isXXXXEvent back make sense? Added. Next - Review after documenting - - Does adding all the isXXXXEvent back make sense? + - CmbVisible and CmbVisible. + - Add Event Util isXXXX. - Can validModel (inputField) handle WidgetData instead of only Lens? - Check _wniOverlay. Can it be replaced with overlayPath check? - Scroll related test case is also weird.