Skip to content

Commit 91e4201

Browse files
mfish33Keavon
andcommitted
Implement the Properties panel with a transform section for layers (#527)
* initial layout system with tool options * cargo fmt * cargo fmt again * document bar defined on the backend * cargo fmt * removed RC<RefCell> * cargo fmt * - fix increment behavior - removed hashmap from layout message handler - removed no op message from layoutMessage * cargo fmt * only send documentBar when zoom or rotation is updated * ctrl-0 changes zoom properly * unfinished layer hook in * fix layerData name * layer panel options bar * basic x/y movment * working transform section * changed messages from tuples to structs * hook up text input * - fixed number input to be more clear - fixed actions for properties message handler * Add styling Co-authored-by: Keavon Chambers <keavon@keavon.com>
1 parent d084775 commit 91e4201

19 files changed

+659
-45
lines changed

editor/src/consts.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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/document_message.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ pub enum DocumentMessage {
2828
#[remain::unsorted]
2929
#[child]
3030
TransformLayers(TransformLayerMessage),
31+
#[remain::unsorted]
32+
#[child]
33+
PropertiesPanel(PropertiesPanelMessage),
3134

3235
// Messages
3336
AbortTransaction,

editor/src/document/document_message_handler.rs

Lines changed: 24 additions & 6 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,
@@ -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(),
@@ -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));
688694
}
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())
701+
}
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());
@@ -743,12 +757,15 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
743757
DebugPrintDocument => {
744758
log::debug!("{:#?}\n{:#?}", self.graphene_document, self.layer_metadata);
745759
}
746-
DeleteLayer { layer_path } => responses.push_front(DocumentOperation::DeleteLayer { path: layer_path }.into()),
760+
DeleteLayer { layer_path } => {
761+
responses.push_front(DocumentOperation::DeleteLayer { path: layer_path.clone() }.into());
762+
responses.push_back(PropertiesPanelMessage::CheckSelectedWasDeleted { path: layer_path }.into());
763+
}
747764
DeleteSelectedLayers => {
748765
self.backup(responses);
749766

750767
for path in self.selected_layers_without_children() {
751-
responses.push_front(DocumentOperation::DeleteLayer { path: path.to_vec() }.into());
768+
responses.push_front(DocumentMessage::DeleteLayer { layer_path: path.to_vec() }.into());
752769
}
753770

754771
responses.push_front(DocumentMessage::SelectionChanged.into());
@@ -861,9 +878,10 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
861878
);
862879
}
863880
LayerChanged { affected_layer_path } => {
864-
if let Ok(layer_entry) = self.layer_panel_entry(affected_layer_path) {
881+
if let Ok(layer_entry) = self.layer_panel_entry(affected_layer_path.clone()) {
865882
responses.push_back(FrontendMessage::UpdateDocumentLayer { data: layer_entry }.into());
866883
}
884+
responses.push_back(PropertiesPanelMessage::CheckSelectedWasUpdated { path: affected_layer_path }.into());
867885
}
868886
MoveSelectedLayersTo {
869887
folder_path,

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)