Skip to content
This repository was archived by the owner on Jul 19, 2022. It is now read-only.

Commit 16d9a8d

Browse files
authored
Merge pull request #237 from unisonweb/crop-docs
Crop long definition docs
2 parents f184b84 + 49c23f5 commit 16d9a8d

File tree

6 files changed

+230
-44
lines changed

6 files changed

+230
-44
lines changed

src/Workspace.elm

+62-27
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ type Msg
6868
= NoOp
6969
| Find
7070
| FetchItemFinished Reference (Result Http.Error Item)
71+
| IsDocCropped Reference (Result Dom.Error Bool)
7172
| Keydown KeyboardEvent
7273
| KeyboardShortcutMsg KeyboardShortcut.Msg
7374
| WorkspaceItemMsg WorkspaceItem.Msg
@@ -92,22 +93,53 @@ update env msg ({ workspaceItems } as model) =
9293

9394
FetchItemFinished ref itemResult ->
9495
let
95-
workspaceItem =
96+
( workspaceItem, cmd ) =
9697
case itemResult of
9798
Err e ->
98-
WorkspaceItem.Failure ref e
99+
( WorkspaceItem.Failure ref e, Cmd.none )
99100

100101
Ok i ->
101-
WorkspaceItem.fromItem ref i
102+
let
103+
c =
104+
-- Docs items are always shown in full and never cropped
105+
if WorkspaceItem.isDocItem i then
106+
Cmd.none
107+
108+
else
109+
isDocCropped ref
110+
in
111+
( WorkspaceItem.fromItem ref i, c )
102112

103113
nextWorkspaceItems =
104114
WorkspaceItems.replace workspaceItems ref workspaceItem
105115
in
106116
( { model | workspaceItems = nextWorkspaceItems }
107-
, Cmd.none
117+
, cmd
108118
, openDefinitionsFocusToOutMsg nextWorkspaceItems
109119
)
110120

121+
IsDocCropped ref res ->
122+
let
123+
visibility =
124+
case res of
125+
Ok True ->
126+
WorkspaceItem.Cropped
127+
128+
Ok False ->
129+
WorkspaceItem.NotCropped
130+
131+
-- If we can't tell, better make it fully visible, than Unknown
132+
Err _ ->
133+
WorkspaceItem.MadeFullyVisible
134+
135+
updateVisibility d =
136+
{ d | docVisibility = visibility }
137+
in
138+
( { model | workspaceItems = WorkspaceItems.updateData updateVisibility ref workspaceItems }
139+
, Cmd.none
140+
, None
141+
)
142+
111143
Keydown event ->
112144
let
113145
( keyboardShortcut, kCmd ) =
@@ -135,38 +167,30 @@ update env msg ({ workspaceItems } as model) =
135167

136168
WorkspaceItem.UpdateZoom ref zoom ->
137169
let
138-
updateMatching workspaceItem =
139-
case workspaceItem of
140-
Success r d ->
141-
if ref == r then
142-
Success r { d | zoom = zoom }
143-
144-
else
145-
workspaceItem
170+
updateZoom d =
171+
{ d | zoom = zoom }
172+
in
173+
( { model | workspaceItems = WorkspaceItems.updateData updateZoom ref workspaceItems }
174+
, Cmd.none
175+
, None
176+
)
146177

