1
1
use super :: { Demo , View } ;
2
2
3
3
use egui:: {
4
- vec2, Align , Checkbox , CollapsingHeader , Color32 , Context , FontId , Resize , RichText , Sense ,
5
- Slider , Stroke , TextFormat , TextStyle , Ui , Vec2 , Window ,
4
+ vec2, Align , Align2 , Checkbox , CollapsingHeader , Color32 , ComboBox , Context , FontId , Resize ,
5
+ RichText , Sense , Slider , Stroke , TextFormat , TextStyle , Ui , Vec2 , Window ,
6
6
} ;
7
7
8
8
/// Showcase some ui code
@@ -16,6 +16,7 @@ pub struct MiscDemoWindow {
16
16
custom_collapsing_header : CustomCollapsingHeader ,
17
17
tree : Tree ,
18
18
box_painting : BoxPainting ,
19
+ text_rotation : TextRotation ,
19
20
20
21
dummy_bool : bool ,
21
22
dummy_usize : usize ,
@@ -32,6 +33,7 @@ impl Default for MiscDemoWindow {
32
33
custom_collapsing_header : Default :: default ( ) ,
33
34
tree : Tree :: demo ( ) ,
34
35
box_painting : Default :: default ( ) ,
36
+ text_rotation : Default :: default ( ) ,
35
37
36
38
dummy_bool : false ,
37
39
dummy_usize : 0 ,
@@ -79,6 +81,10 @@ impl View for MiscDemoWindow {
79
81
} ) ;
80
82
} ) ;
81
83
84
+ CollapsingHeader :: new ( "Text rotation" )
85
+ . default_open ( false )
86
+ . show ( ui, |ui| self . text_rotation . ui ( ui) ) ;
87
+
82
88
CollapsingHeader :: new ( "Colors" )
83
89
. default_open ( false )
84
90
. show ( ui, |ui| {
@@ -729,3 +735,95 @@ fn text_layout_demo(ui: &mut Ui) {
729
735
730
736
ui. label ( job) ;
731
737
}
738
+
739
+ // ----------------------------------------------------------------------------
740
+
741
+ #[ cfg_attr( feature = "serde" , derive( serde:: Deserialize , serde:: Serialize ) ) ]
742
+ #[ cfg_attr( feature = "serde" , serde( default ) ) ]
743
+ struct TextRotation {
744
+ size : Vec2 ,
745
+ angle : f32 ,
746
+ align : egui:: Align2 ,
747
+ }
748
+
749
+ impl Default for TextRotation {
750
+ fn default ( ) -> Self {
751
+ Self {
752
+ size : vec2 ( 200.0 , 200.0 ) ,
753
+ angle : 0.0 ,
754
+ align : egui:: Align2 :: LEFT_TOP ,
755
+ }
756
+ }
757
+ }
758
+
759
+ impl TextRotation {
760
+ pub fn ui ( & mut self , ui : & mut Ui ) {
761
+ ui. add ( Slider :: new ( & mut self . angle , 0.0 ..=2.0 * std:: f32:: consts:: PI ) . text ( "angle" ) ) ;
762
+
763
+ let default_color = if ui. visuals ( ) . dark_mode {
764
+ Color32 :: LIGHT_GRAY
765
+ } else {
766
+ Color32 :: DARK_GRAY
767
+ } ;
768
+
769
+ let aligns = [
770
+ ( Align2 :: LEFT_TOP , "LEFT_TOP" ) ,
771
+ ( Align2 :: LEFT_CENTER , "LEFT_CENTER" ) ,
772
+ ( Align2 :: LEFT_BOTTOM , "LEFT_BOTTOM" ) ,
773
+ ( Align2 :: CENTER_TOP , "CENTER_TOP" ) ,
774
+ ( Align2 :: CENTER_CENTER , "CENTER_CENTER" ) ,
775
+ ( Align2 :: CENTER_BOTTOM , "CENTER_BOTTOM" ) ,
776
+ ( Align2 :: RIGHT_TOP , "RIGHT_TOP" ) ,
777
+ ( Align2 :: RIGHT_CENTER , "RIGHT_CENTER" ) ,
778
+ ( Align2 :: RIGHT_BOTTOM , "RIGHT_BOTTOM" ) ,
779
+ ] ;
780
+
781
+ ComboBox :: new ( "anchor" , "Anchor" )
782
+ . selected_text ( aligns. iter ( ) . find ( |( a, _) | * a == self . align ) . unwrap ( ) . 1 )
783
+ . show_ui ( ui, |ui| {
784
+ for ( align2, name) in & aligns {
785
+ ui. selectable_value ( & mut self . align , * align2, * name) ;
786
+ }
787
+ } ) ;
788
+
789
+ ui. horizontal_wrapped ( |ui| {
790
+ let ( response, painter) = ui. allocate_painter ( self . size , Sense :: empty ( ) ) ;
791
+ let rect = response. rect ;
792
+
793
+ let start_pos = self . size / 2.0 ;
794
+
795
+ let s = ui. ctx ( ) . fonts ( |f| {
796
+ let mut t = egui:: Shape :: text (
797
+ f,
798
+ rect. min + start_pos,
799
+ egui:: Align2 :: LEFT_TOP ,
800
+ "sample_text" ,
801
+ egui:: FontId :: new ( 12.0 , egui:: FontFamily :: Proportional ) ,
802
+ default_color,
803
+ ) ;
804
+
805
+ if let egui:: epaint:: Shape :: Text ( ts) = & mut t {
806
+ let new = ts. clone ( ) . with_angle_and_anchor ( self . angle , self . align ) ;
807
+ * ts = new;
808
+ } ;
809
+
810
+ t
811
+ } ) ;
812
+
813
+ if let egui:: epaint:: Shape :: Text ( ts) = & s {
814
+ let align_pt =
815
+ rect. min + start_pos + self . align . pos_in_rect ( & ts. galley . rect ) . to_vec2 ( ) ;
816
+ painter. circle ( align_pt, 2.0 , Color32 :: RED , ( 0.0 , Color32 :: RED ) ) ;
817
+ } ;
818
+
819
+ painter. rect (
820
+ rect,
821
+ 0.0 ,
822
+ default_color. gamma_multiply ( 0.3 ) ,
823
+ ( 0.0 , Color32 :: BLACK ) ,
824
+ egui:: StrokeKind :: Middle ,
825
+ ) ;
826
+ painter. add ( s) ;
827
+ } ) ;
828
+ }
829
+ }
0 commit comments