use super::{Editor, Selection};
use crate::model::{ItemId, StrokeKind, ToneRange};
use crate::panic_free::Clamped;
pub const DEFAULT_STRENGTH: f64 = 0.5;
#[derive(Clone, Copy, Debug, PartialEq)]
pub(super) struct DodgeSettings {
pub(super) kind: StrokeKind,
pub(super) range: ToneRange,
pub(super) size: Option<f64>,
pub(super) strength: f64,
}
impl Default for DodgeSettings {
fn default() -> Self {
Self {
kind: StrokeKind::Dodge,
range: ToneRange::default(),
size: None,
strength: DEFAULT_STRENGTH,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct DodgeTool {
pub item: ItemId,
pub kind: StrokeKind,
pub range: ToneRange,
pub size: f64,
pub strength: f64,
}
impl Editor {
pub(super) fn start_dodge(&mut self, item: ItemId) -> bool {
if self.project.state().item(item).is_none() {
return false;
}
self.leave_tools();
self.dodge = Some(item);
self.selection = Selection::Item(item);
true
}
pub fn dodge_tool(&self) -> Option<DodgeTool> {
let id = self.dodge?;
let item = self.project.state().item(id)?;
let default = (f64::from(item.width.min(item.height)) * 0.05)
.max(1.0)
.round();
let s = self.dodge_settings;
Some(DodgeTool {
item: id,
kind: s.kind,
range: s.range,
size: s.size.unwrap_or(default),
strength: s.strength,
})
}
pub fn set_dodge_kind(&mut self, kind: StrokeKind) {
if !kind.is_smear() {
self.dodge_settings.kind = kind;
}
}
pub fn set_dodge_range(&mut self, range: ToneRange) {
self.dodge_settings.range = range;
}
pub fn set_dodge_size(&mut self, size: f64) {
if size.is_finite() && size >= 1.0 {
self.dodge_settings.size = Some(size);
}
}
pub fn set_dodge_strength(&mut self, strength: f64) {
if strength.is_finite() {
self.dodge_settings.strength = strength.clamped(0.01, 1.0);
}
}
}