[Spiral] blend in the scale factor so it doesn't have any effect on the smallest windows

This commit is contained in:
joe.thornber 2007-05-25 03:27:32 +00:00
parent ead2838015
commit d9386f5185

View File

@ -24,20 +24,27 @@ mkRatios _ = []
data Direction = East | South | West | North deriving (Enum) data Direction = East | South | West | North deriving (Enum)
blend :: Rational -> [Rational] -> [Rational]
blend scale ratios = zipWith (+) ratios scaleFactors
where
len = length ratios
step = (scale - (1 % 1)) / (fromIntegral len)
scaleFactors = map (* step) . reverse . take len $ [0..]
spiral :: Rational -> Layout spiral :: Rational -> Layout
spiral scale = Layout { doLayout = fibLayout, spiral scale = Layout { doLayout = fibLayout,
modifyLayout = \m -> fmap resize $ fromMessage m } modifyLayout = \m -> fmap resize $ fromMessage m }
where where
fibLayout sc ws = return $ zip ws rects fibLayout sc ws = return $ zip ws rects
where ratios = map (* scale) . reverse . take (length ws) . mkRatios $ fibs where ratios = blend scale . reverse . take (length ws - 1) . mkRatios $ tail fibs
rects = divideRects (zip ratios (cycle [East .. North])) sc rects = divideRects (zip ratios (cycle [East .. North])) sc
resize Expand = spiral $ (21 % 20) * scale resize Expand = spiral $ (21 % 20) * scale
resize Shrink = spiral $ (20 % 21) * scale resize Shrink = spiral $ (20 % 21) * scale
-- This will produce one more rectangle than there are splits details
divideRects :: [(Rational, Direction)] -> Rectangle -> [Rectangle] divideRects :: [(Rational, Direction)] -> Rectangle -> [Rectangle]
divideRects [] _ = [] divideRects [] r = [r]
divideRects [_] r = [r]
divideRects ((r,d):xs) rect = case divideRect r d rect of divideRects ((r,d):xs) rect = case divideRect r d rect of
(r1, r2) -> r1 : (divideRects xs r2) (r1, r2) -> r1 : (divideRects xs r2)