{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, TypeSynonymInstances #-}
module XMonad.Layout.Column (
Column (..)
) where
import XMonad
import qualified XMonad.StackSet as W
data Column a = Column Float deriving (ReadPrec [Column a]
ReadPrec (Column a)
Int -> ReadS (Column a)
ReadS [Column a]
(Int -> ReadS (Column a))
-> ReadS [Column a]
-> ReadPrec (Column a)
-> ReadPrec [Column a]
-> Read (Column a)
forall a. ReadPrec [Column a]
forall a. ReadPrec (Column a)
forall a. Int -> ReadS (Column a)
forall a. ReadS [Column a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Column a]
$creadListPrec :: forall a. ReadPrec [Column a]
readPrec :: ReadPrec (Column a)
$creadPrec :: forall a. ReadPrec (Column a)
readList :: ReadS [Column a]
$creadList :: forall a. ReadS [Column a]
readsPrec :: Int -> ReadS (Column a)
$creadsPrec :: forall a. Int -> ReadS (Column a)
Read,Int -> Column a -> ShowS
[Column a] -> ShowS
Column a -> String
(Int -> Column a -> ShowS)
-> (Column a -> String) -> ([Column a] -> ShowS) -> Show (Column a)
forall a. Int -> Column a -> ShowS
forall a. [Column a] -> ShowS
forall a. Column a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Column a] -> ShowS
$cshowList :: forall a. [Column a] -> ShowS
show :: Column a -> String
$cshow :: forall a. Column a -> String
showsPrec :: Int -> Column a -> ShowS
$cshowsPrec :: forall a. Int -> Column a -> ShowS
Show)
instance LayoutClass Column a where
pureLayout :: Column a -> Rectangle -> Stack a -> [(a, Rectangle)]
pureLayout = Column a -> Rectangle -> Stack a -> [(a, Rectangle)]
forall a. Column a -> Rectangle -> Stack a -> [(a, Rectangle)]
columnLayout
pureMessage :: Column a -> SomeMessage -> Maybe (Column a)
pureMessage = Column a -> SomeMessage -> Maybe (Column a)
forall a. Column a -> SomeMessage -> Maybe (Column a)
columnMessage
columnMessage :: Column a -> SomeMessage -> Maybe (Column a)
columnMessage :: Column a -> SomeMessage -> Maybe (Column a)
columnMessage (Column q :: Float
q) m :: SomeMessage
m = (Resize -> Column a) -> Maybe Resize -> Maybe (Column a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Resize -> Column a
forall a. Resize -> Column a
resize (SomeMessage -> Maybe Resize
forall m. Message m => SomeMessage -> Maybe m
fromMessage SomeMessage
m)
where resize :: Resize -> Column a
resize Shrink = Float -> Column a
forall a. Float -> Column a
Column (Float
qFloat -> Float -> Float
forall a. Num a => a -> a -> a
-0.1)
resize Expand = Float -> Column a
forall a. Float -> Column a
Column (Float
qFloat -> Float -> Float
forall a. Num a => a -> a -> a
+0.1)
columnLayout :: Column a -> Rectangle -> W.Stack a -> [(a,Rectangle)]
columnLayout :: Column a -> Rectangle -> Stack a -> [(a, Rectangle)]
columnLayout (Column q :: Float
q) rect :: Rectangle
rect stack :: Stack a
stack = [a] -> [Rectangle] -> [(a, Rectangle)]
forall a b. [a] -> [b] -> [(a, b)]
zip [a]
ws [Rectangle]
rects
where ws :: [a]
ws = Stack a -> [a]
forall a. Stack a -> [a]
W.integrate Stack a
stack
n :: Int
n = [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
ws
heights :: [Dimension]
heights = (Int -> Dimension) -> [Int] -> [Dimension]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Rectangle -> Float -> Int -> Dimension
xn Int
n Rectangle
rect Float
q) [1..Int
n]
ys :: [Position]
ys = [Dimension -> Position
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Dimension -> Position) -> Dimension -> Position
forall a b. (a -> b) -> a -> b
$ [Dimension] -> Dimension
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([Dimension] -> Dimension) -> [Dimension] -> Dimension
forall a b. (a -> b) -> a -> b
$ Int -> [Dimension] -> [Dimension]
forall a. Int -> [a] -> [a]
take Int
k [Dimension]
heights | Int
k <- [0..Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-1]]
rects :: [Rectangle]
rects = ((Dimension, Position) -> Rectangle)
-> [(Dimension, Position)] -> [Rectangle]
forall a b. (a -> b) -> [a] -> [b]
map (Rectangle -> (Dimension, Position) -> Rectangle
mkRect Rectangle
rect) ([(Dimension, Position)] -> [Rectangle])
-> [(Dimension, Position)] -> [Rectangle]
forall a b. (a -> b) -> a -> b
$ [Dimension] -> [Position] -> [(Dimension, Position)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Dimension]
heights [Position]
ys
mkRect :: Rectangle -> (Dimension,Position) -> Rectangle
mkRect :: Rectangle -> (Dimension, Position) -> Rectangle
mkRect (Rectangle xs :: Position
xs ys :: Position
ys ws :: Dimension
ws _) (h :: Dimension
h,y :: Position
y) = Position -> Position -> Dimension -> Dimension -> Rectangle
Rectangle Position
xs (Position
ysPosition -> Position -> Position
forall a. Num a => a -> a -> a
+Position -> Position
forall a b. (Integral a, Num b) => a -> b
fromIntegral Position
y) Dimension
ws Dimension
h
xn :: Int -> Rectangle -> Float -> Int -> Dimension
xn :: Int -> Rectangle -> Float -> Int -> Dimension
xn n :: Int
n (Rectangle _ _ _ h :: Dimension
h) q :: Float
q k :: Int
k = if Float
qFloat -> Float -> Bool
forall a. Eq a => a -> a -> Bool
==1 then
Dimension
h Dimension -> Dimension -> Dimension
forall a. Integral a => a -> a -> a
`div` (Int -> Dimension
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n)
else
Float -> Dimension
forall a b. (RealFrac a, Integral b) => a -> b
round ((Dimension -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral Dimension
h)Float -> Float -> Float
forall a. Num a => a -> a -> a
*Float
qFloat -> Int -> Float
forall a b. (Num a, Integral b) => a -> b -> a
^(Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
k)Float -> Float -> Float
forall a. Num a => a -> a -> a
*(1Float -> Float -> Float
forall a. Num a => a -> a -> a
-Float
q)Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/(1Float -> Float -> Float
forall a. Num a => a -> a -> a
-Float
qFloat -> Int -> Float
forall a b. (Num a, Integral b) => a -> b -> a
^Int
n))