Skip to content

Commit 44aecd8

Browse files
committed
Add QR Code mode to the Shape tool
1 parent a3f88b0 commit 44aecd8

File tree

5 files changed

+76
-2
lines changed

5 files changed

+76
-2
lines changed

editor/src/messages/tool/common_functionality/graph_modification_utils.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,10 @@ pub fn get_polygon_id(layer: LayerNodeIdentifier, network_interface: &NodeNetwor
356356
NodeGraphLayer::new(layer, network_interface).upstream_node_id_from_name(&DefinitionIdentifier::ProtoNode(graphene_std::vector_nodes::regular_polygon::IDENTIFIER))
357357
}
358358

359+
pub fn get_qr_code_id(layer: LayerNodeIdentifier, network_interface: &NodeNetworkInterface) -> Option<NodeId> {
360+
NodeGraphLayer::new(layer, network_interface).upstream_node_id_from_name(&DefinitionIdentifier::ProtoNode(graphene_std::vector_nodes::qr_code::IDENTIFIER))
361+
}
362+
359363
pub fn get_rectangle_id(layer: LayerNodeIdentifier, network_interface: &NodeNetworkInterface) -> Option<NodeId> {
360364
NodeGraphLayer::new(layer, network_interface).upstream_node_id_from_name(&DefinitionIdentifier::ProtoNode(graphene_std::vector_nodes::rectangle::IDENTIFIER))
361365
}

editor/src/messages/tool/common_functionality/shapes/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ pub mod ellipse_shape;
55
pub mod grid_shape;
66
pub mod line_shape;
77
pub mod polygon_shape;
8+
pub mod qr_code_shape;
89
pub mod rectangle_shape;
910
pub mod shape_utility;
1011
pub mod spiral_shape;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
use super::shape_utility::ShapeToolModifierKey;
2+
use super::*;
3+
use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn;
4+
use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_proto_node_type;
5+
use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier;
6+
use crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, NodeTemplate};
7+
use crate::messages::tool::common_functionality::graph_modification_utils;
8+
use crate::messages::tool::tool_messages::tool_prelude::*;
9+
use glam::DAffine2;
10+
use graph_craft::document::NodeInput;
11+
use graph_craft::document::value::TaggedValue;
12+
use std::collections::VecDeque;
13+
14+
#[derive(Default)]
15+
pub struct QrCode;
16+
17+
impl QrCode {
18+
pub fn create_node() -> NodeTemplate {
19+
let node_type = resolve_proto_node_type(graphene_std::vector::generator_nodes::qr_code::IDENTIFIER).expect("QR Code node can't be found");
20+
node_type.node_template_input_override([None, None, Some(NodeInput::value(TaggedValue::Bool(true), false)), Some(NodeInput::value(TaggedValue::F64(1.), false))])
21+
}
22+
23+
pub fn update_shape(
24+
document: &DocumentMessageHandler,
25+
ipp: &InputPreprocessorMessageHandler,
26+
viewport: &ViewportMessageHandler,
27+
layer: LayerNodeIdentifier,
28+
shape_tool_data: &mut ShapeToolData,
29+
modifier: ShapeToolModifierKey,
30+
responses: &mut VecDeque<Message>,
31+
) {
32+
let [center, lock_ratio, _] = modifier;
33+
34+
if let Some([start, end]) = shape_tool_data.data.calculate_points(document, ipp, viewport, center, lock_ratio) {
35+
let Some(node_id) = graph_modification_utils::get_qr_code_id(layer, &document.network_interface) else {
36+
return;
37+
};
38+
39+
let side = (start.x - end.x).abs().max((start.y - end.y).abs());
40+
41+
responses.add(NodeGraphMessage::SetInput {
42+
input_connector: InputConnector::node(node_id, 3),
43+
input: NodeInput::value(TaggedValue::F64(side), false),
44+
});
45+
responses.add(GraphOperationMessage::TransformSet {
46+
layer,
47+
transform: DAffine2::from_translation(start),
48+
transform_in: TransformIn::Viewport,
49+
skip_rerender: false,
50+
});
51+
}
52+
}
53+
}

editor/src/messages/tool/common_functionality/shapes/shape_utility.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ pub enum ShapeType {
3535
Spiral,
3636
Grid,
3737
Arrow,
38+
QrCode,
3839
Line, // KEEP THIS AT THE END
3940
Rectangle, // KEEP THIS AT THE END
4041
Ellipse, // KEEP THIS AT THE END
@@ -50,6 +51,7 @@ impl ShapeType {
5051
Self::Spiral => "Spiral",
5152
Self::Grid => "Grid",
5253
Self::Arrow => "Arrow",
54+
Self::QrCode => "QR Code",
5355
Self::Line => "Line",
5456
Self::Rectangle => "Rectangle",
5557
Self::Ellipse => "Ellipse",

editor/src/messages/tool/tool_messages/shape_tool.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use crate::messages::tool::common_functionality::shapes::circle_shape::Circle;
1414
use crate::messages::tool::common_functionality::shapes::grid_shape::Grid;
1515
use crate::messages::tool::common_functionality::shapes::line_shape::LineToolData;
1616
use crate::messages::tool::common_functionality::shapes::polygon_shape::Polygon;
17+
use crate::messages::tool::common_functionality::shapes::qr_code_shape::QrCode;
1718
use crate::messages::tool::common_functionality::shapes::shape_utility::{ShapeToolModifierKey, ShapeType, anchor_overlays, clicked_on_shape_endpoints, transform_cage_overlays};
1819
use crate::messages::tool::common_functionality::shapes::spiral_shape::Spiral;
1920
use crate::messages::tool::common_functionality::shapes::star_shape::Star;
@@ -187,6 +188,12 @@ fn create_shape_option_widget(shape_type: ShapeType) -> WidgetInstance {
187188
}
188189
.into()
189190
}),
191+
MenuListEntry::new("QR Code").label("QR Code").on_commit(move |_| {
192+
ShapeToolMessage::UpdateOptions {
193+
options: ShapeOptionsUpdate::ShapeType(ShapeType::QrCode),
194+
}
195+
.into()
196+
}),
190197
]];
191198
DropdownInput::new(entries).selected_index(Some(shape_type as u32)).widget_instance()
192199
}
@@ -905,7 +912,7 @@ impl Fsm for ShapeToolFsmState {
905912
};
906913

907914
match tool_data.current_shape {
908-
ShapeType::Polygon | ShapeType::Star | ShapeType::Circle | ShapeType::Arc | ShapeType::Spiral | ShapeType::Grid | ShapeType::Rectangle | ShapeType::Ellipse => {
915+
ShapeType::Polygon | ShapeType::Star | ShapeType::Circle | ShapeType::Arc | ShapeType::Spiral | ShapeType::Grid | ShapeType::Rectangle | ShapeType::Ellipse | ShapeType::QrCode => {
909916
tool_data.data.start(document, input, viewport);
910917
}
911918
ShapeType::Arrow | ShapeType::Line => {
@@ -931,6 +938,7 @@ impl Fsm for ShapeToolFsmState {
931938
ShapeType::Line => Line::create_node(),
932939
ShapeType::Rectangle => Rectangle::create_node(),
933940
ShapeType::Ellipse => Ellipse::create_node(),
941+
ShapeType::QrCode => QrCode::create_node(),
934942
};
935943

936944
let nodes = vec![(NodeId(0), node)];
@@ -939,7 +947,7 @@ impl Fsm for ShapeToolFsmState {
939947
let defered_responses = &mut VecDeque::new();
940948

941949
match tool_data.current_shape {
942-
ShapeType::Polygon | ShapeType::Star | ShapeType::Circle | ShapeType::Arc | ShapeType::Spiral | ShapeType::Grid | ShapeType::Rectangle | ShapeType::Ellipse => {
950+
ShapeType::Polygon | ShapeType::Star | ShapeType::Circle | ShapeType::Arc | ShapeType::Spiral | ShapeType::Grid | ShapeType::Rectangle | ShapeType::Ellipse | ShapeType::QrCode => {
943951
defered_responses.add(GraphOperationMessage::TransformSet {
944952
layer,
945953
transform: DAffine2::from_scale_angle_translation(DVec2::ONE, 0., input.mouse.position),
@@ -1004,6 +1012,7 @@ impl Fsm for ShapeToolFsmState {
10041012
ShapeType::Line => Line::update_shape(document, input, viewport, layer, tool_data, modifier, responses),
10051013
ShapeType::Rectangle => Rectangle::update_shape(document, input, viewport, layer, tool_data, modifier, responses),
10061014
ShapeType::Ellipse => Ellipse::update_shape(document, input, viewport, layer, tool_data, modifier, responses),
1015+
ShapeType::QrCode => QrCode::update_shape(document, input, viewport, layer, tool_data, modifier, responses),
10071016
}
10081017

10091018
// Auto-panning
@@ -1269,6 +1278,10 @@ fn update_dynamic_hints(state: &ShapeToolFsmState, responses: &mut VecDeque<Mess
12691278
HintInfo::keys([Key::Shift], "Constrain Circular").prepend_plus(),
12701279
HintInfo::keys([Key::Alt], "From Center").prepend_plus(),
12711280
])],
1281+
ShapeType::QrCode => vec![HintGroup(vec![
1282+
HintInfo::mouse(MouseMotion::LmbDrag, "Draw QR Code"),
1283+
HintInfo::keys([Key::Alt], "From Center").prepend_plus(),
1284+
])],
12721285
};
12731286
HintData(hint_groups)
12741287
}
@@ -1291,6 +1304,7 @@ fn update_dynamic_hints(state: &ShapeToolFsmState, responses: &mut VecDeque<Mess
12911304
]),
12921305
ShapeType::Rectangle => HintGroup(vec![HintInfo::keys([Key::Shift], "Constrain Square"), HintInfo::keys([Key::Alt], "From Center")]),
12931306
ShapeType::Ellipse => HintGroup(vec![HintInfo::keys([Key::Shift], "Constrain Circular"), HintInfo::keys([Key::Alt], "From Center")]),
1307+
ShapeType::QrCode => HintGroup(vec![HintInfo::keys([Key::Alt], "From Center")]),
12941308
};
12951309

12961310
if !tool_hint_group.0.is_empty() {

0 commit comments

Comments
 (0)