@@ -18,10 +18,10 @@ use std::f64::consts::PI;
18
18
use std:: rc:: Rc ;
19
19
20
20
trait 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 ;
25
25
fn x ( & self ) -> f64 ;
26
26
fn update_x ( self , new_x : f64 ) -> Self ;
27
27
fn y ( & self ) -> f64 ;
@@ -31,20 +31,20 @@ trait DAffine2Utils {
31
31
}
32
32
33
33
impl DAffine2Utils for DAffine2 {
34
- fn width ( & self ) -> f64 {
34
+ fn scale_x ( & self ) -> f64 {
35
35
self . transform_vector2 ( ( 1. , 0. ) . into ( ) ) . length ( )
36
36
}
37
37
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 ( ) )
40
40
}
41
41
42
- fn height ( & self ) -> f64 {
42
+ fn scale_y ( & self ) -> f64 {
43
43
self . transform_vector2 ( ( 0. , 1. ) . into ( ) ) . length ( )
44
44
}
45
45
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 ( ) )
48
48
}
49
49
50
50
fn x ( & self ) -> f64 {
@@ -66,14 +66,14 @@ impl DAffine2Utils for DAffine2 {
66
66
}
67
67
68
68
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 ( ) ;
71
71
sin. atan2 ( cos)
72
72
}
73
73
74
74
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 ( ) ;
77
77
let half_width = width / 2. ;
78
78
let half_height = height / 2. ;
79
79
@@ -138,15 +138,21 @@ impl MessageHandler<PropertiesPanelMessage, &GrapheneDocument> for PropertiesPan
138
138
let action = match transform_op {
139
139
X => DAffine2 :: update_x,
140
140
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 ,
143
143
Rotation => DAffine2 :: update_rotation,
144
144
} ;
145
145
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
+
146
152
responses. push_back (
147
153
Operation :: SetLayerTransform {
148
154
path : path. clone ( ) ,
149
- transform : action ( layer. transform , value) . to_cols_array ( ) ,
155
+ transform : action ( layer. transform , value / scale ) . to_cols_array ( ) ,
150
156
}
151
157
. into ( ) ,
152
158
) ;
@@ -297,7 +303,7 @@ fn node_section_transform(layer: &Layer) -> LayoutRow {
297
303
name: "" . into( ) ,
298
304
widgets: vec![
299
305
WidgetHolder :: new( Widget :: TextLabel ( TextLabel {
300
- value: "Position " . into( ) ,
306
+ value: "Location " . into( ) ,
301
307
..TextLabel :: default ( )
302
308
} ) ) ,
303
309
WidgetHolder :: new( Widget :: Separator ( Separator {
@@ -340,21 +346,47 @@ fn node_section_transform(layer: &Layer) -> LayoutRow {
340
346
name: "" . into( ) ,
341
347
widgets: vec![
342
348
WidgetHolder :: new( Widget :: TextLabel ( TextLabel {
343
- value: "Dimensions " . into( ) ,
349
+ value: "Rotation " . into( ) ,
344
350
..TextLabel :: default ( )
345
351
} ) ) ,
346
352
WidgetHolder :: new( Widget :: Separator ( Separator {
347
353
separator_type: SeparatorType :: Unrelated ,
348
354
direction: SeparatorDirection :: Horizontal ,
349
355
} ) ) ,
350
356
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( ) ,
354
386
on_update: WidgetCallback :: new( |number_input: & NumberInput | {
355
387
PropertiesPanelMessage :: ModifyTransform {
356
388
value: number_input. value,
357
- transform_op: TransformOp :: Width ,
389
+ transform_op: TransformOp :: ScaleX ,
358
390
}
359
391
. into( )
360
392
} ) ,
@@ -365,13 +397,13 @@ fn node_section_transform(layer: &Layer) -> LayoutRow {
365
397
direction: SeparatorDirection :: Horizontal ,
366
398
} ) ) ,
367
399
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( ) ,
371
403
on_update: WidgetCallback :: new( |number_input: & NumberInput | {
372
404
PropertiesPanelMessage :: ModifyTransform {
373
405
value: number_input. value,
374
- transform_op: TransformOp :: Height ,
406
+ transform_op: TransformOp :: ScaleY ,
375
407
}
376
408
. into( )
377
409
} ) ,
@@ -383,21 +415,38 @@ fn node_section_transform(layer: &Layer) -> LayoutRow {
383
415
name: "" . into( ) ,
384
416
widgets: vec![
385
417
WidgetHolder :: new( Widget :: TextLabel ( TextLabel {
386
- value: "Rotation " . into( ) ,
418
+ value: "Dimensions " . into( ) ,
387
419
..TextLabel :: default ( )
388
420
} ) ) ,
389
421
WidgetHolder :: new( Widget :: Separator ( Separator {
390
422
separator_type: SeparatorType :: Unrelated ,
391
423
direction: SeparatorDirection :: Horizontal ,
392
424
} ) ) ,
393
425
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( ) ,
397
429
on_update: WidgetCallback :: new( |number_input: & NumberInput | {
398
430
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 ,
401
450
}
402
451
. into( )
403
452
} ) ,
0 commit comments