@@ -132,6 +132,38 @@ world_inspector_destroy(te_world_inspector* inspector) {
132132 free (inspector );
133133}
134134
135+ static void
136+ refresh_button_highlight (te_world_inspector * inspector ) {
137+ // Clear highlight.
138+ vec4 color ;
139+ theme_get_button_color (color );
140+ for (unsigned int i = 0 ; i < inspector -> item_buttons_count ; i ++ ) {
141+ button_widget_set_color (inspector -> item_buttons [i ], color );
142+ }
143+
144+ if (inspector -> state != TE_WIS_SHOW_WORLD_OBJECTS ) {
145+ return ;
146+ }
147+
148+ void * game_obj = property_inspector_get_inspected_obj (inspector -> property_inspector );
149+ if (game_obj == NULL ) {
150+ return ;
151+ }
152+
153+ for (unsigned int i = 0 ; i < inspector -> item_buttons_count ; i ++ ) {
154+ te_world_item_info * info =
155+ & ((te_world_item_info * )inspector -> item_list )
156+ [inspector -> current_page * inspector -> item_buttons_count + i ];
157+ if (info -> obj != game_obj ) {
158+ continue ;
159+ }
160+
161+ theme_get_accent_color (color );
162+ button_widget_set_color (inspector -> item_buttons [i ], color );
163+ break ;
164+ }
165+ }
166+
135167// Uses item_list and updates text on the buttons depending on the current world inspector state.
136168static void
137169refresh_item_names (te_world_inspector * inspector ) {
@@ -240,6 +272,8 @@ refresh_item_names(te_world_inspector* inspector) {
240272 widget_set_relative_position (
241273 button_widget_get_widget (inspector -> item_buttons [button_idx ]), pos );
242274 }
275+
276+ refresh_button_highlight (inspector );
243277}
244278
245279static void
@@ -331,6 +365,7 @@ rebuild_item_list_to_display_world_objects(te_world_inspector* inspector) {
331365 }
332366
333367 property_inspector_hide (inspector -> property_inspector );
368+ editor_set_gizmo (inspector -> editor , NULL );
334369
335370 free (inspector -> item_list );
336371 inspector -> item_list = NULL ;
@@ -553,6 +588,7 @@ world_inspector_select_obj(te_world_inspector* inspector, void* obj) {
553588
554589 if (obj == NULL ) {
555590 property_inspector_hide (inspector -> property_inspector );
591+ refresh_button_highlight (inspector );
556592 editor_set_gizmo (inspector -> editor , NULL );
557593 return ;
558594 }
@@ -588,7 +624,29 @@ world_inspector_select_obj(te_world_inspector* inspector, void* obj) {
588624 }
589625 }
590626
627+ // Switch the current page to show the selected item.
628+ bool found = false;
629+ for (unsigned int page_idx = 0 ; page_idx < inspector -> page_count ; page_idx ++ ) {
630+ for (unsigned int i = 0 ; i < inspector -> item_buttons_count ; i ++ ) {
631+ te_world_item_info * info = & (
632+ (te_world_item_info * )inspector
633+ -> item_list )[page_idx * inspector -> item_buttons_count + i ];
634+ if (info -> obj != selected_info -> obj ) {
635+ continue ;
636+ }
637+
638+ inspector -> current_page = page_idx ;
639+ found = true;
640+ break ;
641+ }
642+ if (found ) {
643+ break ;
644+ }
645+ }
646+
591647 property_inspector_show (inspector -> property_inspector , selected_info -> obj , type_id );
648+ refresh_item_names (inspector );
649+ refresh_page_text (inspector );
592650}
593651
594652void
@@ -641,6 +699,9 @@ static void
641699on_top_button_clicked (te_button_widget * button ) {
642700 te_world_inspector * inspector = widget_get_custom_ptr (button_widget_get_widget (button ));
643701
702+ property_inspector_hide (inspector -> property_inspector );
703+ editor_set_gizmo (inspector -> editor , NULL );
704+
644705 if (inspector -> state == TE_WIS_SHOW_WORLD_OBJECTS ) {
645706 inspector -> state = TE_WIS_CREATE_NEW_OBJECT ;
646707 } else if (
@@ -708,6 +769,7 @@ on_button_list_item_clicked(te_button_widget* button) {
708769 switch (selected_info -> type ) {
709770 case (TE_WIT_MODEL ): {
710771 type_id = model_get_type_id ();
772+ editor_set_gizmo (inspector -> editor , selected_info -> obj );
711773 break ;
712774 }
713775 case (TE_WIT_CAMERA ): {
@@ -722,6 +784,7 @@ on_button_list_item_clicked(te_button_widget* button) {
722784
723785 property_inspector_show (
724786 inspector -> property_inspector , selected_info -> obj , type_id );
787+ refresh_button_highlight (inspector );
725788 break ;
726789 }
727790 case (TE_WIS_CREATE_NEW_OBJECT ): {
@@ -777,6 +840,9 @@ on_button_list_item_clicked(te_button_widget* button) {
777840 rebuild_item_list_to_display_world_objects (inspector );
778841 refresh_page_text (inspector );
779842 } else if (option_index == TE_OMO_DELETE_OBJ ) {
843+ // First check if we have gizmo on the object we are about to delete.
844+ editor_on_before_game_obj_deleted (inspector -> editor , inspector -> selected_obj );
845+
780846 const te_type_info * info =
781847 type_database_get_type_info (inspector -> selected_obj_type_id );
782848 info -> despawn (inspector -> game_world , inspector -> selected_obj );
@@ -819,7 +885,7 @@ on_button_list_item_clicked(te_button_widget* button) {
819885
820886 const size_t button_index =
821887 widget_get_custom_value (button_widget_get_widget (button ));
822- te_world_item_info * selected_info =
888+ te_world_item_info * target_info =
823889 & ((te_world_item_info * )inspector -> item_list )
824890 [inspector -> current_page * inspector -> item_buttons_count + button_index ];
825891
@@ -828,14 +894,14 @@ on_button_list_item_clicked(te_button_widget* button) {
828894
829895 switch (inspector -> selected_obj_type ) {
830896 case (TE_WIT_CAMERA ): {
831- switch (selected_info -> type ) {
897+ switch (target_info -> type ) {
832898 case (TE_WIT_CAMERA ): {
833899 log_error ("unexpected state" );
834900 abort ();
835901 break ;
836902 }
837903 case (TE_WIT_MODEL ): {
838- model_attach_camera (inspector -> selected_obj , selected_info -> obj );
904+ model_attach_camera (target_info -> obj , inspector -> selected_obj );
839905 break ;
840906 }
841907 case (TE_WIT_WIDGET ): {
@@ -847,14 +913,14 @@ on_button_list_item_clicked(te_button_widget* button) {
847913 break ;
848914 }
849915 case (TE_WIT_MODEL ): {
850- switch (selected_info -> type ) {
916+ switch (target_info -> type ) {
851917 case (TE_WIT_CAMERA ): {
852918 log_error ("unexpected state" );
853919 abort ();
854920 break ;
855921 }
856922 case (TE_WIT_MODEL ): {
857- model_set_parent (inspector -> selected_obj , selected_info -> obj );
923+ model_set_parent (inspector -> selected_obj , target_info -> obj );
858924 break ;
859925 }
860926 case (TE_WIT_WIDGET ): {
@@ -866,7 +932,7 @@ on_button_list_item_clicked(te_button_widget* button) {
866932 break ;
867933 }
868934 case (TE_WIT_WIDGET ): {
869- switch (selected_info -> type ) {
935+ switch (target_info -> type ) {
870936 case (TE_WIT_CAMERA ): {
871937 log_error ("unexpected state" );
872938 abort ();
@@ -879,8 +945,8 @@ on_button_list_item_clicked(te_button_widget* button) {
879945 }
880946 case (TE_WIT_WIDGET ): {
881947 widget_set_parent (
882- selected_info -> obj ,
883- selected_type_info -> get_widget ( inspector -> selected_obj ) );
948+ selected_type_info -> get_widget ( inspector -> selected_obj ) ,
949+ target_info -> obj );
884950 break ;
885951 }
886952 }
@@ -898,6 +964,8 @@ static void
898964on_button_list_item_right_clicked (te_button_widget * button ) {
899965 te_world_inspector * inspector = widget_get_custom_ptr (button_widget_get_widget (button ));
900966 property_inspector_hide (inspector -> property_inspector );
967+ editor_set_gizmo (inspector -> editor , NULL );
968+ refresh_button_highlight (inspector );
901969
902970 const size_t button_index = widget_get_custom_value (button_widget_get_widget (button ));
903971
0 commit comments