use crate::ui::{
asset_tree::{AssetTree, TREE_WIDTH, TreeSelection},
window_common::{gled_window_frame, raise, tool_window_builder},
};
use egui::{Context, Id, Ui, Vec2, ViewportId};
use gled_model::{
asset::{Asset, palette::Palette},
collection::Collections,
};
#[derive(Debug, Default)]
pub(crate) struct PalettesWindow {
open: bool,
raise: bool,
dirty: bool,
tree: AssetTree<Palette>,
}
impl PalettesWindow {
#[cfg_attr(feature = "profiling", profiling::function)]
pub(crate) fn update(&mut self, ctx: &Context, collections: &mut Collections) {
if !self.open {
self.dirty = false;
return;
}
ctx.show_viewport_immediate(
ViewportId(Id::new("palettes window")),
tool_window_builder("Palettes")
.with_inner_size(Vec2::new(650.0, 500.0))
.with_min_inner_size(Vec2::new(650.0, 500.0)),
|ctx, _viewport_class| {
raise(ctx, &mut self.raise);
ctx.input(|input| {
if input.viewport().close_requested()
|| crate::ui::window_common::embedded_close_clicked("Palettes")
{
self.open = false;
}
});
gled_window_frame(ctx, "Palettes", |ui| {
egui::Panel::left("palettes tree")
.exact_size(TREE_WIDTH)
.resizable(false)
.show(ui, |ui| {
if self.tree.show(
ui,
ui.make_persistent_id("palettes_tree"),
collections,
) {
self.dirty = false;
}
});
egui::CentralPanel::default().show(ui, |ui| {
self.tree.common_settings(ui, &mut self.dirty, collections);
if let TreeSelection::Asset(palette) = &mut self.tree.selected() {
palette_editor(ui, palette, &mut self.dirty);
}
});
});
},
);
}
pub(crate) fn open(&mut self) {
self.open = true;
self.raise = true;
}
}
fn palette_editor(ui: &mut Ui, palette: &mut Asset<Palette>, dirty: &mut bool) {
ui.label("Primary color:");
let res = ui.color_edit_button_rgb(palette.data.primary.rgb_mut());
*dirty |= res.changed();
ui.label("Secondary color:");
let res = ui.color_edit_button_rgb(palette.data.secondary.rgb_mut());
*dirty |= res.changed();
ui.label("Gradient colors:");
ui.scope(|ui| {
palette.data.gradient.chunks_mut(4).for_each(|chunk| {
ui.horizontal(|ui| {
chunk.iter_mut().for_each(|color| {
let res = ui.color_edit_button_rgb(color.rgb_mut());
*dirty |= res.changed();
});
});
});
});
}