Skip to content

Commit c7f2a6e

Browse files
committed
Update the multiple_viewports example to show how to use Context::request_repaint_of().
1 parent 2669344 commit c7f2a6e

File tree

1 file changed

+38
-3
lines changed
  • examples/multiple_viewports/src

1 file changed

+38
-3
lines changed

examples/multiple_viewports/src/main.rs

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
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;
46
use std::sync::{
57
Arc,
68
atomic::{AtomicBool, Ordering},
79
};
810

9-
use eframe::egui;
10-
1111
fn 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

3739
impl 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

Comments
 (0)