InputEvent as_text now returns readable string. Added to_string for debug strings

Made InputEvent as_text() return a readable and presentable string. Added to_string() overrides for each which returns a 'debug-friendly' version which is not as presentable but provides more information and in a more structured fashion. Use as_text() for UI display scenarions and to_string() for debug cases
This commit is contained in:
Eric M 2020-10-01 22:55:23 +10:00
parent 7e009a1671
commit dfe4c5f8e1
4 changed files with 256 additions and 110 deletions

View File

@ -84,10 +84,6 @@ Ref<InputEvent> InputEvent::xformed_by(const Transform2D &p_xform, const Vector2
return Ref<InputEvent>((InputEvent *)this); return Ref<InputEvent>((InputEvent *)this);
} }
String InputEvent::as_text() const {
return String();
}
bool InputEvent::action_match(const Ref<InputEvent> &p_event, bool *p_pressed, float *p_strength, float *p_raw_strength, float p_deadzone) const { bool InputEvent::action_match(const Ref<InputEvent> &p_event, bool *p_pressed, float *p_strength, float *p_raw_strength, float p_deadzone) const {
return false; return false;
} }
@ -198,6 +194,33 @@ void InputEventWithModifiers::set_modifiers_from_event(const InputEventWithModif
set_metakey(event->get_metakey()); set_metakey(event->get_metakey());
} }
String InputEventWithModifiers::as_text() const {
Vector<String> mod_names;
if (get_control()) {
mod_names.push_back(find_keycode_name(KEY_CONTROL));
}
if (get_shift()) {
mod_names.push_back(find_keycode_name(KEY_SHIFT));
}
if (get_alt()) {
mod_names.push_back(find_keycode_name(KEY_ALT));
}
if (get_metakey()) {
mod_names.push_back(find_keycode_name(KEY_META));
}
if (!mod_names.empty()) {
return String("+").join(mod_names);
} else {
return "None";
}
}
String InputEventWithModifiers::to_string() {
return as_text();
}
void InputEventWithModifiers::_bind_methods() { void InputEventWithModifiers::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_store_command", "enable"), &InputEventWithModifiers::set_store_command); ClassDB::bind_method(D_METHOD("set_store_command", "enable"), &InputEventWithModifiers::set_store_command);
ClassDB::bind_method(D_METHOD("is_storing_command"), &InputEventWithModifiers::is_storing_command); ClassDB::bind_method(D_METHOD("is_storing_command"), &InputEventWithModifiers::is_storing_command);
@ -326,24 +349,31 @@ uint32_t InputEventKey::get_physical_keycode_with_modifiers() const {
} }
String InputEventKey::as_text() const { String InputEventKey::as_text() const {
String kc = keycode_get_string(keycode); String kc;
if (keycode == 0) {
kc = keycode_get_string(physical_keycode) + " (" + RTR("Physical") + ")";
} else {
kc = keycode_get_string(keycode);
}
if (kc == String()) { if (kc == String()) {
return kc; return kc;
} }
if (get_metakey()) { String mods_text = InputEventWithModifiers::as_text();
kc = find_keycode_name(KEY_META) + ("+" + kc); return mods_text == "" ? kc : mods_text + "+" + kc;
}
String InputEventKey::to_string() {
String p = is_pressed() ? "true" : "false";
String e = is_echo() ? "true" : "false";
if (keycode == 0) {
return vformat("InputEventKey: keycode=%s mods=%s physical=%s pressed=%s echo=%s", itos(physical_keycode) + " " + keycode_get_string(physical_keycode), InputEventWithModifiers::as_text(), "true", p, e);
} else {
return vformat("InputEventKey: keycode=%s mods=%s physical=%s pressed=%s echo=%s", itos(keycode) + " " + keycode_get_string(keycode), InputEventWithModifiers::as_text(), "false", p, e);
} }
if (get_alt()) {
kc = find_keycode_name(KEY_ALT) + ("+" + kc);
}
if (get_shift()) {
kc = find_keycode_name(KEY_SHIFT) + ("+" + kc);
}
if (get_control()) {
kc = find_keycode_name(KEY_CONTROL) + ("+" + kc);
}
return kc;
} }
bool InputEventKey::action_match(const Ref<InputEvent> &p_event, bool *p_pressed, float *p_strength, float *p_raw_strength, float p_deadzone) const { bool InputEventKey::action_match(const Ref<InputEvent> &p_event, bool *p_pressed, float *p_strength, float *p_raw_strength, float p_deadzone) const {
@ -536,41 +566,74 @@ bool InputEventMouseButton::action_match(const Ref<InputEvent> &p_event, bool *p
return match; return match;
} }
static const char *_mouse_button_descriptions[9] = {
TTRC("Left Mouse Button"),
TTRC("Right Mouse Button"),
TTRC("Middle Mouse Button"),
TTRC("Mouse Wheel Up"),
TTRC("Mouse Wheel Down"),
TTRC("Mouse Wheel Left"),
TTRC("Mouse Wheel Right"),
TTRC("Mouse Thumb Button 1"),
TTRC("Mouse Thumb Button 2")
};
String InputEventMouseButton::as_text() const { String InputEventMouseButton::as_text() const {
String button_index_string = ""; // Modifiers
switch (get_button_index()) { String mods_text = InputEventWithModifiers::as_text();
String full_string = mods_text == "" ? "" : mods_text + "+";
// Button
int idx = get_button_index();
switch (idx) {
case BUTTON_LEFT: case BUTTON_LEFT:
button_index_string = "BUTTON_LEFT";
break;
case BUTTON_RIGHT: case BUTTON_RIGHT:
button_index_string = "BUTTON_RIGHT";
break;
case BUTTON_MIDDLE: case BUTTON_MIDDLE:
button_index_string = "BUTTON_MIDDLE";
break;
case BUTTON_WHEEL_UP: case BUTTON_WHEEL_UP:
button_index_string = "BUTTON_WHEEL_UP";
break;
case BUTTON_WHEEL_DOWN: case BUTTON_WHEEL_DOWN:
button_index_string = "BUTTON_WHEEL_DOWN";
break;
case BUTTON_WHEEL_LEFT: case BUTTON_WHEEL_LEFT:
button_index_string = "BUTTON_WHEEL_LEFT";
break;
case BUTTON_WHEEL_RIGHT: case BUTTON_WHEEL_RIGHT:
button_index_string = "BUTTON_WHEEL_RIGHT";
break;
case BUTTON_XBUTTON1: case BUTTON_XBUTTON1:
button_index_string = "BUTTON_XBUTTON1";
break;
case BUTTON_XBUTTON2: case BUTTON_XBUTTON2:
button_index_string = "BUTTON_XBUTTON2"; full_string += RTR(_mouse_button_descriptions[idx - 1]); // button index starts from 1, array index starts from 0, so subtract 1
break; break;
default: default:
button_index_string = itos(get_button_index()); full_string += RTR("Button") + " #" + itos(idx);
break; break;
} }
return "InputEventMouseButton : button_index=" + button_index_string + ", pressed=" + (pressed ? "true" : "false") + ", position=(" + String(get_position()) + "), button_mask=" + itos(get_button_mask()) + ", doubleclick=" + (doubleclick ? "true" : "false");
// Double Click
if (doubleclick) {
full_string += " (" + RTR("Double Click") + ")";
}
return full_string;
}
String InputEventMouseButton::to_string() {
String p = is_pressed() ? "true" : "false";
String d = doubleclick ? "true" : "false";
int idx = get_button_index();
String button_string = itos(idx);
switch (idx) {
case BUTTON_LEFT:
case BUTTON_RIGHT:
case BUTTON_MIDDLE:
case BUTTON_WHEEL_UP:
case BUTTON_WHEEL_DOWN:
case BUTTON_WHEEL_LEFT:
case BUTTON_WHEEL_RIGHT:
case BUTTON_XBUTTON1:
case BUTTON_XBUTTON2:
button_string += " (" + RTR(_mouse_button_descriptions[idx - 1]) + ")"; // button index starts from 1, array index starts from 0, so subtract 1
break;
default:
break;
}
return vformat("InputEventMouseButton: button_index=%s pressed=%s position=(%s) button_mask=%s doubleclick=%s", button_index, p, String(get_position()), itos(get_button_mask()), d);
} }
void InputEventMouseButton::_bind_methods() { void InputEventMouseButton::_bind_methods() {
@ -653,27 +716,32 @@ Ref<InputEvent> InputEventMouseMotion::xformed_by(const Transform2D &p_xform, co
} }
String InputEventMouseMotion::as_text() const { String InputEventMouseMotion::as_text() const {
String button_mask_string = ""; return vformat(RTR("Mouse motion at position (%s) with speed (%s)"), String(get_position()), String(get_speed()));
}
String InputEventMouseMotion::to_string() {
int button_mask = get_button_mask();
String button_mask_string = itos(button_mask);
switch (get_button_mask()) { switch (get_button_mask()) {
case BUTTON_MASK_LEFT: case BUTTON_MASK_LEFT:
button_mask_string = "BUTTON_MASK_LEFT"; button_mask_string += " (" + RTR(_mouse_button_descriptions[BUTTON_LEFT - 1]) + ")";
break; break;
case BUTTON_MASK_MIDDLE: case BUTTON_MASK_MIDDLE:
button_mask_string = "BUTTON_MASK_MIDDLE"; button_mask_string += " (" + RTR(_mouse_button_descriptions[BUTTON_MIDDLE - 1]) + ")";
break; break;
case BUTTON_MASK_RIGHT: case BUTTON_MASK_RIGHT:
button_mask_string = "BUTTON_MASK_RIGHT"; button_mask_string += " (" + RTR(_mouse_button_descriptions[BUTTON_RIGHT - 1]) + ")";
break; break;
case BUTTON_MASK_XBUTTON1: case BUTTON_MASK_XBUTTON1:
button_mask_string = "BUTTON_MASK_XBUTTON1"; button_mask_string += " (" + RTR(_mouse_button_descriptions[BUTTON_XBUTTON1 - 1]) + ")";
break; break;
case BUTTON_MASK_XBUTTON2: case BUTTON_MASK_XBUTTON2:
button_mask_string = "BUTTON_MASK_XBUTTON2"; button_mask_string += " (" + RTR(_mouse_button_descriptions[BUTTON_XBUTTON2 - 1]) + ")";
break; break;
default: default:
button_mask_string = itos(get_button_mask());
break; break;
} }
return "InputEventMouseMotion : button_mask=" + button_mask_string + ", position=(" + String(get_position()) + "), relative=(" + String(get_relative()) + "), speed=(" + String(get_speed()) + "), pressure=(" + rtos(get_pressure()) + "), tilt=(" + String(get_tilt()) + ")"; return "InputEventMouseMotion : button_mask=" + button_mask_string + ", position=(" + String(get_position()) + "), relative=(" + String(get_relative()) + "), speed=(" + String(get_speed()) + "), pressure=(" + rtos(get_pressure()) + "), tilt=(" + String(get_tilt()) + ")";
} }
@ -796,7 +864,26 @@ bool InputEventJoypadMotion::action_match(const Ref<InputEvent> &p_event, bool *
return match; return match;
} }
static const char *_joy_axis_descriptions[JOY_AXIS_MAX] = {
TTRC("Left Stick X-Axis, Joystick 0 X-Axis"),
TTRC("Left Stick Y-Axis, Joystick 0 Y-Axis"),
TTRC("Right Stick X-Axis, Joystick 1 X-Axis"),
TTRC("Right Stick Y-Axis, Joystick 1 Y-Axis"),
TTRC("Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT"),
TTRC("Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT"),
TTRC("Joystick 3 X-Axis"),
TTRC("Joystick 3 Y-Axis"),
TTRC("Joystick 4 X-Axis"),
TTRC("Joystick 4 Y-Axis"),
};
String InputEventJoypadMotion::as_text() const { String InputEventJoypadMotion::as_text() const {
String desc = axis < JOY_AXIS_MAX ? RTR(_joy_axis_descriptions[axis]) : TTR("Unknown Joypad Axis");
return vformat(TTR("Joypad Motion on Axis %s (%s) with Value %s"), itos(axis), desc, String(Variant(axis_value)));
}
String InputEventJoypadMotion::to_string() {
return "InputEventJoypadMotion : axis=" + itos(axis) + ", axis_value=" + String(Variant(axis_value)); return "InputEventJoypadMotion : axis=" + itos(axis) + ", axis_value=" + String(Variant(axis_value));
} }
@ -869,7 +956,39 @@ bool InputEventJoypadButton::shortcut_match(const Ref<InputEvent> &p_event) cons
return button_index == button->button_index; return button_index == button->button_index;
} }
static const char *_joy_button_descriptions[JOY_BUTTON_SDL_MAX] = {
TTRC("Bottom Action, Sony Cross, Xbox A, Nintendo B"),
TTRC("Right Action, Sony Circle, Xbox B, Nintendo A"),
TTRC("Left Action, Sony Square, Xbox X, Nintendo Y"),
TTRC("Top Action, Sony Triangle, Xbox Y, Nintendo X"),
TTRC("Back, Sony Select, Xbox Back, Nintendo -"),
TTRC("Guide, Sony PS, Xbox Home"),
TTRC("Start, Nintendo +"),
TTRC("Left Stick, Sony L3, Xbox L/LS"),
TTRC("Right Stick, Sony R3, Xbox R/RS"),
TTRC("Left Shoulder, Sony L1, Xbox LB"),
TTRC("Right Shoulder, Sony R1, Xbox RB"),
TTRC("D-pad Up"),
TTRC("D-pad Down"),
TTRC("D-pad Left"),
TTRC("D-pad Right"),
};
String InputEventJoypadButton::as_text() const { String InputEventJoypadButton::as_text() const {
String text = "Joypad Button " + itos(button_index);
if (button_index < JOY_BUTTON_SDL_MAX) {
text += vformat(" (%s)", _joy_button_descriptions[button_index]);
}
if (pressure != 0) {
text += ", Pressure:" + String(Variant(pressure));
}
return text;
}
String InputEventJoypadButton::to_string() {
return "InputEventJoypadButton : button_index=" + itos(button_index) + ", pressed=" + (pressed ? "true" : "false") + ", pressure=" + String(Variant(pressure)); return "InputEventJoypadButton : button_index=" + itos(button_index) + ", pressed=" + (pressed ? "true" : "false") + ", pressure=" + String(Variant(pressure));
} }
@ -927,6 +1046,12 @@ Ref<InputEvent> InputEventScreenTouch::xformed_by(const Transform2D &p_xform, co
} }
String InputEventScreenTouch::as_text() const { String InputEventScreenTouch::as_text() const {
String status = pressed ? RTR("touched") : RTR("released");
return vformat(RTR("Screen %s at (%s) with %s touch points"), status, String(get_position()), itos(index));
}
String InputEventScreenTouch::to_string() {
return "InputEventScreenTouch : index=" + itos(index) + ", pressed=" + (pressed ? "true" : "false") + ", position=(" + String(get_position()) + ")"; return "InputEventScreenTouch : index=" + itos(index) + ", pressed=" + (pressed ? "true" : "false") + ", position=(" + String(get_position()) + ")";
} }
@ -996,6 +1121,10 @@ Ref<InputEvent> InputEventScreenDrag::xformed_by(const Transform2D &p_xform, con
} }
String InputEventScreenDrag::as_text() const { String InputEventScreenDrag::as_text() const {
return vformat(RTR("Screen dragged with %s touch points at position (%s) with speed of (%s)"), itos(index), String(get_position()), String(get_speed()));
}
String InputEventScreenDrag::to_string() {
return "InputEventScreenDrag : index=" + itos(index) + ", position=(" + String(get_position()) + "), relative=(" + String(get_relative()) + "), speed=(" + String(get_speed()) + ")"; return "InputEventScreenDrag : index=" + itos(index) + ", position=(" + String(get_position()) + "), relative=(" + String(get_relative()) + "), speed=(" + String(get_speed()) + ")";
} }
@ -1079,6 +1208,10 @@ bool InputEventAction::action_match(const Ref<InputEvent> &p_event, bool *p_pres
} }
String InputEventAction::as_text() const { String InputEventAction::as_text() const {
return vformat(RTR("Input Action %s was %s"), action, pressed ? "pressed" : "released");
}
String InputEventAction::to_string() {
return "InputEventAction : action=" + action + ", pressed=(" + (pressed ? "true" : "false"); return "InputEventAction : action=" + action + ", pressed=(" + (pressed ? "true" : "false");
} }
@ -1142,6 +1275,10 @@ Ref<InputEvent> InputEventMagnifyGesture::xformed_by(const Transform2D &p_xform,
} }
String InputEventMagnifyGesture::as_text() const { String InputEventMagnifyGesture::as_text() const {
return vformat(RTR("Magnify Gesture at (%s) with factor %s"), String(get_position()), rtos(get_factor()));
}
String InputEventMagnifyGesture::to_string() {
return "InputEventMagnifyGesture : factor=" + rtos(get_factor()) + ", position=(" + String(get_position()) + ")"; return "InputEventMagnifyGesture : factor=" + rtos(get_factor()) + ", position=(" + String(get_position()) + ")";
} }
@ -1178,6 +1315,10 @@ Ref<InputEvent> InputEventPanGesture::xformed_by(const Transform2D &p_xform, con
} }
String InputEventPanGesture::as_text() const { String InputEventPanGesture::as_text() const {
return vformat(RTR("Pan Gesture at (%s) with delta (%s)"), String(get_position()), String(get_delta()));
}
String InputEventPanGesture::to_string() {
return "InputEventPanGesture : delta=(" + String(get_delta()) + "), position=(" + String(get_position()) + ")"; return "InputEventPanGesture : delta=(" + String(get_delta()) + "), position=(" + String(get_position()) + ")";
} }
@ -1255,7 +1396,11 @@ int InputEventMIDI::get_controller_value() const {
} }
String InputEventMIDI::as_text() const { String InputEventMIDI::as_text() const {
return "InputEventMIDI : channel=(" + itos(get_channel()) + "), message=(" + itos(get_message()) + ")"; return vformat(RTR("MIDI Input on Channel=%s Message=%s"), itos(channel), itos(message));
}
String InputEventMIDI::to_string() {
return vformat("InputEvenMIDI: channel=%s message=%s pitch=%s velocity=%s pressure=%s", itos(channel), itos(message), itos(pitch), itos(velocity), itos(pressure));
} }
void InputEventMIDI::_bind_methods() { void InputEventMIDI::_bind_methods() {

View File

@ -132,7 +132,7 @@ public:
virtual bool is_pressed() const; virtual bool is_pressed() const;
virtual bool is_echo() const; virtual bool is_echo() const;
virtual String as_text() const; virtual String as_text() const = 0;
virtual Ref<InputEvent> xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const; virtual Ref<InputEvent> xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const;
@ -207,6 +207,9 @@ public:
void set_modifiers_from_event(const InputEventWithModifiers *event); void set_modifiers_from_event(const InputEventWithModifiers *event);
virtual String as_text() const override;
virtual String to_string() override;
InputEventWithModifiers() {} InputEventWithModifiers() {}
}; };
@ -249,6 +252,7 @@ public:
virtual bool is_action_type() const override { return true; } virtual bool is_action_type() const override { return true; }
virtual String as_text() const override; virtual String as_text() const override;
virtual String to_string() override;
InputEventKey() {} InputEventKey() {}
}; };
@ -306,6 +310,7 @@ public:
virtual bool is_action_type() const override { return true; } virtual bool is_action_type() const override { return true; }
virtual String as_text() const override; virtual String as_text() const override;
virtual String to_string() override;
InputEventMouseButton() {} InputEventMouseButton() {}
}; };
@ -336,6 +341,7 @@ public:
virtual Ref<InputEvent> xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override; virtual Ref<InputEvent> xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override;
virtual String as_text() const override; virtual String as_text() const override;
virtual String to_string() override;
virtual bool accumulate(const Ref<InputEvent> &p_event) override; virtual bool accumulate(const Ref<InputEvent> &p_event) override;
@ -363,6 +369,7 @@ public:
virtual bool is_action_type() const override { return true; } virtual bool is_action_type() const override { return true; }
virtual String as_text() const override; virtual String as_text() const override;
virtual String to_string() override;
InputEventJoypadMotion() {} InputEventJoypadMotion() {}
}; };
@ -391,6 +398,7 @@ public:
virtual bool is_action_type() const override { return true; } virtual bool is_action_type() const override { return true; }
virtual String as_text() const override; virtual String as_text() const override;
virtual String to_string() override;
InputEventJoypadButton() {} InputEventJoypadButton() {}
}; };
@ -416,6 +424,7 @@ public:
virtual Ref<InputEvent> xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override; virtual Ref<InputEvent> xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override;
virtual String as_text() const override; virtual String as_text() const override;
virtual String to_string() override;
InputEventScreenTouch() {} InputEventScreenTouch() {}
}; };
@ -445,6 +454,7 @@ public:
virtual Ref<InputEvent> xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override; virtual Ref<InputEvent> xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override;
virtual String as_text() const override; virtual String as_text() const override;
virtual String to_string() override;
InputEventScreenDrag() {} InputEventScreenDrag() {}
}; };
@ -476,6 +486,7 @@ public:
virtual bool shortcut_match(const Ref<InputEvent> &p_event) const override; virtual bool shortcut_match(const Ref<InputEvent> &p_event) const override;
virtual bool is_action_type() const override { return true; } virtual bool is_action_type() const override { return true; }
virtual String as_text() const override; virtual String as_text() const override;
virtual String to_string() override;
InputEventAction() {} InputEventAction() {}
}; };
@ -506,6 +517,7 @@ public:
virtual Ref<InputEvent> xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override; virtual Ref<InputEvent> xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override;
virtual String as_text() const override; virtual String as_text() const override;
virtual String to_string() override;
InputEventMagnifyGesture() {} InputEventMagnifyGesture() {}
}; };
@ -523,6 +535,7 @@ public:
virtual Ref<InputEvent> xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override; virtual Ref<InputEvent> xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override;
virtual String as_text() const override; virtual String as_text() const override;
virtual String to_string() override;
InputEventPanGesture() {} InputEventPanGesture() {}
}; };
@ -568,6 +581,7 @@ public:
int get_controller_value() const; int get_controller_value() const;
virtual String as_text() const override; virtual String as_text() const override;
virtual String to_string() override;
InputEventMIDI() {} InputEventMIDI() {}
}; };

