Skip to content

Commit e41350a

Browse files
committed
Merge branch 'master' of https://github.com/GraphiteEditor/Graphite into doccomments
2 parents 546da0e + dbe2143 commit e41350a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+3241
-845
lines changed

editor/src/consts.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub const SELECTION_DRAG_ANGLE: f64 = 90.;
3232

3333
// Transformation cage
3434
pub const BOUNDS_SELECT_THRESHOLD: f64 = 10.;
35-
pub const BOUNDS_ROTATE_THRESHOLD: f64 = 40.;
35+
pub const BOUNDS_ROTATE_THRESHOLD: f64 = 20.;
3636

3737
// Path tool
3838
pub const VECTOR_MANIPULATOR_ANCHOR_MARKER_SIZE: f64 = 5.;
@@ -54,5 +54,5 @@ pub const FILE_EXPORT_SUFFIX: &str = ".svg";
5454
pub const COLOR_ACCENT: Color = Color::from_unsafe(0x00 as f32 / 255., 0xA8 as f32 / 255., 0xFF as f32 / 255.);
5555

5656
// Document
57-
pub const GRAPHITE_DOCUMENT_VERSION: &str = "0.0.2";
57+
pub const GRAPHITE_DOCUMENT_VERSION: &str = "0.0.3";
5858
pub const VIEWPORT_ZOOM_TO_FIT_PADDING_SCALE_FACTOR: f32 = 1.05;

editor/src/document/artboard_message.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@ pub enum ArtboardMessage {
1818
position: (f64, f64),
1919
size: (f64, f64),
2020
},
21+
DeleteArtboard {
22+
artboard: LayerId,
23+
},
2124
RenderArtboards,
2225
ResizeArtboard {
23-
artboard: Vec<LayerId>,
26+
artboard: LayerId,
2427
position: (f64, f64),
2528
size: (f64, f64),
2629
},

