plottery_editor 0.7.0

Graphical Editor of Plottery, a creative coding framework for generative vector graphics and pen plotting.
use std::sync::{Arc, Mutex};

use dioxus::signals::{Readable, SyncSignal};
use plottery_lib::rand_range_i;

#[derive(Debug, Clone)]
pub enum ConsoleMessageType {
    Info,
    Error,
    ProjectLog,
}

#[derive(Debug, Clone)]
pub struct ConsoleMessage {
    pub id: i32,
    pub msg: String,
    pub msg_type: ConsoleMessageType,
}

impl ConsoleMessage {
    pub fn new(msg: &str, msg_type: ConsoleMessageType) -> Self {
        Self {
            id: rand_range_i(i32::MIN, i32::MAX),
            msg: msg.to_string(),
            msg_type,
        }
    }
}

impl PartialEq for ConsoleMessage {
    fn eq(&self, other: &Self) -> bool {
        self.id == other.id
    }
}

#[derive(Debug, Clone)]
pub struct ConsoleMessages {
    entries: Arc<Mutex<Vec<ConsoleMessage>>>,
    change_counter: Arc<Mutex<SyncSignal<u32>>>,
}

impl ConsoleMessages {
    pub fn new(change_counter: SyncSignal<u32>) -> Self {
        Self {
            entries: Arc::new(Mutex::new(Vec::new())),
            change_counter: Arc::new(Mutex::new(change_counter)),
        }
    }
    fn trigger_change(&self) {
        let mut change_counter = self
            .change_counter
            .lock()
            .expect("Failed to lock change counter");
        *change_counter += 1;
    }

    pub fn get_change_counter(&self) -> u32 {
        let sig = *self
            .change_counter
            .lock()
            .expect("Failed to lock change counter");
        return *sig.read();
    }

    pub fn clear(&self) {
        self.entries
            .lock()
            .expect("Failed to lock console entries")
            .clear();
        self.trigger_change();
    }

    pub fn project_message(&self, msg: &str) {
        let formatted = format!("> {}", msg);
        self.entries
            .lock()
            .expect("Failed to lock console entries")
            .push(ConsoleMessage::new(
                &formatted,
                ConsoleMessageType::ProjectLog,
            ));
        log::info!("{}", formatted);
        self.trigger_change();
    }
    pub fn info(&self, msg: &str) {
        self.entries
            .lock()
            .expect("Failed to lock console entries")
            .push(ConsoleMessage::new(msg, ConsoleMessageType::Info));
        log::info!("{}", msg);
        self.trigger_change();
    }
    pub fn error(&self, msg: &str) {
        self.entries
            .lock()
            .expect("Failed to lock console entries")
            .push(ConsoleMessage::new(msg, ConsoleMessageType::Error));
        log::error!("{}", msg);
        self.trigger_change();
    }

    pub fn get_messages(&self) -> Vec<ConsoleMessage> {
        self.entries
            .lock()
            .expect("Failed to lock console entries")
            .clone()
    }
}