use bladvak::eframe::egui;
#[derive(serde::Deserialize, serde::Serialize, PartialEq, Debug, Clone, Copy)]
pub(crate) struct DrawingMode {
pub drawing_blend: bool,
pub drawing_continuous_line: bool,
pub pen_radius: u32,
pub(crate) pen_color: [u8; 4],
}
impl Default for DrawingMode {
fn default() -> Self {
Self {
drawing_blend: false,
drawing_continuous_line: true,
pen_radius: 1,
pen_color: [0, 0, 0, 255],
}
}
}
impl DrawingMode {
pub(crate) fn show(&mut self, ui: &mut egui::Ui, max_radius: u32) {
ui.add(egui::Slider::new(&mut self.pen_radius, 1..=max_radius / 4))
.on_hover_text("Pen radius");
let [r, g, b, a] = self.pen_color;
let mut color = egui::Color32::from_rgba_premultiplied(r, g, b, a);
egui::color_picker::color_edit_button_srgba(
ui,
&mut color,
egui::color_picker::Alpha::OnlyBlend,
)
.on_hover_text("Pen color");
self.pen_color = [color.r(), color.g(), color.b(), color.a()];
ui.checkbox(&mut self.drawing_blend, "Blend");
ui.checkbox(&mut self.drawing_continuous_line, "Continuous line");
}
}
#[derive(serde::Deserialize, serde::Serialize, Debug, Clone)]
pub(crate) struct Mode {
pub(crate) current: EditMode,
pub(crate) drawing: DrawingMode,
}
impl Default for Mode {
fn default() -> Self {
Self {
current: EditMode::Cursor,
drawing: DrawingMode::default(),
}
}
}
#[derive(serde::Deserialize, serde::Serialize, PartialEq, Debug, Clone, Copy)]
pub(crate) enum EditMode {
Cursor,
Selection,
Drawing,
}
impl std::fmt::Display for EditMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
EditMode::Cursor => write!(f, "Cursor"),
EditMode::Selection => write!(f, "Selection"),
EditMode::Drawing => write!(f, "Drawing"),
}
}
}
#[derive(serde::Deserialize, serde::Serialize, Debug, Clone)]
pub struct SelectionState {
#[serde(skip)]
pub rectangle: Option<egui::Rect>,
#[serde(skip)]
pub start_selection: egui::Pos2,
#[serde(skip)]
pub last_drawing_point: Option<egui::Pos2>,
#[serde(skip)]
pub is_selecting: bool,
pub cursor_op_as_window: bool,
pub remove_selection_after_op: bool,
}
impl Default for SelectionState {
fn default() -> Self {
Self {
rectangle: None,
cursor_op_as_window: false,
start_selection: egui::Pos2::ZERO,
last_drawing_point: None,
is_selecting: false,
remove_selection_after_op: false,
}
}
}