Add panel background color edit in sandbox
This commit is contained in:
parent
85e1fbd6b6
commit
a477c3c385
|
@ -33,6 +33,7 @@ struct App {
|
||||||
last_update: Instant,
|
last_update: Instant,
|
||||||
protocol_buf: String,
|
protocol_buf: String,
|
||||||
bind_message_buf: String,
|
bind_message_buf: String,
|
||||||
|
panel_bg: egui::Color32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl App {
|
impl App {
|
||||||
|
@ -49,6 +50,7 @@ impl App {
|
||||||
last_update: Instant::now(),
|
last_update: Instant::now(),
|
||||||
protocol_buf: String::new(),
|
protocol_buf: String::new(),
|
||||||
bind_message_buf: String::new(),
|
bind_message_buf: String::new(),
|
||||||
|
panel_bg: egui::Color32::TRANSPARENT,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -58,6 +60,8 @@ impl eframe::App for App {
|
||||||
ctx.request_repaint();
|
ctx.request_repaint();
|
||||||
|
|
||||||
egui::SidePanel::left("left_panel").show(ctx, |ui| {
|
egui::SidePanel::left("left_panel").show(ctx, |ui| {
|
||||||
|
ui.heading("New Panel");
|
||||||
|
|
||||||
ui.label("Protocol name:");
|
ui.label("Protocol name:");
|
||||||
ui.text_edit_singleline(&mut self.protocol_buf);
|
ui.text_edit_singleline(&mut self.protocol_buf);
|
||||||
|
|
||||||
|
@ -81,6 +85,14 @@ impl eframe::App for App {
|
||||||
|
|
||||||
self.panels.push(panel);
|
self.panels.push(panel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ui.separator();
|
||||||
|
ui.heading("Global Settings");
|
||||||
|
|
||||||
|
ui.horizontal(|ui| {
|
||||||
|
ui.label("Panel background color: ");
|
||||||
|
ui.color_edit_button_srgba(&mut self.panel_bg);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
let dt = self.last_update.elapsed().as_secs_f32();
|
let dt = self.last_update.elapsed().as_secs_f32();
|
||||||
|
@ -88,7 +100,7 @@ impl eframe::App for App {
|
||||||
|
|
||||||
for panel in self.panels.iter_mut() {
|
for panel in self.panels.iter_mut() {
|
||||||
panel.panel.update(dt);
|
panel.panel.update(dt);
|
||||||
panel.show(ctx);
|
panel.show(self.panel_bg, ctx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -102,83 +114,87 @@ pub struct PanelWindow {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PanelWindow {
|
impl PanelWindow {
|
||||||
pub fn show(&mut self, ctx: &egui::Context) {
|
pub fn show(&mut self, bg: egui::Color32, ctx: &egui::Context) {
|
||||||
|
let frame = egui::Frame::window(&ctx.style()).fill(bg);
|
||||||
let window_id = egui::Id::new(format!("panel_{}", self.index));
|
let window_id = egui::Id::new(format!("panel_{}", self.index));
|
||||||
egui::Window::new("Panel").id(window_id).show(ctx, |ui| {
|
egui::Window::new("Panel")
|
||||||
egui::menu::bar(ui, |ui| {
|
.frame(frame)
|
||||||
ui.checkbox(&mut self.show_msg, "Show Message Editor");
|
.id(window_id)
|
||||||
});
|
.show(ctx, |ui| {
|
||||||
|
egui::menu::bar(ui, |ui| {
|
||||||
|
ui.checkbox(&mut self.show_msg, "Show Message Editor");
|
||||||
|
});
|
||||||
|
|
||||||
let sense = egui::Sense {
|
let sense = egui::Sense {
|
||||||
click: true,
|
click: true,
|
||||||
drag: true,
|
drag: true,
|
||||||
focusable: true,
|
focusable: true,
|
||||||
};
|
|
||||||
|
|
||||||
let desired_size = ui.available_size();
|
|
||||||
let response = ui.allocate_response(desired_size, sense);
|
|
||||||
let rect = response.rect;
|
|
||||||
|
|
||||||
if rect.size() != self.current_size {
|
|
||||||
let size = rect.size();
|
|
||||||
self.current_size = size;
|
|
||||||
|
|
||||||
let size = canary::Vec2::new(size.x, size.y);
|
|
||||||
self.panel.on_resize(size * PX_PER_MM);
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(hover_pos) = response.hover_pos() {
|
|
||||||
let local = (hover_pos - rect.left_top()) * PX_PER_MM;
|
|
||||||
let pos = canary::Vec2::new(local.x, local.y);
|
|
||||||
|
|
||||||
let kind = if response.drag_started() {
|
|
||||||
CursorEventKind::Select
|
|
||||||
} else if response.drag_released() {
|
|
||||||
CursorEventKind::Deselect
|
|
||||||
} else if response.dragged() {
|
|
||||||
CursorEventKind::Drag
|
|
||||||
} else {
|
|
||||||
CursorEventKind::Hover
|
|
||||||
};
|
};
|
||||||
|
|
||||||
self.panel.on_cursor_event(kind, pos);
|
let desired_size = ui.available_size();
|
||||||
}
|
let response = ui.allocate_response(desired_size, sense);
|
||||||
|
let rect = response.rect;
|
||||||
|
|
||||||
let texture = egui::TextureId::Managed(0);
|
if rect.size() != self.current_size {
|
||||||
let uv = egui::pos2(0.0, 0.0);
|
let size = rect.size();
|
||||||
let mut mesh = egui::Mesh::with_texture(texture);
|
self.current_size = size;
|
||||||
|
|
||||||
let commands = self.panel.draw();
|
let size = canary::Vec2::new(size.x, size.y);
|
||||||
for command in commands.into_iter() {
|
self.panel.on_resize(size * PX_PER_MM);
|
||||||
let voff = mesh.vertices.len() as u32;
|
|
||||||
|
|
||||||
match command {
|
|
||||||
canary::DrawCommand::Mesh { vertices, indices } => {
|
|
||||||
for v in vertices.iter() {
|
|
||||||
use egui::epaint::Vertex;
|
|
||||||
let pos = v.position / PX_PER_MM;
|
|
||||||
let pos = egui::pos2(pos.x, pos.y);
|
|
||||||
let pos = pos + rect.left_top().to_vec2();
|
|
||||||
let (r, g, b, a) = v.color.to_rgba_unmultiplied();
|
|
||||||
let color = egui::Color32::from_rgba_unmultiplied(r, g, b, a);
|
|
||||||
let v = Vertex { pos, uv, color };
|
|
||||||
mesh.vertices.push(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
for i in indices.iter() {
|
|
||||||
mesh.indices.push(i + voff);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => unimplemented!(),
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
let painter = ui.painter_at(rect);
|
if let Some(hover_pos) = response.hover_pos() {
|
||||||
let shape = egui::Shape::mesh(mesh);
|
let local = (hover_pos - rect.left_top()) * PX_PER_MM;
|
||||||
painter.add(shape);
|
let pos = canary::Vec2::new(local.x, local.y);
|
||||||
|
|
||||||
response
|
let kind = if response.drag_started() {
|
||||||
});
|
CursorEventKind::Select
|
||||||
|
} else if response.drag_released() {
|
||||||
|
CursorEventKind::Deselect
|
||||||
|
} else if response.dragged() {
|
||||||
|
CursorEventKind::Drag
|
||||||
|
} else {
|
||||||
|
CursorEventKind::Hover
|
||||||
|
};
|
||||||
|
|
||||||
|
self.panel.on_cursor_event(kind, pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
let texture = egui::TextureId::Managed(0);
|
||||||
|
let uv = egui::pos2(0.0, 0.0);
|
||||||
|
let mut mesh = egui::Mesh::with_texture(texture);
|
||||||
|
|
||||||
|
let commands = self.panel.draw();
|
||||||
|
for command in commands.into_iter() {
|
||||||
|
let voff = mesh.vertices.len() as u32;
|
||||||
|
|
||||||
|
match command {
|
||||||
|
canary::DrawCommand::Mesh { vertices, indices } => {
|
||||||
|
for v in vertices.iter() {
|
||||||
|
use egui::epaint::Vertex;
|
||||||
|
let pos = v.position / PX_PER_MM;
|
||||||
|
let pos = egui::pos2(pos.x, pos.y);
|
||||||
|
let pos = pos + rect.left_top().to_vec2();
|
||||||
|
let (r, g, b, a) = v.color.to_rgba_unmultiplied();
|
||||||
|
let color = egui::Color32::from_rgba_unmultiplied(r, g, b, a);
|
||||||
|
let v = Vertex { pos, uv, color };
|
||||||
|
mesh.vertices.push(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
for i in indices.iter() {
|
||||||
|
mesh.indices.push(i + voff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => unimplemented!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let painter = ui.painter_at(rect);
|
||||||
|
let shape = egui::Shape::mesh(mesh);
|
||||||
|
painter.add(shape);
|
||||||
|
|
||||||
|
response
|
||||||
|
});
|
||||||
|
|
||||||
let msg_edit_id = egui::Id::new(format!("msg_edit_{}", self.index));
|
let msg_edit_id = egui::Id::new(format!("msg_edit_{}", self.index));
|
||||||
egui::Window::new("Message Editor")
|
egui::Window::new("Message Editor")
|
||||||
|
|
Loading…
Reference in New Issue