-
Notifications
You must be signed in to change notification settings - Fork 30
/
metadata.rs
128 lines (113 loc) · 2.85 KB
/
metadata.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
use egui::{Id, Pos2, Rect, Vec2};
use petgraph::{stable_graph::IndexType, EdgeType};
use crate::{DisplayNode, Node};
#[cfg_attr(
feature = "egui_persistence",
derive(serde::Serialize, serde::Deserialize)
)]
#[derive(Clone, Debug)]
struct Bounds {
min: Vec2,
max: Vec2,
}
impl Default for Bounds {
fn default() -> Self {
Self {
min: Vec2::new(f32::MAX, f32::MAX),
max: Vec2::new(f32::MIN, f32::MIN),
}
}
}
impl Bounds {
pub fn compute_next<
N: Clone,
E: Clone,
Ty: EdgeType,
Ix: IndexType,
D: DisplayNode<N, E, Ty, Ix>,
>(
&mut self,
n: &Node<N, E, Ty, Ix, D>,
) {
let loc = n.location();
if loc.x < self.min.x {
self.min.x = loc.x;
};
if loc.x > self.max.x {
self.max.x = loc.x;
};
if loc.y < self.min.y {
self.min.y = loc.y;
};
if loc.y > self.max.y {
self.max.y = loc.y;
};
}
}
#[cfg_attr(
feature = "egui_persistence",
derive(serde::Serialize, serde::Deserialize)
)]
#[derive(Clone, Debug)]
pub struct Metadata {
/// Whether the frame is the first one
pub first_frame: bool,
/// Current zoom factor
pub zoom: f32,
/// Current pan offset
pub pan: Vec2,
/// Top left position of widget
pub top_left: Pos2,
/// State of bounds iteration
bounds: Bounds,
}
impl Default for Metadata {
fn default() -> Self {
Self {
first_frame: true,
zoom: 1.,
pan: Vec2::default(),
top_left: Pos2::default(),
bounds: Bounds::default(),
}
}
}
impl Metadata {
pub fn get(ui: &egui::Ui) -> Self {
ui.data_mut(|data| data.get_persisted::<Metadata>(Id::NULL).unwrap_or_default())
}
pub fn store_into_ui(self, ui: &mut egui::Ui) {
ui.data_mut(|data| {
data.insert_persisted(Id::NULL, self);
});
}
pub fn canvas_to_screen_pos(&self, pos: Pos2) -> Pos2 {
(pos.to_vec2() * self.zoom + self.pan).to_pos2()
}
pub fn canvas_to_screen_size(&self, size: f32) -> f32 {
size * self.zoom
}
pub fn screen_to_canvas_pos(&self, pos: Pos2) -> Pos2 {
((pos.to_vec2() - self.pan) / self.zoom).to_pos2()
}
pub fn comp_iter_bounds<
N: Clone,
E: Clone,
Ty: EdgeType,
Ix: IndexType,
D: DisplayNode<N, E, Ty, Ix>,
>(
&mut self,
n: &Node<N, E, Ty, Ix, D>,
) {
self.bounds.compute_next(n);
}
/// Returns bounding rect of the graph.
pub fn graph_bounds(&self) -> Rect {
Rect::from_min_max(self.bounds.min.to_pos2(), self.bounds.max.to_pos2())
}
/// Resets the bounds iterator.
pub fn reset_bounds(&mut self) {
self.bounds = Bounds::default();
}
}