@@ -3,6 +3,80 @@ import 'dart:async';
3
3
import 'package:flutter/material.dart' ;
4
4
import 'package:flutter_webrtc/flutter_webrtc.dart' ;
5
5
6
+ class ThumbnailWidget extends StatefulWidget {
7
+ const ThumbnailWidget (
8
+ {Key ? key,
9
+ required this .source,
10
+ required this .selected,
11
+ required this .onTap})
12
+ : super (key: key);
13
+ final DesktopCapturerSource source;
14
+ final bool selected;
15
+ final Function (DesktopCapturerSource ) onTap;
16
+
17
+ @override
18
+ _ThumbnailWidgetState createState () => _ThumbnailWidgetState ();
19
+ }
20
+
21
+ class _ThumbnailWidgetState extends State <ThumbnailWidget > {
22
+ final List <StreamSubscription > _subscriptions = [];
23
+
24
+ @override
25
+ void initState () {
26
+ super .initState ();
27
+ _subscriptions.add (widget.source.onThumbnailChanged.stream.listen ((event) {
28
+ setState (() {});
29
+ }));
30
+ _subscriptions.add (widget.source.onNameChanged.stream.listen ((event) {
31
+ setState (() {});
32
+ }));
33
+ }
34
+
35
+ @override
36
+ void deactivate () {
37
+ _subscriptions.forEach ((element) {
38
+ element.cancel ();
39
+ });
40
+ super .deactivate ();
41
+ }
42
+
43
+ @override
44
+ Widget build (BuildContext context) {
45
+ return Column (
46
+ children: [
47
+ Expanded (
48
+ child: Container (
49
+ decoration: widget.selected
50
+ ? BoxDecoration (
51
+ border: Border .all (width: 2 , color: Colors .blueAccent))
52
+ : null ,
53
+ child: InkWell (
54
+ onTap: () {
55
+ print ('Selected source id => ${widget .source .id }' );
56
+ widget.onTap (widget.source);
57
+ },
58
+ child: widget.source.thumbnail != null
59
+ ? Image .memory (
60
+ widget.source.thumbnail! ,
61
+ gaplessPlayback: true ,
62
+ alignment: Alignment .center,
63
+ )
64
+ : Container (),
65
+ ),
66
+ )),
67
+ Text (
68
+ widget.source.name,
69
+ style: TextStyle (
70
+ fontSize: 12 ,
71
+ color: Colors .black87,
72
+ fontWeight:
73
+ widget.selected ? FontWeight .bold : FontWeight .normal),
74
+ ),
75
+ ],
76
+ );
77
+ }
78
+ }
79
+
6
80
// ignore: must_be_immutable
7
81
class ScreenSelectDialog extends Dialog {
8
82
ScreenSelectDialog () {
@@ -19,14 +93,8 @@ class ScreenSelectDialog extends Dialog {
19
93
_stateSetter? .call (() {});
20
94
}));
21
95
22
- _subscriptions.add (desktopCapturer.onNameChanged.stream.listen ((source) {
23
- _sources[source.id] = source;
24
- _stateSetter? .call (() {});
25
- }));
26
-
27
96
_subscriptions
28
97
.add (desktopCapturer.onThumbnailChanged.stream.listen ((source) {
29
- _sources[source.id] = source;
30
98
_stateSetter? .call (() {});
31
99
}));
32
100
}
@@ -60,15 +128,15 @@ class ScreenSelectDialog extends Dialog {
60
128
print (
61
129
'name: ${element .name }, id: ${element .id }, type: ${element .type }' );
62
130
});
63
- _stateSetter? .call (() {
64
- sources.forEach ((element) {
65
- _sources[element.id] = element;
66
- });
67
- });
68
131
_timer? .cancel ();
69
132
_timer = Timer .periodic (Duration (seconds: 3 ), (timer) {
70
133
desktopCapturer.updateSources (types: [_sourceType]);
71
134
});
135
+ _sources.clear ();
136
+ sources.forEach ((element) {
137
+ _sources[element.id] = element;
138
+ });
139
+ _stateSetter? .call (() {});
72
140
return ;
73
141
} catch (e) {
74
142
print (e.toString ());
@@ -158,59 +226,16 @@ class ScreenSelectDialog extends Dialog {
158
226
.where ((element) =>
159
227
element.value.type ==
160
228
SourceType .Screen )
161
- .map ((e) => Column (
162
- children: [
163
- Expanded (
164
- child: Container (
165
- decoration: (_selected_source !=
166
- null &&
167
- _selected_source!
168
- .id ==
169
- e.value.id)
170
- ? BoxDecoration (
171
- border: Border .all (
172
- width: 2 ,
173
- color: Colors
174
- .blueAccent))
175
- : null ,
176
- child: InkWell (
177
- onTap: () {
178
- print (
179
- 'Selected screen id => ${e .value .id }' );
180
- setState (() {
181
- _selected_source =
182
- e.value;
183
- });
184
- },
185
- child:
186
- e.value.thumbnail !=
187
- null
188
- ? Image .memory (
189
- e.value
190
- .thumbnail! ,
191
- scale: 1.0 ,
192
- repeat: ImageRepeat
193
- .noRepeat,
194
- )
195
- : Container (),
196
- ),
197
- )),
198
- Text (
199
- e.value.name,
200
- style: TextStyle (
201
- fontSize: 12 ,
202
- color: Colors .black87,
203
- fontWeight: (_selected_source !=
204
- null &&
205
- _selected_source!
206
- .id ==
207
- e.value
208
- .id)
209
- ? FontWeight .bold
210
- : FontWeight
211
- .normal),
212
- ),
213
- ],
229
+ .map ((e) => ThumbnailWidget (
230
+ onTap: (source) {
231
+ setState (() {
232
+ _selected_source = source;
233
+ });
234
+ },
235
+ source: e.value,
236
+ selected:
237
+ _selected_source? .id ==
238
+ e.value.id,
214
239
))
215
240
.toList (),
216
241
),
@@ -225,61 +250,16 @@ class ScreenSelectDialog extends Dialog {
225
250
.where ((element) =>
226
251
element.value.type ==
227
252
SourceType .Window )
228
- .map ((e) => Column (
229
- children: [
230
- Expanded (
231
- child: Container (
232
- decoration: (_selected_source !=
233
- null &&
234
- _selected_source!
235
- .id ==
236
- e.value.id)
237
- ? BoxDecoration (
238
- border: Border .all (
239
- width: 2 ,
240
- color: Colors
241
- .blueAccent))
242
- : null ,
243
- child: InkWell (
244
- onTap: () {
245
- print (
246
- 'Selected window id => ${e .value .id }' );
247
- setState (() {
248
- _selected_source =
249
- e.value;
250
- });
251
- },
252
- child: e
253
- .value
254
- .thumbnail!
255
- .isNotEmpty
256
- ? Image .memory (
257
- e.value
258
- .thumbnail! ,
259
- scale: 1.0 ,
260
- repeat:
261
- ImageRepeat
262
- .noRepeat,
263
- )
264
- : Container (),
265
- ),
266
- )),
267
- Text (
268
- e.value.name,
269
- style: TextStyle (
270
- fontSize: 12 ,
271
- color: Colors .black87,
272
- fontWeight: (_selected_source !=
273
- null &&
274
- _selected_source!
275
- .id ==
276
- e.value
277
- .id)
278
- ? FontWeight .bold
279
- : FontWeight
280
- .normal),
281
- ),
282
- ],
253
+ .map ((e) => ThumbnailWidget (
254
+ onTap: (source) {
255
+ setState (() {
256
+ _selected_source = source;
257
+ });
258
+ },
259
+ source: e.value,
260
+ selected:
261
+ _selected_source? .id ==
262
+ e.value.id,
283
263
))
284
264
.toList (),
285
265
),
0 commit comments