11use std:: { sync:: Arc , time:: Instant } ;
22
33use gpui:: { prelude:: * , * } ;
4- use gpui_component:: { Sizable , button:: Button , h_flex, slider:: { Slider , SliderEvent , SliderState } , v_flex} ;
4+ use gpui_component:: { Selectable , Sizable , button:: Button , h_flex, slider:: { Slider , SliderEvent , SliderState } , v_flex} ;
5+ use schema:: minecraft_profile:: SkinVariant ;
56
67use crate :: { component:: player_model:: { self , PlayerModel , PlayerModelState } , icon:: PandoraIcon } ;
78
@@ -14,6 +15,7 @@ pub struct PlayerModelWidget {
1415 animating_pitch_positive : bool ,
1516 animating_pitch : bool ,
1617 animating_animation : bool ,
18+ variant : SkinVariant ,
1719 last_drag : Option < Point < Pixels > > ,
1820 last_render : Instant ,
1921}
@@ -30,35 +32,52 @@ impl PlayerModelWidget {
3032 SliderState :: new ( ) . min ( 0.0 ) . max ( 1.0 ) . step ( 1.0 /800.0 ) . default_value ( player_model:: DEFAULT_ANIMATION as f32 )
3133 } ) ;
3234
35+ let variant = crate :: skin_renderer:: determine_skin_variant ( & skin) . unwrap_or ( SkinVariant :: Classic ) ;
36+
3337 cx. subscribe ( & yaw_slider_state, Self :: on_yaw_changed) . detach ( ) ;
3438 cx. subscribe ( & pitch_slider_state, Self :: on_pitch_changed) . detach ( ) ;
3539 cx. subscribe ( & animation_slider_state, Self :: on_animation_changed) . detach ( ) ;
3640
3741 Self {
38- player_model_state : PlayerModelState :: new ( cx, skin) ,
42+ player_model_state : PlayerModelState :: new ( cx, skin, variant ) ,
3943 yaw_slider_state,
4044 pitch_slider_state,
4145 animation_slider_state,
4246 animating_yaw : false ,
4347 animating_pitch_positive : true ,
4448 animating_pitch : false ,
4549 animating_animation : false ,
50+ variant,
4651 last_drag : None ,
4752 last_render : Instant :: now ( ) ,
4853 }
4954 }
5055
51- pub fn set_skin ( & mut self , cx : & mut App , skin : Arc < [ u8 ] > ) {
52- self . player_model_state . as_mut ( cx) . skin = skin;
56+ pub fn set_skin ( & mut self , cx : & mut App , skin : Arc < [ u8 ] > , variant : SkinVariant ) {
57+ self . variant = variant;
58+ let mut state = self . player_model_state . as_mut ( cx) ;
59+ state. skin = skin;
60+ state. variant = variant;
5361 }
5462
5563 pub fn set_cape ( & mut self , cx : & mut App , cape : Option < Arc < [ u8 ] > > ) {
5664 self . player_model_state . as_mut ( cx) . cape = cape;
5765 }
5866
59- pub fn set_skin_and_cape ( & mut self , cx : & mut App , skin : Arc < [ u8 ] > , cape : Option < Arc < [ u8 ] > > ) {
67+ pub fn set_variant ( & mut self , cx : & mut App , variant : SkinVariant ) {
68+ self . variant = variant;
69+ self . player_model_state . as_mut ( cx) . variant = variant;
70+ }
71+
72+ pub fn get_variant ( & self ) -> SkinVariant {
73+ self . variant
74+ }
75+
76+ pub fn set_skin_and_cape ( & mut self , cx : & mut App , skin : Arc < [ u8 ] > , variant : SkinVariant , cape : Option < Arc < [ u8 ] > > ) {
77+ self . variant = variant;
6078 let mut state = self . player_model_state . as_mut ( cx) ;
6179 state. skin = skin;
80+ state. variant = variant;
6281 state. cape = cape;
6382 }
6483
@@ -207,6 +226,30 @@ impl Render for PlayerModelWidget {
207226 } ) )
208227 )
209228 . child ( v_flex ( ) . p_4 ( ) . w_full ( )
229+ . child ( h_flex ( )
230+ . w_full ( )
231+ . gap_2 ( )
232+ . pb_2 ( )
233+ . child ( Button :: new ( "classic" )
234+ . label ( "Classic" )
235+ . flex_1 ( )
236+ . selected ( self . variant == SkinVariant :: Classic )
237+ . on_click ( cx. listener ( |this, _, _, cx| {
238+ this. variant = SkinVariant :: Classic ;
239+ this. player_model_state . update ( cx, |state, _| {
240+ state. variant = SkinVariant :: Classic ;
241+ } ) ;
242+ } ) ) )
243+ . child ( Button :: new ( "slim" )
244+ . label ( "Slim" )
245+ . flex_1 ( )
246+ . selected ( self . variant == SkinVariant :: Slim )
247+ . on_click ( cx. listener ( |this, _, _, cx| {
248+ this. variant = SkinVariant :: Slim ;
249+ this. player_model_state . update ( cx, |state, _| {
250+ state. variant = SkinVariant :: Slim ;
251+ } ) ;
252+ } ) ) ) )
210253 . child ( v_flex ( )
211254 . child ( h_flex ( ) . text_sm ( ) . gap_1 ( )
212255 . child ( format ! ( "Yaw: {}°" , yaw as i32 ) )
0 commit comments