Skip to content

Commit ab636e8

Browse files
committed
Refactor viewport stealing.
1 parent 7100331 commit ab636e8

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

src/controller/viewport.rs

+37-4
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,51 @@ pub struct TrackballViewport {
1818
}
1919

2020
impl TrackballViewport {
21-
/// Whether the viewport has been stolen.
21+
/// Condition whether the viewport has been stolen, evaluated by [`IntoSystemConfigs::run_if`].
2222
#[allow(clippy::needless_pass_by_value)]
2323
#[must_use]
2424
pub fn stolen(viewport: Res<Self>) -> bool {
2525
viewport.stolen != 0
2626
}
2727
/// Steals the viewport or gives it back.
28+
///
29+
/// # Examples
30+
///
31+
/// Steals the viewport for `Some(frames)` and lets it count `frames` down with `None`:
32+
///
33+
/// ```ignore
34+
/// fn system(/* ... */) {
35+
/// viewport.set_stolen(just_stolen.then_some(3));
36+
/// }
37+
///
38+
/// // frame 0: just_stolen = true -> set_stolen(Some(3)) -> frames = 3 -> stolen = true
39+
/// // frame 1: just_stolen = false -> set_stolen(None) -> frames = 2 -> stolen = true
40+
/// // frame 2: just_stolen = false -> set_stolen(None) -> frames = 1 -> stolen = true
41+
/// // frame 3: just_stolen = false -> set_stolen(None) -> frames = 0 -> stolen = false
42+
/// ```
43+
///
44+
/// Steals the viewport with `Some(1)` and gives it back with `Some(0)`:
45+
///
46+
/// ```ignore
47+
/// fn system(/* ... */) {
48+
/// if just_stolen {
49+
/// viewport.set_stolen(Some(1));
50+
/// }
51+
/// if just_give_back {
52+
/// viewport.set_stolen(Some(0));
53+
/// }
54+
/// }
55+
///
56+
/// // frame 0: just_stolen = true -> set_stolen(Some(1)) -> frames = 1 -> stolen = true
57+
/// // frame 1: just_stolen = false -> -> frames = 1 -> stolen = true
58+
/// // frame 25: just_stolen = false -> -> frames = 1 -> stolen = true
59+
/// // frame 50: just_give_back = true -> set_stolen(Some(0)) -> frames = 0 -> stolen = false
60+
/// ```
2861
#[allow(clippy::needless_pass_by_value)]
29-
pub fn set_stolen(&mut self, stolen: bool) {
30-
if stolen {
62+
pub fn set_stolen(&mut self, stolen: Option<usize>) {
63+
if let Some(frames) = stolen {
3164
self.entity = None;
32-
self.stolen = 2;
65+
self.stolen = frames;
3366
} else if self.stolen != 0 {
3467
self.stolen -= 1;
3568
}

src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ impl Plugin for TrackballPlugin {
333333
context.wants_pointer_input() || context.wants_keyboard_input()
334334
})
335335
.unwrap_or_default();
336-
viewport.set_stolen(stolen);
336+
viewport.set_stolen(stolen.then_some(2));
337337
}
338338

339339
app.add_systems(

0 commit comments

Comments
 (0)