1
- type model = unit ;
1
+ module Model = {
2
+ type session = {
3
+ id: int ,
4
+ resolver: Lwt . u (Exthost . Reply . t ),
5
+ };
6
+
7
+ type t = option (session );
8
+ let start = (~id, ~resolver, current) =>
9
+ switch (current) {
10
+ | Some ({id: previousId , _ }) when previousId == id => current
11
+ | Some ({id: previousId , _ }) when previousId != id => Some ({id, resolver})
12
+ | None => Some ({id, resolver})
13
+ | _ => failwith ("Never hit this" )
14
+ };
2
15
3
- let initial = () ;
16
+ let reset = (_: t ) => None ;
17
+
18
+ let initial = None ;
19
+ };
20
+
21
+ type model = Model . t ;
22
+
23
+ let initial = Model . initial;
4
24
5
25
exception UserCancelled ;
6
26
@@ -12,9 +32,16 @@ type msg =
12
32
resolver: [@ opaque ] Lwt . u (Exthost . Reply . t ),
13
33
})
14
34
| Cancelled ({resolver: [@ opaque ] Lwt . u (Exthost . Reply . t )})
35
+ | MenuCancelled
36
+ | MenuItemSelected ({item: Exthost . QuickOpen . Item . t })
15
37
| ShowInput ({
16
38
options: Exthost . InputBoxOptions . t ,
17
39
resolver: [@ opaque ] Lwt . u (Exthost . Reply . t ),
40
+ })
41
+ | ShowQuickPick ({
42
+ instance: int ,
43
+ items: list (Exthost . QuickOpen . Item . t ),
44
+ resolver: [@ opaque ] Lwt . u (Exthost . Reply . t ),
18
45
});
19
46
20
47
type outmsg =
@@ -27,6 +54,29 @@ module Msg = {
27
54
Exthost . Msg . QuickOpen . (
28
55
switch (msg) {
29
56
| Input ({options, _ }) => ShowInput ({options, resolver})
57
+ | SetItems ({instance, items}) =>
58
+ ShowQuickPick ({instance, items, resolver})
59
+ | Show ({instance, _ }) => ShowQuickPick ({instance, items: [] , resolver})
60
+ | CreateOrUpdate ({params}) =>
61
+ Exthost . QuickOpen . (
62
+ {
63
+ switch (params) {
64
+ | QuickInput (input ) =>
65
+ ShowInput ({
66
+ options: {
67
+ ignoreFocusOut: false ,
68
+ password: false ,
69
+ placeHolder: input. placeholder,
70
+ prompt: input. prompt,
71
+ value: input. value,
72
+ },
73
+ resolver,
74
+ })
75
+ | QuickPick ({id, items, _ }) =>
76
+ ShowQuickPick ({instance: id, items, resolver})
77
+ };
78
+ }
79
+ )
30
80
| _ => Noop
31
81
}
32
82
);
@@ -42,16 +92,75 @@ module Effects = {
42
92
Isolinear . Effect . create(~name= "Feature_QuickOpen.accept" , () => {
43
93
Lwt . wakeup(resolver, Exthost . Reply . okJson(` String (text)))
44
94
});
95
+
96
+ let selectItem =
97
+ (~session, ~resolver, ~item: Exthost . QuickOpen . Item . t , client) =>
98
+ Isolinear . Effect . create(~name= "Feature_QuickOpen.select" , () => {
99
+ Exthost . Request . QuickOpen . onDidChangeActive(
100
+ ~session,
101
+ ~handles= [ item. handle] ,
102
+ client,
103
+ );
104
+
105
+ Exthost . Request . QuickOpen . onDidAccept(~session, client);
106
+
107
+ Lwt . wakeup(resolver, Exthost . Reply . okJson(` Int (item. handle)));
108
+ });
45
109
};
46
110
47
- let update = (msg, model) =>
111
+ let update = (~client , msg, model) =>
48
112
switch (msg) {
49
113
| Accepted ({resolver, text}) => (
50
- model,
114
+ model |> Model . reset ,
51
115
Effect (Effects . accept(~resolver, text)),
52
116
)
53
117
54
- | Cancelled ({resolver}) => (model, Effect (Effects . cancel(~resolver)))
118
+ | Cancelled ({resolver}) => (
119
+ model |> Model . reset,
120
+ Effect (Effects . cancel(~resolver)),
121
+ )
122
+
123
+ | MenuItemSelected ({item}) =>
124
+ let eff =
125
+ switch (model) {
126
+ | None => Isolinear . Effect . none
127
+ | Some ({resolver, id}) =>
128
+ Effects . selectItem(~session= id, ~resolver, ~item, client)
129
+ };
130
+
131
+ (model |> Model . reset, Effect (eff));
132
+
133
+ | MenuCancelled =>
134
+ let eff =
135
+ switch (model) {
136
+ | None => Isolinear . Effect . none
137
+ | Some ({resolver, _ }) => Effects . cancel(~resolver)
138
+ };
139
+ (model |> Model . reset, Effect (eff));
140
+
141
+ | ShowQuickPick ({instance, items, resolver}) =>
142
+ let placeholderText = "" ;
143
+ let menu =
144
+ Feature_Quickmenu . Schema . (
145
+ menu(
146
+ ~onItemFocused= _item => Noop ,
147
+ ~onAccepted=
148
+ (~text as _, ~item) => {
149
+ switch (item) {
150
+ | Some (item ) => MenuItemSelected ({item: item})
151
+ | None => MenuCancelled
152
+ }
153
+ },
154
+ ~onCancelled= _item => {Cancelled ({resolver: resolver})},
155
+ ~placeholderText,
156
+ ~itemRenderer= Renderer . default,
157
+ ~toString=
158
+ (item: Exthost . QuickOpen . Item . t ) =>
159
+ Exthost . QuickOpen . Item . (item. label),
160
+ items,
161
+ )
162
+ );
163
+ (model |> Model . start(~id= instance, ~resolver), ShowMenu (menu));
55
164
56
165
| ShowInput ({options, resolver}) =>
57
166
let placeholderText =
@@ -69,7 +178,7 @@ let update = (msg, model) =>
69
178
[] ,
70
179
)
71
180
);
72
- (model, ShowMenu (menu));
181
+ (model |> Model . reset , ShowMenu (menu));
73
182
74
183
| Noop => (model, Nothing )
75
184
};
0 commit comments