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
use crate::Effect;
use lapix::Event;
pub struct LayersPanel {
num_layers: usize,
active_layer: usize,
layers_vis: Vec<bool>,
layers_alpha: Vec<String>,
}
impl LayersPanel {
pub fn new() -> Self {
Self {
num_layers: 1,
active_layer: 0,
layers_vis: vec![true],
layers_alpha: vec!["255".to_owned()],
}
}
pub fn sync(
&mut self,
num_layers: usize,
active_layer: usize,
layers_vis: Vec<bool>,
layers_alpha: Vec<u8>,
) {
self.active_layer = active_layer;
self.num_layers = num_layers;
self.layers_vis = layers_vis;
self.layers_alpha = layers_alpha.into_iter().map(|x| x.to_string()).collect();
}
pub fn update(&mut self, egui_ctx: &egui::Context) -> Vec<Effect> {
let mut events = Vec::new();
egui::Window::new("Layers")
// .default_pos((15., 410.))
.show(egui_ctx, |ui| {
let btn = ui.button("+");
if btn.clicked() {
events.push(Event::NewLayerAbove.into());
events.push(Event::SwitchLayer(self.num_layers).into());
}
ui.horizontal(|ui| {
ui.label("#");
ui.separator();
ui.label("act.");
ui.separator();
ui.label("vis.");
ui.separator();
ui.label("alpha");
});
for i in 0..self.num_layers {
let i = self.num_layers - i - 1;
ui.horizontal(|ui| {
ui.label((i + 1).to_string());
ui.separator();
let tooltip = format!("select layer {}", i + 1);
if ui
.radio(i == self.active_layer, "")
.on_hover_text(tooltip)
.clicked()
{
events.push(Event::SwitchLayer(i).into());
}
ui.separator();
let tooltip = format!("toggle visibility of layer {}", i + 1);
if ui
.radio(self.layers_vis[i], "")
.on_hover_text(tooltip)
.clicked()
{
events
.push(Event::ChangeLayerVisibility(i, !self.layers_vis[i]).into());
}
ui.separator();
let text_edit = ui.add(
egui::widgets::TextEdit::singleline(&mut self.layers_alpha[i])
.desired_width(30.0),
);
if text_edit.changed() {
if let Ok(opacity) = self.layers_alpha[i].parse() {
events.push(Event::ChangeLayerOpacity(i, opacity).into());
}
}
// Move layer below button
ui.add_enabled_ui(i > 0, |ui| {
let btn = ui.button("v");
if btn.clicked() {
events.push(Event::MoveLayerDown(i).into());
events.push(Event::SwitchLayer(i - 1).into());
}
});
// Move layer above button
ui.add_enabled_ui(i < self.num_layers - 1, |ui| {
let btn = ui.button("^");
if btn.clicked() {
events.push(Event::MoveLayerUp(i).into());
events.push(Event::SwitchLayer(i + 1).into());
}
});
// Delete layer button
ui.add_enabled_ui(self.num_layers > 1, |ui| {
let btn = ui.button("x");
if btn.clicked() {
events.push(Event::DeleteLayer(i).into());
let select_layer = match self.active_layer {
x if i > x => self.active_layer,
x if i == x && i == 0 => 0,
_ => self.active_layer - 1,
};
events.push(Event::SwitchLayer(select_layer).into());
}
});
});
}
});
events
}
}