mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-18 18:38:05 +08:00
* Implement Path Tool * Draw a red rectangle where the first point on the shape is * Correctly render anchors, handles, and connecting lines * Fix drain() which can panic * Refactor frontend messages to work as return values not callbacks * Reduce the number of unnecessary frontend updates * Fix stack overflow by using a loop * Group Document Render calls and put them at the end * Speed hacks for dirtification * Add performance * Bunch folder changed updates * Add triggers to redraw overlays to movement_handler * Polish the pixel-perfect rendering of vector manipulators * Restore scrollbars that were disabled * Cleanup * WIP Add shape outline rendering * Fix compiling * Add outlines to selected shapes * Fix outlines rendering over handles and anchors * Fix dirtification * Add a comment * Address code review feedback * Formatting * Small tweaks Co-authored-by: Oliver Davies <oliver@psyfer.io> Co-authored-by: Dennis Kobert <dennis@kobert.dev>
57 lines
1.5 KiB
Rust
57 lines
1.5 KiB
Rust
use crate::message_prelude::*;
|
|
use graphite_proc_macros::*;
|
|
use serde::{Deserialize, Serialize};
|
|
use std::{
|
|
collections::hash_map::DefaultHasher,
|
|
hash::{Hash, Hasher},
|
|
};
|
|
|
|
pub trait AsMessage: TransitiveChild
|
|
where
|
|
Self::TopParent: TransitiveChild<Parent = Self::TopParent, TopParent = Self::TopParent> + AsMessage,
|
|
{
|
|
fn local_name(self) -> String;
|
|
fn global_name(self) -> String {
|
|
<Self as Into<Self::TopParent>>::into(self).local_name()
|
|
}
|
|
}
|
|
|
|
#[impl_message]
|
|
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
|
|
pub enum Message {
|
|
NoOp,
|
|
#[child]
|
|
Documents(DocumentsMessage),
|
|
#[child]
|
|
Global(GlobalMessage),
|
|
#[child]
|
|
Tool(ToolMessage),
|
|
#[child]
|
|
Frontend(FrontendMessage),
|
|
#[child]
|
|
InputPreprocessor(InputPreprocessorMessage),
|
|
#[child]
|
|
InputMapper(InputMapperMessage),
|
|
}
|
|
|
|
impl Message {
|
|
/// Returns the byte representation of the message.
|
|
///
|
|
/// # Safety
|
|
/// This function reads from uninitialized memory!!!
|
|
/// Only use if you know what you are doing
|
|
unsafe fn as_slice(&self) -> &[u8] {
|
|
core::slice::from_raw_parts(self as *const Message as *const u8, std::mem::size_of::<Message>())
|
|
}
|
|
/// Returns a pseudo hash that should uniquely identify the message.
|
|
/// This is needed because `Hash` is not implemented for f64s
|
|
///
|
|
/// # Safety
|
|
/// This function reads from uninitialized memory but the generated value should be fine.
|
|
pub fn pseudo_hash(&self) -> u64 {
|
|
let mut s = DefaultHasher::new();
|
|
unsafe { self.as_slice() }.hash(&mut s);
|
|
s.finish()
|
|
}
|
|
}
|