editor/src/document/artboard_message_handler.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@ impl MessageHandler<ArtboardMessage, ()> for ArtboardMessageHandler {
5555

5656
responses.push_back(DocumentMessage::RenderDocument.into());
5757
}
58+
DeleteArtboard { artboard } => {
59+
self.artboard_ids.retain(|&id| id != artboard);
60+
61+
responses.push_back(ArtboardMessage::DispatchOperation(Box::new(DocumentOperation::DeleteLayer { path: vec![artboard] })).into());
62+
63+
responses.push_back(DocumentMessage::RenderDocument.into());
64+
}
5865
RenderArtboards => {
5966
// Render an infinite canvas if there are no artboards
6067
if self.artboard_ids.is_empty() {
@@ -76,7 +83,7 @@ impl MessageHandler<ArtboardMessage, ()> for ArtboardMessageHandler {
7683
ResizeArtboard { artboard, position, size } => {
7784
responses.push_back(
7885
ArtboardMessage::DispatchOperation(Box::new(DocumentOperation::SetLayerTransform {
79-
path: artboard,
86+
path: vec![artboard],
8087
transform: DAffine2::from_scale_angle_translation(size.into(), 0., position.into()).to_cols_array(),
8188
}))
8289
.into(),

editor/src/document/document_message.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use super::layer_panel::LayerMetadata;
22
use super::utility_types::{AlignAggregate, AlignAxis, FlipAxis};
33
use crate::message_prelude::*;
44

5+
use graphene::boolean_ops::BooleanOperation as BooleanOperationType;
56
use graphene::layers::blend_mode::BlendMode;
67
use graphene::layers::style::ViewMode;
78
use graphene::LayerId;
@@ -28,6 +29,9 @@ pub enum DocumentMessage {
2829
#[remain::unsorted]
2930
#[child]
3031
TransformLayers(TransformLayerMessage),
32+
#[remain::unsorted]
33+
#[child]
34+
PropertiesPanel(PropertiesPanelMessage),
3135

3236
// Messages
3337
AbortTransaction,
@@ -38,6 +42,7 @@ pub enum DocumentMessage {
3842
axis: AlignAxis,
3943
aggregate: AlignAggregate,
4044
},
45+
BooleanOperation(BooleanOperationType),
4146
CommitTransaction,
4247
CreateEmptyFolder {
4348
container_path: Vec<LayerId>,

editor/src/document/document_message_handler.rs

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::clipboards::Clipboard;
22
use super::layer_panel::{layer_panel_entry, LayerDataTypeDiscriminant, LayerMetadata, LayerPanelEntry, RawBuffer};
33
use super::utility_types::{AlignAggregate, AlignAxis, DocumentSave, FlipAxis};
4-
use super::vectorize_layer_metadata;
4+
use super::{vectorize_layer_metadata, PropertiesPanelMessageHandler};
55
use super::{ArtboardMessageHandler, MovementMessageHandler, OverlaysMessageHandler, TransformLayerMessageHandler};
66
use crate::consts::{
77
ASYMPTOTIC_EFFECT, DEFAULT_DOCUMENT_NAME, FILE_EXPORT_SUFFIX, FILE_SAVE_SUFFIX, GRAPHITE_DOCUMENT_VERSION, SCALE_EFFECT, SCROLLBAR_SPACING, VIEWPORT_ZOOM_TO_FIT_PADDING_SCALE_FACTOR,
@@ -16,7 +16,7 @@ use crate::viewport_tools::vector_editor::vector_shape::VectorShape;
1616
use crate::EditorError;
1717

1818
use graphene::document::Document as GrapheneDocument;
19-
use graphene::layers::folder::Folder;
19+
use graphene::layers::folder_layer::FolderLayer;
2020
use graphene::layers::layer_info::LayerDataType;
2121
use graphene::layers::style::ViewMode;
2222
use graphene::{DocumentError, DocumentResponse, LayerId, Operation as DocumentOperation};
@@ -45,6 +45,7 @@ pub struct DocumentMessageHandler {
4545
pub artboard_message_handler: ArtboardMessageHandler,
4646
#[serde(skip)]
4747
transform_layer_handler: TransformLayerMessageHandler,
48+
properties_panel_message_handler: PropertiesPanelMessageHandler,
4849
pub overlays_visible: bool,
4950
pub snapping_enabled: bool,
5051
pub view_mode: ViewMode,
@@ -65,6 +66,7 @@ impl Default for DocumentMessageHandler {
6566
overlays_message_handler: OverlaysMessageHandler::default(),
6667
artboard_message_handler: ArtboardMessageHandler::default(),
6768
transform_layer_handler: TransformLayerMessageHandler::default(),
69+
properties_panel_message_handler: PropertiesPanelMessageHandler::default(),
6870
snapping_enabled: true,
6971
overlays_visible: true,
7072
view_mode: ViewMode::default(),
@@ -221,7 +223,7 @@ impl DocumentMessageHandler {
221223
)
222224
}
223225

224-
fn serialize_structure(&self, folder: &Folder, structure: &mut Vec<u64>, data: &mut Vec<LayerId>, path: &mut Vec<LayerId>) {
226+
fn serialize_structure(&self, folder: &FolderLayer, structure: &mut Vec<u64>, data: &mut Vec<LayerId>, path: &mut Vec<LayerId>) {
225227
let mut space = 0;
226228
for (id, layer) in folder.layer_ids.iter().zip(folder.layers()).rev() {
227229
data.push(*id);
@@ -676,16 +678,28 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
676678
self.transform_layer_handler
677679
.process_action(message, (&mut self.layer_metadata, &mut self.graphene_document, ipp), responses);
678680
}
681+
#[remain::unsorted]
682+
PropertiesPanel(message) => {
683+
self.properties_panel_message_handler.process_action(message, &self.graphene_document, responses);
684+
}
679685

680686
// Messages
681687
AbortTransaction => {
682688
self.undo(responses).unwrap_or_else(|e| log::warn!("{}", e));
683689
responses.extend([RenderDocument.into(), DocumentStructureChanged.into()]);
684690
}
685691
AddSelectedLayers { additional_layers } => {
686-
for layer_path in additional_layers {
687-
responses.extend(self.select_layer(&layer_path));
692+
for layer_path in &additional_layers {
693+
responses.extend(self.select_layer(layer_path));
694+
}
695+
696+
let selected_paths: Vec<Vec<u64>> = self.selected_layers().map(|path| path.to_vec()).collect();
697+
if selected_paths.is_empty() {
698+
responses.push_back(PropertiesPanelMessage::ClearSelection.into())
699+
} else {
700+
responses.push_back(PropertiesPanelMessage::SetActiveLayers { paths: selected_paths }.into())
688701
}
702+
689703
// TODO: Correctly update layer panel in clear_selection instead of here
690704
responses.push_back(FolderChanged { affected_folder_path: vec![] }.into());
691705
responses.push_back(DocumentMessage::SelectionChanged.into());
@@ -727,6 +741,16 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
727741
responses.push_back(ToolMessage::DocumentIsDirty.into());
728742
}
729743
}
744+
BooleanOperation(op) => {
745+
// convert Vec<&[LayerId]> to Vec<Vec<&LayerId>> because Vec<&[LayerId]> does not implement several traits (Debug, Serialize, Deserialize, ...) required by DocumentOperation enum
746+
responses.push_back(
747+
DocumentOperation::BooleanOperation {
748+
operation: op,
749+
selected: self.selected_layers_sorted().iter().map(|slice| (*slice).into()).collect(),
750+
}
751+
.into(),
752+
);
753+
}
730754
CommitTransaction => (),
731755
CreateEmptyFolder { mut container_path } => {
732756
let id = generate_uuid();
@@ -743,12 +767,15 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
743767
DebugPrintDocument => {
744768
log::debug!("{:#?}\n{:#?}", self.graphene_document, self.layer_metadata);
745769
}
746-
DeleteLayer { layer_path } => responses.push_front(DocumentOperation::DeleteLayer { path: layer_path }.into()),
770+
DeleteLayer { layer_path } => {
771+
responses.push_front(DocumentOperation::DeleteLayer { path: layer_path.clone() }.into());
772+
responses.push_back(PropertiesPanelMessage::CheckSelectedWasDeleted { path: layer_path }.into());
773+
}
747774
DeleteSelectedLayers => {
748775
self.backup(responses);
749776

750777
for path in self.selected_layers_without_children() {
751-
responses.push_front(DocumentOperation::DeleteLayer { path: path.to_vec() }.into());
778+
responses.push_front(DocumentMessage::DeleteLayer { layer_path: path.to_vec() }.into());
752779
}
753780

754781
responses.push_front(DocumentMessage::SelectionChanged.into());
@@ -781,7 +808,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
781808
}
782809
}
783810
ExportDocument => {
784-
// TODO(MFISH33): Add Dialog to select artboards
811+
// TODO(mfish33): Add Dialog to select artboards
785812
let bbox = self.document_bounds().unwrap_or_else(|| [DVec2::ZERO, ipp.viewport_bounds.size()]);
786813
let size = bbox[1] - bbox[0];
787814
let name = match self.name.ends_with(FILE_SAVE_SUFFIX) {
@@ -861,9 +888,10 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
861888
);
862889
}
863890
LayerChanged { affected_layer_path } => {
864-
if let Ok(layer_entry) = self.layer_panel_entry(affected_layer_path) {
891+
if let Ok(layer_entry) = self.layer_panel_entry(affected_layer_path.clone()) {
865892
responses.push_back(FrontendMessage::UpdateDocumentLayer { data: layer_entry }.into());
866893
}
894+
responses.push_back(PropertiesPanelMessage::CheckSelectedWasUpdated { path: affected_layer_path }.into());
867895
}
868896
MoveSelectedLayersTo {
869897
folder_path,
@@ -902,7 +930,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
902930
responses.push_back(ToolMessage::DocumentIsDirty.into());
903931
}
904932
Redo => {
905-
responses.push_back(SelectMessage::Abort.into());
933+
responses.push_back(SelectToolMessage::Abort.into());
906934
responses.push_back(DocumentHistoryForward.into());
907935
responses.push_back(ToolMessage::DocumentIsDirty.into());
908936
responses.push_back(RenderDocument.into());
@@ -1159,7 +1187,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
11591187
responses.push_back(ToolMessage::DocumentIsDirty.into());
11601188
}
11611189
Undo => {
1162-
responses.push_back(SelectMessage::Abort.into());
1190+
responses.push_back(SelectToolMessage::Abort.into());
11631191
responses.push_back(DocumentHistoryBackward.into());
11641192
responses.push_back(ToolMessage::DocumentIsDirty.into());
11651193
responses.push_back(RenderDocument.into());

editor/src/document/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ mod overlays_message;
1414
mod overlays_message_handler;
1515
mod portfolio_message;
1616
mod portfolio_message_handler;
17+
mod properties_panel_message;
18+
mod properties_panel_message_handler;
1719
mod transform_layer_message;
1820
mod transform_layer_message_handler;
1921

@@ -42,6 +44,11 @@ pub use portfolio_message::{PortfolioMessage, PortfolioMessageDiscriminant};
4244
#[doc(inline)]
4345
pub use portfolio_message_handler::PortfolioMessageHandler;
4446

47+
#[doc(inline)]
48+
pub use properties_panel_message::{PropertiesPanelMessage, PropertiesPanelMessageDiscriminant};
49+
#[doc(inline)]
50+
pub use properties_panel_message_handler::PropertiesPanelMessageHandler;
51+
4552
#[doc(inline)]
4653
pub use transform_layer_message::{TransformLayerMessage, TransformLayerMessageDiscriminant};
4754
#[doc(inline)]
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
use crate::message_prelude::*;
2+
3+
use serde::{Deserialize, Serialize};
4+
5+
#[remain::sorted]
6+
#[impl_message(Message, DocumentMessage, PropertiesPanel)]
7+
#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)]
8+
pub enum PropertiesPanelMessage {
9+
CheckSelectedWasDeleted { path: Vec<LayerId> },
10+
CheckSelectedWasUpdated { path: Vec<LayerId> },
11+
ClearSelection,
12+
ModifyName { name: String },
13+
ModifyTransform { value: f64, transform_op: TransformOp },
14+
SetActiveLayers { paths: Vec<Vec<LayerId>> },
15+
}
16+
17+
#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)]
18+
pub enum TransformOp {
19+
X,
20+
Y,
21+
Width,
22+
Height,
23+
Rotation,
24+
}

0 commit comments

Comments
 (0)