/
View.elm
191 lines (138 loc) · 6.19 KB
/
View.elm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
module View (signalFlow,functionName,description,basicCatalog,customCatalog,signalSpace,title, line1,line2,line3,line3',demoList) where
import Graphics.Element as Element exposing (Element,show ,flow , down,right,justified,beside)
import Time exposing (..)
import Signal.Extra as Extra exposing ((~>))
import Signal exposing (..)
import String exposing (append,dropLeft)
import Text exposing (Style )
import Color
type TimeData a = TimeSignal | Action a
--timing
timefps = fps 15
signalFlow : Element.Direction -> List (Signal Element) -> Signal Element
signalFlow direction list = Extra.mapMany (flow direction) list
lineString = "------------------------------------------------------"
timeLineUpdate: String -> (String -> String) -> Signal a -> Signal String
timeLineUpdate lineString f signal =
let
addTimeSignal signal = merge (Action <~ signal) ( always TimeSignal<~ timefps)
action = (addTimeSignal signal)
update signal state =
case signal of
TimeSignal -> String.append state "-" |> dropLeft 1
Action a -> let str = f <| toString a
in String.append state str
|> dropLeft (String.length str )
in foldp update lineString action
-----View
box : Int -> Int -> Int -> Element -> Element
box upSpace leftSpace downSpace strEle =
Element.flow down [
Element.spacer 0 upSpace
, (Element.flow right [ Element.spacer leftSpace 5 , strEle])
, Element.spacer 0 downSpace ]
strToElement : Style -> String -> Element
strToElement stringStyle str =
Element.justified <| Text.style stringStyle (Text.fromString str)
toSignalElement : Int -> Int -> Int -> Style -> String -> Signal Element
toSignalElement upSpace leftSpace downSpace strStyle str =
Signal.constant (box upSpace leftSpace downSpace (strToElement strStyle str))
signalSpace : Int -> Int -> Signal Element
signalSpace x y = Signal.constant (Element.spacer x y )
typeEleFormat : String -> Element
typeEleFormat str = Element.justified
<| Text.monospace
<| Text.fromString
<| String.padLeft 35 ' ' str
toTypeElement : Signal a -> Signal Element
toTypeElement signal =
Signal.map (\x -> typeEleFormat <| toString x) signal
timeLineView : String -> Element
timeLineView lineStr =
let format string = Element.justified
<| Text.monospace
<| Text.fromString string
in (format lineStr)
toTimeLine : (String -> String) -> Signal a -> Signal Element
toTimeLine f signal = Signal.map timeLineView (timeLineUpdate lineString f signal)
code : String -> Signal Element
code codeStr =
let format string = Element.color (Color.rgb 255 255 255)
<| Element.justified
<| Text.monospace
<| Text.fromString string
in Signal.constant ( Element.spacer 5 5 `beside` format codeStr)
titleStyle : Style
titleStyle =
{ typeface = ["monospace"]
, height = Just 25
, color = Color.black
, bold = True
, italic = False
, line = Nothing
}
title : String -> Signal Element
title str = toSignalElement 7 20 8 titleStyle str
fucnNameStyle : Style
fucnNameStyle =
{ typeface = ["monospace"]
, height = Just 15
, color = Color.rgb 255 85 85
, bold = True
, italic = False
, line = Nothing
}
functionName : String -> Signal Element
functionName str = toSignalElement 3 70 3 fucnNameStyle str
descriptionSryle : Style
descriptionSryle =
{ typeface = ["monospace"]
, height = Just 15
, color = Color.black
, bold = False
, italic = False
, line = Nothing
}
description : String -> Signal Element
description str = toSignalElement 3 70 5 descriptionSryle str
customCatalog : Signal a -> (String -> String) -> String -> Signal Element
customCatalog signal f codeStr =
signalFlow right [toTypeElement signal
,signalSpace 5 10
,toTimeLine f signal
,code codeStr]
basicCatalog : Signal a -> String -> Signal Element
basicCatalog signal str = customCatalog signal identity str
line1 : String -> String -> Signal a -> Signal Element
line1 funcName code signal =
signalFlow down [
functionName funcName
,basicCatalog signal code
]
line2 : String ->String -> String -> Signal a -> Signal b -> Signal Element
line2 funcName code1 code2 signal1 signal2 =
signalFlow down [
functionName funcName
,basicCatalog signal1 code1
,basicCatalog signal2 code2
]
line3 : String -> String -> String -> String -> Signal a -> Signal b ->Signal c ->Signal Element
line3 funcName code1 code2 code3 signal1 signal2 signal3 =
signalFlow down [
functionName funcName
,basicCatalog signal1 code1
,basicCatalog signal2 code2
,basicCatalog signal3 code3 ]
line3' : String -> String -> String -> String ->String -> Signal a ->Signal b ->Signal c -> Signal Element
line3' funcName refeStr code1 code2 code3 signal1 signal2 signal3 =
signalFlow down [
functionName funcName
,description refeStr
,basicCatalog signal1 code1
,basicCatalog signal2 code2
,basicCatalog signal3 code3 ]
--demoList
lineSpace : Signal Element
lineSpace = signalSpace 5 24
demoList : List (Signal Element) -> Signal Element
demoList list = signalFlow down <| ( List.intersperse lineSpace list ) ++ [lineSpace]