View File

@ -35,47 +35,6 @@
#include "editor/editor_node.h" #include "editor/editor_node.h"
#include "editor/editor_scale.h" #include "editor/editor_scale.h"
static const char *_button_descriptions[JOY_BUTTON_SDL_MAX] = {
TTRC("Bottom Action, Sony Cross, Xbox A, Nintendo B"),
TTRC("Right Action, Sony Circle, Xbox B, Nintendo A"),
TTRC("Left Action, Sony Square, Xbox X, Nintendo Y"),
TTRC("Top Action, Sony Triangle, Xbox Y, Nintendo X"),
TTRC("Back, Sony Select, Xbox Back, Nintendo -"),
TTRC("Guide, Sony PS, Xbox Home"),
TTRC("Start, Nintendo +"),
TTRC("Left Stick, Sony L3, Xbox L/LS"),
TTRC("Right Stick, Sony R3, Xbox R/RS"),
TTRC("Left Shoulder, Sony L1, Xbox LB"),
TTRC("Right Shoulder, Sony R1, Xbox RB"),
TTRC("D-pad Up"),
TTRC("D-pad Down"),
TTRC("D-pad Left"),
TTRC("D-pad Right"),
};
static const char *_axis_descriptions[JOY_AXIS_MAX * 2] = {
TTRC("Left Stick Left, Joystick 0 Left"),
TTRC("Left Stick Right, Joystick 0 Right"),
TTRC("Left Stick Up, Joystick 0 Up"),
TTRC("Left Stick Down, Joystick 0 Down"),
TTRC("Right Stick Left, Joystick 1 Left"),
TTRC("Right Stick Right, Joystick 1 Right"),
TTRC("Right Stick Up, Joystick 1 Up"),
TTRC("Right Stick Down, Joystick 1 Down"),
TTRC("Joystick 2 Left"),
TTRC("Left Trigger, L2, LT, Joystick 2 Right"),
TTRC("Joystick 2 Up"),
TTRC("Right Trigger, R2, RT, Joystick 2 Down"),
TTRC("Joystick 3 Left"),
TTRC("Joystick 3 Right"),
TTRC("Joystick 3 Up"),
TTRC("Joystick 3 Down"),
TTRC("Joystick 4 Left"),
TTRC("Joystick 4 Right"),
TTRC("Joystick 4 Up"),
TTRC("Joystick 4 Down"),
};
void InputMapEditor::_notification(int p_what) { void InputMapEditor::_notification(int p_what) {
switch (p_what) { switch (p_what) {
case NOTIFICATION_ENTER_TREE: { case NOTIFICATION_ENTER_TREE: {
@ -395,6 +354,42 @@ void InputMapEditor::_show_last_added(const Ref<InputEvent> &p_event, const Stri
} }
} }
// Maps to 2*axis if value is neg, or + 1 if value is pos.
static const char *_joy_axis_descriptions[JOY_AXIS_MAX * 2] = {
TTRC("Left Stick Left, Joystick 0 Left"),
TTRC("Left Stick Right, Joystick 0 Right"),
TTRC("Left Stick Up, Joystick 0 Up"),
TTRC("Left Stick Down, Joystick 0 Down"),
TTRC("Right Stick Left, Joystick 1 Left"),
TTRC("Right Stick Right, Joystick 1 Right"),
TTRC("Right Stick Up, Joystick 1 Up"),
TTRC("Right Stick Down, Joystick 1 Down"),
TTRC("Joystick 2 Left"),
TTRC("Left Trigger, Sony L2, Xbox LT, Joystick 2 Right"),
TTRC("Joystick 2 Up"),
TTRC("Right Trigger, Sony R2, Xbox RT, Joystick 2 Down"),
TTRC("Joystick 3 Left"),
TTRC("Joystick 3 Right"),
TTRC("Joystick 3 Up"),
TTRC("Joystick 3 Down"),
TTRC("Joystick 4 Left"),
TTRC("Joystick 4 Right"),
TTRC("Joystick 4 Up"),
TTRC("Joystick 4 Down"),
};
// Separate from `InputEvent::as_text()` since the descriptions need to be different for the input map editor. See #43660.
String InputMapEditor::_get_joypad_motion_event_text(const Ref<InputEventJoypadMotion> &p_event) {
ERR_FAIL_COND_V_MSG(p_event.is_null(), String(), "Provided event is not a valid instance of InputEventJoypadMotion");
String desc = TTR("Unknown Joypad Axis");
if (p_event->get_axis() < JOY_AXIS_MAX) {
desc = RTR(_joy_axis_descriptions[2 * p_event->get_axis() + (p_event->get_axis_value() < 0 ? 0 : 1)]);
}
return vformat("Joypad Axis %s %s (%s)", itos(p_event->get_axis()), p_event->get_axis_value() < 0 ? "-" : "+", desc);
}
void InputMapEditor::_wait_for_key(const Ref<InputEvent> &p_event) { void InputMapEditor::_wait_for_key(const Ref<InputEvent> &p_event) {
Ref<InputEventKey> k = p_event; Ref<InputEventKey> k = p_event;
@ -481,9 +476,11 @@ void InputMapEditor::_add_item(int p_item, Ref<InputEvent> p_exiting_event) {
device_index_label->set_text(TTR("Joypad Axis Index:")); device_index_label->set_text(TTR("Joypad Axis Index:"));
device_index->clear(); device_index->clear();
for (int i = 0; i < JOY_AXIS_MAX * 2; i++) { for (int i = 0; i < JOY_AXIS_MAX * 2; i++) {
String desc = TTR("Axis") + " " + itos(i / 2) + " " + ((i & 1) ? "+" : "-") + Ref<InputEventJoypadMotion> jm;
" (" + TTR(_axis_descriptions[i]) + ")"; jm.instance();
device_index->add_item(desc); jm->set_axis(i / 2);
jm->set_axis_value((i & 1) ? 1 : -1);
device_index->add_item(_get_joypad_motion_event_text(jm));
} }
device_input->popup_centered(Size2(350, 95) * EDSCALE); device_input->popup_centered(Size2(350, 95) * EDSCALE);
@ -502,11 +499,10 @@ void InputMapEditor::_add_item(int p_item, Ref<InputEvent> p_exiting_event) {
device_index_label->set_text(TTR("Joypad Button Index:")); device_index_label->set_text(TTR("Joypad Button Index:"));
device_index->clear(); device_index->clear();
for (int i = 0; i < JOY_BUTTON_MAX; i++) { for (int i = 0; i < JOY_BUTTON_MAX; i++) {
String desc = TTR("Button") + " " + itos(i); Ref<InputEventJoypadButton> jb;
if (i < JOY_BUTTON_SDL_MAX) { jb.instance();
desc += " (" + TTR(_button_descriptions[i]) + ")"; jb->set_button_index(i);
} device_index->add_item(jb->as_text());
device_index->add_item(desc);
} }
device_input->popup_centered(Size2(350, 95) * EDSCALE); device_input->popup_centered(Size2(350, 95) * EDSCALE);
@ -714,14 +710,7 @@ void InputMapEditor::_update_actions() {
Ref<InputEventJoypadButton> jb = event; Ref<InputEventJoypadButton> jb = event;
if (jb.is_valid()) { if (jb.is_valid()) {
const int idx = jb->get_button_index(); action2->set_text(0, jb->as_text());
String str = _get_device_string(jb->get_device()) + ", " +
TTR("Button") + " " + itos(idx);
if (idx >= 0 && idx < JOY_BUTTON_SDL_MAX) {
str += String() + " (" + TTR(_button_descriptions[jb->get_button_index()]) + ")";
}
action2->set_text(0, str);
action2->set_icon(0, input_editor->get_theme_icon("JoyButton", "EditorIcons")); action2->set_icon(0, input_editor->get_theme_icon("JoyButton", "EditorIcons"));
} }
@ -754,12 +743,8 @@ void InputMapEditor::_update_actions() {
Ref<InputEventJoypadMotion> jm = event; Ref<InputEventJoypadMotion> jm = event;
if (jm.is_valid()) { if (jm.is_valid()) {
int ax = jm->get_axis(); device_index->add_item(_get_joypad_motion_event_text(jm));
int n = 2 * ax + (jm->get_axis_value() < 0 ? 0 : 1); action2->set_text(0, jm->as_text());
String str = _get_device_string(jm->get_device()) + ", " +
TTR("Axis") + " " + itos(ax) + " " + (jm->get_axis_value() < 0 ? "-" : "+") +
" (" + _axis_descriptions[n] + ")";
action2->set_text(0, str);
action2->set_icon(0, input_editor->get_theme_icon("JoyAxis", "EditorIcons")); action2->set_icon(0, input_editor->get_theme_icon("JoyAxis", "EditorIcons"));
} }
action2->set_metadata(0, i); action2->set_metadata(0, i);

View File

@ -88,6 +88,8 @@ class InputMapEditor : public Control {
void _press_a_key_confirm(); void _press_a_key_confirm();
void _show_last_added(const Ref<InputEvent> &p_event, const String &p_name); void _show_last_added(const Ref<InputEvent> &p_event, const String &p_name);
String _get_joypad_motion_event_text(const Ref<InputEventJoypadMotion> &p_event);
Variant get_drag_data_fw(const Point2 &p_point, Control *p_from); Variant get_drag_data_fw(const Point2 &p_point, Control *p_from);
bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;
void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from);