Răsfoiți Sursa

Merge pull request #105140 from syntaxerror247/actions-panel-improvements

Android Editor: Add new actions and enhancements to `TouchActionsPanel`
Thaddeus Crews 5 luni în urmă
părinte
comite
e508573183
2 a modificat fișierele cu 105 adăugiri și 16 ștergeri
  1. 88 16
      editor/gui/touch_actions_panel.cpp
  2. 17 0
      editor/gui/touch_actions_panel.h

+ 88 - 16
editor/gui/touch_actions_panel.cpp

@@ -45,6 +45,9 @@ void TouchActionsPanel::_notification(int p_what) {
 			DisplayServer::get_singleton()->set_hardware_keyboard_connection_change_callback(callable_mp(this, &TouchActionsPanel::_hardware_keyboard_connected));
 			_hardware_keyboard_connected(DisplayServer::get_singleton()->has_hardware_keyboard());
 		} break;
+		case NOTIFICATION_VISIBILITY_CHANGED: {
+			set_process_input(is_visible_in_tree());
+		} break;
 		case NOTIFICATION_THEME_CHANGED: {
 			drag_handle->set_texture(get_editor_theme_icon(SNAME("DragHandle")));
 			layout_toggle_button->set_button_icon(get_editor_theme_icon(SNAME("Orientation")));
@@ -53,10 +56,27 @@ void TouchActionsPanel::_notification(int p_what) {
 			delete_button->set_button_icon(get_editor_theme_icon(SNAME("Remove")));
 			undo_button->set_button_icon(get_editor_theme_icon(SNAME("UndoRedo")));
 			redo_button->set_button_icon(get_editor_theme_icon(SNAME("Redo")));
+			cut_button->set_button_icon(get_editor_theme_icon(SNAME("ActionCut")));
+			copy_button->set_button_icon(get_editor_theme_icon(SNAME("ActionCopy")));
+			paste_button->set_button_icon(get_editor_theme_icon(SNAME("ActionPaste")));
 		} break;
 	}
 }
 
+void TouchActionsPanel::input(const Ref<InputEvent> &event) {
+	if (ctrl_btn_pressed) {
+		event->call(SNAME("set_ctrl_pressed"), true);
+	}
+
+	if (shift_btn_pressed) {
+		event->call(SNAME("set_shift_pressed"), true);
+	}
+
+	if (alt_btn_pressed) {
+		event->call(SNAME("set_alt_pressed"), true);
+	}
+}
+
 void TouchActionsPanel::_hardware_keyboard_connected(bool p_connected) {
 	set_visible(!p_connected);
 }
@@ -81,12 +101,26 @@ void TouchActionsPanel::_simulate_key_press(Key p_keycode) {
 	Input::get_singleton()->parse_input_event(event);
 }
 
