@@ -18,10 +18,10 @@ use std::f64::consts::PI;
1818use std:: rc:: Rc ;
1919
2020trait DAffine2Utils {
21- fn width ( & self ) -> f64 ;
22- fn update_width ( self , new_width : f64 ) -> Self ;
23- fn height ( & self ) -> f64 ;
24- fn update_height ( self , new_height : f64 ) -> Self ;
21+ fn scale_x ( & self ) -> f64 ;
22+ fn update_scale_x ( self , new_width : f64 ) -> Self ;
23+ fn scale_y ( & self ) -> f64 ;
24+ fn update_scale_y ( self , new_height : f64 ) -> Self ;
2525 fn x ( & self ) -> f64 ;
2626 fn update_x ( self , new_x : f64 ) -> Self ;
2727 fn y ( & self ) -> f64 ;
@@ -31,20 +31,20 @@ trait DAffine2Utils {
3131}
3232
3333impl DAffine2Utils for DAffine2 {
34- fn width ( & self ) -> f64 {
34+ fn scale_x ( & self ) -> f64 {
3535 self . transform_vector2 ( ( 1. , 0. ) . into ( ) ) . length ( )
3636 }
3737
38- fn update_width ( self , new_width : f64 ) -> Self {
39- self * DAffine2 :: from_scale ( ( new_width / self . width ( ) , 1. ) . into ( ) )
38+ fn update_scale_x ( self , new_width : f64 ) -> Self {
39+ self * DAffine2 :: from_scale ( ( new_width / self . scale_x ( ) , 1. ) . into ( ) )
4040 }
4141
42- fn height ( & self ) -> f64 {
42+ fn scale_y ( & self ) -> f64 {
4343 self . transform_vector2 ( ( 0. , 1. ) . into ( ) ) . length ( )
4444 }
4545
46- fn update_height ( self , new_height : f64 ) -> Self {
47- self * DAffine2 :: from_scale ( ( 1. , new_height / self . height ( ) ) . into ( ) )
46+ fn update_scale_y ( self , new_height : f64 ) -> Self {
47+ self * DAffine2 :: from_scale ( ( 1. , new_height / self . scale_y ( ) ) . into ( ) )
4848 }
4949
5050 fn x ( & self ) -> f64 {
@@ -66,14 +66,14 @@ impl DAffine2Utils for DAffine2 {
6666 }
6767
6868 fn rotation ( & self ) -> f64 {
69- let cos = self . matrix2 . col ( 0 ) . x / self . width ( ) ;
70- let sin = self . matrix2 . col ( 0 ) . y / self . width ( ) ;
69+ let cos = self . matrix2 . col ( 0 ) . x / self . scale_x ( ) ;
70+ let sin = self . matrix2 . col ( 0 ) . y / self . scale_x ( ) ;
7171 sin. atan2 ( cos)
7272 }
7373
7474 fn update_rotation ( self , new_rotation : f64 ) -> Self {
75- let width = self . width ( ) ;
76- let height = self . height ( ) ;
75+ let width = self . scale_x ( ) ;
76+ let height = self . scale_y ( ) ;
7777 let half_width = width / 2. ;
7878 let half_height = height / 2. ;
7979
@@ -138,15 +138,21 @@ impl MessageHandler<PropertiesPanelMessage, &GrapheneDocument> for PropertiesPan
138138 let action = match transform_op {
139139 X => DAffine2 :: update_x,
140140 Y => DAffine2 :: update_y,
141- Width => DAffine2 :: update_width ,
142- Height => DAffine2 :: update_height ,
141+ ScaleX | Width => DAffine2 :: update_scale_x ,
142+ ScaleY | Height => DAffine2 :: update_scale_y ,
143143 Rotation => DAffine2 :: update_rotation,
144144 } ;
145145
146+ let scale = match transform_op {
147+ Width => layer. bounding_transform ( ) . scale_x ( ) / layer. transform . scale_x ( ) ,
148+ Height => layer. bounding_transform ( ) . scale_y ( ) / layer. transform . scale_y ( ) ,
149+ _ => 1. ,
150+ } ;
151+
146152 responses. push_back (
147153 Operation :: SetLayerTransform {
148154 path : path. clone ( ) ,
149- transform : action ( layer. transform , value) . to_cols_array ( ) ,
155+ transform : action ( layer. transform , value / scale ) . to_cols_array ( ) ,
150156 }
151157 . into ( ) ,
152158 ) ;
@@ -297,7 +303,7 @@ fn node_section_transform(layer: &Layer) -> LayoutRow {
297303 name: "" . into( ) ,
298304 widgets: vec![
299305 WidgetHolder :: new( Widget :: TextLabel ( TextLabel {
300- value: "Position " . into( ) ,
306+ value: "Location " . into( ) ,
301307 ..TextLabel :: default ( )
302308 } ) ) ,
303309 WidgetHolder :: new( Widget :: Separator ( Separator {
@@ -340,21 +346,47 @@ fn node_section_transform(layer: &Layer) -> LayoutRow {
340346 name: "" . into( ) ,
341347 widgets: vec![
342348 WidgetHolder :: new( Widget :: TextLabel ( TextLabel {
343- value: "Dimensions " . into( ) ,
349+ value: "Rotation " . into( ) ,
344350 ..TextLabel :: default ( )
345351 } ) ) ,
346352 WidgetHolder :: new( Widget :: Separator ( Separator {
347353 separator_type: SeparatorType :: Unrelated ,
348354 direction: SeparatorDirection :: Horizontal ,
349355 } ) ) ,
350356 WidgetHolder :: new( Widget :: NumberInput ( NumberInput {
351- value: layer. transform. width( ) ,
352- label: "W" . into( ) ,
353- unit: " px" . into( ) ,
357+ value: layer. transform. rotation( ) * 180. / PI ,
358+ label: "" . into( ) ,
359+ unit: "°" . into( ) ,
360+ on_update: WidgetCallback :: new( |number_input: & NumberInput | {
361+ PropertiesPanelMessage :: ModifyTransform {
362+ value: number_input. value / 180. * PI ,
363+ transform_op: TransformOp :: Rotation ,
364+ }
365+ . into( )
366+ } ) ,
367+ ..NumberInput :: default ( )
368+ } ) ) ,
369+ ] ,
370+ } ,
371+ LayoutRow :: Row {
372+ name: "" . into( ) ,
373+ widgets: vec![
374+ WidgetHolder :: new( Widget :: TextLabel ( TextLabel {
375+ value: "Scale" . into( ) ,
376+ ..TextLabel :: default ( )
377+ } ) ) ,
378+ WidgetHolder :: new( Widget :: Separator ( Separator {
379+ separator_type: SeparatorType :: Unrelated ,
380+ direction: SeparatorDirection :: Horizontal ,
381+ } ) ) ,
382+ WidgetHolder :: new( Widget :: NumberInput ( NumberInput {
383+ value: layer. transform. scale_x( ) ,
384+ label: "X" . into( ) ,
385+ unit: "" . into( ) ,
354386 on_update: WidgetCallback :: new( |number_input: & NumberInput | {
355387 PropertiesPanelMessage :: ModifyTransform {
356388 value: number_input. value,
357- transform_op: TransformOp :: Width ,
389+ transform_op: TransformOp :: ScaleX ,
358390 }
359391 . into( )
360392 } ) ,
@@ -365,13 +397,13 @@ fn node_section_transform(layer: &Layer) -> LayoutRow {
365397 direction: SeparatorDirection :: Horizontal ,
366398 } ) ) ,
367399 WidgetHolder :: new( Widget :: NumberInput ( NumberInput {
368- value: layer. transform. height ( ) ,
369- label: "H " . into( ) ,
370- unit: " px " . into( ) ,
400+ value: layer. transform. scale_y ( ) ,
401+ label: "Y " . into( ) ,
402+ unit: "" . into( ) ,
371403 on_update: WidgetCallback :: new( |number_input: & NumberInput | {
372404 PropertiesPanelMessage :: ModifyTransform {
373405 value: number_input. value,
374- transform_op: TransformOp :: Height ,
406+ transform_op: TransformOp :: ScaleY ,
375407 }
376408 . into( )
377409 } ) ,
@@ -383,21 +415,38 @@ fn node_section_transform(layer: &Layer) -> LayoutRow {
383415 name: "" . into( ) ,
384416 widgets: vec![
385417 WidgetHolder :: new( Widget :: TextLabel ( TextLabel {
386- value: "Rotation " . into( ) ,
418+ value: "Dimensions " . into( ) ,
387419 ..TextLabel :: default ( )
388420 } ) ) ,
389421 WidgetHolder :: new( Widget :: Separator ( Separator {
390422 separator_type: SeparatorType :: Unrelated ,
391423 direction: SeparatorDirection :: Horizontal ,
392424 } ) ) ,
393425 WidgetHolder :: new( Widget :: NumberInput ( NumberInput {
394- value: layer. transform . rotation ( ) * 180. / PI ,
395- label: "R " . into( ) ,
396- unit: "° " . into( ) ,
426+ value: layer. bounding_transform ( ) . scale_x ( ) ,
427+ label: "W " . into( ) ,
428+ unit: " px " . into( ) ,
397429 on_update: WidgetCallback :: new( |number_input: & NumberInput | {
398430 PropertiesPanelMessage :: ModifyTransform {
399- value: number_input. value / 180. * PI ,
400- transform_op: TransformOp :: Rotation ,
431+ value: number_input. value,
432+ transform_op: TransformOp :: Width ,
433+ }
434+ . into( )
435+ } ) ,
436+ ..NumberInput :: default ( )
437+ } ) ) ,
438+ WidgetHolder :: new( Widget :: Separator ( Separator {
439+ separator_type: SeparatorType :: Related ,
440+ direction: SeparatorDirection :: Horizontal ,
441+ } ) ) ,
442+ WidgetHolder :: new( Widget :: NumberInput ( NumberInput {
443+ value: layer. bounding_transform( ) . scale_y( ) ,
444+ label: "H" . into( ) ,
445+ unit: " px" . into( ) ,
446+ on_update: WidgetCallback :: new( |number_input: & NumberInput | {
447+ PropertiesPanelMessage :: ModifyTransform {
448+ value: number_input. value,
449+ transform_op: TransformOp :: Height ,
401450 }
402451 . into( )
403452 } ) ,
0 commit comments