147-
_ ->
148-
workspaceItem
178+
WorkspaceItem.ShowFullDoc ref ->
179+
let
180+
updateDocVisibility d =
181+
{ d | docVisibility = WorkspaceItem.MadeFullyVisible }
149182
in
150-
( { model | workspaceItems = WorkspaceItems.map updateMatching workspaceItems }
183+
( { model | workspaceItems = WorkspaceItems.updateData updateDocVisibility ref workspaceItems }
151184
, Cmd.none
152185
, None
153186
)
154187

155188
WorkspaceItem.ToggleDocFold ref docId ->
156189
let
157-
updateMatching workspaceItem =
158-
case workspaceItem of
159-
Success r d ->
160-
if ref == r then
161-
Success r { d | docFoldToggles = Doc.toggleFold d.docFoldToggles docId }
162-
163-
else
164-
workspaceItem
165-
166-
_ ->
167-
workspaceItem
190+
updateDocFoldToggles d =
191+
{ d | docFoldToggles = Doc.toggleFold d.docFoldToggles docId }
168192
in
169-
( { model | workspaceItems = WorkspaceItems.map updateMatching workspaceItems }
193+
( { model | workspaceItems = WorkspaceItems.updateData updateDocFoldToggles ref workspaceItems }
170194
, Cmd.none
171195
, None
172196
)
@@ -376,6 +400,17 @@ fetchDefinition perspective ref =
376400
|> Api.toRequest WorkspaceItem.decodeItem (FetchItemFinished ref)
377401

378402

403+
isDocCropped : Reference -> Cmd Msg
404+
isDocCropped ref =
405+
let
406+
id =
407+
"definition-doc-" ++ Reference.toString ref
408+
in
409+
Dom.getViewportOf id
410+
|> Task.map (\v -> v.viewport.height < v.scene.height)
411+
|> Task.attempt (IsDocCropped ref)
412+
413+
379414
scrollToDefinition : Reference -> Cmd Msg
380415
scrollToDefinition ref =
381416
let

src/Workspace/WorkspaceItem.elm

+69-15
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import List.Nonempty as NEL
2222
import Maybe.Extra as MaybeE
2323
import String.Extra exposing (pluralize)
2424
import UI
25+
import UI.Button as Button
2526
import UI.FoldToggle as FoldToggle
2627
import UI.Icon as Icon exposing (Icon)
2728
import UI.Tooltip as Tooltip
@@ -32,12 +33,22 @@ import Workspace.Zoom exposing (Zoom(..))
3233
type WorkspaceItem
3334
= Loading Reference
3435
| Failure Reference Http.Error
35-
| Success
36-
Reference
37-
{ item : Item
38-
, zoom : Zoom
39-
, docFoldToggles : DocFoldToggles
40-
}
36+
| Success Reference ItemData
37+
38+
39+
type DocVisibility
40+
= Unknown
41+
| Cropped
42+
| NotCropped
43+
| MadeFullyVisible
44+
45+
46+
type alias ItemData =
47+
{ item : Item
48+
, zoom : Zoom
49+
, docFoldToggles : DocFoldToggles
50+
, docVisibility : DocVisibility
51+
}
4152

4253

4354
type alias WithDoc =
@@ -70,6 +81,7 @@ type Msg
7081
| ToggleDocFold Reference Doc.FoldId
7182
| ChangePerspectiveToNamespace FQN
7283
| FindWithinNamespace FQN
84+
| ShowFullDoc Reference
7385

7486

7587
fromItem : Reference -> Item -> WorkspaceItem
@@ -85,11 +97,19 @@ fromItem ref item =
8597

8698
else
8799
Near
100+
101+
docVisibility =
102+
if isDocItem item then
103+
MadeFullyVisible
104+
105+
else
106+
Unknown
88107
in
89108
Success ref
90109
{ item = item
91110
, zoom = zoom
92111
, docFoldToggles = Doc.emptyDocFoldToggles
112+
, docVisibility = docVisibility
93113
}
94114

95115

@@ -269,9 +289,47 @@ viewInfo zoom onClick_ hash info category =
269289
]
270290

271291

272-
viewDoc : Reference -> DocFoldToggles -> Doc -> Html Msg
273-
viewDoc ref docFoldToggles doc =
274-
div [ class "workspace-item-definition-doc" ] [ Doc.view (OpenReference ref) (ToggleDocFold ref) docFoldToggles doc ]
292+
viewDoc : Reference -> DocVisibility -> DocFoldToggles -> Doc -> Html Msg
293+
viewDoc ref docVisibility docFoldToggles doc =
294+
let
295+
( showFullDoc, shownInFull ) =
296+
case docVisibility of
297+
Unknown ->
298+
( UI.nothing, False )
299+
300+
Cropped ->
301+
( div [ class "show-full-doc" ]
302+
[ Button.iconThenLabel (ShowFullDoc ref) Icon.arrowDown "Show full documentation"
303+
|> Button.small
304+
|> Button.view
305+
]
306+
, False
307+
)
308+
309+
_ ->
310+
( UI.nothing, True )
311+
312+
classes =
313+
classList
314+
[ ( "workspace-item-definition-doc", True )
315+
, ( "shown-in-full", shownInFull )
316+
]
317+
in
318+
div [ classes ]
319+
[ div [ class "definition-doc-columns" ]
320+
[ div [ class "icon-column" ] [ Icon.view Icon.doc ]
321+
, div
322+
[ class "doc-column"
323+
, id ("definition-doc-" ++ Reference.toString ref)
324+
]
325+
[ Doc.view (OpenReference ref)
326+
(ToggleDocFold ref)
327+
docFoldToggles
328+
doc
329+
]
330+
]
331+
, showFullDoc
332+
]
275333

276334

277335
{-| TODO: Yikes, this isn't great. Needs cleanup
@@ -326,11 +384,7 @@ viewSource zoom onSourceToggleClick sourceConfig item =
326384
|> Tuple.mapBoth viewLineGutter (viewToggableSource (FoldToggle.disabled |> FoldToggle.open))
327385

328386

329-
viewItem :
330-
Reference
331-
-> { item : Item, zoom : Zoom, docFoldToggles : DocFoldToggles }
332-
-> Bool
333-
-> Html Msg
387+
viewItem : Reference -> ItemData -> Bool -> Html Msg
334388
viewItem ref data isFocused =
335389
let
336390
( zoomClass, infoZoomToggle, sourceZoomToggle ) =
@@ -352,7 +406,7 @@ viewItem ref data isFocused =
352406

353407
viewDoc_ doc =
354408
doc
355-
|> Maybe.map (viewDoc ref data.docFoldToggles)
409+
|> Maybe.map (viewDoc ref data.docVisibility data.docFoldToggles)
356410
|> Maybe.withDefault UI.nothing
357411

358412
viewContent doc =

src/Workspace/WorkspaceItems.elm

+22
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,28 @@ prev items =
399399
-- TRANFORM
400400

401401

402+
updateData :
403+
(WorkspaceItem.ItemData -> WorkspaceItem.ItemData)
404+
-> Reference
405+
-> WorkspaceItems
406+
-> WorkspaceItems
407+
updateData f ref wItems =
408+
let
409+
update_ workspaceItem =
410+
case workspaceItem of
411+
WorkspaceItem.Success r d ->
412+
if ref == r then
413+
WorkspaceItem.Success r (f d)
414+
415+
else
416+
workspaceItem
417+
418+
_ ->
419+
workspaceItem
420+
in
421+
map update_ wItems
422+
423+
402424
map :
403425
(WorkspaceItem -> WorkspaceItem)
404426
-> WorkspaceItems

src/css/definition-doc.css

+1
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,7 @@
306306
}
307307
.definition-doc h1:first-child {
308308
margin-top: 0;
309+
line-height: 1.1;
309310
}
310311

311312
.definition-doc h2 {

src/css/themes/unison/light.css

+14
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@
6868
--color-workspace-item-fg: var(--color-gray-darken-30);
6969
--color-workspace-item-mg: var(--color-gray-lighten-60);
7070
--color-workspace-item-bg: var(--color-gray-lighten-100);
71+
--color-workspace-item-bg-faded: rgba(
72+
255,
73+
255,
74+
255,
75+
0.5
76+
); /* 50% gray-lighten-100 */
7177
--color-workspace-item-source-bg: transparent;
7278
--color-workspace-item-subtle-fg: var(--color-gray-lighten-30);
7379
--color-workspace-item-subtle-bg: var(--color-gray-lighten-60);
@@ -85,9 +91,17 @@
8591
--color-workspace-item-focus-mg: var(--color-gray-lighten-55);
8692
--color-workspace-item-focus-source-bg: transparent;
8793
--color-workspace-item-focus-bg: var(--color-gray-lighten-60);
94+
--color-workspace-item-focus-bg-faded: rgba(
95+
250,
96+
250,
97+
251,
98+
0.5
99+
); /* 50% gray-lighten-60 */
88100
--color-workspace-item-focus-bg-em: var(--color-gray-lighten-50);
89101
--color-workspace-item-focus-content-border: var(--color-gray-lighten-50);
90102
--color-workspace-item-focus-border: var(--color-gray-lighten-50);
103+
--color-workspace-item-cropped-control-border: var(--color-gray-lighten-30);
104+
--color-workspace-item-cropped-control-shadow: var(--color-gray-lighten-45);
91105

92106
--color-doc-fg: var(--color-gray-darken-30);
93107
--color-doc-bg: var(--color-gray-lighten-100);

0 commit comments

Comments
 (0)