|
@@ -44,14 +44,25 @@ void TouchActionsPanel::_notification(int p_what) {
|
|
|
case NOTIFICATION_ENTER_TREE: {
|
|
|
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());
|
|
|
+ if (!is_floating) {
|
|
|
+ get_parent()->move_child(this, embedded_panel_index);
|
|
|
+ }
|
|
|
} 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")));
|
|
|
- lock_panel_button->set_button_icon(get_editor_theme_icon(SNAME("Lock")));
|
|
|
+ if (is_floating) {
|
|
|
+ drag_handle->set_texture(get_editor_theme_icon(SNAME("DragHandle")));
|
|
|
+ layout_toggle_button->set_button_icon(get_editor_theme_icon(SNAME("Orientation")));
|
|
|
+ lock_panel_button->set_button_icon(get_editor_theme_icon(SNAME("Lock")));
|
|
|
+ } else {
|
|
|
+ if (embedded_panel_index == 1) {
|
|
|
+ panel_pos_button->set_button_icon(get_editor_theme_icon(SNAME("ControlAlignLeftWide")));
|
|
|
+ } else {
|
|
|
+ panel_pos_button->set_button_icon(get_editor_theme_icon(SNAME("ControlAlignRightWide")));
|
|
|
+ }
|
|
|
+ }
|
|
|
save_button->set_button_icon(get_editor_theme_icon(SNAME("Save")));
|
|
|
delete_button->set_button_icon(get_editor_theme_icon(SNAME("Remove")));
|
|
|
undo_button->set_button_icon(get_editor_theme_icon(SNAME("UndoRedo")));
|
|
@@ -154,7 +165,7 @@ void TouchActionsPanel::_add_new_modifier_button(Modifier p_modifier) {
|
|
|
}
|
|
|
|
|
|
void TouchActionsPanel::_on_drag_handle_gui_input(const Ref<InputEvent> &p_event) {
|
|
|
- if (lock_panel_position) {
|
|
|
+ if (locked_panel) {
|
|
|
return;
|
|
|
}
|
|
|
Ref<InputEventMouseButton> mouse_button_event = p_event;
|
|
@@ -191,50 +202,87 @@ void TouchActionsPanel::_switch_layout() {
|
|
|
}
|
|
|
|
|
|
void TouchActionsPanel::_lock_panel_toggled(bool p_pressed) {
|
|
|
- lock_panel_position = p_pressed;
|
|
|
- layout_toggle_button->set_disabled(p_pressed);
|
|
|
+ locked_panel = p_pressed;
|
|
|
+ layout_toggle_button->set_visible(!p_pressed);
|
|
|
+ drag_handle->set_visible(!p_pressed);
|
|
|
+ reset_size();
|
|
|
+ queue_redraw();
|
|
|
+}
|
|
|
+
|
|
|
+void TouchActionsPanel::_switch_embedded_panel_side() {
|
|
|
+ if (embedded_panel_index == 0) {
|
|
|
+ embedded_panel_index = 1;
|
|
|
+ panel_pos_button->set_button_icon(get_editor_theme_icon(SNAME("ControlAlignLeftWide")));
|
|
|
+ } else {
|
|
|
+ embedded_panel_index = 0;
|
|
|
+ panel_pos_button->set_button_icon(get_editor_theme_icon(SNAME("ControlAlignRightWide")));
|
|
|
+ }
|
|
|
+ get_parent()->move_child(this, embedded_panel_index); // Parent is a hbox with only two children -- TouchActionsPanel and main Editor UI.
|
|
|
+ EditorSettings::get_singleton()->set("_touch_actions_panel_embed_index", embedded_panel_index);
|
|
|
+ EditorSettings::get_singleton()->save();
|
|
|
}
|
|
|
|
|
|
TouchActionsPanel::TouchActionsPanel() {
|
|
|
- Ref<StyleBoxFlat> panel_style;
|
|
|
- panel_style.instantiate();
|
|
|
- panel_style->set_bg_color(Color(0.1, 0.1, 0.1, 1));
|
|
|
- panel_style->set_border_color(Color(0.3, 0.3, 0.3, 1));
|
|
|
- panel_style->set_border_width_all(3);
|
|
|
- panel_style->set_corner_radius_all(10);
|
|
|
- panel_style->set_content_margin_all(12);
|
|
|
- add_theme_style_override(SceneStringName(panel), panel_style);
|
|
|
+ int panel_mode = EDITOR_GET("interface/touchscreen/touch_actions_panel");
|
|
|
+ is_floating = panel_mode == 2;
|
|
|
+
|
|
|
+ if (is_floating) {
|
|
|
+ Ref<StyleBoxFlat> panel_style;
|
|
|
+ panel_style.instantiate();
|
|
|
+ panel_style->set_bg_color(Color(0.1, 0.1, 0.1, 1));
|
|
|
+ panel_style->set_border_color(Color(0.3, 0.3, 0.3, 1));
|
|
|
+ panel_style->set_border_width_all(3);
|
|
|
+ panel_style->set_corner_radius_all(10);
|
|
|
+ panel_style->set_content_margin_all(12);
|
|
|
+ add_theme_style_override(SceneStringName(panel), panel_style);
|
|
|
|
|
|
- set_position(EDITOR_DEF("_touch_actions_panel_position", Point2(480, 480))); // Dropped it here for no good reason — users can move it anyway.
|
|
|
+ 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", 20);
|
|
|
- box->set_vertical(EDITOR_DEF("_touch_actions_panel_vertical_layout", false));
|
|
|
+ if (is_floating) {
|
|
|
+ box->set_vertical(EDITOR_DEF("_touch_actions_panel_vertical_layout", false));
|
|
|
+ } else {
|
|
|
+ box->set_vertical(true);
|
|
|
+ }
|
|
|
add_child(box);
|
|
|
|
|
|
- drag_handle = memnew(TextureRect);
|
|
|
- drag_handle->set_custom_minimum_size(Size2(40, 40));
|
|
|
- drag_handle->set_stretch_mode(TextureRect::STRETCH_KEEP_CENTERED);
|
|
|
- drag_handle->connect(SceneStringName(gui_input), callable_mp(this, &TouchActionsPanel::_on_drag_handle_gui_input));
|
|
|
- box->add_child(drag_handle);
|
|
|
+ if (is_floating) {
|
|
|
+ drag_handle = memnew(TextureRect);
|
|
|
+ drag_handle->set_custom_minimum_size(Size2(40, 40));
|
|
|
+ drag_handle->set_stretch_mode(TextureRect::STRETCH_KEEP_CENTERED);
|
|
|
+ drag_handle->connect(SceneStringName(gui_input), callable_mp(this, &TouchActionsPanel::_on_drag_handle_gui_input));
|
|
|
+ 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(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);
|
|
|
|
|
|
- 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(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(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);
|
|
|
+ } else {
|
|
|
+ panel_pos_button = memnew(Button);
|
|
|
+ panel_pos_button->set_theme_type_variation("FlatMenuButton");
|
|
|
+ panel_pos_button->set_accessibility_name(TTRC("Switch Embedded Panel Position"));
|
|
|
+ panel_pos_button->set_focus_mode(FOCUS_NONE);
|
|
|
+ panel_pos_button->set_icon_alignment(HORIZONTAL_ALIGNMENT_CENTER);
|
|
|
+ panel_pos_button->connect(SceneStringName(pressed), callable_mp(this, &TouchActionsPanel::_switch_embedded_panel_side));
|
|
|
+ box->add_child(panel_pos_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(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);
|
|
|
+ embedded_panel_index = EDITOR_DEF("_touch_actions_panel_embed_index", 0);
|
|
|
+ }
|
|
|
|
|
|
ColorRect *separator = memnew(ColorRect);
|
|
|
separator->set_color(Color(0.5, 0.5, 0.5));
|