diff --git a/editor/gui/touch_actions_panel.cpp b/editor/gui/touch_actions_panel.cpp index bc6576e519e..5e6822adb19 100644 --- a/editor/gui/touch_actions_panel.cpp +++ b/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 &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 &p_event) { if (lock_panel_position) { return; @@ -106,7 +163,11 @@ void TouchActionsPanel::_on_drag_handle_gui_input(const Ref &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 &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); } diff --git a/editor/gui/touch_actions_panel.h b/editor/gui/touch_actions_panel.h index 8fde9f8af55..f8eae906d15 100644 --- a/editor/gui/touch_actions_panel.h +++ b/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 &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: