@@ -419,6 +419,8 @@ void GameView::_update_debugger_buttons() {
419
419
420
420
suspend_button->set_disabled (empty);
421
421
camera_override_button->set_disabled (empty);
422
+ speed_state_button->set_disabled (empty);
423
+ reset_speed_button->set_disabled (empty);
422
424
423
425
PopupMenu *menu = camera_override_menu->get_popup ();
424
426
@@ -431,6 +433,8 @@ void GameView::_update_debugger_buttons() {
431
433
camera_override_button->set_pressed (false );
432
434
}
433
435
next_frame_button->set_disabled (!suspend_button->is_pressed ());
436
+
437
+ _reset_time_scales ();
434
438
}
435
439
436
440
void GameView::_handle_shortcut_requested (int p_embed_action) {
@@ -511,6 +515,43 @@ void GameView::_size_mode_button_pressed(int size_mode) {
511
515
_update_embed_window_size ();
512
516
}
513
517
518
+ void GameView::_reset_time_scales () {
519
+ time_scale_index = DEFAULT_TIME_SCALE_INDEX;
520
+ _update_time_scales ();
521
+ }
522
+
523
+ void GameView::_update_time_scales () {
524
+ Array message;
525
+ message.append (time_scale_range[time_scale_index]);
526
+ Array sessions = debugger->get_sessions ();
527
+ for (int i = 0 ; i < sessions.size (); i++) {
528
+ if (Object::cast_to<EditorDebuggerSession>(sessions[i])->is_active ()) {
529
+ Ref<EditorDebuggerSession> session = sessions[i];
530
+ session->send_message (" scene:speed_changed" , message);
531
+ }
532
+ }
533
+ Color text_color;
534
+ if (time_scale_index == DEFAULT_TIME_SCALE_INDEX) {
535
+ text_color = Color (1 .0f , 1 .0f , 1 .0f );
536
+ } else if (time_scale_index > DEFAULT_TIME_SCALE_INDEX) {
537
+ text_color = Color (0 .0f , 1 .0f , 0 .0f );
538
+ } else if (time_scale_index < DEFAULT_TIME_SCALE_INDEX) {
539
+ text_color = Color (1 .0f , 1 .0f , 0 .0f );
540
+ }
541
+ bool disabled = time_scale_index == DEFAULT_TIME_SCALE_INDEX;
542
+ reset_speed_button->set_disabled (disabled);
543
+ speed_state_button->add_theme_color_override (" font_color" , text_color);
544
+ speed_state_button->set_text (vformat (" %0.2fx" , time_scale_range[time_scale_index]));
545
+ }
546
+
547
+ void GameView::_speed_state_menu_pressed (int p_id) {
548
+ if (time_scale_index == p_id) {
549
+ return ;
550
+ }
551
+ time_scale_index = p_id;
552
+ _update_time_scales ();
553
+ }
554
+
514
555
GameView::EmbedAvailability GameView::_get_embed_available () {
515
556
if (!DisplayServer::get_singleton ()->has_feature (DisplayServer::FEATURE_WINDOW_EMBEDDING)) {
516
557
return EMBED_NOT_AVAILABLE_FEATURE_NOT_SUPPORTED;
@@ -700,6 +741,7 @@ void GameView::_notification(int p_what) {
700
741
case NOTIFICATION_THEME_CHANGED: {
701
742
suspend_button->set_button_icon (get_editor_theme_icon (SNAME (" Pause" )));
702
743
next_frame_button->set_button_icon (get_editor_theme_icon (SNAME (" NextFrame" )));
744
+ reset_speed_button->set_button_icon (get_editor_theme_icon (SNAME (" Reload" )));
703
745
704
746
node_type_button[RuntimeNodeSelect::NODE_TYPE_NONE]->set_button_icon (get_editor_theme_icon (SNAME (" InputEventJoypadMotion" )));
705
747
node_type_button[RuntimeNodeSelect::NODE_TYPE_2D]->set_button_icon (get_editor_theme_icon (SNAME (" 2DNodes" )));
@@ -995,6 +1037,27 @@ GameView::GameView(Ref<GameViewDebugger> p_debugger, EmbeddedProcessBase *p_embe
995
1037
next_frame_button->set_accessibility_name (TTRC (" Next Frame" ));
996
1038
next_frame_button->set_shortcut (ED_SHORTCUT (" editor/next_frame_embedded_project" , TTRC (" Next Frame" ), Key::F10));
997
1039
1040
+ speed_state_button = memnew (MenuButton);
1041
+ main_menu_hbox->add_child (speed_state_button);
1042
+ speed_state_button->set_text (TTRC (" 1.00x" ));
1043
+ speed_state_button->set_theme_type_variation (" FlatButton" );
1044
+ speed_state_button->set_tooltip_text (TTRC (" Change the game speed." ));
1045
+ speed_state_button->set_accessibility_name (TTRC (" Speed State" ));
1046
+ speed_state_button->set_custom_minimum_size (Vector2 (48 , 0 ));
1047
+
1048
+ PopupMenu *menu = speed_state_button->get_popup ();
1049
+ menu->connect (SceneStringName (id_pressed), callable_mp (this , &GameView::_speed_state_menu_pressed));
1050
+ for (float f : time_scale_range) {
1051
+ menu->add_item (TTRC (vformat (" %0.2fx" , f)));
1052
+ }
1053
+
1054
+ reset_speed_button = memnew (Button);
1055
+ main_menu_hbox->add_child (reset_speed_button);
1056
+ reset_speed_button->set_theme_type_variation (" FlatButton" );
1057
+ reset_speed_button->set_tooltip_text (TTRC (" Reset the game speed." ));
1058
+ reset_speed_button->set_accessibility_name (TTRC (" Reset Speed" ));
1059
+ reset_speed_button->connect (SceneStringName (pressed), callable_mp (this , &GameView::_reset_time_scales));
1060
+
998
1061
main_menu_hbox->add_child (memnew (VSeparator));
999
1062
1000
1063
node_type_button[RuntimeNodeSelect::NODE_TYPE_NONE] = memnew (Button);
@@ -1079,7 +1142,7 @@ GameView::GameView(Ref<GameViewDebugger> p_debugger, EmbeddedProcessBase *p_embe
1079
1142
camera_override_menu->set_tooltip_text (TTRC (" Camera Override Options" ));
1080
1143
camera_override_menu->set_accessibility_name (TTRC (" Camera Override Options" ));
1081
1144
1082
- PopupMenu * menu = camera_override_menu->get_popup ();
1145
+ menu = camera_override_menu->get_popup ();
1083
1146
menu->connect (SceneStringName (id_pressed), callable_mp (this , &GameView::_camera_override_menu_id_pressed));
1084
1147
menu->add_item (TTRC (" Reset 2D Camera" ), CAMERA_RESET_2D);
1085
1148
menu->add_item (TTRC (" Reset 3D Camera" ), CAMERA_RESET_3D);
0 commit comments