2
2
3
3
extern crate ui;
4
4
5
+ use std:: sync:: { Arc , Mutex } ;
6
+
5
7
use ui:: { BoxControl , Window , InitOptions } ;
6
8
use ui:: { Image , Area , AreaHandler , AreaKeyEvent , AreaDrawParams } ;
7
9
8
10
struct ImageAreaHandler {
9
- data : Vec < u32 >
11
+ data : Arc < Mutex < Vec < u32 > > >
10
12
}
11
13
12
14
impl AreaHandler for ImageAreaHandler {
13
15
fn draw ( & mut self , _area : & Area , area_draw_params : & AreaDrawParams ) {
14
16
let img = Image :: new ( 100 , 100 ) ;
15
- img. load_pixmap ( 0 , 0 , 100 , 100 , & self . data ) ;
17
+ img. load_pixmap ( 0 , 0 , 100 , 100 , & * self . data . lock ( ) . unwrap ( ) ) ;
16
18
area_draw_params. context . draw_image ( 0.0 , 0.0 , & img) ;
17
19
}
18
20
@@ -35,8 +37,28 @@ fn run() {
35
37
vbox. set_padded ( true ) ;
36
38
mainwin. set_child ( vbox. clone ( ) . into ( ) ) ;
37
39
38
- let area = Area :: new ( Box :: new ( ImageAreaHandler { data : vec ! [ 0xff123456 ; 100 * 100 ] } ) ) ;
39
- vbox. append ( area. into ( ) , false ) ;
40
+ let mut data = Arc :: new ( Mutex :: new ( vec ! [ 0xff123456 ; 100 * 100 ] ) ) ;
41
+
42
+ let area = Area :: new ( Box :: new ( ImageAreaHandler { data : data. clone ( ) } ) ) ;
43
+ vbox. append ( ( & area) . into ( ) , false ) ;
44
+
45
+ :: std:: thread:: spawn ( move || {
46
+ let mut color = 0x0000ff ;
47
+ loop {
48
+ color = color << 4 | ( color & 0xff000000 ) >> 24 ;
49
+ for j in 0 ..100 {
50
+ :: std:: thread:: sleep_ms ( 10 ) ;
51
+ {
52
+ let mut d = data. lock ( ) . unwrap ( ) ;
53
+ for i in 0 ..100 {
54
+ d[ i+j* 100 ] = 0xff000000 | color;
55
+ }
56
+ }
57
+ area. queue_redraw_all ( ) ;
58
+ }
59
+ }
60
+ } ) ;
61
+
40
62
41
63
mainwin. show ( ) ;
42
64
ui:: main ( ) ;
0 commit comments