+void TouchActionsPanel::_on_modifier_button_toggled(bool p_pressed, int p_modifier) {
+	switch ((Modifier)p_modifier) {
+		case MODIFIER_CTRL:
+			ctrl_btn_pressed = p_pressed;
+			break;
+		case MODIFIER_SHIFT:
+			shift_btn_pressed = p_pressed;
+			break;
+		case MODIFIER_ALT:
+			alt_btn_pressed = p_pressed;
+			break;
+	}
+}
+
 Button *TouchActionsPanel::_add_new_action_button(const String &p_shortcut, const String &p_name, Key p_keycode) {
 	Button *action_button = memnew(Button);
-	action_button->set_focus_mode(Control::FOCUS_NONE);
-	action_button->set_h_size_flags(Control::SIZE_SHRINK_CENTER);
-	action_button->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
+	action_button->set_theme_type_variation("FlatMenuButton");
 	action_button->set_accessibility_name(p_name);
+	action_button->set_focus_mode(FOCUS_NONE);
+	action_button->set_icon_alignment(HORIZONTAL_ALIGNMENT_CENTER);
 	if (p_keycode == Key::NONE) {
 		action_button->connect(SceneStringName(pressed), callable_mp(this, &TouchActionsPanel::_simulate_editor_shortcut).bind(p_shortcut));
 	} else {
@@ -96,6 +130,29 @@ Button *TouchActionsPanel::_add_new_action_button(const String &p_shortcut, cons
 	return action_button;
 }
 
+void TouchActionsPanel::_add_new_modifier_button(Modifier p_modifier) {
+	String text;
+	switch (p_modifier) {
+		case MODIFIER_CTRL:
+			text = "Ctrl";
+			break;
+		case MODIFIER_SHIFT:
+			text = "Shift";
+			break;
+		case MODIFIER_ALT:
+			text = "Alt";
+			break;
+	}
+	Button *toggle_button = memnew(Button);
+	toggle_button->set_text(text);
+	toggle_button->set_toggle_mode(true);
+	toggle_button->set_theme_type_variation("FlatMenuButton");
+	toggle_button->set_accessibility_name(text);
+	toggle_button->set_focus_mode(FOCUS_NONE);
+	toggle_button->connect(SceneStringName(toggled), callable_mp(this, &TouchActionsPanel::_on_modifier_button_toggled).bind((int)p_modifier));
+	box->add_child(toggle_button);
+}
+
 void TouchActionsPanel::_on_drag_handle_gui_input(const Ref<InputEvent> &p_event) {
 	if (lock_panel_position) {
 		return;
@@ -106,7 +163,11 @@ void TouchActionsPanel::_on_drag_handle_gui_input(const Ref<InputEvent> &p_event
 			dragging = true;
 			drag_offset = mouse_button_event->get_position();
 		} else {
-			dragging = false;
+			if (dragging) {
+				dragging = false;
+				EditorSettings::get_singleton()->set("_touch_actions_panel_position", get_position());
+				EditorSettings::get_singleton()->save();
+			}
 		}
 	}
 
@@ -124,6 +185,9 @@ void TouchActionsPanel::_on_drag_handle_gui_input(const Ref<InputEvent> &p_event
 void TouchActionsPanel::_switch_layout() {
 	box->set_vertical(!box->is_vertical());
 	reset_size();
+	queue_redraw();
+	EditorSettings::get_singleton()->set("_touch_actions_panel_vertical_layout", box->is_vertical());
+	EditorSettings::get_singleton()->save();
 }
 
 void TouchActionsPanel::_lock_panel_toggled(bool p_pressed) {
@@ -141,11 +205,12 @@ TouchActionsPanel::TouchActionsPanel() {
 	panel_style->set_content_margin_all(12);
 	add_theme_style_override(SceneStringName(panel), panel_style);
 
-	set_anchors_and_offsets_preset(Control::PRESET_CENTER_BOTTOM, Control::PRESET_MODE_MINSIZE, 80);
+	set_position(EDITOR_DEF("_touch_actions_panel_position", Point2(480, 480))); // Dropped it here for no good reason — users can move it anyway.
 
 	box = memnew(BoxContainer);
 	box->set_alignment(BoxContainer::ALIGNMENT_CENTER);
-	box->add_theme_constant_override("separation", 15);
+	box->add_theme_constant_override("separation", 20);
+	box->set_vertical(EDITOR_DEF("_touch_actions_panel_vertical_layout", false));
 	add_child(box);
 
 	drag_handle = memnew(TextureRect);
@@ -155,19 +220,19 @@ TouchActionsPanel::TouchActionsPanel() {
 	box->add_child(drag_handle);
 
 	layout_toggle_button = memnew(Button);
+	layout_toggle_button->set_theme_type_variation("FlatMenuButton");
 	layout_toggle_button->set_accessibility_name(TTRC("Switch Layout"));
-	layout_toggle_button->set_focus_mode(Control::FOCUS_NONE);
-	layout_toggle_button->set_h_size_flags(Control::SIZE_SHRINK_CENTER);
-	layout_toggle_button->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
+	layout_toggle_button->set_focus_mode(FOCUS_NONE);
+	layout_toggle_button->set_icon_alignment(HORIZONTAL_ALIGNMENT_CENTER);
 	layout_toggle_button->connect(SceneStringName(pressed), callable_mp(this, &TouchActionsPanel::_switch_layout));
 	box->add_child(layout_toggle_button);
 
 	lock_panel_button = memnew(Button);
 	lock_panel_button->set_toggle_mode(true);
+	lock_panel_button->set_theme_type_variation("FlatMenuButton");
 	lock_panel_button->set_accessibility_name(TTRC("Lock Panel"));
-	lock_panel_button->set_focus_mode(Control::FOCUS_NONE);
-	lock_panel_button->set_h_size_flags(Control::SIZE_SHRINK_CENTER);
-	lock_panel_button->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
+	lock_panel_button->set_focus_mode(FOCUS_NONE);
+	lock_panel_button->set_icon_alignment(HORIZONTAL_ALIGNMENT_CENTER);
 	lock_panel_button->connect(SceneStringName(toggled), callable_mp(this, &TouchActionsPanel::_lock_panel_toggled));
 	box->add_child(lock_panel_button);
 
@@ -177,8 +242,15 @@ TouchActionsPanel::TouchActionsPanel() {
 	box->add_child(separator);
 
 	// Add action buttons.
-	save_button = _add_new_action_button("editor/save_scene", TTR("Save"));
-	delete_button = _add_new_action_button("", TTR("Delete"), Key::KEY_DELETE);
-	undo_button = _add_new_action_button("ui_undo", TTR("Undo"));
-	redo_button = _add_new_action_button("ui_redo", TTR("Redo"));
+	save_button = _add_new_action_button("editor/save_scene", TTRC("Save"));
+	delete_button = _add_new_action_button("", TTRC("Delete"), Key::KEY_DELETE);
+	undo_button = _add_new_action_button("ui_undo", TTRC("Undo"));
+	redo_button = _add_new_action_button("ui_redo", TTRC("Redo"));
+	cut_button = _add_new_action_button("ui_cut", TTRC("Cut"));
+	copy_button = _add_new_action_button("ui_copy", TTRC("Copy"));
+	paste_button = _add_new_action_button("ui_paste", TTRC("Paste"));
+
+	_add_new_modifier_button(MODIFIER_CTRL);
+	_add_new_modifier_button(MODIFIER_SHIFT);
+	_add_new_modifier_button(MODIFIER_ALT);
 }

+ 17 - 0
editor/gui/touch_actions_panel.h

@@ -45,6 +45,9 @@ private:
 	Button *delete_button = nullptr;
 	Button *undo_button = nullptr;
 	Button *redo_button = nullptr;
+	Button *cut_button = nullptr;
+	Button *copy_button = nullptr;
+	Button *paste_button = nullptr;
 
 	TextureRect *drag_handle = nullptr;
 	Button *layout_toggle_button = nullptr;
@@ -54,7 +57,18 @@ private:
 	bool dragging = false;
 	Vector2 drag_offset;
 
+	enum Modifier {
+		MODIFIER_CTRL,
+		MODIFIER_SHIFT,
+		MODIFIER_ALT
+	};
+
+	bool ctrl_btn_pressed = false;
+	bool shift_btn_pressed = false;
+	bool alt_btn_pressed = false;
+
 	void _notification(int p_what);
+	virtual void input(const Ref<InputEvent> &event) override;
 
 	void _simulate_editor_shortcut(const String &p_shortcut_name);
 	void _simulate_key_press(Key p_keycode);
@@ -63,6 +77,9 @@ private:
 	void _lock_panel_toggled(bool p_pressed);
 	Button *_add_new_action_button(const String &p_shortcut, const String &p_name, Key p_keycode = Key::NONE);
 
+	void _add_new_modifier_button(Modifier p_modifier);
+	void _on_modifier_button_toggled(bool p_pressed, int p_modifier);
+
 	void _hardware_keyboard_connected(bool p_connected);
 
 public: