11#![ cfg_attr( not( debug_assertions) , windows_subsystem = "windows" ) ] // hide console window on Windows in release
22#![ allow( rustdoc:: missing_crate_level_docs) ] // it's an example
33
4+ use eframe:: egui;
5+ use std:: sync:: atomic:: AtomicUsize ;
46use std:: sync:: {
57 Arc ,
68 atomic:: { AtomicBool , Ordering } ,
79} ;
810
9- use eframe:: egui;
10-
1111fn main ( ) -> eframe:: Result {
1212 env_logger:: init ( ) ; // Log to stderr (if you run with `RUST_LOG=debug`).
1313 let options = eframe:: NativeOptions {
@@ -27,15 +27,18 @@ struct MyApp {
2727 /// The downside is that their painting is linked with the parent viewport:
2828 /// if either needs repainting, they are both repainted.
2929 show_immediate_viewport : bool ,
30+ immediate_viewport_redraw_counter : usize ,
3031
3132 /// Deferred viewports run independent of the parent viewport, which can save
3233 /// CPU if only some of the viewports require repainting.
3334 /// However, this requires passing state with `Arc` and locks.
3435 show_deferred_viewport : Arc < AtomicBool > ,
36+ deferred_viewport_redraw_counter : Arc < AtomicUsize > ,
3537}
3638
3739impl eframe:: App for MyApp {
3840 fn update ( & mut self , ctx : & egui:: Context , _frame : & mut eframe:: Frame ) {
41+ let mut deferred_viewport_refresh_requested = false ;
3942 egui:: CentralPanel :: default ( ) . show ( ctx, |ui| {
4043 ui. label ( "Hello from the root viewport" ) ;
4144
@@ -48,6 +51,21 @@ impl eframe::App for MyApp {
4851 ui. checkbox ( & mut show_deferred_viewport, "Show deferred child viewport" ) ;
4952 self . show_deferred_viewport
5053 . store ( show_deferred_viewport, Ordering :: Relaxed ) ;
54+
55+ deferred_viewport_refresh_requested =
56+ ui. button ( "request refresh of deferred viewport" ) . clicked ( ) ;
57+
58+ ui. group ( |ui| {
59+ ui. label ( format ! (
60+ "Immediate viewport counter: {}" ,
61+ self . immediate_viewport_redraw_counter
62+ ) ) ;
63+ ui. label ( format ! (
64+ "Deferred viewport counter: {}" ,
65+ self . deferred_viewport_redraw_counter
66+ . load( Ordering :: Relaxed )
67+ ) ) ;
68+ } )
5169 } ) ;
5270
5371 if self . show_immediate_viewport {
@@ -62,8 +80,14 @@ impl eframe::App for MyApp {
6280 "This egui backend doesn't support multiple viewports"
6381 ) ;
6482
83+ self . immediate_viewport_redraw_counter += 1 ;
84+
6585 egui:: CentralPanel :: default ( ) . show ( ctx, |ui| {
6686 ui. label ( "Hello from immediate viewport" ) ;
87+ ui. label ( format ! (
88+ "Counter: {}" ,
89+ self . immediate_viewport_redraw_counter
90+ ) ) ;
6791 } ) ;
6892
6993 if ctx. input ( |i| i. viewport ( ) . close_requested ( ) ) {
@@ -76,8 +100,16 @@ impl eframe::App for MyApp {
76100
77101 if self . show_deferred_viewport . load ( Ordering :: Relaxed ) {
78102 let show_deferred_viewport = self . show_deferred_viewport . clone ( ) ;
103+ let counter = self . deferred_viewport_redraw_counter . clone ( ) ;
104+
105+ let deferred_viewport_id = egui:: ViewportId :: from_hash_of ( "deferred_viewport" ) ;
106+
107+ if deferred_viewport_refresh_requested {
108+ ctx. request_repaint_of ( deferred_viewport_id) ;
109+ }
110+
79111 ctx. show_viewport_deferred (
80- egui :: ViewportId :: from_hash_of ( "deferred_viewport" ) ,
112+ deferred_viewport_id ,
81113 egui:: ViewportBuilder :: default ( )
82114 . with_title ( "Deferred Viewport" )
83115 . with_inner_size ( [ 200.0 , 100.0 ] ) ,
@@ -87,8 +119,11 @@ impl eframe::App for MyApp {
87119 "This egui backend doesn't support multiple viewports"
88120 ) ;
89121
122+ let value = counter. fetch_add ( 1 , Ordering :: Relaxed ) ;
123+
90124 egui:: CentralPanel :: default ( ) . show ( ctx, |ui| {
91125 ui. label ( "Hello from deferred viewport" ) ;
126+ ui. label ( format ! ( "Counter: {}" , value) ) ;
92127 } ) ;
93128 if ctx. input ( |i| i. viewport ( ) . close_requested ( ) ) {
94129 // Tell parent to close us.
0 commit comments