Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add shortcuts to reset position, rotation and scale in Spatial and Canvas Item Editor #102888

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions editor/plugins/canvas_item_editor_plugin.cpp
Original file line number Diff line number Diff line change
@@ -520,6 +520,18 @@ void CanvasItemEditor::shortcut_input(const Ref<InputEvent> &p_ev) {
viewport->queue_redraw();
}
}

if (k->is_pressed()) {
if (reset_transform_position_shortcut.is_valid() && reset_transform_position_shortcut->matches_event(p_ev)) {
_reset_transform(TransformType::POSITION);
}
if (reset_transform_rotation_shortcut.is_valid() && reset_transform_rotation_shortcut->matches_event(p_ev)) {
_reset_transform(TransformType::ROTATION);
}
if (reset_transform_scale_shortcut.is_valid() && reset_transform_scale_shortcut->matches_event(p_ev)) {
_reset_transform(TransformType::SCALE);
}
}
}
}

@@ -1080,6 +1092,47 @@ void CanvasItemEditor::_on_grid_menu_id_pressed(int p_id) {
viewport->queue_redraw();
}

void CanvasItemEditor::_reset_transform(TransformType type) {
EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
undo_redo->create_action(TTR("Reset Transform"));
List<Node *> nodes_to_reset = EditorNode::get_singleton()->get_editor_selection()->get_selected_node_list();
for (Node *node : nodes_to_reset) {
if (Node2D *res_node = Object::cast_to<Node2D>(node)) {
switch (type) {
case TransformType::POSITION:
undo_redo->add_undo_method(res_node, "set_position", res_node->get_position());
res_node->set_position(Vector2());
break;
case TransformType::ROTATION:
undo_redo->add_undo_method(res_node, "set_rotation", res_node->get_rotation());
res_node->set_rotation(0);
break;
case TransformType::SCALE:
undo_redo->add_undo_method(res_node, "set_scale", res_node->get_scale());
res_node->set_scale(Size2(1, 1));
break;
}
}
if (Control *res_node = Object::cast_to<Control>(node)) {
switch (type) {
case TransformType::POSITION:
undo_redo->add_undo_method(res_node, "set_position", res_node->get_position());
res_node->set_position(Vector2());
break;
case TransformType::ROTATION:
undo_redo->add_undo_method(res_node, "set_rotation", res_node->get_rotation());
res_node->set_rotation(0);
break;
case TransformType::SCALE:
undo_redo->add_undo_method(res_node, "set_scale", res_node->get_scale());
res_node->set_scale(Size2(1, 1));
break;
}
}
}
undo_redo->commit_action();
}

