@@ -2,14 +2,16 @@ use egui::load::SizedTexture;
22use egui:: * ;
33use egui_dock:: { NodeIndex , SurfaceIndex } ;
44use silica:: layers:: { SilicaGroup , SilicaHierarchy , SilicaLayer } ;
5- use silicate_compositor:: blend:: BlendingMode ;
65use std:: collections:: HashMap ;
76use std:: sync:: Arc ;
87use tokio:: sync:: mpsc:: Receiver ;
98
109use crate :: app:: { App , Instance , InstanceKey , UserEvent } ;
1110
12- use super :: { canvas:: CanvasView , custom:: slider:: OpacitySlider } ;
11+ use super :: {
12+ canvas:: CanvasView ,
13+ custom:: { blend_radio:: BlendModeRadio , opacity_slider:: OpacitySlider } ,
14+ } ;
1315
1416struct ControlsGui < ' a > {
1517 app : & ' a Arc < App > ,
@@ -38,7 +40,7 @@ impl ControlsGui<'_> {
3840 ui. label ( file. stroke_count . to_string ( ) ) ;
3941 ui. end_row ( ) ;
4042 ui. label ( "Layer Count" ) ;
41- ui. label ( file. layer_count . to_string ( ) ) ;
43+ ui. label ( file. layer_count ( ) . to_string ( ) ) ;
4244 ui. end_row ( ) ;
4345 ui. label ( "Canvas Size" ) ;
4446
@@ -80,9 +82,14 @@ impl ControlsGui<'_> {
8082 . write ( )
8183 . get_mut ( & self . active_canvas )
8284 {
83- let mut degree = instance. rotation . to_degrees ( ) ;
84- ui. add ( Slider :: new ( & mut degree, 0.0 ..=360.0 ) . suffix ( " deg" ) ) ;
85- instance. rotation = degree. to_radians ( ) ;
85+ ui. add (
86+ Slider :: new ( & mut instance. rotation , 0.0 ..=std:: f32:: consts:: TAU )
87+ . custom_formatter ( |v, _| {
88+ let degree = v. to_degrees ( ) ;
89+ format ! ( "{degree:.0}" )
90+ } )
91+ . suffix ( " deg" ) ,
92+ ) ;
8693 } else {
8794 ui. label ( "No file loaded..." ) ;
8895 }
@@ -154,20 +161,14 @@ impl ControlsGui<'_> {
154161
155162 fn layout_layer_control ( ui : & mut Ui , l : & mut SilicaLayer , changed : & mut bool ) {
156163 * changed |= OpacitySlider :: new ( & mut l. opacity ) . ui ( ui) . changed ( ) ;
157-
158- ui. style_mut ( ) . spacing . combo_width = ui. available_width ( ) ;
159- ComboBox :: from_id_salt ( 0 )
160- . selected_text ( l. blend . as_str ( ) )
161- . show_ui ( ui, |ui| {
162- for b in BlendingMode :: all ( ) {
163- * changed |= ui. selectable_value ( & mut l. blend , * b, b. as_str ( ) ) . changed ( ) ;
164- }
165- } ) ;
164+ ui. add_space ( 10.0 ) ;
165+ * changed |= BlendModeRadio :: new ( & mut l. blend ) . ui ( ui) . changed ( ) ;
166166
167167 Grid :: new ( l. id ) . show ( ui, |ui| {
168168 ui. label ( "Clipped" ) ;
169169 * changed |= Checkbox :: without_text ( & mut l. clipped ) . ui ( ui) . changed ( ) ;
170170 } ) ;
171+ ui. add_space ( 10.0 ) ;
171172 }
172173
173174 fn layout_layers_sub ( ui : & mut Ui , layers : & mut SilicaGroup , changed : & mut bool ) {
@@ -200,13 +201,20 @@ impl ControlsGui<'_> {
200201 ) ;
201202
202203 let header_res = ui. horizontal ( |ui| {
203- let mut frame = egui:: Frame :: default ( )
204- . corner_radius ( 2.5 )
205- . inner_margin ( 5.0 )
204+ let mut frame = egui:: Frame :: new ( )
205+ . corner_radius ( 3 )
206+ . inner_margin ( 5 )
206207 . begin ( ui) ;
207208 {
208209 let ui = & mut frame. content_ui ;
209- if ui. strong ( layer_name) . clicked ( ) {
210+ if ui
211+ . add (
212+ Label :: new ( layer_name)
213+ . selectable ( false )
214+ . sense ( Sense :: click ( ) ) ,
215+ )
216+ . clicked ( )
217+ {
210218 state. toggle ( ui) ;
211219 }
212220 ui. with_layout ( Layout :: right_to_left ( Align :: Center ) , |ui| {
@@ -224,17 +232,18 @@ impl ControlsGui<'_> {
224232 }
225233 frame. end ( ui) ;
226234 } ) ;
227-
228- state. show_body_indented ( & header_res. response , ui, |ui| {
229- match layer {
230- SilicaHierarchy :: Layer ( layer) => {
235+ match layer {
236+ SilicaHierarchy :: Layer ( layer) => {
237+ state. show_body_unindented ( ui, |ui| {
231238 Self :: layout_layer_control ( ui, layer, changed) ;
232- }
233- SilicaHierarchy :: Group ( layer) => {
239+ } ) ;
240+ }
241+ SilicaHierarchy :: Group ( layer) => {
242+ state. show_body_indented ( & header_res. response , ui, |ui| {
234243 Self :: layout_layers_sub ( ui, layer, changed) ;
235- }
236- } ;
237- } ) ;
244+ } ) ;
245+ }
246+ } ;
238247 } ) ;
239248 }
240249
@@ -260,12 +269,25 @@ impl ControlsGui<'_> {
260269 ui. end_row ( ) ;
261270 ui. label ( "Background Color" ) ;
262271
263- // Safety: This is trivially safe. The underlying container is of 4 elements.
264- // This does the same thing as split_array_mut except that is not stabilized yet.
265- let bg = unsafe { & mut * ( file. background_color . as_mut_ptr ( ) as * mut [ f32 ; 3 ] ) } ;
272+ // Safety: this is trivially safe, N=3 < 4
273+ let bg = unsafe {
274+ file. background_color
275+ . first_chunk_mut :: < 3 > ( )
276+ . unwrap_unchecked ( )
277+ } ;
266278 changed |= ui. color_edit_button_rgb ( bg) . changed ( ) ;
267279 } ) ;
268280
281+ // let bg = &mut file.background_color;
282+ // let rgb = Rgba::from_rgb(bg[0], bg[1], bg[2]);
283+ // let mut color = Color32::from(rgb);
284+ // let old_value = color;
285+ // color_picker::color_picker_color32(ui, &mut color, color_picker::Alpha::Opaque);
286+ // if old_value != color {
287+ // *bg = Rgba::from(color).to_rgba_unmultiplied();
288+ // changed = true;
289+ // }
290+
269291 instance. tick_change ( changed) ;
270292 } else {
271293 ui. label ( "No file hierachy." ) ;
@@ -382,6 +404,7 @@ impl ViewerGui {
382404 . style ( egui_dock:: Style :: from_egui ( ui. style ( ) ) )
383405 . show_add_buttons ( true )
384406 . show_leaf_close_all_buttons ( false )
407+ . show_leaf_collapse_buttons ( false )
385408 . show_inside (
386409 ui,
387410 & mut CanvasGui {
0 commit comments