void CanvasItemEditor::_switch_theme_preview(int p_mode) {
view_menu->get_popup()->hide();

@@ -5727,6 +5780,9 @@ CanvasItemEditor::CanvasItemEditor() {

multiply_grid_step_shortcut = ED_SHORTCUT("canvas_item_editor/multiply_grid_step", TTRC("Multiply grid step by 2"), Key::KP_MULTIPLY);
divide_grid_step_shortcut = ED_SHORTCUT("canvas_item_editor/divide_grid_step", TTRC("Divide grid step by 2"), Key::KP_DIVIDE);
reset_transform_position_shortcut = ED_SHORTCUT("canvas_item_editor/reset_transform_position", TTRC("Reset Position"), KeyModifierMask::ALT + Key::W);
reset_transform_rotation_shortcut = ED_SHORTCUT("canvas_item_editor/reset_transform_rotation", TTRC("Reset Rotation"), KeyModifierMask::ALT + Key::E);
reset_transform_scale_shortcut = ED_SHORTCUT("canvas_item_editor/reset_transform_scale", TTRC("Reset Scale"), KeyModifierMask::ALT + Key::R);

skeleton_menu->get_popup()->set_item_checked(skeleton_menu->get_popup()->get_item_index(SKELETON_SHOW_BONES), true);

10 changes: 10 additions & 0 deletions editor/plugins/canvas_item_editor_plugin.h
Original file line number Diff line number Diff line change
@@ -187,6 +187,12 @@ class CanvasItemEditor : public VBoxContainer {
GRID_VISIBILITY_HIDE,
};

enum TransformType {
POSITION,
ROTATION,
SCALE
};

const String locked_transform_warning = TTRC("All selected CanvasItems are either invisible or locked in some way and can't be transformed.");

bool selection_menu_additive_selection = false;
@@ -377,6 +383,9 @@ class CanvasItemEditor : public VBoxContainer {
Ref<Shortcut> set_pivot_shortcut;
Ref<Shortcut> multiply_grid_step_shortcut;
Ref<Shortcut> divide_grid_step_shortcut;
Ref<Shortcut> reset_transform_position_shortcut;
Ref<Shortcut> reset_transform_rotation_shortcut;
Ref<Shortcut> reset_transform_scale_shortcut;

Ref<ViewPanner> panner;
void _pan_callback(Vector2 p_scroll_vec, Ref<InputEvent> p_event);
@@ -416,6 +425,7 @@ class CanvasItemEditor : public VBoxContainer {
bool _is_grid_visible() const;
void _prepare_grid_menu();
void _on_grid_menu_id_pressed(int p_id);
void _reset_transform(TransformType type);

public:
enum ThemePreviewMode {
43 changes: 43 additions & 0 deletions editor/plugins/node_3d_editor_plugin.cpp
Original file line number Diff line number Diff line change
@@ -1552,6 +1552,35 @@ Transform3D Node3DEditorViewport::_compute_transform(TransformMode p_mode, const
}
}

void Node3DEditorViewport::_reset_transform(TransformType type) {
EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
undo_redo->create_action(TTR("Reset Transform"));
const List<Node *> &selection = editor_selection->get_selected_node_list();

for (Node *E : selection) {
Node3D *sp = Object::cast_to<Node3D>(E);
if (!sp) {
continue;
}

switch (type) {
case TransformType::POSITION:
undo_redo->add_undo_method(sp, "set_position", sp->get_position());
sp->set_position(Vector3(0, 0, 0));
break;
case TransformType::ROTATION:
undo_redo->add_undo_method(sp, "set_rotation", sp->get_rotation());
sp->set_rotation(Vector3(0, 0, 0));
break;
case TransformType::SCALE:
undo_redo->add_undo_method(sp, "set_scale", sp->get_scale());
sp->set_scale(Vector3(1, 1, 1));
break;
}
}
undo_redo->commit_action();
}

void Node3DEditorViewport::_surface_mouse_enter() {
if (Input::get_singleton()->get_mouse_mode() == Input::MOUSE_MODE_CAPTURED) {
return;
@@ -2442,6 +2471,17 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
if (ED_IS_SHORTCUT("spatial_editor/cancel_transform", p_event) && _edit.mode != TRANSFORM_NONE) {
cancel_transform();
}
if (!is_freelook_active()) {
if (ED_IS_SHORTCUT("spatial_editor/reset_transform_position", p_event)) {
_reset_transform(TransformType::POSITION);
}
if (ED_IS_SHORTCUT("spatial_editor/reset_transform_rotation", p_event)) {
_reset_transform(TransformType::ROTATION);
}
if (ED_IS_SHORTCUT("spatial_editor/reset_transform_scale", p_event)) {
_reset_transform(TransformType::SCALE);
}
}
if (!is_freelook_active() && !k->is_echo()) {
if (ED_IS_SHORTCUT("spatial_editor/instant_translate", p_event) && (_edit.mode != TRANSFORM_TRANSLATE || collision_reposition)) {
if (_edit.mode == TRANSFORM_NONE) {
@@ -5680,6 +5720,9 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, int p
ED_SHORTCUT("spatial_editor/instant_rotate", TTRC("Begin Rotate Transformation"));
ED_SHORTCUT("spatial_editor/instant_scale", TTRC("Begin Scale Transformation"));
ED_SHORTCUT("spatial_editor/collision_reposition", TTRC("Reposition Using Collisions"), KeyModifierMask::SHIFT | Key::G);
ED_SHORTCUT("spatial_editor/reset_transform_position", TTRC("Reset Position"), KeyModifierMask::ALT + Key::W);
ED_SHORTCUT("spatial_editor/reset_transform_rotation", TTRC("Reset Rotation"), KeyModifierMask::ALT + Key::E);
ED_SHORTCUT("spatial_editor/reset_transform_scale", TTRC("Reset Scale"), KeyModifierMask::ALT + Key::R);

preview_camera = memnew(CheckBox);
preview_camera->set_text(TTR("Preview"));
7 changes: 7 additions & 0 deletions editor/plugins/node_3d_editor_plugin.h
Original file line number Diff line number Diff line change
@@ -363,6 +363,11 @@ class Node3DEditorViewport : public Control {
TRANSFORM_XZ,
TRANSFORM_XY,
};
enum TransformType {
POSITION,
ROTATION,
SCALE
};

struct EditData {
TransformMode mode;
@@ -513,6 +518,8 @@ class Node3DEditorViewport : public Control {

Transform3D _compute_transform(TransformMode p_mode, const Transform3D &p_original, const Transform3D &p_original_local, Vector3 p_motion, double p_extra, bool p_local, bool p_orthogonal);

void _reset_transform(TransformType type);

void begin_transform(TransformMode p_mode, bool instant);
void commit_transform();
void apply_transform(Vector3 p_motion, double p_snap);