Merge branch 'godotengine:master' into bugfix_shader_compile_spirv_from_source

This commit is contained in:
chris.clst 2021-11-14 03:23:22 +01:00 committed by GitHub
commit 038be68649
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
322 changed files with 6794 additions and 4323 deletions

View file

@ -51,6 +51,14 @@ jobs:
build-mono: false
artifact: true
- name: Minimal Template (target=release, tools=no, everything disabled)
cache-name: linux-template-minimal
target: release
tools: false
tests: false
sconsflags: modules_enabled_by_default=no disable_3d=yes disable_advanced_gui=yes deprecated=no minizip=no
artifact: true
steps:
- uses: actions/checkout@v2

View file

@ -502,15 +502,15 @@ String OS::get_system_dir(SystemDir p_dir, bool p_shared_storage) const {
return ::OS::get_singleton()->get_system_dir(::OS::SystemDir(p_dir), p_shared_storage);
}
String OS::get_keycode_string(uint32_t p_code) const {
String OS::get_keycode_string(Key p_code) const {
return ::keycode_get_string(p_code);
}
bool OS::is_keycode_unicode(uint32_t p_unicode) const {
return ::keycode_has_unicode(p_unicode);
bool OS::is_keycode_unicode(char32_t p_unicode) const {
return ::keycode_has_unicode((Key)p_unicode);
}
int OS::find_keycode_from_string(const String &p_code) const {
Key OS::find_keycode_from_string(const String &p_code) const {
return find_keycode(p_code);
}

View file

@ -195,9 +195,9 @@ public:
String get_unique_id() const;
String get_keycode_string(uint32_t p_code) const;
bool is_keycode_unicode(uint32_t p_unicode) const;
int find_keycode_from_string(const String &p_code) const;
String get_keycode_string(Key p_code) const;
bool is_keycode_unicode(char32_t p_unicode) const;
Key find_keycode_from_string(const String &p_code) const;
void set_use_file_access_save_and_swap(bool p_enable);

View file

@ -71,6 +71,16 @@ static Vector<_CoreConstant> _global_constants;
#define BIND_CORE_ENUM_CONSTANT(m_constant) \
_global_constants.push_back(_CoreConstant(__constant_get_enum_name(m_constant, #m_constant), #m_constant, m_constant));
// This just binds enum classes as if they were regular enum constants.
#define BIND_CORE_ENUM_CLASS_CONSTANT(m_enum, m_prefix, m_member) \
_global_constants.push_back(_CoreConstant(__constant_get_enum_name(m_enum::m_member, #m_prefix "_" #m_member), #m_prefix "_" #m_member, (int)m_enum::m_member));
#define BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(m_enum, m_name, m_member) \
_global_constants.push_back(_CoreConstant(__constant_get_enum_name(m_enum::m_member, #m_name), #m_name, (int)m_enum::m_member));
#define BIND_CORE_ENUM_CLASS_CONSTANT_NO_VAL(m_enum, m_prefix, m_member) \
_global_constants.push_back(_CoreConstant(__constant_get_enum_name(m_enum::m_member, #m_prefix "_" #m_member), #m_prefix "_" #m_member, (int)m_enum::m_member, true));
#define BIND_CORE_ENUM_CONSTANT_CUSTOM(m_custom_name, m_constant) \
_global_constants.push_back(_CoreConstant(__constant_get_enum_name(m_constant, #m_constant), m_custom_name, m_constant));
@ -91,6 +101,16 @@ static Vector<_CoreConstant> _global_constants;
#define BIND_CORE_ENUM_CONSTANT(m_constant) \
_global_constants.push_back(_CoreConstant(#m_constant, m_constant));
// This just binds enum classes as if they were regular enum constants.
#define BIND_CORE_ENUM_CLASS_CONSTANT(m_enum, m_prefix, m_member) \
_global_constants.push_back(_CoreConstant(#m_prefix "_" #m_member, (int)m_enum::m_member));
#define BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(m_enum, m_name, m_member) \
_global_constants.push_back(_CoreConstant(#m_name, (int)m_enum::m_member));
#define BIND_CORE_ENUM_CLASS_CONSTANT_NO_VAL(m_enum, m_prefix, m_member) \
_global_constants.push_back(_CoreConstant(#m_prefix "_" #m_member, (int)m_enum::m_member));
#define BIND_CORE_ENUM_CONSTANT_CUSTOM(m_custom_name, m_constant) \
_global_constants.push_back(_CoreConstant(m_custom_name, m_constant));
@ -144,326 +164,317 @@ void register_global_constants() {
BIND_CORE_ENUM_CONSTANT(INLINE_ALIGN_CENTER);
BIND_CORE_ENUM_CONSTANT(INLINE_ALIGN_BOTTOM);
// huge list of keys
BIND_CORE_CONSTANT(SPKEY);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, SPECIAL);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ESCAPE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, TAB);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, BACKTAB);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, BACKSPACE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ENTER);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_ENTER);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, INSERT);
BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(Key, KEY_DELETE, KEY_DELETE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, PAUSE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, PRINT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, SYSREQ);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, CLEAR);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, HOME);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, END);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LEFT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, UP);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, RIGHT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, DOWN);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, PAGEUP);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, PAGEDOWN);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, SHIFT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, CTRL);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, META);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ALT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, CAPSLOCK);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, NUMLOCK);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, SCROLLLOCK);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F1);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F2);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F3);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F4);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F5);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F6);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F7);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F8);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F9);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F10);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F11);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F12);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F13);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F14);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F15);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F16);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_MULTIPLY);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_DIVIDE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_SUBTRACT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_PERIOD);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_ADD);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_0);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_1);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_2);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_3);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_4);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_5);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_6);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_7);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_8);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, KP_9);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, SUPER_L);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, SUPER_R);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, MENU);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, HYPER_L);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, HYPER_R);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, HELP);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, DIRECTION_L);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, DIRECTION_R);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, BACK);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, FORWARD);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, STOP);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, REFRESH);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, VOLUMEDOWN);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, VOLUMEMUTE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, VOLUMEUP);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, BASSBOOST);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, BASSUP);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, BASSDOWN);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, TREBLEUP);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, TREBLEDOWN);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, MEDIAPLAY);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, MEDIASTOP);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, MEDIAPREVIOUS);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, MEDIANEXT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, MEDIARECORD);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, HOMEPAGE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, FAVORITES);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, SEARCH);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, STANDBY);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, OPENURL);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LAUNCHMAIL);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LAUNCHMEDIA);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LAUNCH0);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LAUNCH1);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LAUNCH2);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LAUNCH3);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LAUNCH4);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LAUNCH5);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LAUNCH6);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LAUNCH7);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LAUNCH8);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LAUNCH9);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LAUNCHA);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LAUNCHB);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LAUNCHC);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LAUNCHD);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LAUNCHE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LAUNCHF);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, UNKNOWN);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, SPACE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, EXCLAM);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, QUOTEDBL);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, NUMBERSIGN);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, DOLLAR);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, PERCENT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, AMPERSAND);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, APOSTROPHE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, PARENLEFT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, PARENRIGHT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ASTERISK);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, PLUS);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, COMMA);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, MINUS);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, PERIOD);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, SLASH);
BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(Key, KEY_0, KEY_0);
BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(Key, KEY_1, KEY_1);
BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(Key, KEY_2, KEY_2);
BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(Key, KEY_3, KEY_3);
BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(Key, KEY_4, KEY_4);
BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(Key, KEY_5, KEY_5);
BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(Key, KEY_6, KEY_6);
BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(Key, KEY_7, KEY_7);
BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(Key, KEY_8, KEY_8);
BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(Key, KEY_9, KEY_9);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, COLON);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, SEMICOLON);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, LESS);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, EQUAL);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, GREATER);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, QUESTION);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, AT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, A);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, B);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, C);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, D);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, E);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, F);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, G);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, H);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, I);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, J);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, K);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, L);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, M);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, N);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, O);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, P);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, Q);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, R);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, S);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, T);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, U);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, V);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, W);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, X);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, Y);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, Z);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, BRACKETLEFT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, BACKSLASH);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, BRACKETRIGHT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ASCIICIRCUM);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, UNDERSCORE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, QUOTELEFT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, BRACELEFT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, BAR);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, BRACERIGHT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ASCIITILDE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, NOBREAKSPACE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, EXCLAMDOWN);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, CENT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, STERLING);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, CURRENCY);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, YEN);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, BROKENBAR);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, SECTION);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, DIAERESIS);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, COPYRIGHT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ORDFEMININE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, GUILLEMOTLEFT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, NOTSIGN);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, HYPHEN);
BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(Key, KEY_REGISTERED, KEY_REGISTERED);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, MACRON);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, DEGREE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, PLUSMINUS);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, TWOSUPERIOR);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, THREESUPERIOR);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ACUTE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, MU);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, PARAGRAPH);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, PERIODCENTERED);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, CEDILLA);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ONESUPERIOR);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, MASCULINE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, GUILLEMOTRIGHT);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ONEQUARTER);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ONEHALF);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, THREEQUARTERS);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, QUESTIONDOWN);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, AGRAVE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, AACUTE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ACIRCUMFLEX);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ATILDE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ADIAERESIS);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ARING);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, AE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, CCEDILLA);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, EGRAVE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, EACUTE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ECIRCUMFLEX);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, EDIAERESIS);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, IGRAVE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, IACUTE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ICIRCUMFLEX);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, IDIAERESIS);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ETH);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, NTILDE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, OGRAVE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, OACUTE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, OCIRCUMFLEX);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, OTILDE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ODIAERESIS);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, MULTIPLY);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, OOBLIQUE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, UGRAVE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, UACUTE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, UCIRCUMFLEX);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, UDIAERESIS);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, YACUTE);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, THORN);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, SSHARP);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, DIVISION);
BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, YDIAERESIS);
BIND_CORE_ENUM_CONSTANT(KEY_ESCAPE);
BIND_CORE_ENUM_CONSTANT(KEY_TAB);
BIND_CORE_ENUM_CONSTANT(KEY_BACKTAB);
BIND_CORE_ENUM_CONSTANT(KEY_BACKSPACE);
BIND_CORE_ENUM_CONSTANT(KEY_ENTER);
BIND_CORE_ENUM_CONSTANT(KEY_KP_ENTER);
BIND_CORE_ENUM_CONSTANT(KEY_INSERT);
BIND_CORE_ENUM_CONSTANT(KEY_DELETE);
BIND_CORE_ENUM_CONSTANT(KEY_PAUSE);
BIND_CORE_ENUM_CONSTANT(KEY_PRINT);
BIND_CORE_ENUM_CONSTANT(KEY_SYSREQ);
BIND_CORE_ENUM_CONSTANT(KEY_CLEAR);
BIND_CORE_ENUM_CONSTANT(KEY_HOME);
BIND_CORE_ENUM_CONSTANT(KEY_END);
BIND_CORE_ENUM_CONSTANT(KEY_LEFT);
BIND_CORE_ENUM_CONSTANT(KEY_UP);
BIND_CORE_ENUM_CONSTANT(KEY_RIGHT);
BIND_CORE_ENUM_CONSTANT(KEY_DOWN);
BIND_CORE_ENUM_CONSTANT(KEY_PAGEUP);
BIND_CORE_ENUM_CONSTANT(KEY_PAGEDOWN);
BIND_CORE_ENUM_CONSTANT(KEY_SHIFT);
BIND_CORE_ENUM_CONSTANT(KEY_CTRL);
BIND_CORE_ENUM_CONSTANT(KEY_META);
BIND_CORE_ENUM_CONSTANT(KEY_ALT);
BIND_CORE_ENUM_CONSTANT(KEY_CAPSLOCK);
BIND_CORE_ENUM_CONSTANT(KEY_NUMLOCK);
BIND_CORE_ENUM_CONSTANT(KEY_SCROLLLOCK);
BIND_CORE_ENUM_CONSTANT(KEY_F1);
BIND_CORE_ENUM_CONSTANT(KEY_F2);
BIND_CORE_ENUM_CONSTANT(KEY_F3);
BIND_CORE_ENUM_CONSTANT(KEY_F4);
BIND_CORE_ENUM_CONSTANT(KEY_F5);
BIND_CORE_ENUM_CONSTANT(KEY_F6);
BIND_CORE_ENUM_CONSTANT(KEY_F7);
BIND_CORE_ENUM_CONSTANT(KEY_F8);
BIND_CORE_ENUM_CONSTANT(KEY_F9);
BIND_CORE_ENUM_CONSTANT(KEY_F10);
BIND_CORE_ENUM_CONSTANT(KEY_F11);
BIND_CORE_ENUM_CONSTANT(KEY_F12);
BIND_CORE_ENUM_CONSTANT(KEY_F13);
BIND_CORE_ENUM_CONSTANT(KEY_F14);
BIND_CORE_ENUM_CONSTANT(KEY_F15);
BIND_CORE_ENUM_CONSTANT(KEY_F16);
BIND_CORE_ENUM_CONSTANT(KEY_KP_MULTIPLY);
BIND_CORE_ENUM_CONSTANT(KEY_KP_DIVIDE);
BIND_CORE_ENUM_CONSTANT(KEY_KP_SUBTRACT);
BIND_CORE_ENUM_CONSTANT(KEY_KP_PERIOD);
BIND_CORE_ENUM_CONSTANT(KEY_KP_ADD);
BIND_CORE_ENUM_CONSTANT(KEY_KP_0);
BIND_CORE_ENUM_CONSTANT(KEY_KP_1);
BIND_CORE_ENUM_CONSTANT(KEY_KP_2);
BIND_CORE_ENUM_CONSTANT(KEY_KP_3);
BIND_CORE_ENUM_CONSTANT(KEY_KP_4);
BIND_CORE_ENUM_CONSTANT(KEY_KP_5);
BIND_CORE_ENUM_CONSTANT(KEY_KP_6);
BIND_CORE_ENUM_CONSTANT(KEY_KP_7);
BIND_CORE_ENUM_CONSTANT(KEY_KP_8);
BIND_CORE_ENUM_CONSTANT(KEY_KP_9);
BIND_CORE_ENUM_CONSTANT(KEY_SUPER_L);
BIND_CORE_ENUM_CONSTANT(KEY_SUPER_R);
BIND_CORE_ENUM_CONSTANT(KEY_MENU);
BIND_CORE_ENUM_CONSTANT(KEY_HYPER_L);
BIND_CORE_ENUM_CONSTANT(KEY_HYPER_R);
BIND_CORE_ENUM_CONSTANT(KEY_HELP);
BIND_CORE_ENUM_CONSTANT(KEY_DIRECTION_L);
BIND_CORE_ENUM_CONSTANT(KEY_DIRECTION_R);
BIND_CORE_ENUM_CONSTANT(KEY_BACK);
BIND_CORE_ENUM_CONSTANT(KEY_FORWARD);
BIND_CORE_ENUM_CONSTANT(KEY_STOP);
BIND_CORE_ENUM_CONSTANT(KEY_REFRESH);
BIND_CORE_ENUM_CONSTANT(KEY_VOLUMEDOWN);
BIND_CORE_ENUM_CONSTANT(KEY_VOLUMEMUTE);
BIND_CORE_ENUM_CONSTANT(KEY_VOLUMEUP);
BIND_CORE_ENUM_CONSTANT(KEY_BASSBOOST);
BIND_CORE_ENUM_CONSTANT(KEY_BASSUP);
BIND_CORE_ENUM_CONSTANT(KEY_BASSDOWN);
BIND_CORE_ENUM_CONSTANT(KEY_TREBLEUP);
BIND_CORE_ENUM_CONSTANT(KEY_TREBLEDOWN);
BIND_CORE_ENUM_CONSTANT(KEY_MEDIAPLAY);
BIND_CORE_ENUM_CONSTANT(KEY_MEDIASTOP);
BIND_CORE_ENUM_CONSTANT(KEY_MEDIAPREVIOUS);
BIND_CORE_ENUM_CONSTANT(KEY_MEDIANEXT);
BIND_CORE_ENUM_CONSTANT(KEY_MEDIARECORD);
BIND_CORE_ENUM_CONSTANT(KEY_HOMEPAGE);
BIND_CORE_ENUM_CONSTANT(KEY_FAVORITES);
BIND_CORE_ENUM_CONSTANT(KEY_SEARCH);
BIND_CORE_ENUM_CONSTANT(KEY_STANDBY);
BIND_CORE_ENUM_CONSTANT(KEY_OPENURL);
BIND_CORE_ENUM_CONSTANT(KEY_LAUNCHMAIL);
BIND_CORE_ENUM_CONSTANT(KEY_LAUNCHMEDIA);
BIND_CORE_ENUM_CONSTANT(KEY_LAUNCH0);
BIND_CORE_ENUM_CONSTANT(KEY_LAUNCH1);
BIND_CORE_ENUM_CONSTANT(KEY_LAUNCH2);
BIND_CORE_ENUM_CONSTANT(KEY_LAUNCH3);
BIND_CORE_ENUM_CONSTANT(KEY_LAUNCH4);
BIND_CORE_ENUM_CONSTANT(KEY_LAUNCH5);
BIND_CORE_ENUM_CONSTANT(KEY_LAUNCH6);
BIND_CORE_ENUM_CONSTANT(KEY_LAUNCH7);
BIND_CORE_ENUM_CONSTANT(KEY_LAUNCH8);
BIND_CORE_ENUM_CONSTANT(KEY_LAUNCH9);
BIND_CORE_ENUM_CONSTANT(KEY_LAUNCHA);
BIND_CORE_ENUM_CONSTANT(KEY_LAUNCHB);
BIND_CORE_ENUM_CONSTANT(KEY_LAUNCHC);
BIND_CORE_ENUM_CONSTANT(KEY_LAUNCHD);
BIND_CORE_ENUM_CONSTANT(KEY_LAUNCHE);
BIND_CORE_ENUM_CONSTANT(KEY_LAUNCHF);
BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(KeyModifierMask, KEY_CODE_MASK, CODE_MASK);
BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(KeyModifierMask, KEY_MODIFIER_MASK, MODIFIER_MASK);
BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, SHIFT);
BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, ALT);
BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, META);
BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, CTRL);
BIND_CORE_ENUM_CLASS_CONSTANT_NO_VAL(KeyModifierMask, KEY_MASK, CMD);
BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, KPAD);
BIND_CORE_ENUM_CLASS_CONSTANT(KeyModifierMask, KEY_MASK, GROUP_SWITCH);
BIND_CORE_ENUM_CONSTANT(KEY_UNKNOWN);
BIND_CORE_ENUM_CONSTANT(KEY_SPACE);
BIND_CORE_ENUM_CONSTANT(KEY_EXCLAM);
BIND_CORE_ENUM_CONSTANT(KEY_QUOTEDBL);
BIND_CORE_ENUM_CONSTANT(KEY_NUMBERSIGN);
BIND_CORE_ENUM_CONSTANT(KEY_DOLLAR);
BIND_CORE_ENUM_CONSTANT(KEY_PERCENT);
BIND_CORE_ENUM_CONSTANT(KEY_AMPERSAND);
BIND_CORE_ENUM_CONSTANT(KEY_APOSTROPHE);
BIND_CORE_ENUM_CONSTANT(KEY_PARENLEFT);
BIND_CORE_ENUM_CONSTANT(KEY_PARENRIGHT);
BIND_CORE_ENUM_CONSTANT(KEY_ASTERISK);
BIND_CORE_ENUM_CONSTANT(KEY_PLUS);
BIND_CORE_ENUM_CONSTANT(KEY_COMMA);
BIND_CORE_ENUM_CONSTANT(KEY_MINUS);
BIND_CORE_ENUM_CONSTANT(KEY_PERIOD);
BIND_CORE_ENUM_CONSTANT(KEY_SLASH);
BIND_CORE_ENUM_CONSTANT(KEY_0);
BIND_CORE_ENUM_CONSTANT(KEY_1);
BIND_CORE_ENUM_CONSTANT(KEY_2);
BIND_CORE_ENUM_CONSTANT(KEY_3);
BIND_CORE_ENUM_CONSTANT(KEY_4);
BIND_CORE_ENUM_CONSTANT(KEY_5);
BIND_CORE_ENUM_CONSTANT(KEY_6);
BIND_CORE_ENUM_CONSTANT(KEY_7);
BIND_CORE_ENUM_CONSTANT(KEY_8);
BIND_CORE_ENUM_CONSTANT(KEY_9);
BIND_CORE_ENUM_CONSTANT(KEY_COLON);
BIND_CORE_ENUM_CONSTANT(KEY_SEMICOLON);
BIND_CORE_ENUM_CONSTANT(KEY_LESS);
BIND_CORE_ENUM_CONSTANT(KEY_EQUAL);
BIND_CORE_ENUM_CONSTANT(KEY_GREATER);
BIND_CORE_ENUM_CONSTANT(KEY_QUESTION);
BIND_CORE_ENUM_CONSTANT(KEY_AT);
BIND_CORE_ENUM_CONSTANT(KEY_A);
BIND_CORE_ENUM_CONSTANT(KEY_B);
BIND_CORE_ENUM_CONSTANT(KEY_C);
BIND_CORE_ENUM_CONSTANT(KEY_D);
BIND_CORE_ENUM_CONSTANT(KEY_E);
BIND_CORE_ENUM_CONSTANT(KEY_F);
BIND_CORE_ENUM_CONSTANT(KEY_G);
BIND_CORE_ENUM_CONSTANT(KEY_H);
BIND_CORE_ENUM_CONSTANT(KEY_I);
BIND_CORE_ENUM_CONSTANT(KEY_J);
BIND_CORE_ENUM_CONSTANT(KEY_K);
BIND_CORE_ENUM_CONSTANT(KEY_L);
BIND_CORE_ENUM_CONSTANT(KEY_M);
BIND_CORE_ENUM_CONSTANT(KEY_N);
BIND_CORE_ENUM_CONSTANT(KEY_O);
BIND_CORE_ENUM_CONSTANT(KEY_P);
BIND_CORE_ENUM_CONSTANT(KEY_Q);
BIND_CORE_ENUM_CONSTANT(KEY_R);
BIND_CORE_ENUM_CONSTANT(KEY_S);
BIND_CORE_ENUM_CONSTANT(KEY_T);
BIND_CORE_ENUM_CONSTANT(KEY_U);
BIND_CORE_ENUM_CONSTANT(KEY_V);
BIND_CORE_ENUM_CONSTANT(KEY_W);
BIND_CORE_ENUM_CONSTANT(KEY_X);
BIND_CORE_ENUM_CONSTANT(KEY_Y);
BIND_CORE_ENUM_CONSTANT(KEY_Z);
BIND_CORE_ENUM_CONSTANT(KEY_BRACKETLEFT);
BIND_CORE_ENUM_CONSTANT(KEY_BACKSLASH);
BIND_CORE_ENUM_CONSTANT(KEY_BRACKETRIGHT);
BIND_CORE_ENUM_CONSTANT(KEY_ASCIICIRCUM);
BIND_CORE_ENUM_CONSTANT(KEY_UNDERSCORE);
BIND_CORE_ENUM_CONSTANT(KEY_QUOTELEFT);
BIND_CORE_ENUM_CONSTANT(KEY_BRACELEFT);
BIND_CORE_ENUM_CONSTANT(KEY_BAR);
BIND_CORE_ENUM_CONSTANT(KEY_BRACERIGHT);
BIND_CORE_ENUM_CONSTANT(KEY_ASCIITILDE);
BIND_CORE_ENUM_CONSTANT(KEY_NOBREAKSPACE);
BIND_CORE_ENUM_CONSTANT(KEY_EXCLAMDOWN);
BIND_CORE_ENUM_CONSTANT(KEY_CENT);
BIND_CORE_ENUM_CONSTANT(KEY_STERLING);
BIND_CORE_ENUM_CONSTANT(KEY_CURRENCY);
BIND_CORE_ENUM_CONSTANT(KEY_YEN);
BIND_CORE_ENUM_CONSTANT(KEY_BROKENBAR);
BIND_CORE_ENUM_CONSTANT(KEY_SECTION);
BIND_CORE_ENUM_CONSTANT(KEY_DIAERESIS);
BIND_CORE_ENUM_CONSTANT(KEY_COPYRIGHT);
BIND_CORE_ENUM_CONSTANT(KEY_ORDFEMININE);
BIND_CORE_ENUM_CONSTANT(KEY_GUILLEMOTLEFT);
BIND_CORE_ENUM_CONSTANT(KEY_NOTSIGN);
BIND_CORE_ENUM_CONSTANT(KEY_HYPHEN);
BIND_CORE_ENUM_CONSTANT(KEY_REGISTERED);
BIND_CORE_ENUM_CONSTANT(KEY_MACRON);
BIND_CORE_ENUM_CONSTANT(KEY_DEGREE);
BIND_CORE_ENUM_CONSTANT(KEY_PLUSMINUS);
BIND_CORE_ENUM_CONSTANT(KEY_TWOSUPERIOR);
BIND_CORE_ENUM_CONSTANT(KEY_THREESUPERIOR);
BIND_CORE_ENUM_CONSTANT(KEY_ACUTE);
BIND_CORE_ENUM_CONSTANT(KEY_MU);
BIND_CORE_ENUM_CONSTANT(KEY_PARAGRAPH);
BIND_CORE_ENUM_CONSTANT(KEY_PERIODCENTERED);
BIND_CORE_ENUM_CONSTANT(KEY_CEDILLA);
BIND_CORE_ENUM_CONSTANT(KEY_ONESUPERIOR);
BIND_CORE_ENUM_CONSTANT(KEY_MASCULINE);
BIND_CORE_ENUM_CONSTANT(KEY_GUILLEMOTRIGHT);
BIND_CORE_ENUM_CONSTANT(KEY_ONEQUARTER);
BIND_CORE_ENUM_CONSTANT(KEY_ONEHALF);
BIND_CORE_ENUM_CONSTANT(KEY_THREEQUARTERS);
BIND_CORE_ENUM_CONSTANT(KEY_QUESTIONDOWN);
BIND_CORE_ENUM_CONSTANT(KEY_AGRAVE);
BIND_CORE_ENUM_CONSTANT(KEY_AACUTE);
BIND_CORE_ENUM_CONSTANT(KEY_ACIRCUMFLEX);
BIND_CORE_ENUM_CONSTANT(KEY_ATILDE);
BIND_CORE_ENUM_CONSTANT(KEY_ADIAERESIS);
BIND_CORE_ENUM_CONSTANT(KEY_ARING);
BIND_CORE_ENUM_CONSTANT(KEY_AE);
BIND_CORE_ENUM_CONSTANT(KEY_CCEDILLA);
BIND_CORE_ENUM_CONSTANT(KEY_EGRAVE);
BIND_CORE_ENUM_CONSTANT(KEY_EACUTE);
BIND_CORE_ENUM_CONSTANT(KEY_ECIRCUMFLEX);
BIND_CORE_ENUM_CONSTANT(KEY_EDIAERESIS);
BIND_CORE_ENUM_CONSTANT(KEY_IGRAVE);
BIND_CORE_ENUM_CONSTANT(KEY_IACUTE);
BIND_CORE_ENUM_CONSTANT(KEY_ICIRCUMFLEX);
BIND_CORE_ENUM_CONSTANT(KEY_IDIAERESIS);
BIND_CORE_ENUM_CONSTANT(KEY_ETH);
BIND_CORE_ENUM_CONSTANT(KEY_NTILDE);
BIND_CORE_ENUM_CONSTANT(KEY_OGRAVE);
BIND_CORE_ENUM_CONSTANT(KEY_OACUTE);
BIND_CORE_ENUM_CONSTANT(KEY_OCIRCUMFLEX);
BIND_CORE_ENUM_CONSTANT(KEY_OTILDE);
BIND_CORE_ENUM_CONSTANT(KEY_ODIAERESIS);
BIND_CORE_ENUM_CONSTANT(KEY_MULTIPLY);
BIND_CORE_ENUM_CONSTANT(KEY_OOBLIQUE);
BIND_CORE_ENUM_CONSTANT(KEY_UGRAVE);
BIND_CORE_ENUM_CONSTANT(KEY_UACUTE);
BIND_CORE_ENUM_CONSTANT(KEY_UCIRCUMFLEX);
BIND_CORE_ENUM_CONSTANT(KEY_UDIAERESIS);
BIND_CORE_ENUM_CONSTANT(KEY_YACUTE);
BIND_CORE_ENUM_CONSTANT(KEY_THORN);
BIND_CORE_ENUM_CONSTANT(KEY_SSHARP);
BIND_CORE_ENUM_CLASS_CONSTANT(MouseButton, MOUSE_BUTTON, LEFT);
BIND_CORE_ENUM_CLASS_CONSTANT(MouseButton, MOUSE_BUTTON, RIGHT);
BIND_CORE_ENUM_CLASS_CONSTANT(MouseButton, MOUSE_BUTTON, MIDDLE);
BIND_CORE_ENUM_CLASS_CONSTANT(MouseButton, MOUSE_BUTTON, WHEEL_UP);
BIND_CORE_ENUM_CLASS_CONSTANT(MouseButton, MOUSE_BUTTON, WHEEL_DOWN);
BIND_CORE_ENUM_CLASS_CONSTANT(MouseButton, MOUSE_BUTTON, WHEEL_LEFT);
BIND_CORE_ENUM_CLASS_CONSTANT(MouseButton, MOUSE_BUTTON, WHEEL_RIGHT);
BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(MouseButton, MOUSE_BUTTON_XBUTTON1, MB_XBUTTON1);
BIND_CORE_ENUM_CLASS_CONSTANT_CUSTOM(MouseButton, MOUSE_BUTTON_XBUTTON2, MB_XBUTTON2);
BIND_CORE_ENUM_CLASS_CONSTANT(MouseButton, MOUSE_BUTTON, MASK_LEFT);
BIND_CORE_ENUM_CLASS_CONSTANT(MouseButton, MOUSE_BUTTON, MASK_RIGHT);
BIND_CORE_ENUM_CLASS_CONSTANT(MouseButton, MOUSE_BUTTON, MASK_MIDDLE);
BIND_CORE_ENUM_CLASS_CONSTANT(MouseButton, MOUSE_BUTTON, MASK_XBUTTON1);
BIND_CORE_ENUM_CLASS_CONSTANT(MouseButton, MOUSE_BUTTON, MASK_XBUTTON2);
BIND_CORE_ENUM_CONSTANT(KEY_DIVISION);
BIND_CORE_ENUM_CONSTANT(KEY_YDIAERESIS);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, INVALID);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, A);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, B);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, X);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, Y);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, BACK);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, GUIDE);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, START);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, LEFT_STICK);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, RIGHT_STICK);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, LEFT_SHOULDER);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, RIGHT_SHOULDER);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, DPAD_UP);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, DPAD_DOWN);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, DPAD_LEFT);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, DPAD_RIGHT);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, MISC1);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, PADDLE1);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, PADDLE2);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, PADDLE3);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, PADDLE4);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, TOUCHPAD);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, SDL_MAX);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, MAX);
BIND_CORE_ENUM_CONSTANT(KEY_CODE_MASK);
BIND_CORE_ENUM_CONSTANT(KEY_MODIFIER_MASK);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyAxis, JOY_AXIS, INVALID);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyAxis, JOY_AXIS, LEFT_X);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyAxis, JOY_AXIS, LEFT_Y);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyAxis, JOY_AXIS, RIGHT_X);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyAxis, JOY_AXIS, RIGHT_Y);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyAxis, JOY_AXIS, TRIGGER_LEFT);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyAxis, JOY_AXIS, TRIGGER_RIGHT);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyAxis, JOY_AXIS, SDL_MAX);
BIND_CORE_ENUM_CLASS_CONSTANT(JoyAxis, JOY_AXIS, MAX);
BIND_CORE_ENUM_CONSTANT(KEY_MASK_SHIFT);
BIND_CORE_ENUM_CONSTANT(KEY_MASK_ALT);
BIND_CORE_ENUM_CONSTANT(KEY_MASK_META);
BIND_CORE_ENUM_CONSTANT(KEY_MASK_CTRL);
BIND_CORE_ENUM_CONSTANT_NO_VAL(KEY_MASK_CMD);
BIND_CORE_ENUM_CONSTANT(KEY_MASK_KPAD);
BIND_CORE_ENUM_CONSTANT(KEY_MASK_GROUP_SWITCH);
// mouse
BIND_CORE_ENUM_CONSTANT(MOUSE_BUTTON_LEFT);
BIND_CORE_ENUM_CONSTANT(MOUSE_BUTTON_RIGHT);
BIND_CORE_ENUM_CONSTANT(MOUSE_BUTTON_MIDDLE);
BIND_CORE_ENUM_CONSTANT(MOUSE_BUTTON_XBUTTON1);
BIND_CORE_ENUM_CONSTANT(MOUSE_BUTTON_XBUTTON2);
BIND_CORE_ENUM_CONSTANT(MOUSE_BUTTON_WHEEL_UP);
BIND_CORE_ENUM_CONSTANT(MOUSE_BUTTON_WHEEL_DOWN);
BIND_CORE_ENUM_CONSTANT(MOUSE_BUTTON_WHEEL_LEFT);
BIND_CORE_ENUM_CONSTANT(MOUSE_BUTTON_WHEEL_RIGHT);
BIND_CORE_ENUM_CONSTANT(MOUSE_BUTTON_MASK_LEFT);
BIND_CORE_ENUM_CONSTANT(MOUSE_BUTTON_MASK_RIGHT);
BIND_CORE_ENUM_CONSTANT(MOUSE_BUTTON_MASK_MIDDLE);
BIND_CORE_ENUM_CONSTANT(MOUSE_BUTTON_MASK_XBUTTON1);
BIND_CORE_ENUM_CONSTANT(MOUSE_BUTTON_MASK_XBUTTON2);
// Joypad buttons
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_INVALID);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_A);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_B);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_X);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_Y);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_BACK);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_GUIDE);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_START);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_LEFT_STICK);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_RIGHT_STICK);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_LEFT_SHOULDER);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_RIGHT_SHOULDER);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_DPAD_UP);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_DPAD_DOWN);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_DPAD_LEFT);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_DPAD_RIGHT);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_MISC1);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_PADDLE1);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_PADDLE2);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_PADDLE3);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_PADDLE4);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_TOUCHPAD);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_SDL_MAX);
BIND_CORE_ENUM_CONSTANT(JOY_BUTTON_MAX);
// Joypad axes
BIND_CORE_ENUM_CONSTANT(JOY_AXIS_INVALID);
BIND_CORE_ENUM_CONSTANT(JOY_AXIS_LEFT_X);
BIND_CORE_ENUM_CONSTANT(JOY_AXIS_LEFT_Y);
BIND_CORE_ENUM_CONSTANT(JOY_AXIS_RIGHT_X);
BIND_CORE_ENUM_CONSTANT(JOY_AXIS_RIGHT_Y);
BIND_CORE_ENUM_CONSTANT(JOY_AXIS_TRIGGER_LEFT);
BIND_CORE_ENUM_CONSTANT(JOY_AXIS_TRIGGER_RIGHT);
BIND_CORE_ENUM_CONSTANT(JOY_AXIS_SDL_MAX);
BIND_CORE_ENUM_CONSTANT(JOY_AXIS_MAX);
// midi
BIND_CORE_ENUM_CONSTANT(MIDI_MESSAGE_NOTE_OFF);
BIND_CORE_ENUM_CONSTANT(MIDI_MESSAGE_NOTE_ON);
BIND_CORE_ENUM_CONSTANT(MIDI_MESSAGE_AFTERTOUCH);
BIND_CORE_ENUM_CONSTANT(MIDI_MESSAGE_CONTROL_CHANGE);
BIND_CORE_ENUM_CONSTANT(MIDI_MESSAGE_PROGRAM_CHANGE);
BIND_CORE_ENUM_CONSTANT(MIDI_MESSAGE_CHANNEL_PRESSURE);
BIND_CORE_ENUM_CONSTANT(MIDI_MESSAGE_PITCH_BEND);
BIND_CORE_ENUM_CLASS_CONSTANT(MIDIMessage, MIDI_MESSAGE, NOTE_OFF);
BIND_CORE_ENUM_CLASS_CONSTANT(MIDIMessage, MIDI_MESSAGE, NOTE_ON);
BIND_CORE_ENUM_CLASS_CONSTANT(MIDIMessage, MIDI_MESSAGE, AFTERTOUCH);
BIND_CORE_ENUM_CLASS_CONSTANT(MIDIMessage, MIDI_MESSAGE, CONTROL_CHANGE);
BIND_CORE_ENUM_CLASS_CONSTANT(MIDIMessage, MIDI_MESSAGE, PROGRAM_CHANGE);
BIND_CORE_ENUM_CLASS_CONSTANT(MIDIMessage, MIDI_MESSAGE, CHANNEL_PRESSURE);
BIND_CORE_ENUM_CLASS_CONSTANT(MIDIMessage, MIDI_MESSAGE, PITCH_BEND);
// error list

View file

@ -35,7 +35,7 @@
#include "core/input/input_map.h"
#include "core/os/os.h"
static const char *_joy_buttons[JOY_BUTTON_SDL_MAX] = {
static const char *_joy_buttons[(size_t)JoyButton::SDL_MAX] = {
"a",
"b",
"x",
@ -59,7 +59,7 @@ static const char *_joy_buttons[JOY_BUTTON_SDL_MAX] = {
"touchpad",
};
static const char *_joy_axes[JOY_AXIS_SDL_MAX] = {
static const char *_joy_axes[(size_t)JoyAxis::SDL_MAX] = {
"leftx",
"lefty",
"rightx",
@ -225,11 +225,15 @@ bool Input::is_key_pressed(Key p_keycode) const {
bool Input::is_mouse_button_pressed(MouseButton p_button) const {
_THREAD_SAFE_METHOD_
return (mouse_button_mask & (1 << (p_button - 1))) != 0;
return (mouse_button_mask & mouse_button_to_mask(p_button)) != MouseButton::NONE;
}
static int _combine_device(int p_value, int p_device) {
return p_value | (p_device << 20);
static JoyAxis _combine_device(JoyAxis p_value, int p_device) {
return JoyAxis((int)p_value | (p_device << 20));
}
static JoyButton _combine_device(JoyButton p_value, int p_device) {
return JoyButton((int)p_value | (p_device << 20));
}
bool Input::is_joy_button_pressed(int p_device, JoyButton p_button) const {
@ -338,7 +342,7 @@ Vector2 Input::get_vector(const StringName &p_negative_x, const StringName &p_po
float Input::get_joy_axis(int p_device, JoyAxis p_axis) const {
_THREAD_SAFE_METHOD_
int c = _combine_device(p_axis, p_device);
JoyAxis c = _combine_device(p_axis, p_device);
if (_joy_axis.has(c)) {
return _joy_axis[c];
} else {
@ -412,11 +416,11 @@ void Input::joy_connection_changed(int p_idx, bool p_connected, String p_name, S
js.mapping = mapping;
} else {
js.connected = false;
for (int i = 0; i < JOY_BUTTON_MAX; i++) {
int c = _combine_device(i, p_idx);
for (int i = 0; i < (int)JoyButton::MAX; i++) {
JoyButton c = _combine_device((JoyButton)i, p_idx);
joy_buttons_pressed.erase(c);
}
for (int i = 0; i < JOY_AXIS_MAX; i++) {
for (int i = 0; i < (int)JoyAxis::MAX; i++) {
set_joy_axis(p_idx, (JoyAxis)i, 0.0f);
}
}
@ -454,7 +458,7 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em
// require additional handling by this class.
Ref<InputEventKey> k = p_event;
if (k.is_valid() && !k->is_echo() && k->get_keycode() != 0) {
if (k.is_valid() && !k->is_echo() && k->get_keycode() != Key::NONE) {
if (k->is_pressed()) {
keys_pressed.insert(k->get_keycode());
} else {
@ -466,9 +470,9 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em
if (mb.is_valid()) {
if (mb->is_pressed()) {
mouse_button_mask |= (MouseButton)(1 << (mb->get_button_index() - 1));
mouse_button_mask |= mouse_button_to_mask(mb->get_button_index());
} else {
mouse_button_mask &= (MouseButton) ~(1 << (mb->get_button_index() - 1));
mouse_button_mask &= ~mouse_button_to_mask(mb->get_button_index());
}
Point2 pos = mb->get_global_position();
@ -476,7 +480,7 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em
set_mouse_position(pos);
}
if (event_dispatch_function && emulate_touch_from_mouse && !p_is_emulated && mb->get_button_index() == 1) {
if (event_dispatch_function && emulate_touch_from_mouse && !p_is_emulated && mb->get_button_index() == MouseButton::LEFT) {
Ref<InputEventScreenTouch> touch_event;
touch_event.instantiate();
touch_event->set_pressed(mb->is_pressed());
@ -493,7 +497,7 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em
set_mouse_position(pos);
}
if (event_dispatch_function && emulate_touch_from_mouse && !p_is_emulated && mm->get_button_mask() & 1) {
if (event_dispatch_function && emulate_touch_from_mouse && !p_is_emulated && (mm->get_button_mask() & MouseButton::LEFT) != MouseButton::NONE) {
Ref<InputEventScreenDrag> drag_event;
drag_event.instantiate();
@ -539,11 +543,11 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em
button_event->set_position(st->get_position());
button_event->set_global_position(st->get_position());
button_event->set_pressed(st->is_pressed());
button_event->set_button_index(MOUSE_BUTTON_LEFT);
button_event->set_button_index(MouseButton::LEFT);
if (st->is_pressed()) {
button_event->set_button_mask(MouseButton(mouse_button_mask | MOUSE_BUTTON_MASK_LEFT));
button_event->set_button_mask(MouseButton(mouse_button_mask | MouseButton::MASK_LEFT));
} else {
button_event->set_button_mask(MouseButton(mouse_button_mask & ~MOUSE_BUTTON_MASK_LEFT));
button_event->set_button_mask(MouseButton(mouse_button_mask & ~MouseButton::MASK_LEFT));
}
_parse_input_event_impl(button_event, true);
@ -576,7 +580,7 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em
Ref<InputEventJoypadButton> jb = p_event;
if (jb.is_valid()) {
int c = _combine_device(jb->get_button_index(), jb->get_device());
JoyButton c = _combine_device(jb->get_button_index(), jb->get_device());
if (jb->is_pressed()) {
joy_buttons_pressed.insert(c);
@ -624,7 +628,7 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em
void Input::set_joy_axis(int p_device, JoyAxis p_axis, float p_value) {
_THREAD_SAFE_METHOD_
int c = _combine_device(p_axis, p_device);
JoyAxis c = _combine_device(p_axis, p_device);
_joy_axis[c] = p_value;
}
@ -692,7 +696,7 @@ Point2 Input::get_last_mouse_speed() const {
return mouse_speed_track.speed;
}
int Input::get_mouse_button_mask() const {
MouseButton Input::get_mouse_button_mask() const {
return mouse_button_mask; // do not trust OS implementation, should remove it - OS::get_singleton()->get_mouse_button_state();
}
@ -771,8 +775,8 @@ void Input::ensure_touch_mouse_raised() {
button_event->set_position(mouse_pos);
button_event->set_global_position(mouse_pos);
button_event->set_pressed(false);
button_event->set_button_index(MOUSE_BUTTON_LEFT);
button_event->set_button_mask(MouseButton(mouse_button_mask & ~MOUSE_BUTTON_MASK_LEFT));
button_event->set_button_index(MouseButton::LEFT);
button_event->set_button_mask(MouseButton(mouse_button_mask & ~MouseButton::MASK_LEFT));
_parse_input_event_impl(button_event, true);
}
@ -876,10 +880,10 @@ void Input::joy_button(int p_device, JoyButton p_button, bool p_pressed) {
_THREAD_SAFE_METHOD_;
Joypad &joy = joy_names[p_device];
//printf("got button %i, mapping is %i\n", p_button, joy.mapping);
if (joy.last_buttons[p_button] == p_pressed) {
if (joy.last_buttons[(size_t)p_button] == p_pressed) {
return;
}
joy.last_buttons[p_button] = p_pressed;
joy.last_buttons[(size_t)p_button] = p_pressed;
if (joy.mapping == -1) {
_button_event(p_device, p_button, p_pressed);
return;
@ -901,16 +905,16 @@ void Input::joy_button(int p_device, JoyButton p_button, bool p_pressed) {
void Input::joy_axis(int p_device, JoyAxis p_axis, const JoyAxisValue &p_value) {
_THREAD_SAFE_METHOD_;
ERR_FAIL_INDEX(p_axis, JOY_AXIS_MAX);
ERR_FAIL_INDEX((int)p_axis, (int)JoyAxis::MAX);
Joypad &joy = joy_names[p_device];
if (joy.last_axis[p_axis] == p_value.value) {
if (joy.last_axis[(size_t)p_axis] == p_value.value) {
return;
}
//when changing direction quickly, insert fake event to release pending inputmap actions
float last = joy.last_axis[p_axis];
float last = joy.last_axis[(size_t)p_axis];
if (p_value.min == 0 && (last < 0.25 || last > 0.75) && (last - 0.5) * (p_value.value - 0.5) < 0) {
JoyAxisValue jx;
jx.min = p_value.min;
@ -923,7 +927,7 @@ void Input::joy_axis(int p_device, JoyAxis p_axis, const JoyAxisValue &p_value)
joy_axis(p_device, p_axis, jx);
}
joy.last_axis[p_axis] = p_value.value;
joy.last_axis[(size_t)p_axis] = p_value.value;
float val = p_value.min == 0 ? -1.0f + 2.0f * p_value.value : p_value.value;
if (joy.mapping == -1) {
@ -935,32 +939,32 @@ void Input::joy_axis(int p_device, JoyAxis p_axis, const JoyAxisValue &p_value)
if (map.type == TYPE_BUTTON) {
bool pressed = map.value > 0.5;
if (pressed == joy_buttons_pressed.has(_combine_device(map.index, p_device))) {
if (pressed == joy_buttons_pressed.has(_combine_device((JoyButton)map.index, p_device))) {
// Button already pressed or released; so ignore.
return;
}
_button_event(p_device, (JoyButton)map.index, pressed);
// Ensure opposite D-Pad button is also released.
switch (map.index) {
case JOY_BUTTON_DPAD_UP:
if (joy_buttons_pressed.has(_combine_device(JOY_BUTTON_DPAD_DOWN, p_device))) {
_button_event(p_device, JOY_BUTTON_DPAD_DOWN, false);
switch ((JoyButton)map.index) {
case JoyButton::DPAD_UP:
if (joy_buttons_pressed.has(_combine_device(JoyButton::DPAD_DOWN, p_device))) {
_button_event(p_device, JoyButton::DPAD_DOWN, false);
}
break;
case JOY_BUTTON_DPAD_DOWN:
if (joy_buttons_pressed.has(_combine_device(JOY_BUTTON_DPAD_UP, p_device))) {
_button_event(p_device, JOY_BUTTON_DPAD_UP, false);
case JoyButton::DPAD_DOWN:
if (joy_buttons_pressed.has(_combine_device(JoyButton::DPAD_UP, p_device))) {
_button_event(p_device, JoyButton::DPAD_UP, false);
}
break;
case JOY_BUTTON_DPAD_LEFT:
if (joy_buttons_pressed.has(_combine_device(JOY_BUTTON_DPAD_RIGHT, p_device))) {
_button_event(p_device, JOY_BUTTON_DPAD_RIGHT, false);
case JoyButton::DPAD_LEFT:
if (joy_buttons_pressed.has(_combine_device(JoyButton::DPAD_RIGHT, p_device))) {
_button_event(p_device, JoyButton::DPAD_RIGHT, false);
}
break;
case JOY_BUTTON_DPAD_RIGHT:
if (joy_buttons_pressed.has(_combine_device(JOY_BUTTON_DPAD_LEFT, p_device))) {
_button_event(p_device, JOY_BUTTON_DPAD_LEFT, false);
case JoyButton::DPAD_RIGHT:
if (joy_buttons_pressed.has(_combine_device(JoyButton::DPAD_LEFT, p_device))) {
_button_event(p_device, JoyButton::DPAD_LEFT, false);
}
break;
default:
@ -977,27 +981,27 @@ void Input::joy_axis(int p_device, JoyAxis p_axis, const JoyAxisValue &p_value)
//printf("invalid mapping\n");
}
void Input::joy_hat(int p_device, int p_val) {
void Input::joy_hat(int p_device, HatMask p_val) {
_THREAD_SAFE_METHOD_;
const Joypad &joy = joy_names[p_device];
JoyEvent map[HAT_MAX];
JoyEvent map[(size_t)HatDir::MAX];
map[HatDir::HAT_UP].type = TYPE_BUTTON;
map[HatDir::HAT_UP].index = JOY_BUTTON_DPAD_UP;
map[HatDir::HAT_UP].value = 0;
map[(size_t)HatDir::UP].type = TYPE_BUTTON;
map[(size_t)HatDir::UP].index = (int)JoyButton::DPAD_UP;
map[(size_t)HatDir::UP].value = 0;
map[HatDir::HAT_RIGHT].type = TYPE_BUTTON;
map[HatDir::HAT_RIGHT].index = JOY_BUTTON_DPAD_RIGHT;
map[HatDir::HAT_RIGHT].value = 0;
map[(size_t)HatDir::RIGHT].type = TYPE_BUTTON;
map[(size_t)HatDir::RIGHT].index = (int)JoyButton::DPAD_RIGHT;
map[(size_t)HatDir::RIGHT].value = 0;
map[HatDir::HAT_DOWN].type = TYPE_BUTTON;
map[HatDir::HAT_DOWN].index = JOY_BUTTON_DPAD_DOWN;
map[HatDir::HAT_DOWN].value = 0;
map[(size_t)HatDir::DOWN].type = TYPE_BUTTON;
map[(size_t)HatDir::DOWN].index = (int)JoyButton::DPAD_DOWN;
map[(size_t)HatDir::DOWN].value = 0;
map[HatDir::HAT_LEFT].type = TYPE_BUTTON;
map[HatDir::HAT_LEFT].index = JOY_BUTTON_DPAD_LEFT;
map[HatDir::HAT_LEFT].value = 0;
map[(size_t)HatDir::LEFT].type = TYPE_BUTTON;
map[(size_t)HatDir::LEFT].index = (int)JoyButton::DPAD_LEFT;
map[(size_t)HatDir::LEFT].value = 0;
if (joy.mapping != -1) {
_get_mapped_hat_events(map_db[joy.mapping], (HatDir)0, map);
@ -1005,18 +1009,18 @@ void Input::joy_hat(int p_device, int p_val) {
int cur_val = joy_names[p_device].hat_current;
for (int hat_direction = 0, hat_mask = 1; hat_direction < HAT_MAX; hat_direction++, hat_mask <<= 1) {
if ((p_val & hat_mask) != (cur_val & hat_mask)) {
for (int hat_direction = 0, hat_mask = 1; hat_direction < (int)HatDir::MAX; hat_direction++, hat_mask <<= 1) {
if (((int)p_val & hat_mask) != (cur_val & hat_mask)) {
if (map[hat_direction].type == TYPE_BUTTON) {
_button_event(p_device, (JoyButton)map[hat_direction].index, p_val & hat_mask);
_button_event(p_device, (JoyButton)map[hat_direction].index, (int)p_val & hat_mask);
}
if (map[hat_direction].type == TYPE_AXIS) {
_axis_event(p_device, (JoyAxis)map[hat_direction].index, (p_val & hat_mask) ? map[hat_direction].value : 0.0);
_axis_event(p_device, (JoyAxis)map[hat_direction].index, ((int)p_val & hat_mask) ? map[hat_direction].value : 0.0);
}
}
}
joy_names[p_device].hat_current = p_val;
joy_names[p_device].hat_current = (int)p_val;
}
void Input::_button_event(int p_device, JoyButton p_index, bool p_pressed) {
@ -1049,10 +1053,10 @@ Input::JoyEvent Input::_get_mapped_button_event(const JoyDeviceMapping &mapping,
event.type = binding.outputType;
switch (binding.outputType) {
case TYPE_BUTTON:
event.index = binding.output.button;
event.index = (int)binding.output.button;
return event;
case TYPE_AXIS:
event.index = binding.output.axis.axis;
event.index = (int)binding.output.axis.axis;
switch (binding.output.axis.range) {
case POSITIVE_HALF_AXIS:
event.value = 1;
@ -1104,7 +1108,7 @@ Input::JoyEvent Input::_get_mapped_axis_event(const JoyDeviceMapping &mapping, J
}
switch (binding.outputType) {
case TYPE_BUTTON:
event.index = binding.output.button;
event.index = (int)binding.output.button;
switch (binding.input.axis.range) {
case POSITIVE_HALF_AXIS:
event.value = shifted_positive_value;
@ -1121,7 +1125,7 @@ Input::JoyEvent Input::_get_mapped_axis_event(const JoyDeviceMapping &mapping, J
}
return event;
case TYPE_AXIS:
event.index = binding.output.axis.axis;
event.index = (int)binding.output.axis.axis;
event.value = value;
if (binding.output.axis.range != binding.input.axis.range) {
switch (binding.output.axis.range) {
@ -1150,43 +1154,43 @@ void Input::_get_mapped_hat_events(const JoyDeviceMapping &mapping, HatDir p_hat
for (int i = 0; i < mapping.bindings.size(); i++) {
const JoyBinding binding = mapping.bindings[i];
if (binding.inputType == TYPE_HAT && binding.input.hat.hat == p_hat) {
int hat_direction;
HatDir hat_direction;
switch (binding.input.hat.hat_mask) {
case HatMask::HAT_MASK_UP:
hat_direction = HatDir::HAT_UP;
case HatMask::UP:
hat_direction = HatDir::UP;
break;
case HatMask::HAT_MASK_RIGHT:
hat_direction = HatDir::HAT_RIGHT;
case HatMask::RIGHT:
hat_direction = HatDir::RIGHT;
break;
case HatMask::HAT_MASK_DOWN:
hat_direction = HatDir::HAT_DOWN;
case HatMask::DOWN:
hat_direction = HatDir::DOWN;
break;
case HatMask::HAT_MASK_LEFT:
hat_direction = HatDir::HAT_LEFT;
case HatMask::LEFT:
hat_direction = HatDir::LEFT;
break;
default:
ERR_PRINT_ONCE("Joypad button mapping error.");
continue;
}
r_events[hat_direction].type = binding.outputType;
r_events[(size_t)hat_direction].type = binding.outputType;
switch (binding.outputType) {
case TYPE_BUTTON:
r_events[hat_direction].index = binding.output.button;
r_events[(size_t)hat_direction].index = (int)binding.output.button;
break;
case TYPE_AXIS:
r_events[hat_direction].index = binding.output.axis.axis;
r_events[(size_t)hat_direction].index = (int)binding.output.axis.axis;
switch (binding.output.axis.range) {
case POSITIVE_HALF_AXIS:
r_events[hat_direction].value = 1;
r_events[(size_t)hat_direction].value = 1;
break;
case NEGATIVE_HALF_AXIS:
r_events[hat_direction].value = -1;
r_events[(size_t)hat_direction].value = -1;
break;
case FULL_AXIS:
// It doesn't make sense for a hat direction to map to a full axis,
// but keeping as a default for a trigger with a positive half-axis.
r_events[hat_direction].value = 1;
r_events[(size_t)hat_direction].value = 1;
break;
}
break;
@ -1198,21 +1202,21 @@ void Input::_get_mapped_hat_events(const JoyDeviceMapping &mapping, HatDir p_hat
}
JoyButton Input::_get_output_button(String output) {
for (int i = 0; i < JOY_BUTTON_SDL_MAX; i++) {
for (int i = 0; i < (int)JoyButton::SDL_MAX; i++) {
if (output == _joy_buttons[i]) {
return JoyButton(i);
}
}
return JoyButton::JOY_BUTTON_INVALID;
return JoyButton::INVALID;
}
JoyAxis Input::_get_output_axis(String output) {
for (int i = 0; i < JOY_AXIS_SDL_MAX; i++) {
for (int i = 0; i < (int)JoyAxis::SDL_MAX; i++) {
if (output == _joy_axes[i]) {
return JoyAxis(i);
}
}
return JoyAxis::JOY_AXIS_INVALID;
return JoyAxis::INVALID;
}
void Input::parse_mapping(String p_mapping) {
@ -1273,16 +1277,16 @@ void Input::parse_mapping(String p_mapping) {
JoyButton output_button = _get_output_button(output);
JoyAxis output_axis = _get_output_axis(output);
ERR_CONTINUE_MSG(output_button == JOY_BUTTON_INVALID && output_axis == JOY_AXIS_INVALID,
ERR_CONTINUE_MSG(output_button == JoyButton::INVALID && output_axis == JoyAxis::INVALID,
vformat("Unrecognised output string \"%s\" in mapping:\n%s", output, p_mapping));
ERR_CONTINUE_MSG(output_button != JOY_BUTTON_INVALID && output_axis != JOY_AXIS_INVALID,
ERR_CONTINUE_MSG(output_button != JoyButton::INVALID && output_axis != JoyAxis::INVALID,
vformat("Output string \"%s\" matched both button and axis in mapping:\n%s", output, p_mapping));
JoyBinding binding;
if (output_button != JOY_BUTTON_INVALID) {
if (output_button != JoyButton::INVALID) {
binding.outputType = TYPE_BUTTON;
binding.output.button = output_button;
} else if (output_axis != JOY_AXIS_INVALID) {
} else if (output_axis != JoyAxis::INVALID) {
binding.outputType = TYPE_AXIS;
binding.output.axis.axis = output_axis;
binding.output.axis.range = output_range;

View file

@ -85,11 +85,11 @@ public:
typedef void (*EventDispatchFunc)(const Ref<InputEvent> &p_event);
private:
int mouse_button_mask = 0;
MouseButton mouse_button_mask = MouseButton::NONE;
Set<int> keys_pressed;
Set<int> joy_buttons_pressed;
Map<int, float> _joy_axis;
Set<Key> keys_pressed;
Set<JoyButton> joy_buttons_pressed;
Map<JoyAxis, float> _joy_axis;
//Map<StringName,int> custom_action_press;
Vector3 gravity;
Vector3 accelerometer;
@ -133,9 +133,9 @@ private:
StringName name;
StringName uid;
bool connected = false;
bool last_buttons[JOY_BUTTON_MAX] = { false };
float last_axis[JOY_AXIS_MAX] = { 0.0f };
int last_hat = HatMask::HAT_MASK_CENTER;
bool last_buttons[(size_t)JoyButton::MAX] = { false };
float last_axis[(size_t)JoyAxis::MAX] = { 0.0f };
HatMask last_hat = HatMask::CENTER;
int mapping = -1;
int hat_current = 0;
};
@ -162,7 +162,7 @@ private:
struct JoyEvent {
int type;
int index;
int index; // Can be either JoyAxis or JoyButton.
float value;
};
@ -206,7 +206,7 @@ private:
JoyEvent _get_mapped_button_event(const JoyDeviceMapping &mapping, JoyButton p_button);
JoyEvent _get_mapped_axis_event(const JoyDeviceMapping &mapping, JoyAxis p_axis, float p_value);
void _get_mapped_hat_events(const JoyDeviceMapping &mapping, HatDir p_hat, JoyEvent r_events[HAT_MAX]);
void _get_mapped_hat_events(const JoyDeviceMapping &mapping, HatDir p_hat, JoyEvent r_events[(size_t)HatDir::MAX]);
JoyButton _get_output_button(String output);
JoyAxis _get_output_axis(String output);
void _button_event(int p_device, JoyButton p_index, bool p_pressed);
@ -273,7 +273,7 @@ public:
Point2 get_mouse_position() const;
Point2 get_last_mouse_speed() const;
int get_mouse_button_mask() const;
MouseButton get_mouse_button_mask() const;
void warp_mouse_position(const Vector2 &p_to);
Point2i warp_mouse_motion(const Ref<InputEventMouseMotion> &p_motion, const Rect2 &p_rect);
@ -312,7 +312,7 @@ public:
void parse_mapping(String p_mapping);
void joy_button(int p_device, JoyButton p_button, bool p_pressed);
void joy_axis(int p_device, JoyAxis p_axis, const JoyAxisValue &p_value);
void joy_hat(int p_device, int p_val);
void joy_hat(int p_device, HatMask p_val);
void add_joy_mapping(String p_mapping, bool p_update_existing = false);
void remove_joy_mapping(String p_guid);

View file

@ -31,90 +31,106 @@
#ifndef INPUT_ENUMS_H
#define INPUT_ENUMS_H
enum HatDir {
HAT_UP = 0,
HAT_RIGHT = 1,
HAT_DOWN = 2,
HAT_LEFT = 3,
HAT_MAX = 4,
enum class HatDir {
UP = 0,
RIGHT = 1,
DOWN = 2,
LEFT = 3,
MAX = 4,
};
enum HatMask {
HAT_MASK_CENTER = 0,
HAT_MASK_UP = 1,
HAT_MASK_RIGHT = 2,
HAT_MASK_DOWN = 4,
HAT_MASK_LEFT = 8,
enum class HatMask {
CENTER = 0,
UP = 1,
RIGHT = 2,
DOWN = 4,
LEFT = 8,
};
enum JoyAxis {
JOY_AXIS_INVALID = -1,
JOY_AXIS_LEFT_X = 0,
JOY_AXIS_LEFT_Y = 1,
JOY_AXIS_RIGHT_X = 2,
JOY_AXIS_RIGHT_Y = 3,
JOY_AXIS_TRIGGER_LEFT = 4,
JOY_AXIS_TRIGGER_RIGHT = 5,
JOY_AXIS_SDL_MAX = 6,
JOY_AXIS_MAX = 10, // OpenVR supports up to 5 Joysticks making a total of 10 axes.
enum class JoyAxis {
INVALID = -1,
LEFT_X = 0,
LEFT_Y = 1,
RIGHT_X = 2,
RIGHT_Y = 3,
TRIGGER_LEFT = 4,
TRIGGER_RIGHT = 5,
SDL_MAX = 6,
MAX = 10, // OpenVR supports up to 5 Joysticks making a total of 10 axes.
};
enum JoyButton {
JOY_BUTTON_INVALID = -1,
JOY_BUTTON_A = 0,
JOY_BUTTON_B = 1,
JOY_BUTTON_X = 2,
JOY_BUTTON_Y = 3,
JOY_BUTTON_BACK = 4,
JOY_BUTTON_GUIDE = 5,
JOY_BUTTON_START = 6,
JOY_BUTTON_LEFT_STICK = 7,
JOY_BUTTON_RIGHT_STICK = 8,
JOY_BUTTON_LEFT_SHOULDER = 9,
JOY_BUTTON_RIGHT_SHOULDER = 10,
JOY_BUTTON_DPAD_UP = 11,
JOY_BUTTON_DPAD_DOWN = 12,
JOY_BUTTON_DPAD_LEFT = 13,
JOY_BUTTON_DPAD_RIGHT = 14,
JOY_BUTTON_MISC1 = 15,
JOY_BUTTON_PADDLE1 = 16,
JOY_BUTTON_PADDLE2 = 17,
JOY_BUTTON_PADDLE3 = 18,
JOY_BUTTON_PADDLE4 = 19,
JOY_BUTTON_TOUCHPAD = 20,
JOY_BUTTON_SDL_MAX = 21,
JOY_BUTTON_MAX = 36, // Android supports up to 36 buttons.
enum class JoyButton {
INVALID = -1,
A = 0,
B = 1,
X = 2,
Y = 3,
BACK = 4,
GUIDE = 5,
START = 6,
LEFT_STICK = 7,
RIGHT_STICK = 8,
LEFT_SHOULDER = 9,
RIGHT_SHOULDER = 10,
DPAD_UP = 11,
DPAD_DOWN = 12,
DPAD_LEFT = 13,
DPAD_RIGHT = 14,
MISC1 = 15,
PADDLE1 = 16,
PADDLE2 = 17,
PADDLE3 = 18,
PADDLE4 = 19,
TOUCHPAD = 20,
SDL_MAX = 21,
MAX = 36, // Android supports up to 36 buttons.
};
enum MIDIMessage {
MIDI_MESSAGE_NONE = 0,
MIDI_MESSAGE_NOTE_OFF = 0x8,
MIDI_MESSAGE_NOTE_ON = 0x9,
MIDI_MESSAGE_AFTERTOUCH = 0xA,
MIDI_MESSAGE_CONTROL_CHANGE = 0xB,
MIDI_MESSAGE_PROGRAM_CHANGE = 0xC,
MIDI_MESSAGE_CHANNEL_PRESSURE = 0xD,
MIDI_MESSAGE_PITCH_BEND = 0xE,
enum class MIDIMessage {
NONE = 0,
NOTE_OFF = 0x8,
NOTE_ON = 0x9,
AFTERTOUCH = 0xA,
CONTROL_CHANGE = 0xB,
PROGRAM_CHANGE = 0xC,
CHANNEL_PRESSURE = 0xD,
PITCH_BEND = 0xE,
};
enum MouseButton {
MOUSE_BUTTON_NONE = 0,
MOUSE_BUTTON_LEFT = 1,
MOUSE_BUTTON_RIGHT = 2,
MOUSE_BUTTON_MIDDLE = 3,
MOUSE_BUTTON_WHEEL_UP = 4,
MOUSE_BUTTON_WHEEL_DOWN = 5,
MOUSE_BUTTON_WHEEL_LEFT = 6,
MOUSE_BUTTON_WHEEL_RIGHT = 7,
MOUSE_BUTTON_XBUTTON1 = 8,
MOUSE_BUTTON_XBUTTON2 = 9,
MOUSE_BUTTON_MASK_LEFT = (1 << (MOUSE_BUTTON_LEFT - 1)),
MOUSE_BUTTON_MASK_RIGHT = (1 << (MOUSE_BUTTON_RIGHT - 1)),
MOUSE_BUTTON_MASK_MIDDLE = (1 << (MOUSE_BUTTON_MIDDLE - 1)),
MOUSE_BUTTON_MASK_XBUTTON1 = (1 << (MOUSE_BUTTON_XBUTTON1 - 1)),
MOUSE_BUTTON_MASK_XBUTTON2 = (1 << (MOUSE_BUTTON_XBUTTON2 - 1)),
enum class MouseButton {
NONE = 0,
LEFT = 1,
RIGHT = 2,
MIDDLE = 3,
WHEEL_UP = 4,
WHEEL_DOWN = 5,
WHEEL_LEFT = 6,
WHEEL_RIGHT = 7,
MB_XBUTTON1 = 8, // "XBUTTON1" is a reserved word on Windows.
MB_XBUTTON2 = 9, // "XBUTTON2" is a reserved word on Windows.
MASK_LEFT = (1 << (LEFT - 1)),
MASK_RIGHT = (1 << (RIGHT - 1)),
MASK_MIDDLE = (1 << (MIDDLE - 1)),
MASK_XBUTTON1 = (1 << (MB_XBUTTON1 - 1)),
MASK_XBUTTON2 = (1 << (MB_XBUTTON2 - 1)),
};
inline MouseButton mouse_button_to_mask(MouseButton button) {
return MouseButton(1 << ((int)button - 1));
}
inline MouseButton operator&(MouseButton a, MouseButton b) {
return (MouseButton)((int)a & (int)b);
}
inline MouseButton operator|(MouseButton a, MouseButton b) {
return (MouseButton)((int)a | (int)b);
}
inline MouseButton operator^(MouseButton a, MouseButton b) {
return (MouseButton)((int)a ^ (int)b);
}
inline MouseButton &operator|=(MouseButton &a, MouseButton b) {
return (MouseButton &)((int &)a |= (int)b);
}
@ -123,4 +139,28 @@ inline MouseButton &operator&=(MouseButton &a, MouseButton b) {
return (MouseButton &)((int &)a &= (int)b);
}
inline MouseButton operator~(MouseButton a) {
return (MouseButton)(~(int)a);
}
inline HatMask operator|(HatMask a, HatMask b) {
return (HatMask)((int)a | (int)b);
}
inline HatMask operator&(HatMask a, HatMask b) {
return (HatMask)((int)a & (int)b);
}
inline HatMask &operator&=(HatMask &a, HatMask b) {
return (HatMask &)((int &)a &= (int)b);
}
inline HatMask &operator|=(HatMask &a, HatMask b) {
return (HatMask &)((int &)a |= (int)b);
}
inline HatMask operator~(HatMask a) {
return (HatMask)(~(int)a);
}
#endif // INPUT_ENUMS_H

View file

@ -203,19 +203,19 @@ void InputEventWithModifiers::set_modifiers_from_event(const InputEventWithModif
set_meta_pressed(event->is_meta_pressed());
}
uint32_t InputEventWithModifiers::get_modifiers_mask() const {
uint32_t mask = 0;
Key InputEventWithModifiers::get_modifiers_mask() const {
Key mask = Key::NONE;
if (is_ctrl_pressed()) {
mask |= KEY_MASK_CTRL;
mask |= KeyModifierMask::CTRL;
}
if (is_shift_pressed()) {
mask |= KEY_MASK_SHIFT;
mask |= KeyModifierMask::SHIFT;
}
if (is_alt_pressed()) {
mask |= KEY_MASK_ALT;
mask |= KeyModifierMask::ALT;
}
if (is_meta_pressed()) {
mask |= KEY_MASK_META;
mask |= KeyModifierMask::META;
}
return mask;
}
@ -224,16 +224,16 @@ String InputEventWithModifiers::as_text() const {
Vector<String> mod_names;
if (is_ctrl_pressed()) {
mod_names.push_back(find_keycode_name(KEY_CTRL));
mod_names.push_back(find_keycode_name(Key::CTRL));
}
if (is_shift_pressed()) {
mod_names.push_back(find_keycode_name(KEY_SHIFT));
mod_names.push_back(find_keycode_name(Key::SHIFT));
}
if (is_alt_pressed()) {
mod_names.push_back(find_keycode_name(KEY_ALT));
mod_names.push_back(find_keycode_name(Key::ALT));
}
if (is_meta_pressed()) {
mod_names.push_back(find_keycode_name(KEY_META));
mod_names.push_back(find_keycode_name(Key::META));
}
if (!mod_names.is_empty()) {
@ -325,12 +325,12 @@ Key InputEventKey::get_physical_keycode() const {
return physical_keycode;
}
void InputEventKey::set_unicode(uint32_t p_unicode) {
void InputEventKey::set_unicode(char32_t p_unicode) {
unicode = p_unicode;
emit_changed();
}
uint32_t InputEventKey::get_unicode() const {
char32_t InputEventKey::get_unicode() const {
return unicode;
}
@ -343,18 +343,18 @@ bool InputEventKey::is_echo() const {
return echo;
}
uint32_t InputEventKey::get_keycode_with_modifiers() const {
Key InputEventKey::get_keycode_with_modifiers() const {
return keycode | get_modifiers_mask();
}
uint32_t InputEventKey::get_physical_keycode_with_modifiers() const {
Key InputEventKey::get_physical_keycode_with_modifiers() const {
return physical_keycode | get_modifiers_mask();
}
String InputEventKey::as_text() const {
String kc;
if (keycode == 0) {
if (keycode == Key::NONE) {
kc = keycode_get_string(physical_keycode) + " (" + RTR("Physical") + ")";
} else {
kc = keycode_get_string(keycode);
@ -374,11 +374,11 @@ String InputEventKey::to_string() {
String kc = "";
String physical = "false";
if (keycode == 0) {
kc = itos(physical_keycode) + " (" + keycode_get_string(physical_keycode) + ")";
if (keycode == Key::NONE) {
kc = itos((int64_t)physical_keycode) + " (" + keycode_get_string(physical_keycode) + ")";
physical = "true";
} else {
kc = itos(keycode) + " (" + keycode_get_string(keycode) + ")";
kc = itos((int64_t)keycode) + " (" + keycode_get_string(keycode) + ")";
}
String mods = InputEventWithModifiers::as_text();
@ -390,22 +390,22 @@ String InputEventKey::to_string() {
Ref<InputEventKey> InputEventKey::create_reference(Key p_keycode) {
Ref<InputEventKey> ie;
ie.instantiate();
ie->set_keycode(p_keycode & KEY_CODE_MASK);
ie->set_unicode(p_keycode & KEY_CODE_MASK);
ie->set_keycode(p_keycode & KeyModifierMask::CODE_MASK);
ie->set_unicode(char32_t(p_keycode & KeyModifierMask::CODE_MASK));
if (p_keycode & KEY_MASK_SHIFT) {
if ((p_keycode & KeyModifierMask::SHIFT) != Key::NONE) {
ie->set_shift_pressed(true);
}
if (p_keycode & KEY_MASK_ALT) {
if ((p_keycode & KeyModifierMask::ALT) != Key::NONE) {
ie->set_alt_pressed(true);
}
if (p_keycode & KEY_MASK_CTRL) {
if ((p_keycode & KeyModifierMask::CTRL) != Key::NONE) {
ie->set_ctrl_pressed(true);
}
if (p_keycode & KEY_MASK_CMD) {
if ((p_keycode & KeyModifierMask::CMD) != Key::NONE) {
ie->set_command_pressed(true);
}
if (p_keycode & KEY_MASK_META) {
if ((p_keycode & KeyModifierMask::META) != Key::NONE) {
ie->set_meta_pressed(true);
}
@ -419,14 +419,14 @@ bool InputEventKey::action_match(const Ref<InputEvent> &p_event, bool *p_pressed
}
bool match = false;
if (get_keycode() == 0) {
uint32_t code = get_physical_keycode_with_modifiers();
uint32_t event_code = key->get_physical_keycode_with_modifiers();
if (get_keycode() == Key::NONE) {
Key code = get_physical_keycode_with_modifiers();
Key event_code = key->get_physical_keycode_with_modifiers();
match = get_physical_keycode() == key->get_physical_keycode() && (!key->is_pressed() || (code & event_code) == code);
} else {
uint32_t code = get_keycode_with_modifiers();
uint32_t event_code = key->get_keycode_with_modifiers();
Key code = get_keycode_with_modifiers();
Key event_code = key->get_keycode_with_modifiers();
match = get_keycode() == key->get_keycode() && (!key->is_pressed() || (code & event_code) == code);
}
@ -452,7 +452,7 @@ bool InputEventKey::is_match(const Ref<InputEvent> &p_event, bool p_exact_match)
return false;
}
if (keycode == 0) {
if (keycode == Key::NONE) {
return physical_keycode == key->physical_keycode &&
(!p_exact_match || get_modifiers_mask() == key->get_modifiers_mask());
} else {
@ -487,12 +487,12 @@ void InputEventKey::_bind_methods() {
///////////////////////////////////
void InputEventMouse::set_button_mask(int p_mask) {
void InputEventMouse::set_button_mask(MouseButton p_mask) {
button_mask = p_mask;
emit_changed();
}
int InputEventMouse::get_button_mask() const {
MouseButton InputEventMouse::get_button_mask() const {
return button_mask;
}
@ -637,21 +637,21 @@ String InputEventMouseButton::as_text() const {
String full_string = mods_text == "" ? "" : mods_text + "+";
// Button
int idx = get_button_index();
MouseButton idx = get_button_index();
switch (idx) {
case MOUSE_BUTTON_LEFT:
case MOUSE_BUTTON_RIGHT:
case MOUSE_BUTTON_MIDDLE:
case MOUSE_BUTTON_WHEEL_UP:
case MOUSE_BUTTON_WHEEL_DOWN:
case MOUSE_BUTTON_WHEEL_LEFT:
case MOUSE_BUTTON_WHEEL_RIGHT:
case MOUSE_BUTTON_XBUTTON1:
case MOUSE_BUTTON_XBUTTON2:
full_string += RTR(_mouse_button_descriptions[idx - 1]); // button index starts from 1, array index starts from 0, so subtract 1
case MouseButton::LEFT:
case MouseButton::RIGHT:
case MouseButton::MIDDLE:
case MouseButton::WHEEL_UP:
case MouseButton::WHEEL_DOWN:
case MouseButton::WHEEL_LEFT:
case MouseButton::WHEEL_RIGHT:
case MouseButton::MB_XBUTTON1:
case MouseButton::MB_XBUTTON2:
full_string += RTR(_mouse_button_descriptions[(size_t)idx - 1]); // button index starts from 1, array index starts from 0, so subtract 1
break;
default:
full_string += RTR("Button") + " #" + itos(idx);
full_string += RTR("Button") + " #" + itos((int64_t)idx);
break;
}
@ -667,20 +667,20 @@ String InputEventMouseButton::to_string() {
String p = is_pressed() ? "true" : "false";
String d = double_click ? "true" : "false";
int idx = get_button_index();
String button_string = itos(idx);
MouseButton idx = get_button_index();
String button_string = itos((int64_t)idx);
switch (idx) {
case MOUSE_BUTTON_LEFT:
case MOUSE_BUTTON_RIGHT:
case MOUSE_BUTTON_MIDDLE:
case MOUSE_BUTTON_WHEEL_UP:
case MOUSE_BUTTON_WHEEL_DOWN:
case MOUSE_BUTTON_WHEEL_LEFT:
case MOUSE_BUTTON_WHEEL_RIGHT:
case MOUSE_BUTTON_XBUTTON1:
case MOUSE_BUTTON_XBUTTON2:
button_string += " (" + RTR(_mouse_button_descriptions[idx - 1]) + ")"; // button index starts from 1, array index starts from 0, so subtract 1
case MouseButton::LEFT:
case MouseButton::RIGHT:
case MouseButton::MIDDLE:
case MouseButton::WHEEL_UP:
case MouseButton::WHEEL_DOWN:
case MouseButton::WHEEL_LEFT:
case MouseButton::WHEEL_RIGHT:
case MouseButton::MB_XBUTTON1:
case MouseButton::MB_XBUTTON2:
button_string += " (" + RTR(_mouse_button_descriptions[(size_t)idx - 1]) + ")"; // button index starts from 1, array index starts from 0, so subtract 1
break;
default:
break;
@ -778,23 +778,23 @@ String InputEventMouseMotion::as_text() const {
}
String InputEventMouseMotion::to_string() {
int button_mask = get_button_mask();
String button_mask_string = itos(button_mask);
switch (get_button_mask()) {
case MOUSE_BUTTON_MASK_LEFT:
button_mask_string += " (" + RTR(_mouse_button_descriptions[MOUSE_BUTTON_LEFT - 1]) + ")";
MouseButton button_mask = get_button_mask();
String button_mask_string = itos((int64_t)button_mask);
switch (button_mask) {
case MouseButton::MASK_LEFT:
button_mask_string += " (" + RTR(_mouse_button_descriptions[(size_t)MouseButton::LEFT - 1]) + ")";
break;
case MOUSE_BUTTON_MASK_MIDDLE:
button_mask_string += " (" + RTR(_mouse_button_descriptions[MOUSE_BUTTON_MIDDLE - 1]) + ")";
case MouseButton::MASK_MIDDLE:
button_mask_string += " (" + RTR(_mouse_button_descriptions[(size_t)MouseButton::MIDDLE - 1]) + ")";
break;
case MOUSE_BUTTON_MASK_RIGHT:
button_mask_string += " (" + RTR(_mouse_button_descriptions[MOUSE_BUTTON_RIGHT - 1]) + ")";
case MouseButton::MASK_RIGHT:
button_mask_string += " (" + RTR(_mouse_button_descriptions[(size_t)MouseButton::RIGHT - 1]) + ")";
break;
case MOUSE_BUTTON_MASK_XBUTTON1:
button_mask_string += " (" + RTR(_mouse_button_descriptions[MOUSE_BUTTON_XBUTTON1 - 1]) + ")";
case MouseButton::MASK_XBUTTON1:
button_mask_string += " (" + RTR(_mouse_button_descriptions[(size_t)MouseButton::MB_XBUTTON1 - 1]) + ")";
break;
case MOUSE_BUTTON_MASK_XBUTTON2:
button_mask_string += " (" + RTR(_mouse_button_descriptions[MOUSE_BUTTON_XBUTTON2 - 1]) + ")";
case MouseButton::MASK_XBUTTON2:
button_mask_string += " (" + RTR(_mouse_button_descriptions[(size_t)MouseButton::MB_XBUTTON2 - 1]) + ")";
break;
default:
break;
@ -869,7 +869,7 @@ void InputEventMouseMotion::_bind_methods() {
///////////////////////////////////
void InputEventJoypadMotion::set_axis(JoyAxis p_axis) {
ERR_FAIL_INDEX(p_axis, JOY_AXIS_MAX);
ERR_FAIL_COND(p_axis < JoyAxis::LEFT_X || p_axis > JoyAxis::MAX);
axis = p_axis;
emit_changed();
@ -938,7 +938,7 @@ bool InputEventJoypadMotion::is_match(const Ref<InputEvent> &p_event, bool p_exa
(!p_exact_match || ((axis_value < 0) == (jm->axis_value < 0)));
}
static const char *_joy_axis_descriptions[JOY_AXIS_MAX] = {
static const char *_joy_axis_descriptions[(size_t)JoyAxis::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"),
@ -952,7 +952,7 @@ static const char *_joy_axis_descriptions[JOY_AXIS_MAX] = {
};
String InputEventJoypadMotion::as_text() const {
String desc = axis < JOY_AXIS_MAX ? RTR(_joy_axis_descriptions[axis]) : TTR("Unknown Joypad Axis");
String desc = axis < JoyAxis::MAX ? RTR(_joy_axis_descriptions[(size_t)axis]) : TTR("Unknown Joypad Axis");
return vformat(TTR("Joypad Motion on Axis %d (%s) with Value %.2f"), axis, desc, axis_value);
}
@ -1032,7 +1032,7 @@ bool InputEventJoypadButton::is_match(const Ref<InputEvent> &p_event, bool p_exa
return button_index == button->button_index;
}
static const char *_joy_button_descriptions[JOY_BUTTON_SDL_MAX] = {
static const char *_joy_button_descriptions[(size_t)JoyButton::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"),
@ -1057,10 +1057,10 @@ static const char *_joy_button_descriptions[JOY_BUTTON_SDL_MAX] = {
};
String InputEventJoypadButton::as_text() const {
String text = "Joypad Button " + itos(button_index);
String text = "Joypad Button " + itos((int64_t)button_index);
if (button_index >= 0 && button_index < JOY_BUTTON_SDL_MAX) {
text += vformat(" (%s)", _joy_button_descriptions[button_index]);
if (button_index > JoyButton::INVALID && button_index < JoyButton::SDL_MAX) {
text += vformat(" (%s)", _joy_button_descriptions[(size_t)button_index]);
}
if (pressure != 0) {
@ -1506,7 +1506,7 @@ int InputEventMIDI::get_controller_value() const {
}
String InputEventMIDI::as_text() const {
return vformat(RTR("MIDI Input on Channel=%s Message=%s"), itos(channel), itos(message));
return vformat(RTR("MIDI Input on Channel=%s Message=%s"), itos(channel), itos((int64_t)message));
}
String InputEventMIDI::to_string() {

View file

@ -151,7 +151,7 @@ public:
void set_modifiers_from_event(const InputEventWithModifiers *event);
uint32_t get_modifiers_mask() const;
Key get_modifiers_mask() const;
virtual String as_text() const override;
virtual String to_string() override;
@ -164,8 +164,8 @@ class InputEventKey : public InputEventWithModifiers {
bool pressed = false; /// otherwise release
Key keycode = KEY_NONE; // Key enum, without modifier masks.
Key physical_keycode = KEY_NONE;
Key keycode = Key::NONE; // Key enum, without modifier masks.
Key physical_keycode = Key::NONE;
uint32_t unicode = 0; ///unicode
bool echo = false; /// true if this is an echo key
@ -183,14 +183,14 @@ public:
void set_physical_keycode(Key p_keycode);
Key get_physical_keycode() const;
void set_unicode(uint32_t p_unicode);
uint32_t get_unicode() const;
void set_unicode(char32_t p_unicode);
char32_t get_unicode() const;
void set_echo(bool p_enable);
virtual bool is_echo() const override;
uint32_t get_keycode_with_modifiers() const;
uint32_t get_physical_keycode_with_modifiers() const;
Key get_keycode_with_modifiers() const;
Key get_physical_keycode_with_modifiers() const;
virtual bool action_match(const Ref<InputEvent> &p_event, bool *p_pressed, float *p_strength, float *p_raw_strength, float p_deadzone) const override;
virtual bool is_match(const Ref<InputEvent> &p_event, bool p_exact_match = true) const override;
@ -208,7 +208,7 @@ public:
class InputEventMouse : public InputEventWithModifiers {
GDCLASS(InputEventMouse, InputEventWithModifiers);
int button_mask = 0;
MouseButton button_mask = MouseButton::NONE;
Vector2 pos;
Vector2 global_pos;
@ -217,8 +217,8 @@ protected:
static void _bind_methods();
public:
void set_button_mask(int p_mask);
int get_button_mask() const;
void set_button_mask(MouseButton p_mask);
MouseButton get_button_mask() const;
void set_position(const Vector2 &p_pos);
Vector2 get_position() const;
@ -233,7 +233,7 @@ class InputEventMouseButton : public InputEventMouse {
GDCLASS(InputEventMouseButton, InputEventMouse);
float factor = 1;
MouseButton button_index = MOUSE_BUTTON_NONE;
MouseButton button_index = MouseButton::NONE;
bool pressed = false; //otherwise released
bool double_click = false; //last even less than double click time
@ -501,7 +501,7 @@ class InputEventMIDI : public InputEvent {
GDCLASS(InputEventMIDI, InputEvent);
int channel = 0;
MIDIMessage message = MIDI_MESSAGE_NONE;
MIDIMessage message = MIDIMessage::NONE;
int pitch = 0;
int velocity = 0;
int instrument = 0;

View file

@ -381,320 +381,320 @@ const OrderedHashMap<String, List<Ref<InputEvent>>> &InputMap::get_builtins() {
}
List<Ref<InputEvent>> inputs;
inputs.push_back(InputEventKey::create_reference(KEY_ENTER));
inputs.push_back(InputEventKey::create_reference(KEY_KP_ENTER));
inputs.push_back(InputEventKey::create_reference(KEY_SPACE));
inputs.push_back(InputEventKey::create_reference(Key::ENTER));
inputs.push_back(InputEventKey::create_reference(Key::KP_ENTER));
inputs.push_back(InputEventKey::create_reference(Key::SPACE));
default_builtin_cache.insert("ui_accept", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventJoypadButton::create_reference(JOY_BUTTON_Y));
inputs.push_back(InputEventKey::create_reference(KEY_SPACE));
inputs.push_back(InputEventJoypadButton::create_reference(JoyButton::Y));
inputs.push_back(InputEventKey::create_reference(Key::SPACE));
default_builtin_cache.insert("ui_select", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_ESCAPE));
inputs.push_back(InputEventKey::create_reference(Key::ESCAPE));
default_builtin_cache.insert("ui_cancel", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_TAB));
inputs.push_back(InputEventKey::create_reference(Key::TAB));
default_builtin_cache.insert("ui_focus_next", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_TAB | KEY_MASK_SHIFT));
inputs.push_back(InputEventKey::create_reference(Key::TAB | KeyModifierMask::SHIFT));
default_builtin_cache.insert("ui_focus_prev", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_LEFT));
inputs.push_back(InputEventJoypadButton::create_reference(JOY_BUTTON_DPAD_LEFT));
inputs.push_back(InputEventKey::create_reference(Key::LEFT));
inputs.push_back(InputEventJoypadButton::create_reference(JoyButton::DPAD_LEFT));
default_builtin_cache.insert("ui_left", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_RIGHT));
inputs.push_back(InputEventJoypadButton::create_reference(JOY_BUTTON_DPAD_RIGHT));
inputs.push_back(InputEventKey::create_reference(Key::RIGHT));
inputs.push_back(InputEventJoypadButton::create_reference(JoyButton::DPAD_RIGHT));
default_builtin_cache.insert("ui_right", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_UP));
inputs.push_back(InputEventJoypadButton::create_reference(JOY_BUTTON_DPAD_UP));
inputs.push_back(InputEventKey::create_reference(Key::UP));
inputs.push_back(InputEventJoypadButton::create_reference(JoyButton::DPAD_UP));
default_builtin_cache.insert("ui_up", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_DOWN));
inputs.push_back(InputEventJoypadButton::create_reference(JOY_BUTTON_DPAD_DOWN));
inputs.push_back(InputEventKey::create_reference(Key::DOWN));
inputs.push_back(InputEventJoypadButton::create_reference(JoyButton::DPAD_DOWN));
default_builtin_cache.insert("ui_down", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_PAGEUP));
inputs.push_back(InputEventKey::create_reference(Key::PAGEUP));
default_builtin_cache.insert("ui_page_up", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_PAGEDOWN));
inputs.push_back(InputEventKey::create_reference(Key::PAGEDOWN));
default_builtin_cache.insert("ui_page_down", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_HOME));
inputs.push_back(InputEventKey::create_reference(Key::HOME));
default_builtin_cache.insert("ui_home", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_END));
inputs.push_back(InputEventKey::create_reference(Key::END));
default_builtin_cache.insert("ui_end", inputs);
// ///// UI basic Shortcuts /////
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_X | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(KEY_DELETE | KEY_MASK_SHIFT));
inputs.push_back(InputEventKey::create_reference(Key::X | KeyModifierMask::CMD));
inputs.push_back(InputEventKey::create_reference(Key::KEY_DELETE | KeyModifierMask::SHIFT));
default_builtin_cache.insert("ui_cut", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_C | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(KEY_INSERT | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::C | KeyModifierMask::CMD));
inputs.push_back(InputEventKey::create_reference(Key::INSERT | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_copy", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_V | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(KEY_INSERT | KEY_MASK_SHIFT));
inputs.push_back(InputEventKey::create_reference(Key::V | KeyModifierMask::CMD));
inputs.push_back(InputEventKey::create_reference(Key::INSERT | KeyModifierMask::SHIFT));
default_builtin_cache.insert("ui_paste", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_Z | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::Z | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_undo", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_Z | KEY_MASK_CMD | KEY_MASK_SHIFT));
inputs.push_back(InputEventKey::create_reference(KEY_Y | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::Z | KeyModifierMask::CMD | KeyModifierMask::SHIFT));
inputs.push_back(InputEventKey::create_reference(Key::Y | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_redo", inputs);
// ///// UI Text Input Shortcuts /////
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_SPACE | KEY_MASK_CTRL));
inputs.push_back(InputEventKey::create_reference(Key::SPACE | KeyModifierMask::CTRL));
default_builtin_cache.insert("ui_text_completion_query", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_ENTER));
inputs.push_back(InputEventKey::create_reference(KEY_KP_ENTER));
inputs.push_back(InputEventKey::create_reference(Key::ENTER));
inputs.push_back(InputEventKey::create_reference(Key::KP_ENTER));
default_builtin_cache.insert("ui_text_completion_accept", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_TAB));
inputs.push_back(InputEventKey::create_reference(Key::TAB));
default_builtin_cache.insert("ui_text_completion_replace", inputs);
// Newlines
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_ENTER));
inputs.push_back(InputEventKey::create_reference(KEY_KP_ENTER));
inputs.push_back(InputEventKey::create_reference(Key::ENTER));
inputs.push_back(InputEventKey::create_reference(Key::KP_ENTER));
default_builtin_cache.insert("ui_text_newline", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_ENTER | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(KEY_KP_ENTER | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::ENTER | KeyModifierMask::CMD));
inputs.push_back(InputEventKey::create_reference(Key::KP_ENTER | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_text_newline_blank", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_ENTER | KEY_MASK_SHIFT | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(KEY_KP_ENTER | KEY_MASK_SHIFT | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::ENTER | KeyModifierMask::SHIFT | KeyModifierMask::CMD));
inputs.push_back(InputEventKey::create_reference(Key::KP_ENTER | KeyModifierMask::SHIFT | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_text_newline_above", inputs);
// Indentation
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_TAB));
inputs.push_back(InputEventKey::create_reference(Key::TAB));
default_builtin_cache.insert("ui_text_indent", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_TAB | KEY_MASK_SHIFT));
inputs.push_back(InputEventKey::create_reference(Key::TAB | KeyModifierMask::SHIFT));
default_builtin_cache.insert("ui_text_dedent", inputs);
// Text Backspace and Delete
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_BACKSPACE));
inputs.push_back(InputEventKey::create_reference(KEY_BACKSPACE | KEY_MASK_SHIFT));
inputs.push_back(InputEventKey::create_reference(Key::BACKSPACE));
inputs.push_back(InputEventKey::create_reference(Key::BACKSPACE | KeyModifierMask::SHIFT));
default_builtin_cache.insert("ui_text_backspace", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_BACKSPACE | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::BACKSPACE | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_text_backspace_word", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_BACKSPACE | KEY_MASK_ALT));
inputs.push_back(InputEventKey::create_reference(Key::BACKSPACE | KeyModifierMask::ALT));
default_builtin_cache.insert("ui_text_backspace_word.macos", inputs);
inputs = List<Ref<InputEvent>>();
default_builtin_cache.insert("ui_text_backspace_all_to_left", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_BACKSPACE | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::BACKSPACE | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_text_backspace_all_to_left.macos", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_DELETE));
inputs.push_back(InputEventKey::create_reference(Key::KEY_DELETE));
default_builtin_cache.insert("ui_text_delete", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_DELETE | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::KEY_DELETE | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_text_delete_word", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_DELETE | KEY_MASK_ALT));
inputs.push_back(InputEventKey::create_reference(Key::KEY_DELETE | KeyModifierMask::ALT));
default_builtin_cache.insert("ui_text_delete_word.macos", inputs);
inputs = List<Ref<InputEvent>>();
default_builtin_cache.insert("ui_text_delete_all_to_right", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_DELETE | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::KEY_DELETE | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_text_delete_all_to_right.macos", inputs);
// Text Caret Movement Left/Right
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_LEFT));
inputs.push_back(InputEventKey::create_reference(Key::LEFT));
default_builtin_cache.insert("ui_text_caret_left", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_LEFT | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::LEFT | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_text_caret_word_left", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_LEFT | KEY_MASK_ALT));
inputs.push_back(InputEventKey::create_reference(Key::LEFT | KeyModifierMask::ALT));
default_builtin_cache.insert("ui_text_caret_word_left.macos", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_RIGHT));
inputs.push_back(InputEventKey::create_reference(Key::RIGHT));
default_builtin_cache.insert("ui_text_caret_right", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_RIGHT | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::RIGHT | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_text_caret_word_right", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_RIGHT | KEY_MASK_ALT));
inputs.push_back(InputEventKey::create_reference(Key::RIGHT | KeyModifierMask::ALT));
default_builtin_cache.insert("ui_text_caret_word_right.macos", inputs);
// Text Caret Movement Up/Down
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_UP));
inputs.push_back(InputEventKey::create_reference(Key::UP));
default_builtin_cache.insert("ui_text_caret_up", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_DOWN));
inputs.push_back(InputEventKey::create_reference(Key::DOWN));
default_builtin_cache.insert("ui_text_caret_down", inputs);
// Text Caret Movement Line Start/End
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_HOME));
inputs.push_back(InputEventKey::create_reference(Key::HOME));
default_builtin_cache.insert("ui_text_caret_line_start", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_A | KEY_MASK_CTRL));
inputs.push_back(InputEventKey::create_reference(KEY_LEFT | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::A | KeyModifierMask::CTRL));
inputs.push_back(InputEventKey::create_reference(Key::LEFT | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_text_caret_line_start.macos", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_END));
inputs.push_back(InputEventKey::create_reference(Key::END));
default_builtin_cache.insert("ui_text_caret_line_end", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_E | KEY_MASK_CTRL));
inputs.push_back(InputEventKey::create_reference(KEY_RIGHT | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::E | KeyModifierMask::CTRL));
inputs.push_back(InputEventKey::create_reference(Key::RIGHT | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_text_caret_line_end.macos", inputs);
// Text Caret Movement Page Up/Down
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_PAGEUP));
inputs.push_back(InputEventKey::create_reference(Key::PAGEUP));
default_builtin_cache.insert("ui_text_caret_page_up", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_PAGEDOWN));
inputs.push_back(InputEventKey::create_reference(Key::PAGEDOWN));
default_builtin_cache.insert("ui_text_caret_page_down", inputs);
// Text Caret Movement Document Start/End
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_HOME | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::HOME | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_text_caret_document_start", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_UP | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::UP | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_text_caret_document_start.macos", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_END | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::END | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_text_caret_document_end", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_DOWN | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::DOWN | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_text_caret_document_end.macos", inputs);
// Text Scrolling
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_UP | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::UP | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_text_scroll_up", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_UP | KEY_MASK_CMD | KEY_MASK_ALT));
inputs.push_back(InputEventKey::create_reference(Key::UP | KeyModifierMask::CMD | KeyModifierMask::ALT));
default_builtin_cache.insert("ui_text_scroll_up.macos", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_DOWN | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::DOWN | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_text_scroll_down", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_DOWN | KEY_MASK_CMD | KEY_MASK_ALT));
inputs.push_back(InputEventKey::create_reference(Key::DOWN | KeyModifierMask::CMD | KeyModifierMask::ALT));
default_builtin_cache.insert("ui_text_scroll_down.macos", inputs);
// Text Misc
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_A | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::A | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_text_select_all", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_D | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::D | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_text_select_word_under_caret", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_INSERT));
inputs.push_back(InputEventKey::create_reference(Key::INSERT));
default_builtin_cache.insert("ui_text_toggle_insert_mode", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_MENU));
inputs.push_back(InputEventKey::create_reference(Key::MENU));
default_builtin_cache.insert("ui_menu", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_ENTER));
inputs.push_back(InputEventKey::create_reference(KEY_KP_ENTER));
inputs.push_back(InputEventKey::create_reference(Key::ENTER));
inputs.push_back(InputEventKey::create_reference(Key::KP_ENTER));
default_builtin_cache.insert("ui_text_submit", inputs);
// ///// UI Graph Shortcuts /////
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_D | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::D | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_graph_duplicate", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_DELETE));
inputs.push_back(InputEventKey::create_reference(Key::KEY_DELETE));
default_builtin_cache.insert("ui_graph_delete", inputs);
// ///// UI File Dialog Shortcuts /////
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_BACKSPACE));
inputs.push_back(InputEventKey::create_reference(Key::BACKSPACE));
default_builtin_cache.insert("ui_filedialog_up_one_level", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_F5));
inputs.push_back(InputEventKey::create_reference(Key::F5));
default_builtin_cache.insert("ui_filedialog_refresh", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_H));
inputs.push_back(InputEventKey::create_reference(Key::H));
default_builtin_cache.insert("ui_filedialog_show_hidden", inputs);
inputs = List<Ref<InputEvent>>();
inputs.push_back(InputEventKey::create_reference(KEY_QUOTELEFT | KEY_MASK_CMD));
inputs.push_back(InputEventKey::create_reference(Key::QUOTELEFT | KeyModifierMask::CMD));
default_builtin_cache.insert("ui_swap_input_direction", inputs);
return default_builtin_cache;

View file

@ -85,8 +85,7 @@ String HTTPClient::query_string_from_dict(const Dictionary &p_dict) {
}
}
}
query.erase(0, 1);
return query;
return query.substr(1);
}
Dictionary HTTPClient::_get_response_headers_as_dictionary() {

View file

@ -107,6 +107,39 @@ uint64_t Color::to_rgba64() const {
return c;
}
String _to_hex(float p_val) {
int v = Math::round(p_val * 255);
v = CLAMP(v, 0, 255);
String ret;
for (int i = 0; i < 2; i++) {
char32_t c[2] = { 0, 0 };
int lv = v & 0xF;
if (lv < 10) {
c[0] = '0' + lv;
} else {
c[0] = 'a' + lv - 10;
}
v >>= 4;
String cs = (const char32_t *)c;
ret = cs + ret;
}
return ret;
}
String Color::to_html(bool p_alpha) const {
String txt;
txt += _to_hex(r);
txt += _to_hex(g);
txt += _to_hex(b);
if (p_alpha) {
txt += _to_hex(a);
}
return txt;
}
float Color::get_h() const {
float min = MIN(r, g);
min = MIN(min, b);
@ -249,20 +282,6 @@ Color Color::hex64(uint64_t p_hex) {
return Color(r, g, b, a);
}
Color Color::from_rgbe9995(uint32_t p_rgbe) {
float r = p_rgbe & 0x1ff;
float g = (p_rgbe >> 9) & 0x1ff;
float b = (p_rgbe >> 18) & 0x1ff;
float e = (p_rgbe >> 27);
float m = Math::pow(2, e - 15.0 - 9.0);
float rd = r * m;
float gd = g * m;
float bd = b * m;
return Color(rd, gd, bd, 1.0f);
}
static int _parse_col4(const String &p_str, int p_ofs) {
char character = p_str[p_ofs];
@ -428,45 +447,26 @@ Color Color::from_string(const String &p_string, const Color &p_default) {
}
}
String _to_hex(float p_val) {
int v = Math::round(p_val * 255);
v = CLAMP(v, 0, 255);
String ret;
for (int i = 0; i < 2; i++) {
char32_t c[2] = { 0, 0 };
int lv = v & 0xF;
if (lv < 10) {
c[0] = '0' + lv;
} else {
c[0] = 'a' + lv - 10;
}
v >>= 4;
String cs = (const char32_t *)c;
ret = cs + ret;
}
return ret;
}
String Color::to_html(bool p_alpha) const {
String txt;
txt += _to_hex(r);
txt += _to_hex(g);
txt += _to_hex(b);
if (p_alpha) {
txt += _to_hex(a);
}
return txt;
}
Color Color::from_hsv(float p_h, float p_s, float p_v, float p_a) const {
Color Color::from_hsv(float p_h, float p_s, float p_v, float p_alpha) {
Color c;
c.set_hsv(p_h, p_s, p_v, p_a);
c.set_hsv(p_h, p_s, p_v, p_alpha);
return c;
}
Color Color::from_rgbe9995(uint32_t p_rgbe) {
float r = p_rgbe & 0x1ff;
float g = (p_rgbe >> 9) & 0x1ff;
float b = (p_rgbe >> 18) & 0x1ff;
float e = (p_rgbe >> 27);
float m = Math::pow(2, e - 15.0 - 9.0);
float rd = r * m;
float gd = g * m;
float bd = b * m;
return Color(rd, gd, bd, 1.0f);
}
Color::operator String() const {
return "(" + String::num(r, 4) + ", " + String::num(g, 4) + ", " + String::num(b, 4) + ", " + String::num(a, 4) + ")";
}

View file

@ -51,6 +51,7 @@ struct Color {
uint64_t to_rgba64() const;
uint64_t to_argb64() const;
uint64_t to_abgr64() const;
String to_html(bool p_alpha = true) const;
float get_h() const;
float get_s() const;
float get_v() const;
@ -189,8 +190,7 @@ struct Color {
static String get_named_color_name(int p_idx);
static Color get_named_color(int p_idx);
static Color from_string(const String &p_string, const Color &p_default);
String to_html(bool p_alpha = true) const;
Color from_hsv(float p_h, float p_s, float p_v, float p_a) const;
static Color from_hsv(float p_h, float p_s, float p_v, float p_alpha = 1.0);
static Color from_rgbe9995(uint32_t p_rgbe);
_FORCE_INLINE_ bool operator<(const Color &p_color) const; //used in set keys

View file

@ -33,400 +33,399 @@
#include "core/os/os.h"
struct _KeyCodeText {
int code;
Key code;
const char *text;
};
static const _KeyCodeText _keycodes[] = {
/* clang-format off */
{KEY_ESCAPE ,"Escape"},
{KEY_TAB ,"Tab"},
{KEY_BACKTAB ,"BackTab"},
{KEY_BACKSPACE ,"BackSpace"},
{KEY_ENTER ,"Enter"},
{KEY_KP_ENTER ,"Kp Enter"},
{KEY_INSERT ,"Insert"},
{KEY_DELETE ,"Delete"},
{KEY_PAUSE ,"Pause"},
{KEY_PRINT ,"Print"},
{KEY_SYSREQ ,"SysReq"},
{KEY_CLEAR ,"Clear"},
{KEY_HOME ,"Home"},
{KEY_END ,"End"},
{KEY_LEFT ,"Left"},
{KEY_UP ,"Up"},
{KEY_RIGHT ,"Right"},
{KEY_DOWN ,"Down"},
{KEY_PAGEUP ,"PageUp"},
{KEY_PAGEDOWN ,"PageDown"},
{KEY_SHIFT ,"Shift"},
{KEY_CTRL ,"Ctrl"},
{Key::ESCAPE ,"Escape"},
{Key::TAB ,"Tab"},
{Key::BACKTAB ,"BackTab"},
{Key::BACKSPACE ,"BackSpace"},
{Key::ENTER ,"Enter"},
{Key::KP_ENTER ,"Kp Enter"},
{Key::INSERT ,"Insert"},
{Key::KEY_DELETE ,"Delete"},
{Key::PAUSE ,"Pause"},
{Key::PRINT ,"Print"},
{Key::SYSREQ ,"SysReq"},
{Key::CLEAR ,"Clear"},
{Key::HOME ,"Home"},
{Key::END ,"End"},
{Key::LEFT ,"Left"},
{Key::UP ,"Up"},
{Key::RIGHT ,"Right"},
{Key::DOWN ,"Down"},
{Key::PAGEUP ,"PageUp"},
{Key::PAGEDOWN ,"PageDown"},
{Key::SHIFT ,"Shift"},
{Key::CTRL ,"Ctrl"},
#ifdef OSX_ENABLED
{KEY_META ,"Command"},
{Key::META ,"Command"},
#else
{KEY_META ,"Meta"},
{Key::META ,"Meta"},
#endif
{KEY_ALT ,"Alt"},
{KEY_CAPSLOCK ,"CapsLock"},
{KEY_NUMLOCK ,"NumLock"},
{KEY_SCROLLLOCK ,"ScrollLock"},
{KEY_F1 ,"F1"},
{KEY_F2 ,"F2"},
{KEY_F3 ,"F3"},
{KEY_F4 ,"F4"},
{KEY_F5 ,"F5"},
{KEY_F6 ,"F6"},
{KEY_F7 ,"F7"},
{KEY_F8 ,"F8"},
{KEY_F9 ,"F9"},
{KEY_F10 ,"F10"},
{KEY_F11 ,"F11"},
{KEY_F12 ,"F12"},
{KEY_F13 ,"F13"},
{KEY_F14 ,"F14"},
{KEY_F15 ,"F15"},
{KEY_F16 ,"F16"},
{KEY_KP_MULTIPLY ,"Kp Multiply"},
{KEY_KP_DIVIDE ,"Kp Divide"},
{KEY_KP_SUBTRACT ,"Kp Subtract"},
{KEY_KP_PERIOD ,"Kp Period"},
{KEY_KP_ADD ,"Kp Add"},
{KEY_KP_0 ,"Kp 0"},
{KEY_KP_1 ,"Kp 1"},
{KEY_KP_2 ,"Kp 2"},
{KEY_KP_3 ,"Kp 3"},
{KEY_KP_4 ,"Kp 4"},
{KEY_KP_5 ,"Kp 5"},
{KEY_KP_6 ,"Kp 6"},
{KEY_KP_7 ,"Kp 7"},
{KEY_KP_8 ,"Kp 8"},
{KEY_KP_9 ,"Kp 9"},
{KEY_SUPER_L ,"Super L"},
{KEY_SUPER_R ,"Super R"},
{KEY_MENU ,"Menu"},
{KEY_HYPER_L ,"Hyper L"},
{KEY_HYPER_R ,"Hyper R"},
{KEY_HELP ,"Help"},
{KEY_DIRECTION_L ,"Direction L"},
{KEY_DIRECTION_R ,"Direction R"},
{KEY_BACK ,"Back"},
{KEY_FORWARD ,"Forward"},
{KEY_STOP ,"Stop"},
{KEY_REFRESH ,"Refresh"},
{KEY_VOLUMEDOWN ,"VolumeDown"},
{KEY_VOLUMEMUTE ,"VolumeMute"},
{KEY_VOLUMEUP ,"VolumeUp"},
{KEY_BASSBOOST ,"BassBoost"},
{KEY_BASSUP ,"BassUp"},
{KEY_BASSDOWN ,"BassDown"},
{KEY_TREBLEUP ,"TrebleUp"},
{KEY_TREBLEDOWN ,"TrebleDown"},
{KEY_MEDIAPLAY ,"MediaPlay"},
{KEY_MEDIASTOP ,"MediaStop"},
{KEY_MEDIAPREVIOUS ,"MediaPrevious"},
{KEY_MEDIANEXT ,"MediaNext"},
{KEY_MEDIARECORD ,"MediaRecord"},
{KEY_HOMEPAGE ,"HomePage"},
{KEY_FAVORITES ,"Favorites"},
{KEY_SEARCH ,"Search"},
{KEY_STANDBY ,"StandBy"},
{KEY_LAUNCHMAIL ,"LaunchMail"},
{KEY_LAUNCHMEDIA ,"LaunchMedia"},
{KEY_LAUNCH0 ,"Launch0"},
{KEY_LAUNCH1 ,"Launch1"},
{KEY_LAUNCH2 ,"Launch2"},
{KEY_LAUNCH3 ,"Launch3"},
{KEY_LAUNCH4 ,"Launch4"},
{KEY_LAUNCH5 ,"Launch5"},
{KEY_LAUNCH6 ,"Launch6"},
{KEY_LAUNCH7 ,"Launch7"},
{KEY_LAUNCH8 ,"Launch8"},
{KEY_LAUNCH9 ,"Launch9"},
{KEY_LAUNCHA ,"LaunchA"},
{KEY_LAUNCHB ,"LaunchB"},
{KEY_LAUNCHC ,"LaunchC"},
{KEY_LAUNCHD ,"LaunchD"},
{KEY_LAUNCHE ,"LaunchE"},
{KEY_LAUNCHF ,"LaunchF"},
{KEY_UNKNOWN ,"Unknown"},
{KEY_SPACE ,"Space"},
{KEY_EXCLAM ,"Exclam"},
{KEY_QUOTEDBL ,"QuoteDbl"},
{KEY_NUMBERSIGN ,"NumberSign"},
{KEY_DOLLAR ,"Dollar"},
{KEY_PERCENT ,"Percent"},
{KEY_AMPERSAND ,"Ampersand"},
{KEY_APOSTROPHE ,"Apostrophe"},
{KEY_PARENLEFT ,"ParenLeft"},
{KEY_PARENRIGHT ,"ParenRight"},
{KEY_ASTERISK ,"Asterisk"},
{KEY_PLUS ,"Plus"},
{KEY_COMMA ,"Comma"},
{KEY_MINUS ,"Minus"},
{KEY_PERIOD ,"Period"},
{KEY_SLASH ,"Slash"},
{KEY_0 ,"0"},
{KEY_1 ,"1"},
{KEY_2 ,"2"},
{KEY_3 ,"3"},
{KEY_4 ,"4"},
{KEY_5 ,"5"},
{KEY_6 ,"6"},
{KEY_7 ,"7"},
{KEY_8 ,"8"},
{KEY_9 ,"9"},
{KEY_COLON ,"Colon"},
{KEY_SEMICOLON ,"Semicolon"},
{KEY_LESS ,"Less"},
{KEY_EQUAL ,"Equal"},
{KEY_GREATER ,"Greater"},
{KEY_QUESTION ,"Question"},
{KEY_AT ,"At"},
{KEY_A ,"A"},
{KEY_B ,"B"},
{KEY_C ,"C"},
{KEY_D ,"D"},
{KEY_E ,"E"},
{KEY_F ,"F"},
{KEY_G ,"G"},
{KEY_H ,"H"},
{KEY_I ,"I"},
{KEY_J ,"J"},
{KEY_K ,"K"},
{KEY_L ,"L"},
{KEY_M ,"M"},
{KEY_N ,"N"},
{KEY_O ,"O"},
{KEY_P ,"P"},
{KEY_Q ,"Q"},
{KEY_R ,"R"},
{KEY_S ,"S"},
{KEY_T ,"T"},
{KEY_U ,"U"},
{KEY_V ,"V"},
{KEY_W ,"W"},
{KEY_X ,"X"},
{KEY_Y ,"Y"},
{KEY_Z ,"Z"},
{KEY_BRACKETLEFT ,"BracketLeft"},
{KEY_BACKSLASH ,"BackSlash"},
{KEY_BRACKETRIGHT ,"BracketRight"},
{KEY_ASCIICIRCUM ,"AsciiCircum"},
{KEY_UNDERSCORE ,"UnderScore"},
{KEY_QUOTELEFT ,"QuoteLeft"},
{KEY_BRACELEFT ,"BraceLeft"},
{KEY_BAR ,"Bar"},
{KEY_BRACERIGHT ,"BraceRight"},
{KEY_ASCIITILDE ,"AsciiTilde"},
{KEY_NOBREAKSPACE ,"NoBreakSpace"},
{KEY_EXCLAMDOWN ,"ExclamDown"},
{KEY_CENT ,"Cent"},
{KEY_STERLING ,"Sterling"},
{KEY_CURRENCY ,"Currency"},
{KEY_YEN ,"Yen"},
{KEY_BROKENBAR ,"BrokenBar"},
{KEY_SECTION ,"Section"},
{KEY_DIAERESIS ,"Diaeresis"},
{KEY_COPYRIGHT ,"Copyright"},
{KEY_ORDFEMININE ,"Ordfeminine"},
{KEY_GUILLEMOTLEFT ,"GuillemotLeft"},
{KEY_NOTSIGN ,"NotSign"},
{KEY_HYPHEN ,"Hyphen"},
{KEY_REGISTERED ,"Registered"},
{KEY_MACRON ,"Macron"},
{KEY_DEGREE ,"Degree"},
{KEY_PLUSMINUS ,"PlusMinus"},
{KEY_TWOSUPERIOR ,"TwoSuperior"},
{KEY_THREESUPERIOR ,"ThreeSuperior"},
{KEY_ACUTE ,"Acute"},
{KEY_MU ,"Mu"},
{KEY_PARAGRAPH ,"Paragraph"},
{KEY_PERIODCENTERED ,"PeriodCentered"},
{KEY_CEDILLA ,"Cedilla"},
{KEY_ONESUPERIOR ,"OneSuperior"},
{KEY_MASCULINE ,"Masculine"},
{KEY_GUILLEMOTRIGHT ,"GuillemotRight"},
{KEY_ONEQUARTER ,"OneQuarter"},
{KEY_ONEHALF ,"OneHalf"},
{KEY_THREEQUARTERS ,"ThreeQuarters"},
{KEY_QUESTIONDOWN ,"QuestionDown"},
{KEY_AGRAVE ,"Agrave"},
{KEY_AACUTE ,"Aacute"},
{KEY_ACIRCUMFLEX ,"AcircumFlex"},
{KEY_ATILDE ,"Atilde"},
{KEY_ADIAERESIS ,"Adiaeresis"},
{KEY_ARING ,"Aring"},
{KEY_AE ,"Ae"},
{KEY_CCEDILLA ,"Ccedilla"},
{KEY_EGRAVE ,"Egrave"},
{KEY_EACUTE ,"Eacute"},
{KEY_ECIRCUMFLEX ,"Ecircumflex"},
{KEY_EDIAERESIS ,"Ediaeresis"},
{KEY_IGRAVE ,"Igrave"},
{KEY_IACUTE ,"Iacute"},
{KEY_ICIRCUMFLEX ,"Icircumflex"},
{KEY_IDIAERESIS ,"Idiaeresis"},
{KEY_ETH ,"Eth"},
{KEY_NTILDE ,"Ntilde"},
{KEY_OGRAVE ,"Ograve"},
{KEY_OACUTE ,"Oacute"},
{KEY_OCIRCUMFLEX ,"Ocircumflex"},
{KEY_OTILDE ,"Otilde"},
{KEY_ODIAERESIS ,"Odiaeresis"},
{KEY_MULTIPLY ,"Multiply"},
{KEY_OOBLIQUE ,"Ooblique"},
{KEY_UGRAVE ,"Ugrave"},
{KEY_UACUTE ,"Uacute"},
{KEY_UCIRCUMFLEX ,"Ucircumflex"},
{KEY_UDIAERESIS ,"Udiaeresis"},
{KEY_YACUTE ,"Yacute"},
{KEY_THORN ,"Thorn"},
{KEY_SSHARP ,"Ssharp"},
{KEY_DIVISION ,"Division"},
{KEY_YDIAERESIS ,"Ydiaeresis"},
{0 ,nullptr}
{Key::ALT ,"Alt"},
{Key::CAPSLOCK ,"CapsLock"},
{Key::NUMLOCK ,"NumLock"},
{Key::SCROLLLOCK ,"ScrollLock"},
{Key::F1 ,"F1"},
{Key::F2 ,"F2"},
{Key::F3 ,"F3"},
{Key::F4 ,"F4"},
{Key::F5 ,"F5"},
{Key::F6 ,"F6"},
{Key::F7 ,"F7"},
{Key::F8 ,"F8"},
{Key::F9 ,"F9"},
{Key::F10 ,"F10"},
{Key::F11 ,"F11"},
{Key::F12 ,"F12"},
{Key::F13 ,"F13"},
{Key::F14 ,"F14"},
{Key::F15 ,"F15"},
{Key::F16 ,"F16"},
{Key::KP_MULTIPLY ,"Kp Multiply"},
{Key::KP_DIVIDE ,"Kp Divide"},
{Key::KP_SUBTRACT ,"Kp Subtract"},
{Key::KP_PERIOD ,"Kp Period"},
{Key::KP_ADD ,"Kp Add"},
{Key::KP_0 ,"Kp 0"},
{Key::KP_1 ,"Kp 1"},
{Key::KP_2 ,"Kp 2"},
{Key::KP_3 ,"Kp 3"},
{Key::KP_4 ,"Kp 4"},
{Key::KP_5 ,"Kp 5"},
{Key::KP_6 ,"Kp 6"},
{Key::KP_7 ,"Kp 7"},
{Key::KP_8 ,"Kp 8"},
{Key::KP_9 ,"Kp 9"},
{Key::SUPER_L ,"Super L"},
{Key::SUPER_R ,"Super R"},
{Key::MENU ,"Menu"},
{Key::HYPER_L ,"Hyper L"},
{Key::HYPER_R ,"Hyper R"},
{Key::HELP ,"Help"},
{Key::DIRECTION_L ,"Direction L"},
{Key::DIRECTION_R ,"Direction R"},
{Key::BACK ,"Back"},
{Key::FORWARD ,"Forward"},
{Key::STOP ,"Stop"},
{Key::REFRESH ,"Refresh"},
{Key::VOLUMEDOWN ,"VolumeDown"},
{Key::VOLUMEMUTE ,"VolumeMute"},
{Key::VOLUMEUP ,"VolumeUp"},
{Key::BASSBOOST ,"BassBoost"},
{Key::BASSUP ,"BassUp"},
{Key::BASSDOWN ,"BassDown"},
{Key::TREBLEUP ,"TrebleUp"},
{Key::TREBLEDOWN ,"TrebleDown"},
{Key::MEDIAPLAY ,"MediaPlay"},
{Key::MEDIASTOP ,"MediaStop"},
{Key::MEDIAPREVIOUS ,"MediaPrevious"},
{Key::MEDIANEXT ,"MediaNext"},
{Key::MEDIARECORD ,"MediaRecord"},
{Key::HOMEPAGE ,"HomePage"},
{Key::FAVORITES ,"Favorites"},
{Key::SEARCH ,"Search"},
{Key::STANDBY ,"StandBy"},
{Key::LAUNCHMAIL ,"LaunchMail"},
{Key::LAUNCHMEDIA ,"LaunchMedia"},
{Key::LAUNCH0 ,"Launch0"},
{Key::LAUNCH1 ,"Launch1"},
{Key::LAUNCH2 ,"Launch2"},
{Key::LAUNCH3 ,"Launch3"},
{Key::LAUNCH4 ,"Launch4"},
{Key::LAUNCH5 ,"Launch5"},
{Key::LAUNCH6 ,"Launch6"},
{Key::LAUNCH7 ,"Launch7"},
{Key::LAUNCH8 ,"Launch8"},
{Key::LAUNCH9 ,"Launch9"},
{Key::LAUNCHA ,"LaunchA"},
{Key::LAUNCHB ,"LaunchB"},
{Key::LAUNCHC ,"LaunchC"},
{Key::LAUNCHD ,"LaunchD"},
{Key::LAUNCHE ,"LaunchE"},
{Key::LAUNCHF ,"LaunchF"},
{Key::UNKNOWN ,"Unknown"},
{Key::SPACE ,"Space"},
{Key::EXCLAM ,"Exclam"},
{Key::QUOTEDBL ,"QuoteDbl"},
{Key::NUMBERSIGN ,"NumberSign"},
{Key::DOLLAR ,"Dollar"},
{Key::PERCENT ,"Percent"},
{Key::AMPERSAND ,"Ampersand"},
{Key::APOSTROPHE ,"Apostrophe"},
{Key::PARENLEFT ,"ParenLeft"},
{Key::PARENRIGHT ,"ParenRight"},
{Key::ASTERISK ,"Asterisk"},
{Key::PLUS ,"Plus"},
{Key::COMMA ,"Comma"},
{Key::MINUS ,"Minus"},
{Key::PERIOD ,"Period"},
{Key::SLASH ,"Slash"},
{Key::KEY_0 ,"0"},
{Key::KEY_1 ,"1"},
{Key::KEY_2 ,"2"},
{Key::KEY_3 ,"3"},
{Key::KEY_4 ,"4"},
{Key::KEY_5 ,"5"},
{Key::KEY_6 ,"6"},
{Key::KEY_7 ,"7"},
{Key::KEY_8 ,"8"},
{Key::KEY_9 ,"9"},
{Key::COLON ,"Colon"},
{Key::SEMICOLON ,"Semicolon"},
{Key::LESS ,"Less"},
{Key::EQUAL ,"Equal"},
{Key::GREATER ,"Greater"},
{Key::QUESTION ,"Question"},
{Key::AT ,"At"},
{Key::A ,"A"},
{Key::B ,"B"},
{Key::C ,"C"},
{Key::D ,"D"},
{Key::E ,"E"},
{Key::F ,"F"},
{Key::G ,"G"},
{Key::H ,"H"},
{Key::I ,"I"},
{Key::J ,"J"},
{Key::K ,"K"},
{Key::L ,"L"},
{Key::M ,"M"},
{Key::N ,"N"},
{Key::O ,"O"},
{Key::P ,"P"},
{Key::Q ,"Q"},
{Key::R ,"R"},
{Key::S ,"S"},
{Key::T ,"T"},
{Key::U ,"U"},
{Key::V ,"V"},
{Key::W ,"W"},
{Key::X ,"X"},
{Key::Y ,"Y"},
{Key::Z ,"Z"},
{Key::BRACKETLEFT ,"BracketLeft"},
{Key::BACKSLASH ,"BackSlash"},
{Key::BRACKETRIGHT ,"BracketRight"},
{Key::ASCIICIRCUM ,"AsciiCircum"},
{Key::UNDERSCORE ,"UnderScore"},
{Key::QUOTELEFT ,"QuoteLeft"},
{Key::BRACELEFT ,"BraceLeft"},
{Key::BAR ,"Bar"},
{Key::BRACERIGHT ,"BraceRight"},
{Key::ASCIITILDE ,"AsciiTilde"},
{Key::NOBREAKSPACE ,"NoBreakSpace"},
{Key::EXCLAMDOWN ,"ExclamDown"},
{Key::CENT ,"Cent"},
{Key::STERLING ,"Sterling"},
{Key::CURRENCY ,"Currency"},
{Key::YEN ,"Yen"},
{Key::BROKENBAR ,"BrokenBar"},
{Key::SECTION ,"Section"},
{Key::DIAERESIS ,"Diaeresis"},
{Key::COPYRIGHT ,"Copyright"},
{Key::ORDFEMININE ,"Ordfeminine"},
{Key::GUILLEMOTLEFT ,"GuillemotLeft"},
{Key::NOTSIGN ,"NotSign"},
{Key::HYPHEN ,"Hyphen"},
{Key::KEY_REGISTERED ,"Registered"},
{Key::MACRON ,"Macron"},
{Key::DEGREE ,"Degree"},
{Key::PLUSMINUS ,"PlusMinus"},
{Key::TWOSUPERIOR ,"TwoSuperior"},
{Key::THREESUPERIOR ,"ThreeSuperior"},
{Key::ACUTE ,"Acute"},
{Key::MU ,"Mu"},
{Key::PARAGRAPH ,"Paragraph"},
{Key::PERIODCENTERED ,"PeriodCentered"},
{Key::CEDILLA ,"Cedilla"},
{Key::ONESUPERIOR ,"OneSuperior"},
{Key::MASCULINE ,"Masculine"},
{Key::GUILLEMOTRIGHT ,"GuillemotRight"},
{Key::ONEQUARTER ,"OneQuarter"},
{Key::ONEHALF ,"OneHalf"},
{Key::THREEQUARTERS ,"ThreeQuarters"},
{Key::QUESTIONDOWN ,"QuestionDown"},
{Key::AGRAVE ,"Agrave"},
{Key::AACUTE ,"Aacute"},
{Key::ACIRCUMFLEX ,"AcircumFlex"},
{Key::ATILDE ,"Atilde"},
{Key::ADIAERESIS ,"Adiaeresis"},
{Key::ARING ,"Aring"},
{Key::AE ,"Ae"},
{Key::CCEDILLA ,"Ccedilla"},
{Key::EGRAVE ,"Egrave"},
{Key::EACUTE ,"Eacute"},
{Key::ECIRCUMFLEX ,"Ecircumflex"},
{Key::EDIAERESIS ,"Ediaeresis"},
{Key::IGRAVE ,"Igrave"},
{Key::IACUTE ,"Iacute"},
{Key::ICIRCUMFLEX ,"Icircumflex"},
{Key::IDIAERESIS ,"Idiaeresis"},
{Key::ETH ,"Eth"},
{Key::NTILDE ,"Ntilde"},
{Key::OGRAVE ,"Ograve"},
{Key::OACUTE ,"Oacute"},
{Key::OCIRCUMFLEX ,"Ocircumflex"},
{Key::OTILDE ,"Otilde"},
{Key::ODIAERESIS ,"Odiaeresis"},
{Key::MULTIPLY ,"Multiply"},
{Key::OOBLIQUE ,"Ooblique"},
{Key::UGRAVE ,"Ugrave"},
{Key::UACUTE ,"Uacute"},
{Key::UCIRCUMFLEX ,"Ucircumflex"},
{Key::UDIAERESIS ,"Udiaeresis"},
{Key::YACUTE ,"Yacute"},
{Key::THORN ,"Thorn"},
{Key::SSHARP ,"Ssharp"},
{Key::DIVISION ,"Division"},
{Key::YDIAERESIS ,"Ydiaeresis"},
{Key::NONE ,nullptr}
/* clang-format on */
};
bool keycode_has_unicode(uint32_t p_keycode) {
bool keycode_has_unicode(Key p_keycode) {
switch (p_keycode) {
case KEY_ESCAPE:
case KEY_TAB:
case KEY_BACKTAB:
case KEY_BACKSPACE:
case KEY_ENTER:
case KEY_KP_ENTER:
case KEY_INSERT:
case KEY_DELETE:
case KEY_PAUSE:
case KEY_PRINT:
case KEY_SYSREQ:
case KEY_CLEAR:
case KEY_HOME:
case KEY_END:
case KEY_LEFT:
case KEY_UP:
case KEY_RIGHT:
case KEY_DOWN:
case KEY_PAGEUP:
case KEY_PAGEDOWN:
case KEY_SHIFT:
case KEY_CTRL:
case KEY_META:
case KEY_ALT:
case KEY_CAPSLOCK:
case KEY_NUMLOCK:
case KEY_SCROLLLOCK:
case KEY_F1:
case KEY_F2:
case KEY_F3:
case KEY_F4:
case KEY_F5:
case KEY_F6:
case KEY_F7:
case KEY_F8:
case KEY_F9:
case KEY_F10:
case KEY_F11:
case KEY_F12:
case KEY_F13:
case KEY_F14:
case KEY_F15:
case KEY_F16:
case KEY_SUPER_L:
case KEY_SUPER_R:
case KEY_MENU:
case KEY_HYPER_L:
case KEY_HYPER_R:
case KEY_HELP:
case KEY_DIRECTION_L:
case KEY_DIRECTION_R:
case KEY_BACK:
case KEY_FORWARD:
case KEY_STOP:
case KEY_REFRESH:
case KEY_VOLUMEDOWN:
case KEY_VOLUMEMUTE:
case KEY_VOLUMEUP:
case KEY_BASSBOOST:
case KEY_BASSUP:
case KEY_BASSDOWN:
case KEY_TREBLEUP:
case KEY_TREBLEDOWN:
case KEY_MEDIAPLAY:
case KEY_MEDIASTOP:
case KEY_MEDIAPREVIOUS:
case KEY_MEDIANEXT:
case KEY_MEDIARECORD:
case KEY_HOMEPAGE:
case KEY_FAVORITES:
case KEY_SEARCH:
case KEY_STANDBY:
case KEY_OPENURL:
case KEY_LAUNCHMAIL:
case KEY_LAUNCHMEDIA:
case KEY_LAUNCH0:
case KEY_LAUNCH1:
case KEY_LAUNCH2:
case KEY_LAUNCH3:
case KEY_LAUNCH4:
case KEY_LAUNCH5:
case KEY_LAUNCH6:
case KEY_LAUNCH7:
case KEY_LAUNCH8:
case KEY_LAUNCH9:
case KEY_LAUNCHA:
case KEY_LAUNCHB:
case KEY_LAUNCHC:
case KEY_LAUNCHD:
case KEY_LAUNCHE:
case KEY_LAUNCHF:
case Key::ESCAPE:
case Key::TAB:
case Key::BACKTAB:
case Key::BACKSPACE:
case Key::ENTER:
case Key::KP_ENTER:
case Key::INSERT:
case Key::KEY_DELETE:
case Key::PAUSE:
case Key::PRINT:
case Key::SYSREQ:
case Key::CLEAR:
case Key::HOME:
case Key::END:
case Key::LEFT:
case Key::UP:
case Key::RIGHT:
case Key::DOWN:
case Key::PAGEUP:
case Key::PAGEDOWN:
case Key::SHIFT:
case Key::CTRL:
case Key::META:
case Key::ALT:
case Key::CAPSLOCK:
case Key::NUMLOCK:
case Key::SCROLLLOCK:
case Key::F1:
case Key::F2:
case Key::F3:
case Key::F4:
case Key::F5:
case Key::F6:
case Key::F7:
case Key::F8:
case Key::F9:
case Key::F10:
case Key::F11:
case Key::F12:
case Key::F13:
case Key::F14:
case Key::F15:
case Key::F16:
case Key::SUPER_L:
case Key::SUPER_R:
case Key::MENU:
case Key::HYPER_L:
case Key::HYPER_R:
case Key::HELP:
case Key::DIRECTION_L:
case Key::DIRECTION_R:
case Key::BACK:
case Key::FORWARD:
case Key::STOP:
case Key::REFRESH:
case Key::VOLUMEDOWN:
case Key::VOLUMEMUTE:
case Key::VOLUMEUP:
case Key::BASSBOOST:
case Key::BASSUP:
case Key::BASSDOWN:
case Key::TREBLEUP:
case Key::TREBLEDOWN:
case Key::MEDIAPLAY:
case Key::MEDIASTOP:
case Key::MEDIAPREVIOUS:
case Key::MEDIANEXT:
case Key::MEDIARECORD:
case Key::HOMEPAGE:
case Key::FAVORITES:
case Key::SEARCH:
case Key::STANDBY:
case Key::OPENURL:
case Key::LAUNCHMAIL:
case Key::LAUNCHMEDIA:
case Key::LAUNCH0:
case Key::LAUNCH1:
case Key::LAUNCH2:
case Key::LAUNCH3:
case Key::LAUNCH4:
case Key::LAUNCH5:
case Key::LAUNCH6:
case Key::LAUNCH7:
case Key::LAUNCH8:
case Key::LAUNCH9:
case Key::LAUNCHA:
case Key::LAUNCHB:
case Key::LAUNCHC:
case Key::LAUNCHD:
case Key::LAUNCHE:
case Key::LAUNCHF:
return false;
default: {
}
}
return true;
}
String keycode_get_string(uint32_t p_code) {
String keycode_get_string(Key p_code) {
String codestr;
if (p_code & KEY_MASK_SHIFT) {
codestr += find_keycode_name(KEY_SHIFT);
if ((p_code & KeyModifierMask::SHIFT) != Key::NONE) {
codestr += find_keycode_name(Key::SHIFT);
codestr += "+";
}
if (p_code & KEY_MASK_ALT) {
codestr += find_keycode_name(KEY_ALT);
if ((p_code & KeyModifierMask::ALT) != Key::NONE) {
codestr += find_keycode_name(Key::ALT);
codestr += "+";
}
if (p_code & KEY_MASK_CTRL) {
codestr += find_keycode_name(KEY_CTRL);
if ((p_code & KeyModifierMask::CTRL) != Key::NONE) {
codestr += find_keycode_name(Key::CTRL);
codestr += "+";
}
if (p_code & KEY_MASK_META) {
codestr += find_keycode_name(KEY_META);
if ((p_code & KeyModifierMask::META) != Key::NONE) {
codestr += find_keycode_name(Key::META);
codestr += "+";
}
p_code &= KEY_CODE_MASK;
p_code &= KeyModifierMask::CODE_MASK;
const _KeyCodeText *kct = &_keycodes[0];
while (kct->text) {
if (kct->code == (int)p_code) {
if (kct->code == p_code) {
codestr += kct->text;
return codestr;
}
kct++;
}
codestr += String::chr(p_code);
codestr += String::chr((char32_t)p_code);
return codestr;
}
int find_keycode(const String &p_code) {
Key find_keycode(const String &p_code) {
const _KeyCodeText *kct = &_keycodes[0];
while (kct->text) {
@ -436,10 +435,10 @@ int find_keycode(const String &p_code) {
kct++;
}
return 0;
return Key::NONE;
}
const char *find_keycode_name(int p_keycode) {
const char *find_keycode_name(Key p_keycode) {
const _KeyCodeText *kct = &_keycodes[0];
while (kct->text) {
@ -464,7 +463,7 @@ int keycode_get_count() {
}
int keycode_get_value_by_index(int p_index) {
return _keycodes[p_index].code;
return (int)_keycodes[p_index].code;
}
const char *keycode_get_name_by_index(int p_index) {

View file

@ -33,148 +33,142 @@
#include "core/string/ustring.h"
/*
Special Key:
The strategy here is similar to the one used by toolkits,
which consists in leaving the 24 bits unicode range for printable
characters, and use the upper 8 bits for special keys and
modifiers. This way everything (char/keycode) can fit nicely in one 32 bits unsigned integer.
*/
enum {
SPKEY = (1 << 24)
};
enum Key {
KEY_NONE = 0,
enum class Key {
NONE = 0,
// Special key: The strategy here is similar to the one used by toolkits,
// which consists in leaving the 24 bits unicode range for printable
// characters, and use the upper 8 bits for special keys and modifiers.
// This way everything (char/keycode) can fit nicely in one 32-bit
// integer (the enum's underlying type is `int` by default).
SPECIAL = (1 << 24),
/* CURSOR/FUNCTION/BROWSER/MULTIMEDIA/MISC KEYS */
KEY_ESCAPE = SPKEY | 0x01,
KEY_TAB = SPKEY | 0x02,
KEY_BACKTAB = SPKEY | 0x03,
KEY_BACKSPACE = SPKEY | 0x04,
KEY_ENTER = SPKEY | 0x05,
KEY_KP_ENTER = SPKEY | 0x06,
KEY_INSERT = SPKEY | 0x07,
KEY_DELETE = SPKEY | 0x08,
KEY_PAUSE = SPKEY | 0x09,
KEY_PRINT = SPKEY | 0x0A,
KEY_SYSREQ = SPKEY | 0x0B,
KEY_CLEAR = SPKEY | 0x0C,
KEY_HOME = SPKEY | 0x0D,
KEY_END = SPKEY | 0x0E,
KEY_LEFT = SPKEY | 0x0F,
KEY_UP = SPKEY | 0x10,
KEY_RIGHT = SPKEY | 0x11,
KEY_DOWN = SPKEY | 0x12,
KEY_PAGEUP = SPKEY | 0x13,
KEY_PAGEDOWN = SPKEY | 0x14,
KEY_SHIFT = SPKEY | 0x15,
KEY_CTRL = SPKEY | 0x16,
KEY_META = SPKEY | 0x17,
KEY_ALT = SPKEY | 0x18,
KEY_CAPSLOCK = SPKEY | 0x19,
KEY_NUMLOCK = SPKEY | 0x1A,
KEY_SCROLLLOCK = SPKEY | 0x1B,
KEY_F1 = SPKEY | 0x1C,
KEY_F2 = SPKEY | 0x1D,
KEY_F3 = SPKEY | 0x1E,
KEY_F4 = SPKEY | 0x1F,
KEY_F5 = SPKEY | 0x20,
KEY_F6 = SPKEY | 0x21,
KEY_F7 = SPKEY | 0x22,
KEY_F8 = SPKEY | 0x23,
KEY_F9 = SPKEY | 0x24,
KEY_F10 = SPKEY | 0x25,
KEY_F11 = SPKEY | 0x26,
KEY_F12 = SPKEY | 0x27,
KEY_F13 = SPKEY | 0x28,
KEY_F14 = SPKEY | 0x29,
KEY_F15 = SPKEY | 0x2A,
KEY_F16 = SPKEY | 0x2B,
KEY_KP_MULTIPLY = SPKEY | 0x81,
KEY_KP_DIVIDE = SPKEY | 0x82,
KEY_KP_SUBTRACT = SPKEY | 0x83,
KEY_KP_PERIOD = SPKEY | 0x84,
KEY_KP_ADD = SPKEY | 0x85,
KEY_KP_0 = SPKEY | 0x86,
KEY_KP_1 = SPKEY | 0x87,
KEY_KP_2 = SPKEY | 0x88,
KEY_KP_3 = SPKEY | 0x89,
KEY_KP_4 = SPKEY | 0x8A,
KEY_KP_5 = SPKEY | 0x8B,
KEY_KP_6 = SPKEY | 0x8C,
KEY_KP_7 = SPKEY | 0x8D,
KEY_KP_8 = SPKEY | 0x8E,
KEY_KP_9 = SPKEY | 0x8F,
KEY_SUPER_L = SPKEY | 0x2C,
KEY_SUPER_R = SPKEY | 0x2D,
KEY_MENU = SPKEY | 0x2E,
KEY_HYPER_L = SPKEY | 0x2F,
KEY_HYPER_R = SPKEY | 0x30,
KEY_HELP = SPKEY | 0x31,
KEY_DIRECTION_L = SPKEY | 0x32,
KEY_DIRECTION_R = SPKEY | 0x33,
KEY_BACK = SPKEY | 0x40,
KEY_FORWARD = SPKEY | 0x41,
KEY_STOP = SPKEY | 0x42,
KEY_REFRESH = SPKEY | 0x43,
KEY_VOLUMEDOWN = SPKEY | 0x44,
KEY_VOLUMEMUTE = SPKEY | 0x45,
KEY_VOLUMEUP = SPKEY | 0x46,
KEY_BASSBOOST = SPKEY | 0x47,
KEY_BASSUP = SPKEY | 0x48,
KEY_BASSDOWN = SPKEY | 0x49,
KEY_TREBLEUP = SPKEY | 0x4A,
KEY_TREBLEDOWN = SPKEY | 0x4B,
KEY_MEDIAPLAY = SPKEY | 0x4C,
KEY_MEDIASTOP = SPKEY | 0x4D,
KEY_MEDIAPREVIOUS = SPKEY | 0x4E,
KEY_MEDIANEXT = SPKEY | 0x4F,
KEY_MEDIARECORD = SPKEY | 0x50,
KEY_HOMEPAGE = SPKEY | 0x51,
KEY_FAVORITES = SPKEY | 0x52,
KEY_SEARCH = SPKEY | 0x53,
KEY_STANDBY = SPKEY | 0x54,
KEY_OPENURL = SPKEY | 0x55,
KEY_LAUNCHMAIL = SPKEY | 0x56,
KEY_LAUNCHMEDIA = SPKEY | 0x57,
KEY_LAUNCH0 = SPKEY | 0x58,
KEY_LAUNCH1 = SPKEY | 0x59,
KEY_LAUNCH2 = SPKEY | 0x5A,
KEY_LAUNCH3 = SPKEY | 0x5B,
KEY_LAUNCH4 = SPKEY | 0x5C,
KEY_LAUNCH5 = SPKEY | 0x5D,
KEY_LAUNCH6 = SPKEY | 0x5E,
KEY_LAUNCH7 = SPKEY | 0x5F,
KEY_LAUNCH8 = SPKEY | 0x60,
KEY_LAUNCH9 = SPKEY | 0x61,
KEY_LAUNCHA = SPKEY | 0x62,
KEY_LAUNCHB = SPKEY | 0x63,
KEY_LAUNCHC = SPKEY | 0x64,
KEY_LAUNCHD = SPKEY | 0x65,
KEY_LAUNCHE = SPKEY | 0x66,
KEY_LAUNCHF = SPKEY | 0x67,
ESCAPE = SPECIAL | 0x01,
TAB = SPECIAL | 0x02,
BACKTAB = SPECIAL | 0x03,
BACKSPACE = SPECIAL | 0x04,
ENTER = SPECIAL | 0x05,
KP_ENTER = SPECIAL | 0x06,
INSERT = SPECIAL | 0x07,
KEY_DELETE = SPECIAL | 0x08, // "DELETE" is a reserved word on Windows.
PAUSE = SPECIAL | 0x09,
PRINT = SPECIAL | 0x0A,
SYSREQ = SPECIAL | 0x0B,
CLEAR = SPECIAL | 0x0C,
HOME = SPECIAL | 0x0D,
END = SPECIAL | 0x0E,
LEFT = SPECIAL | 0x0F,
UP = SPECIAL | 0x10,
RIGHT = SPECIAL | 0x11,
DOWN = SPECIAL | 0x12,
PAGEUP = SPECIAL | 0x13,
PAGEDOWN = SPECIAL | 0x14,
SHIFT = SPECIAL | 0x15,
CTRL = SPECIAL | 0x16,
META = SPECIAL | 0x17,
ALT = SPECIAL | 0x18,
CAPSLOCK = SPECIAL | 0x19,
NUMLOCK = SPECIAL | 0x1A,
SCROLLLOCK = SPECIAL | 0x1B,
F1 = SPECIAL | 0x1C,
F2 = SPECIAL | 0x1D,
F3 = SPECIAL | 0x1E,
F4 = SPECIAL | 0x1F,
F5 = SPECIAL | 0x20,
F6 = SPECIAL | 0x21,
F7 = SPECIAL | 0x22,
F8 = SPECIAL | 0x23,
F9 = SPECIAL | 0x24,
F10 = SPECIAL | 0x25,
F11 = SPECIAL | 0x26,
F12 = SPECIAL | 0x27,
F13 = SPECIAL | 0x28,
F14 = SPECIAL | 0x29,
F15 = SPECIAL | 0x2A,
F16 = SPECIAL | 0x2B,
KP_MULTIPLY = SPECIAL | 0x81,
KP_DIVIDE = SPECIAL | 0x82,
KP_SUBTRACT = SPECIAL | 0x83,
KP_PERIOD = SPECIAL | 0x84,
KP_ADD = SPECIAL | 0x85,
KP_0 = SPECIAL | 0x86,
KP_1 = SPECIAL | 0x87,
KP_2 = SPECIAL | 0x88,
KP_3 = SPECIAL | 0x89,
KP_4 = SPECIAL | 0x8A,
KP_5 = SPECIAL | 0x8B,
KP_6 = SPECIAL | 0x8C,
KP_7 = SPECIAL | 0x8D,
KP_8 = SPECIAL | 0x8E,
KP_9 = SPECIAL | 0x8F,
SUPER_L = SPECIAL | 0x2C,
SUPER_R = SPECIAL | 0x2D,
MENU = SPECIAL | 0x2E,
HYPER_L = SPECIAL | 0x2F,
HYPER_R = SPECIAL | 0x30,
HELP = SPECIAL | 0x31,
DIRECTION_L = SPECIAL | 0x32,
DIRECTION_R = SPECIAL | 0x33,
BACK = SPECIAL | 0x40,
FORWARD = SPECIAL | 0x41,
STOP = SPECIAL | 0x42,
REFRESH = SPECIAL | 0x43,
VOLUMEDOWN = SPECIAL | 0x44,
VOLUMEMUTE = SPECIAL | 0x45,
VOLUMEUP = SPECIAL | 0x46,
BASSBOOST = SPECIAL | 0x47,
BASSUP = SPECIAL | 0x48,
BASSDOWN = SPECIAL | 0x49,
TREBLEUP = SPECIAL | 0x4A,
TREBLEDOWN = SPECIAL | 0x4B,
MEDIAPLAY = SPECIAL | 0x4C,
MEDIASTOP = SPECIAL | 0x4D,
MEDIAPREVIOUS = SPECIAL | 0x4E,
MEDIANEXT = SPECIAL | 0x4F,
MEDIARECORD = SPECIAL | 0x50,
HOMEPAGE = SPECIAL | 0x51,
FAVORITES = SPECIAL | 0x52,
SEARCH = SPECIAL | 0x53,
STANDBY = SPECIAL | 0x54,
OPENURL = SPECIAL | 0x55,
LAUNCHMAIL = SPECIAL | 0x56,
LAUNCHMEDIA = SPECIAL | 0x57,
LAUNCH0 = SPECIAL | 0x58,
LAUNCH1 = SPECIAL | 0x59,
LAUNCH2 = SPECIAL | 0x5A,
LAUNCH3 = SPECIAL | 0x5B,
LAUNCH4 = SPECIAL | 0x5C,
LAUNCH5 = SPECIAL | 0x5D,
LAUNCH6 = SPECIAL | 0x5E,
LAUNCH7 = SPECIAL | 0x5F,
LAUNCH8 = SPECIAL | 0x60,
LAUNCH9 = SPECIAL | 0x61,
LAUNCHA = SPECIAL | 0x62,
LAUNCHB = SPECIAL | 0x63,
LAUNCHC = SPECIAL | 0x64,
LAUNCHD = SPECIAL | 0x65,
LAUNCHE = SPECIAL | 0x66,
LAUNCHF = SPECIAL | 0x67,
KEY_UNKNOWN = SPKEY | 0xFFFFFF,
UNKNOWN = SPECIAL | 0xFFFFFF,
/* PRINTABLE LATIN 1 CODES */
KEY_SPACE = 0x0020,
KEY_EXCLAM = 0x0021,
KEY_QUOTEDBL = 0x0022,
KEY_NUMBERSIGN = 0x0023,
KEY_DOLLAR = 0x0024,
KEY_PERCENT = 0x0025,
KEY_AMPERSAND = 0x0026,
KEY_APOSTROPHE = 0x0027,
KEY_PARENLEFT = 0x0028,
KEY_PARENRIGHT = 0x0029,
KEY_ASTERISK = 0x002A,
KEY_PLUS = 0x002B,
KEY_COMMA = 0x002C,
KEY_MINUS = 0x002D,
KEY_PERIOD = 0x002E,
KEY_SLASH = 0x002F,
SPACE = 0x0020,
EXCLAM = 0x0021,
QUOTEDBL = 0x0022,
NUMBERSIGN = 0x0023,
DOLLAR = 0x0024,
PERCENT = 0x0025,
AMPERSAND = 0x0026,
APOSTROPHE = 0x0027,
PARENLEFT = 0x0028,
PARENRIGHT = 0x0029,
ASTERISK = 0x002A,
PLUS = 0x002B,
COMMA = 0x002C,
MINUS = 0x002D,
PERIOD = 0x002E,
SLASH = 0x002F,
KEY_0 = 0x0030,
KEY_1 = 0x0031,
KEY_2 = 0x0032,
@ -185,134 +179,133 @@ enum Key {
KEY_7 = 0x0037,
KEY_8 = 0x0038,
KEY_9 = 0x0039,
KEY_COLON = 0x003A,
KEY_SEMICOLON = 0x003B,
KEY_LESS = 0x003C,
KEY_EQUAL = 0x003D,
KEY_GREATER = 0x003E,
KEY_QUESTION = 0x003F,
KEY_AT = 0x0040,
KEY_A = 0x0041,
KEY_B = 0x0042,
KEY_C = 0x0043,
KEY_D = 0x0044,
KEY_E = 0x0045,
KEY_F = 0x0046,
KEY_G = 0x0047,
KEY_H = 0x0048,
KEY_I = 0x0049,
KEY_J = 0x004A,
KEY_K = 0x004B,
KEY_L = 0x004C,
KEY_M = 0x004D,
KEY_N = 0x004E,
KEY_O = 0x004F,
KEY_P = 0x0050,
KEY_Q = 0x0051,
KEY_R = 0x0052,
KEY_S = 0x0053,
KEY_T = 0x0054,
KEY_U = 0x0055,
KEY_V = 0x0056,
KEY_W = 0x0057,
KEY_X = 0x0058,
KEY_Y = 0x0059,
KEY_Z = 0x005A,
KEY_BRACKETLEFT = 0x005B,
KEY_BACKSLASH = 0x005C,
KEY_BRACKETRIGHT = 0x005D,
KEY_ASCIICIRCUM = 0x005E,
KEY_UNDERSCORE = 0x005F,
KEY_QUOTELEFT = 0x0060,
KEY_BRACELEFT = 0x007B,
KEY_BAR = 0x007C,
KEY_BRACERIGHT = 0x007D,
KEY_ASCIITILDE = 0x007E,
KEY_NOBREAKSPACE = 0x00A0,
KEY_EXCLAMDOWN = 0x00A1,
KEY_CENT = 0x00A2,
KEY_STERLING = 0x00A3,
KEY_CURRENCY = 0x00A4,
KEY_YEN = 0x00A5,
KEY_BROKENBAR = 0x00A6,
KEY_SECTION = 0x00A7,
KEY_DIAERESIS = 0x00A8,
KEY_COPYRIGHT = 0x00A9,
KEY_ORDFEMININE = 0x00AA,
KEY_GUILLEMOTLEFT = 0x00AB,
KEY_NOTSIGN = 0x00AC,
KEY_HYPHEN = 0x00AD,
KEY_REGISTERED = 0x00AE,
KEY_MACRON = 0x00AF,
KEY_DEGREE = 0x00B0,
KEY_PLUSMINUS = 0x00B1,
KEY_TWOSUPERIOR = 0x00B2,
KEY_THREESUPERIOR = 0x00B3,
KEY_ACUTE = 0x00B4,
KEY_MU = 0x00B5,
KEY_PARAGRAPH = 0x00B6,
KEY_PERIODCENTERED = 0x00B7,
KEY_CEDILLA = 0x00B8,
KEY_ONESUPERIOR = 0x00B9,
KEY_MASCULINE = 0x00BA,
KEY_GUILLEMOTRIGHT = 0x00BB,
KEY_ONEQUARTER = 0x00BC,
KEY_ONEHALF = 0x00BD,
KEY_THREEQUARTERS = 0x00BE,
KEY_QUESTIONDOWN = 0x00BF,
KEY_AGRAVE = 0x00C0,
KEY_AACUTE = 0x00C1,
KEY_ACIRCUMFLEX = 0x00C2,
KEY_ATILDE = 0x00C3,
KEY_ADIAERESIS = 0x00C4,
KEY_ARING = 0x00C5,
KEY_AE = 0x00C6,
KEY_CCEDILLA = 0x00C7,
KEY_EGRAVE = 0x00C8,
KEY_EACUTE = 0x00C9,
KEY_ECIRCUMFLEX = 0x00CA,
KEY_EDIAERESIS = 0x00CB,
KEY_IGRAVE = 0x00CC,
KEY_IACUTE = 0x00CD,
KEY_ICIRCUMFLEX = 0x00CE,
KEY_IDIAERESIS = 0x00CF,
KEY_ETH = 0x00D0,
KEY_NTILDE = 0x00D1,
KEY_OGRAVE = 0x00D2,
KEY_OACUTE = 0x00D3,
KEY_OCIRCUMFLEX = 0x00D4,
KEY_OTILDE = 0x00D5,
KEY_ODIAERESIS = 0x00D6,
KEY_MULTIPLY = 0x00D7,
KEY_OOBLIQUE = 0x00D8,
KEY_UGRAVE = 0x00D9,
KEY_UACUTE = 0x00DA,
KEY_UCIRCUMFLEX = 0x00DB,
KEY_UDIAERESIS = 0x00DC,
KEY_YACUTE = 0x00DD,
KEY_THORN = 0x00DE,
KEY_SSHARP = 0x00DF,
COLON = 0x003A,
SEMICOLON = 0x003B,
LESS = 0x003C,
EQUAL = 0x003D,
GREATER = 0x003E,
QUESTION = 0x003F,
AT = 0x0040,
A = 0x0041,
B = 0x0042,
C = 0x0043,
D = 0x0044,
E = 0x0045,
F = 0x0046,
G = 0x0047,
H = 0x0048,
I = 0x0049,
J = 0x004A,
K = 0x004B,
L = 0x004C,
M = 0x004D,
N = 0x004E,
O = 0x004F,
P = 0x0050,
Q = 0x0051,
R = 0x0052,
S = 0x0053,
T = 0x0054,
U = 0x0055,
V = 0x0056,
W = 0x0057,
X = 0x0058,
Y = 0x0059,
Z = 0x005A,
BRACKETLEFT = 0x005B,
BACKSLASH = 0x005C,
BRACKETRIGHT = 0x005D,
ASCIICIRCUM = 0x005E,
UNDERSCORE = 0x005F,
QUOTELEFT = 0x0060,
BRACELEFT = 0x007B,
BAR = 0x007C,
BRACERIGHT = 0x007D,
ASCIITILDE = 0x007E,
NOBREAKSPACE = 0x00A0,
EXCLAMDOWN = 0x00A1,
CENT = 0x00A2,
STERLING = 0x00A3,
CURRENCY = 0x00A4,
YEN = 0x00A5,
BROKENBAR = 0x00A6,
SECTION = 0x00A7,
DIAERESIS = 0x00A8,
COPYRIGHT = 0x00A9,
ORDFEMININE = 0x00AA,
GUILLEMOTLEFT = 0x00AB,
NOTSIGN = 0x00AC,
HYPHEN = 0x00AD,
KEY_REGISTERED = 0x00AE, // "REGISTERED" is a reserved word on Windows.
MACRON = 0x00AF,
DEGREE = 0x00B0,
PLUSMINUS = 0x00B1,
TWOSUPERIOR = 0x00B2,
THREESUPERIOR = 0x00B3,
ACUTE = 0x00B4,
MU = 0x00B5,
PARAGRAPH = 0x00B6,
PERIODCENTERED = 0x00B7,
CEDILLA = 0x00B8,
ONESUPERIOR = 0x00B9,
MASCULINE = 0x00BA,
GUILLEMOTRIGHT = 0x00BB,
ONEQUARTER = 0x00BC,
ONEHALF = 0x00BD,
THREEQUARTERS = 0x00BE,
QUESTIONDOWN = 0x00BF,
AGRAVE = 0x00C0,
AACUTE = 0x00C1,
ACIRCUMFLEX = 0x00C2,
ATILDE = 0x00C3,
ADIAERESIS = 0x00C4,
ARING = 0x00C5,
AE = 0x00C6,
CCEDILLA = 0x00C7,
EGRAVE = 0x00C8,
EACUTE = 0x00C9,
ECIRCUMFLEX = 0x00CA,
EDIAERESIS = 0x00CB,
IGRAVE = 0x00CC,
IACUTE = 0x00CD,
ICIRCUMFLEX = 0x00CE,
IDIAERESIS = 0x00CF,
ETH = 0x00D0,
NTILDE = 0x00D1,
OGRAVE = 0x00D2,
OACUTE = 0x00D3,
OCIRCUMFLEX = 0x00D4,
OTILDE = 0x00D5,
ODIAERESIS = 0x00D6,
MULTIPLY = 0x00D7,
OOBLIQUE = 0x00D8,
UGRAVE = 0x00D9,
UACUTE = 0x00DA,
UCIRCUMFLEX = 0x00DB,
UDIAERESIS = 0x00DC,
YACUTE = 0x00DD,
THORN = 0x00DE,
SSHARP = 0x00DF,
KEY_DIVISION = 0x00F7,
KEY_YDIAERESIS = 0x00FF,
DIVISION = 0x00F7,
YDIAERESIS = 0x00FF,
END_LATIN1 = 0x0100,
};
enum KeyModifierMask {
KEY_CODE_MASK = ((1 << 25) - 1), ///< Apply this mask to any keycode to remove modifiers.
KEY_MODIFIER_MASK = (0xFF << 24), ///< Apply this mask to isolate modifiers.
KEY_MASK_SHIFT = (1 << 25),
KEY_MASK_ALT = (1 << 26),
KEY_MASK_META = (1 << 27),
KEY_MASK_CTRL = (1 << 28),
enum class KeyModifierMask {
CODE_MASK = ((1 << 25) - 1), ///< Apply this mask to any keycode to remove modifiers.
MODIFIER_MASK = (0xFF << 24), ///< Apply this mask to isolate modifiers.
SHIFT = (1 << 25),
ALT = (1 << 26),
META = (1 << 27),
CTRL = (1 << 28),
#ifdef APPLE_STYLE_KEYS
KEY_MASK_CMD = KEY_MASK_META,
CMD = META,
#else
KEY_MASK_CMD = KEY_MASK_CTRL,
CMD = CTRL,
#endif
KEY_MASK_KPAD = (1 << 29),
KEY_MASK_GROUP_SWITCH = (1 << 30)
// bit 31 can't be used because variant uses regular 32 bits int as datatype
KPAD = (1 << 29),
GROUP_SWITCH = (1 << 30)
};
// To avoid having unnecessary operators, only define the ones that are needed.
@ -325,10 +318,26 @@ inline Key &operator-=(Key &a, int b) {
return (Key &)((int &)a -= b);
}
inline Key operator+(Key a, int b) {
return (Key)((int)a + (int)b);
}
inline Key operator+(Key a, Key b) {
return (Key)((int)a + (int)b);
}
inline Key operator-(Key a, Key b) {
return (Key)((int)a - (int)b);
}
inline Key operator&(Key a, Key b) {
return (Key)((int)a & (int)b);
}
inline Key operator|(Key a, Key b) {
return (Key)((int)a | (int)b);
}
inline Key &operator|=(Key &a, Key b) {
return (Key &)((int &)a |= (int)b);
}
@ -337,6 +346,10 @@ inline Key &operator|=(Key &a, KeyModifierMask b) {
return (Key &)((int &)a |= (int)b);
}
inline Key &operator&=(Key &a, KeyModifierMask b) {
return (Key &)((int &)a &= (int)b);
}
inline Key operator|(Key a, KeyModifierMask b) {
return (Key)((int)a | (int)b);
}
@ -361,10 +374,10 @@ inline KeyModifierMask operator|(KeyModifierMask a, KeyModifierMask b) {
return (KeyModifierMask)((int)a | (int)b);
}
String keycode_get_string(uint32_t p_code);
bool keycode_has_unicode(uint32_t p_keycode);
int find_keycode(const String &p_code);
const char *find_keycode_name(int p_keycode);
String keycode_get_string(Key p_code);
bool keycode_has_unicode(Key p_keycode);
Key find_keycode(const String &p_code);
const char *find_keycode_name(Key p_keycode);
int keycode_get_count();
int keycode_get_value_by_index(int p_index);
const char *keycode_get_name_by_index(int p_index);

View file

@ -68,46 +68,46 @@ void MIDIDriver::receive_input_packet(uint64_t timestamp, uint8_t *data, uint32_
}
switch (event->get_message()) {
case MIDI_MESSAGE_AFTERTOUCH:
case MIDIMessage::AFTERTOUCH:
if (length >= 2 + param_position) {
event->set_pitch(data[param_position]);
event->set_pressure(data[param_position + 1]);
}
break;
case MIDI_MESSAGE_CONTROL_CHANGE:
case MIDIMessage::CONTROL_CHANGE:
if (length >= 2 + param_position) {
event->set_controller_number(data[param_position]);
event->set_controller_value(data[param_position + 1]);
}
break;
case MIDI_MESSAGE_NOTE_ON:
case MIDI_MESSAGE_NOTE_OFF:
case MIDIMessage::NOTE_ON:
case MIDIMessage::NOTE_OFF:
if (length >= 2 + param_position) {
event->set_pitch(data[param_position]);
event->set_velocity(data[param_position + 1]);
if (event->get_message() == MIDI_MESSAGE_NOTE_ON && event->get_velocity() == 0) {
if (event->get_message() == MIDIMessage::NOTE_ON && event->get_velocity() == 0) {
// https://www.midi.org/forum/228-writing-midi-software-send-note-off,-or-zero-velocity-note-on
event->set_message(MIDI_MESSAGE_NOTE_OFF);
event->set_message(MIDIMessage::NOTE_OFF);
}
}
break;
case MIDI_MESSAGE_PITCH_BEND:
case MIDIMessage::PITCH_BEND:
if (length >= 2 + param_position) {
event->set_pitch((data[param_position + 1] << 7) | data[param_position]);
}
break;
case MIDI_MESSAGE_PROGRAM_CHANGE:
case MIDIMessage::PROGRAM_CHANGE:
if (length >= 1 + param_position) {
event->set_instrument(data[param_position]);
}
break;
case MIDI_MESSAGE_CHANNEL_PRESSURE:
case MIDIMessage::CHANNEL_PRESSURE:
if (length >= 1 + param_position) {
event->set_pressure(data[param_position]);
}

View file

@ -952,10 +952,6 @@ const char32_t *String::get_data() const {
return size() ? &operator[](0) : &zero;
}
void String::erase(int p_pos, int p_chars) {
*this = left(MAX(p_pos, 0)) + substr(p_pos + p_chars, length() - ((p_pos + p_chars)));
}
String String::capitalize() const {
String aux = this->camelcase_to_underscore(true).replace("_", " ").strip_edges();
String cap;
@ -4420,7 +4416,7 @@ String String::property_name_encode() const {
// as well as '"', '=' or ' ' (32)
const char32_t *cstr = get_data();
for (int i = 0; cstr[i]; i++) {
if (cstr[i] == '=' || cstr[i] == '"' || cstr[i] < 33 || cstr[i] > 126) {
if (cstr[i] == '=' || cstr[i] == '"' || cstr[i] == ';' || cstr[i] == '[' || cstr[i] == ']' || cstr[i] < 33 || cstr[i] > 126) {
return "\"" + c_escape_multiline() + "\"";
}
}

View file

@ -80,7 +80,7 @@ struct VariantCaster<const T &> {
} \
typedef int64_t EncodeT; \
_FORCE_INLINE_ static void encode(m_enum p_val, const void *p_ptr) { \
*(int64_t *)p_ptr = p_val; \
*(int64_t *)p_ptr = (int64_t)p_val; \
} \
};

View file

@ -31,6 +31,7 @@
#ifndef VARIANT_H
#define VARIANT_H
#include "core/input/input_enums.h"
#include "core/io/ip_address.h"
#include "core/math/aabb.h"
#include "core/math/basis.h"
@ -43,6 +44,7 @@
#include "core/math/vector3.h"
#include "core/math/vector3i.h"
#include "core/object/object_id.h"
#include "core/os/keyboard.h"
#include "core/string/node_path.h"
#include "core/string/ustring.h"
#include "core/templates/rid.h"
@ -430,6 +432,21 @@ public:
Variant(const IPAddress &p_address);
#define VARIANT_ENUM_CLASS_CONSTRUCTOR(m_enum) \
Variant(const m_enum &p_value) { \
type = INT; \
_data._int = (int64_t)p_value; \
}
// Only enum classes that need to be bound need this to be defined.
VARIANT_ENUM_CLASS_CONSTRUCTOR(JoyAxis)
VARIANT_ENUM_CLASS_CONSTRUCTOR(JoyButton)
VARIANT_ENUM_CLASS_CONSTRUCTOR(Key)
VARIANT_ENUM_CLASS_CONSTRUCTOR(MIDIMessage)
VARIANT_ENUM_CLASS_CONSTRUCTOR(MouseButton)
#undef VARIANT_ENUM_CLASS_CONSTRUCTOR
// If this changes the table in variant_op must be updated
enum Operator {
//comparison

View file

@ -1412,8 +1412,6 @@ static void _register_variant_builtin_methods() {
bind_method(String, plus_file, sarray("file"), varray());
bind_method(String, unicode_at, sarray("at"), varray());
bind_method(String, dedent, sarray(), varray());
// FIXME: String needs to be immutable when binding
//bind_method(String, erase, sarray("position", "chars"), varray());
bind_method(String, hash, sarray(), varray());
bind_method(String, md5_text, sarray(), varray());
bind_method(String, sha1_text, sarray(), varray());
@ -1422,8 +1420,6 @@ static void _register_variant_builtin_methods() {
bind_method(String, sha1_buffer, sarray(), varray());
bind_method(String, sha256_buffer, sarray(), varray());
bind_method(String, is_empty, sarray(), varray());
// FIXME: Static function, not sure how to bind
//bind_method(String, humanize_size, sarray("size"), varray());
bind_method(String, is_absolute_path, sarray(), varray());
bind_method(String, is_relative_path, sarray(), varray());
@ -1635,17 +1631,15 @@ static void _register_variant_builtin_methods() {
bind_method(Color, to_argb64, sarray(), varray());
bind_method(Color, to_abgr64, sarray(), varray());
bind_method(Color, to_rgba64, sarray(), varray());
bind_method(Color, to_html, sarray("with_alpha"), varray(true));
bind_method(Color, clamp, sarray("min", "max"), varray(Color(0, 0, 0, 0), Color(1, 1, 1, 1)));
bind_method(Color, inverted, sarray(), varray());
bind_method(Color, lerp, sarray("to", "weight"), varray());
bind_method(Color, lightened, sarray("amount"), varray());
bind_method(Color, darkened, sarray("amount"), varray());
bind_method(Color, to_html, sarray("with_alpha"), varray(true));
bind_method(Color, blend, sarray("over"), varray());
// FIXME: Color is immutable, need to probably find a way to do this via constructor
//ADDFUNC4R(COLOR, COLOR, Color, from_hsv, FLOAT, "h", FLOAT, "s", FLOAT, "v", FLOAT, "a", varray(1.0));
bind_method(Color, is_equal_approx, sarray("to"), varray());
bind_static_method(Color, hex, sarray("hex"), varray());
@ -1657,6 +1651,7 @@ static void _register_variant_builtin_methods() {
bind_static_method(Color, get_named_color_name, sarray("idx"), varray());
bind_static_method(Color, get_named_color, sarray("idx"), varray());
bind_static_method(Color, from_string, sarray("str", "default"), varray());
bind_static_method(Color, from_hsv, sarray("h", "s", "v", "alpha"), varray(1.0));
bind_static_method(Color, from_rgbe9995, sarray("rgbe"), varray());
/* RID */

View file

@ -1251,7 +1251,7 @@
<constant name="INLINE_ALIGN_BOTTOM" value="14" enum="InlineAlign">
Aligns bottom of the inline object (e.g. image, table) to the bottom of the text. Equvalent to [code]INLINE_ALIGN_BOTTOM_TO | INLINE_ALIGN_TO_BOTTOM[/code].
</constant>
<constant name="SPKEY" value="16777216">
<constant name="KEY_SPECIAL" value="16777216" enum="Key">
Keycodes with this bit applied are non-printable.
</constant>
<constant name="KEY_ESCAPE" value="16777217" enum="Key">
@ -2016,12 +2016,6 @@
<constant name="MOUSE_BUTTON_MIDDLE" value="3" enum="MouseButton">
Middle mouse button.
</constant>
<constant name="MOUSE_BUTTON_XBUTTON1" value="8" enum="MouseButton">
Extra mouse button 1 (only present on some mice).
</constant>
<constant name="MOUSE_BUTTON_XBUTTON2" value="9" enum="MouseButton">
Extra mouse button 2 (only present on some mice).
</constant>
<constant name="MOUSE_BUTTON_WHEEL_UP" value="4" enum="MouseButton">
Mouse wheel up.
</constant>
@ -2034,6 +2028,12 @@
<constant name="MOUSE_BUTTON_WHEEL_RIGHT" value="7" enum="MouseButton">
Mouse wheel right button (only present on some mice).
</constant>
<constant name="MOUSE_BUTTON_XBUTTON1" value="8" enum="MouseButton">
Extra mouse button 1 (only present on some mice).
</constant>
<constant name="MOUSE_BUTTON_XBUTTON2" value="9" enum="MouseButton">
Extra mouse button 2 (only present on some mice).
</constant>
<constant name="MOUSE_BUTTON_MASK_LEFT" value="1" enum="MouseButton">
Left mouse button mask.
</constant>

View file

@ -54,7 +54,22 @@
<return type="AABB" />
<argument index="0" name="to_point" type="Vector3" />
<description>
Returns this [AABB] expanded to include a given point.
Returns a copy of this [AABB] expanded to include a given point.
[b]Example:[/b]
[codeblocks]
[gdscript]
# position (-3, 2, 0), size (1, 1, 1)
var box = AABB(Vector3(-3, 2, 0), Vector3(1, 1, 1))
# position (-3, -1, 0), size (3, 4, 2), so we fit both the original AABB and Vector3(0, -1, 2)
var box2 = box.expand(Vector3(0, -1, 2))
[/gdscript]
[csharp]
// position (-3, 2, 0), size (1, 1, 1)
var box = new AABB(new Vector3(-3, 2, 0), new Vector3(1, 1, 1));
// position (-3, -1, 0), size (3, 4, 2), so we fit both the original AABB and Vector3(0, -1, 2)
var box2 = box.Expand(new Vector3(0, -1, 2));
[/csharp]
[/codeblocks]
</description>
</method>
<method name="get_center" qualifiers="const">

View file

@ -50,6 +50,9 @@
The rate at which objects stop spinning in this area. Represents the angular velocity lost per second.
See [member ProjectSettings.physics/2d/default_angular_damp] for more details about damping.
</member>
<member name="angular_damp_space_override" type="int" setter="set_angular_damp_space_override_mode" getter="get_angular_damp_space_override_mode" enum="Area2D.SpaceOverride" default="0">
Override mode for angular damping calculations within this area. See [enum SpaceOverride] for possible values.
</member>
<member name="audio_bus_name" type="StringName" setter="set_audio_bus_name" getter="get_audio_bus_name" default="&amp;&quot;Master&quot;">
The name of the area's audio bus.
</member>
@ -57,21 +60,30 @@
If [code]true[/code], the area's audio bus overrides the default audio bus.
</member>
<member name="gravity" type="float" setter="set_gravity" getter="get_gravity" default="980.0">
The area's gravity intensity (in pixels per second squared). This value multiplies the gravity vector. This is useful to alter the force of gravity without altering its direction.
The area's gravity intensity (in pixels per second squared). This value multiplies the gravity direction. This is useful to alter the force of gravity without altering its direction.
</member>
<member name="gravity_distance_scale" type="float" setter="set_gravity_distance_scale" getter="get_gravity_distance_scale" default="0.0">
The falloff factor for point gravity. The greater the value, the faster gravity decreases with distance.
<member name="gravity_direction" type="Vector2" setter="set_gravity_direction" getter="get_gravity_direction" default="Vector2(0, 1)">
The area's gravity vector (not normalized).
</member>
<member name="gravity_point" type="bool" setter="set_gravity_is_point" getter="is_gravity_a_point" default="false">
If [code]true[/code], gravity is calculated from a point (set via [member gravity_vec]). See also [member space_override].
If [code]true[/code], gravity is calculated from a point (set via [member gravity_point_center]). See also [member gravity_space_override].
</member>
<member name="gravity_vec" type="Vector2" setter="set_gravity_vector" getter="get_gravity_vector" default="Vector2(0, 1)">
The area's gravity vector (not normalized). If gravity is a point (see [member gravity_point]), this will be the point of attraction.
<member name="gravity_point_center" type="Vector2" setter="set_gravity_point_center" getter="get_gravity_point_center" default="Vector2(0, 1)">
If gravity is a point (see [member gravity_point]), this will be the point of attraction.
</member>
<member name="gravity_point_distance_scale" type="float" setter="set_gravity_point_distance_scale" getter="get_gravity_point_distance_scale" default="0.0">
The falloff factor for point gravity. The greater the value, the faster gravity decreases with distance.
</member>
<member name="gravity_space_override" type="int" setter="set_gravity_space_override_mode" getter="get_gravity_space_override_mode" enum="Area2D.SpaceOverride" default="0">
Override mode for gravity calculations within this area. See [enum SpaceOverride] for possible values.
</member>
<member name="linear_damp" type="float" setter="set_linear_damp" getter="get_linear_damp" default="0.1">
The rate at which objects stop moving in this area. Represents the linear velocity lost per second.
See [member ProjectSettings.physics/2d/default_linear_damp] for more details about damping.
</member>
<member name="linear_damp_space_override" type="int" setter="set_linear_damp_space_override_mode" getter="get_linear_damp_space_override_mode" enum="Area2D.SpaceOverride" default="0">
Override mode for linear damping calculations within this area. See [enum SpaceOverride] for possible values.
</member>
<member name="monitorable" type="bool" setter="set_monitorable" getter="is_monitorable" default="true">
If [code]true[/code], other monitoring areas can detect this area.
</member>
@ -81,9 +93,6 @@
<member name="priority" type="float" setter="set_priority" getter="get_priority" default="0.0">
The area's priority. Higher priority areas are processed first.
</member>
<member name="space_override" type="int" setter="set_space_override_mode" getter="get_space_override_mode" enum="Area2D.SpaceOverride" default="0">
Override mode for gravity and damping calculations within this area. See [enum SpaceOverride] for possible values.
</member>
</members>
<signals>
<signal name="area_entered">

View file

@ -48,6 +48,9 @@
The rate at which objects stop spinning in this area. Represents the angular velocity lost per second.
See [member ProjectSettings.physics/3d/default_angular_damp] for more details about damping.
</member>
<member name="angular_damp_space_override" type="int" setter="set_angular_damp_space_override_mode" getter="get_angular_damp_space_override_mode" enum="Area3D.SpaceOverride" default="0">
Override mode for angular damping calculations within this area. See [enum SpaceOverride] for possible values.
</member>
<member name="audio_bus_name" type="StringName" setter="set_audio_bus_name" getter="get_audio_bus_name" default="&amp;&quot;Master&quot;">
The name of the area's audio bus.
</member>
@ -55,21 +58,30 @@
If [code]true[/code], the area's audio bus overrides the default audio bus.
</member>
<member name="gravity" type="float" setter="set_gravity" getter="get_gravity" default="9.8">
The area's gravity intensity (in meters per second squared). This value multiplies the gravity vector. This is useful to alter the force of gravity without altering its direction.
The area's gravity intensity (in meters per second squared). This value multiplies the gravity direction. This is useful to alter the force of gravity without altering its direction.
</member>
<member name="gravity_distance_scale" type="float" setter="set_gravity_distance_scale" getter="get_gravity_distance_scale" default="0.0">
The falloff factor for point gravity. The greater the value, the faster gravity decreases with distance.
<member name="gravity_direction" type="Vector3" setter="set_gravity_direction" getter="get_gravity_direction" default="Vector3(0, -1, 0)">
The area's gravity vector (not normalized).
</member>
<member name="gravity_point" type="bool" setter="set_gravity_is_point" getter="is_gravity_a_point" default="false">
If [code]true[/code], gravity is calculated from a point (set via [member gravity_vec]). See also [member space_override].
If [code]true[/code], gravity is calculated from a point (set via [member gravity_point_center]). See also [member gravity_space_override].
</member>
<member name="gravity_vec" type="Vector3" setter="set_gravity_vector" getter="get_gravity_vector" default="Vector3(0, -1, 0)">
The area's gravity vector (not normalized). If gravity is a point (see [member gravity_point]), this will be the point of attraction.
<member name="gravity_point_center" type="Vector3" setter="set_gravity_point_center" getter="get_gravity_point_center" default="Vector3(0, -1, 0)">
If gravity is a point (see [member gravity_point]), this will be the point of attraction.
</member>
<member name="gravity_point_distance_scale" type="float" setter="set_gravity_point_distance_scale" getter="get_gravity_point_distance_scale" default="0.0">
The falloff factor for point gravity. The greater the value, the faster gravity decreases with distance.
</member>
<member name="gravity_space_override" type="int" setter="set_gravity_space_override_mode" getter="get_gravity_space_override_mode" enum="Area3D.SpaceOverride" default="0">
Override mode for gravity calculations within this area. See [enum SpaceOverride] for possible values.
</member>
<member name="linear_damp" type="float" setter="set_linear_damp" getter="get_linear_damp" default="0.1">
The rate at which objects stop moving in this area. Represents the linear velocity lost per second.
See [member ProjectSettings.physics/3d/default_linear_damp] for more details about damping.
</member>
<member name="linear_damp_space_override" type="int" setter="set_linear_damp_space_override_mode" getter="get_linear_damp_space_override_mode" enum="Area3D.SpaceOverride" default="0">
Override mode for linear damping calculations within this area. See [enum SpaceOverride] for possible values.
</member>
<member name="monitorable" type="bool" setter="set_monitorable" getter="is_monitorable" default="true">
If [code]true[/code], other monitoring areas can detect this area.
</member>
@ -91,9 +103,6 @@
<member name="reverb_bus_uniformity" type="float" setter="set_reverb_uniformity" getter="get_reverb_uniformity" default="0.0">
The degree to which this area's reverb is a uniform effect. Ranges from [code]0[/code] to [code]1[/code] with [code]0.1[/code] precision.
</member>
<member name="space_override" type="int" setter="set_space_override_mode" getter="get_space_override_mode" enum="Area3D.SpaceOverride" default="0">
Override mode for gravity and damping calculations within this area. See [enum SpaceOverride] for possible values.
</member>
<member name="wind_attenuation_factor" type="float" setter="set_wind_attenuation_factor" getter="get_wind_attenuation_factor" default="0.0">
The exponential rate at which wind force decreases with distance from its origin.
</member>

View file

@ -477,15 +477,19 @@
[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm expects a deterministic result. Doing so will result in unexpected behavior.
[codeblocks]
[gdscript]
class MyCustomSorter:
static func sort_ascending(a, b):
if a[0] &lt; b[0]:
return true
return false
func sort_ascending(a, b):
if a[0] &lt; b[0]:
return true
return false
var my_items = [[5, "Potato"], [9, "Rice"], [4, "Tomato"]]
my_items.sort_custom(MyCustomSorter.sort_ascending)
print(my_items) # Prints [[4, Tomato], [5, Potato], [9, Rice]].
func _ready():
var my_items = [[5, "Potato"], [9, "Rice"], [4, "Tomato"]]
my_items.sort_custom(sort_ascending)
print(my_items) # Prints [[4, Tomato], [5, Potato], [9, Rice]].
# Descending, lambda version.
my_items.sort_custom(func(a, b): return a[0] &gt; b[0])
print(my_items) # Prints [[9, Rice], [5, Potato], [4, Tomato]].
[/gdscript]
[csharp]
// There is no custom sort support for Godot.Collections.Array

View file

@ -50,7 +50,7 @@
<member name="button_group" type="ButtonGroup" setter="set_button_group" getter="get_button_group">
The [ButtonGroup] associated with the button. Not to be confused with node groups.
</member>
<member name="button_mask" type="int" setter="set_button_mask" getter="get_button_mask" default="1">
<member name="button_mask" type="int" setter="set_button_mask" getter="get_button_mask" enum="MouseButton" default="1">
Binary mask to choose which mouse buttons this button will respond to.
To allow both left-click and right-click, use [code]MOUSE_BUTTON_MASK_LEFT | MOUSE_BUTTON_MASK_RIGHT[/code].
</member>

View file

@ -147,6 +147,24 @@
<description>
</description>
</method>
<method name="from_hsv" qualifiers="static">
<return type="Color" />
<argument index="0" name="h" type="float" />
<argument index="1" name="s" type="float" />
<argument index="2" name="v" type="float" />
<argument index="3" name="alpha" type="float" default="1.0" />
<description>
Constructs a color from an [url=https://en.wikipedia.org/wiki/HSL_and_HSV]HSV profile[/url]. [code]h[/code] (hue), [code]s[/code] (saturation), and [code]v[/code] (value) are typically between 0 and 1.
[codeblocks]
[gdscript]
var c = Color.from_hsv(0.58, 0.5, 0.79, 0.8)
[/gdscript]
[csharp]
var c = Color.FromHsv(0.58f, 0.5f, 0.79f, 0.8f);
[/csharp]
[/codeblocks]
</description>
</method>
<method name="from_rgbe9995" qualifiers="static">
<return type="Color" />
<argument index="0" name="rgbe" type="int" />

View file

@ -25,8 +25,9 @@
</method>
<method name="_parse_begin" qualifiers="virtual">
<return type="void" />
<argument index="0" name="object" type="Object" />
<description>
Called to allow adding controls at the beginning of the list.
Called to allow adding controls at the beginning of the property list for [code]object[/code].
</description>
</method>
<method name="_parse_category" qualifiers="virtual">
@ -34,12 +35,22 @@
<argument index="0" name="object" type="Object" />
<argument index="1" name="category" type="String" />
<description>
Called to allow adding controls at the beginning of a category in the property list for [code]object[/code].
</description>
</method>
<method name="_parse_end" qualifiers="virtual">
<return type="void" />
<argument index="0" name="object" type="Object" />
<description>
Called to allow adding controls at the end of the list.
Called to allow adding controls at the end of the property list for [code]object[/code].
</description>
</method>
<method name="_parse_group" qualifiers="virtual">
<return type="void" />
<argument index="0" name="object" type="Object" />
<argument index="1" name="group" type="String" />
<description>
Called to allow adding controls at the beginning of a group or a sub-group in the property list for [code]object[/code].
</description>
</method>
<method name="_parse_property" qualifiers="virtual">
@ -52,7 +63,7 @@
<argument index="5" name="usage_flags" type="int" />
<argument index="6" name="wide" type="bool" />
<description>
Called to allow adding property specific editors to the inspector. Usually these inherit [EditorProperty]. Returning [code]true[/code] removes the built-in editor for this property, otherwise allows to insert a custom editor before the built-in one.
Called to allow adding property-specific editors to the property list for [code]object[/code]. The added editor control must extend [EditorProperty]. Returning [code]true[/code] removes the built-in editor for this property, otherwise allows to insert a custom editor before the built-in one.
</description>
</method>
<method name="add_custom_control">

View file

@ -155,7 +155,7 @@
</description>
</method>
<method name="get_mouse_button_mask" qualifiers="const">
<return type="int" />
<return type="int" enum="MouseButton" />
<description>
Returns mouse buttons as a bitmask. If multiple mouse buttons are pressed at the same time, the bits are added together.
</description>

View file

@ -11,14 +11,14 @@
</tutorials>
<methods>
<method name="get_keycode_with_modifiers" qualifiers="const">
<return type="int" />
<return type="int" enum="Key" />
<description>
Returns the keycode combined with modifier keys such as [kbd]Shift[/kbd] or [kbd]Alt[/kbd]. See also [InputEventWithModifiers].
To get a human-readable representation of the [InputEventKey] with modifiers, use [code]OS.get_keycode_string(event.get_keycode_with_modifiers())[/code] where [code]event[/code] is the [InputEventKey].
</description>
</method>
<method name="get_physical_keycode_with_modifiers" qualifiers="const">
<return type="int" />
<return type="int" enum="Key" />
<description>
Returns the physical keycode combined with modifier keys such as [kbd]Shift[/kbd] or [kbd]Alt[/kbd]. See also [InputEventWithModifiers].
To get a human-readable representation of the [InputEventKey] with modifiers, use [code]OS.get_keycode_string(event.get_physical_keycode_with_modifiers())[/code] where [code]event[/code] is the [InputEventKey].

View file

@ -10,7 +10,7 @@
<link title="InputEvent">https://docs.godotengine.org/en/latest/tutorials/inputs/inputevent.html</link>
</tutorials>
<members>
<member name="button_mask" type="int" setter="set_button_mask" getter="get_button_mask" default="0">
<member name="button_mask" type="int" setter="set_button_mask" getter="get_button_mask" enum="MouseButton" default="0">
The mouse button mask identifier, one of or a bitwise combination of the [enum MouseButton] button masks.
</member>
<member name="global_position" type="Vector2" setter="set_global_position" getter="get_global_position" default="Vector2(0, 0)">

View file

@ -28,7 +28,7 @@
var polygon = NavigationPolygon.new()
var vertices = PackedVector2Array([Vector2(0, 0), Vector2(0, 50), Vector2(50, 50), Vector2(50, 0)])
polygon.vertices = vertices
var indices = PackedInt32Array(0, 3, 1)
var indices = PackedInt32Array([0, 1, 2, 3])
polygon.add_polygon(indices)
$NavigationRegion2D.navpoly = polygon
[/gdscript]
@ -36,7 +36,7 @@
var polygon = new NavigationPolygon();
var vertices = new Vector2[] { new Vector2(0, 0), new Vector2(0, 50), new Vector2(50, 50), new Vector2(50, 0) };
polygon.Vertices = vertices;
var indices = new int[] { 0, 3, 1 };
var indices = new int[] { 0, 1, 2, 3 };
polygon.AddPolygon(indices);
GetNode&lt;NavigationRegion2D&gt;("NavigationRegion2D").Navpoly = polygon;
[/csharp]

View file

@ -228,11 +228,6 @@
If [code]include_internal[/code] is [code]false[/code], the returned array won't include internal children (see [code]internal[/code] parameter in [method add_child]).
</description>
</method>
<method name="get_editor_description" qualifiers="const">
<return type="String" />
<description>
</description>
</method>
<method name="get_groups" qualifiers="const">
<return type="Array" />
<description>
@ -618,12 +613,6 @@
Sets the editable children state of [code]node[/code] relative to this node. This method is only intended for use with editor tooling.
</description>
</method>
<method name="set_editor_description">
<return type="void" />
<argument index="0" name="editor_description" type="String" />
<description>
</description>
</method>
<method name="set_multiplayer_authority">
<return type="void" />
<argument index="0" name="id" type="int" />
@ -702,6 +691,9 @@
<member name="custom_multiplayer" type="MultiplayerAPI" setter="set_custom_multiplayer" getter="get_custom_multiplayer">
The override to the default [MultiplayerAPI]. Set to [code]null[/code] to use the default [SceneTree] one.
</member>
<member name="editor_description" type="String" setter="set_editor_description" getter="get_editor_description" default="&quot;&quot;">
Add a custom description to a node.
</member>
<member name="multiplayer" type="MultiplayerAPI" setter="" getter="get_multiplayer">
The [MultiplayerAPI] instance associated with this node. Either the [member custom_multiplayer], or the default SceneTree one (if inside tree).
</member>

View file

@ -133,7 +133,7 @@
</description>
</method>
<method name="find_keycode_from_string" qualifiers="const">
<return type="int" />
<return type="int" enum="Key" />
<argument index="0" name="string" type="String" />
<description>
Returns the keycode of the given string (e.g. "Escape").
@ -222,7 +222,7 @@
</method>
<method name="get_keycode_string" qualifiers="const">
<return type="String" />
<argument index="0" name="code" type="int" />
<argument index="0" name="code" type="int" enum="Key" />
<description>
Returns the given keycode as a string (e.g. Return values: [code]"Escape"[/code], [code]"Shift+Escape"[/code]).
See also [member InputEventKey.keycode] and [method InputEventKey.get_keycode_with_modifiers].

View file

@ -30,7 +30,7 @@
<argument index="2" name="safe_margin" type="float" default="0.08" />
<description>
Moves the body along the vector [code]linear_velocity[/code]. This method should be used in [method Node._physics_process] (or in a method called by [method Node._physics_process]), as it uses the physics step's [code]delta[/code] value automatically in calculations. Otherwise, the simulation will run at an incorrect speed.
The body will stop if it collides. Returns a [KinematicCollision2D], which contains information about the collision.
The body will stop if it collides. Returns a [KinematicCollision2D], which contains information about the collision when stopped, or when touching another body along the motion.
If [code]test_only[/code] is [code]true[/code], the body does not move but the would-be collision information is given.
[code]safe_margin[/code] is the extra margin used for collision recovery (see [member CharacterBody2D.collision/safe_margin] for more details).
</description>
@ -50,8 +50,8 @@
<argument index="3" name="safe_margin" type="float" default="0.08" />
<description>
Checks for collisions without moving the body. This method should be used in [method Node._physics_process] (or in a method called by [method Node._physics_process]), as it uses the physics step's [code]delta[/code] value automatically in calculations. Otherwise, the simulation will run at an incorrect speed.
Virtually sets the node's position, scale and rotation to that of the given [Transform2D], then tries to move the body along the vector [code]linear_velocity[/code]. Returns [code]true[/code] if a collision would occur.
[code]collision[/code] is an optional object of type [KinematicCollision2D], which contains additional information about the collision (should there be one).
Virtually sets the node's position, scale and rotation to that of the given [Transform2D], then tries to move the body along the vector [code]linear_velocity[/code]. Returns [code]true[/code] if a collision would stop the body from moving along the whole path.
[code]collision[/code] is an optional object of type [KinematicCollision2D], which contains additional information about the collision when stopped, or when touching another body along the motion.
[code]safe_margin[/code] is the extra margin used for collision recovery (see [member CharacterBody2D.collision/safe_margin] for more details).
</description>
</method>

View file

@ -38,7 +38,7 @@
<argument index="3" name="max_collisions" type="int" default="1" />
<description>
Moves the body along the vector [code]linear_velocity[/code]. This method should be used in [method Node._physics_process] (or in a method called by [method Node._physics_process]), as it uses the physics step's [code]delta[/code] value automatically in calculations. Otherwise, the simulation will run at an incorrect speed.
The body will stop if it collides. Returns a [KinematicCollision3D], which contains information about the collision.
The body will stop if it collides. Returns a [KinematicCollision3D], which contains information about the collision when stopped, or when touching another body along the motion.
If [code]test_only[/code] is [code]true[/code], the body does not move but the would-be collision information is given.
[code]safe_margin[/code] is the extra margin used for collision recovery (see [member CharacterBody3D.collision/safe_margin] for more details).
[code]max_collisions[/code] allows to retrieve more than one collision result.
@ -68,8 +68,8 @@
<argument index="4" name="max_collisions" type="int" default="1" />
<description>
Checks for collisions without moving the body. This method should be used in [method Node._physics_process] (or in a method called by [method Node._physics_process]), as it uses the physics step's [code]delta[/code] value automatically in calculations. Otherwise, the simulation will run at an incorrect speed.
Virtually sets the node's position, scale and rotation to that of the given [Transform3D], then tries to move the body along the vector [code]linear_velocity[/code]. Returns [code]true[/code] if a collision would occur.
[code]collision[/code] is an optional object of type [KinematicCollision3D], which contains additional information about the collision (should there be one).
Virtually sets the node's position, scale and rotation to that of the given [Transform3D], then tries to move the body along the vector [code]linear_velocity[/code]. Returns [code]true[/code] if a collision would stop the body from moving along the whole path.
[code]collision[/code] is an optional object of type [KinematicCollision3D], which contains additional information about the collision when stopped, or when touching another body along the motion.
[code]safe_margin[/code] is the extra margin used for collision recovery (see [member CharacterBody3D.collision/safe_margin] for more details).
[code]max_collisions[/code] allows to retrieve more than one collision result.
</description>

View file

@ -64,7 +64,7 @@
Intersects a ray in a given space. Ray position and other parameters are defined through [PhysicsRayQueryParameters2D]. The returned object is a dictionary with the following fields:
[code]collider[/code]: The colliding object.
[code]collider_id[/code]: The colliding object's ID.
[code]normal[/code]: The object's surface normal at the intersection point.
[code]normal[/code]: The object's surface normal at the intersection point, or [code]Vector2(0, 0)[/code] if the ray starts inside the shape and [member PhysicsRayQueryParameters2D.hit_from_inside] is [code]true[/code].
[code]position[/code]: The intersection point.
[code]rid[/code]: The intersecting object's [RID].
[code]shape[/code]: The shape index of the colliding shape.

View file

@ -65,7 +65,7 @@
Intersects a ray in a given space. Ray position and other parameters are defined through [PhysicsRayQueryParameters3D]. The returned object is a dictionary with the following fields:
[code]collider[/code]: The colliding object.
[code]collider_id[/code]: The colliding object's ID.
[code]normal[/code]: The object's surface normal at the intersection point.
[code]normal[/code]: The object's surface normal at the intersection point, or [code]Vector3(0, 0, 0)[/code] if the ray starts inside the shape and [member PhysicsRayQueryParameters3D.hit_from_inside] is [code]true[/code].
[code]position[/code]: The intersection point.
[code]rid[/code]: The intersecting object's [RID].
[code]shape[/code]: The shape index of the colliding shape.

View file

@ -24,6 +24,9 @@
<member name="from" type="Vector2" setter="set_from" getter="get_from" default="Vector2(0, 0)">
The starting point of the ray being queried for, in global coordinates.
</member>
<member name="hit_from_inside" type="bool" setter="set_hit_from_inside" getter="is_hit_from_inside_enabled" default="false">
If [code]true[/code], the query will detect a hit when starting inside shapes. In this case the collision normal will be [code]Vector2(0, 0)[/code]. Does not affect concave polygon shapes.
</member>
<member name="to" type="Vector2" setter="set_to" getter="get_to" default="Vector2(0, 0)">
The ending point of the ray being queried for, in global coordinates.
</member>

View file

@ -24,6 +24,12 @@
<member name="from" type="Vector3" setter="set_from" getter="get_from" default="Vector3(0, 0, 0)">
The starting point of the ray being queried for, in global coordinates.
</member>
<member name="hit_back_faces" type="bool" setter="set_hit_back_faces" getter="is_hit_back_faces_enabled" default="true">
If [code]true[/code], the query will hit back faces with concave polygon shapes with back face enabled or heightmap shapes.
</member>
<member name="hit_from_inside" type="bool" setter="set_hit_from_inside" getter="is_hit_from_inside_enabled" default="false">
If [code]true[/code], the query will detect a hit when starting inside shapes. In this case the collision normal will be [code]Vector3(0, 0, 0)[/code]. Does not affect concave polygon shapes or heightmap shapes.
</member>
<member name="to" type="Vector3" setter="set_to" getter="get_to" default="Vector3(0, 0, 0)">
The ending point of the ray being queried for, in global coordinates.
</member>

View file

@ -98,13 +98,6 @@
Returns the space assigned to the area.
</description>
</method>
<method name="area_get_space_override_mode" qualifiers="const">
<return type="int" enum="PhysicsServer2D.AreaSpaceOverrideMode" />
<argument index="0" name="area" type="RID" />
<description>
Returns the space override mode for the area.
</description>
</method>
<method name="area_get_transform" qualifiers="const">
<return type="Transform2D" />
<argument index="0" name="area" type="RID" />
@ -207,14 +200,6 @@
Assigns a space to the area.
</description>
</method>
<method name="area_set_space_override_mode">
<return type="void" />
<argument index="0" name="area" type="RID" />
<argument index="1" name="mode" type="int" enum="PhysicsServer2D.AreaSpaceOverrideMode" />
<description>
Sets the space override mode for the area. See [enum AreaSpaceOverrideMode] for a list of available modes.
</description>
</method>
<method name="area_set_transform">
<return type="void" />
<argument index="0" name="area" type="RID" />
@ -346,7 +331,7 @@
<return type="PhysicsDirectBodyState2D" />
<argument index="0" name="body" type="RID" />
<description>
Returns the [PhysicsDirectBodyState2D] of the body.
Returns the [PhysicsDirectBodyState2D] of the body. Returns [code]null[/code] if the body is destroyed or removed from the physics space.
</description>
</method>
<method name="body_get_max_contacts_reported" qualifiers="const">
@ -855,28 +840,37 @@
<constant name="SHAPE_CUSTOM" value="8" enum="ShapeType">
This constant is used internally by the engine. Any attempt to create this kind of shape results in an error.
</constant>
<constant name="AREA_PARAM_GRAVITY" value="0" enum="AreaParameter">
<constant name="AREA_PARAM_GRAVITY_OVERRIDE_MODE" value="0" enum="AreaParameter">
Constant to set/get gravity override mode in an area. See [enum AreaSpaceOverrideMode] for possible values.
</constant>
<constant name="AREA_PARAM_GRAVITY" value="1" enum="AreaParameter">
Constant to set/get gravity strength in an area.
</constant>
<constant name="AREA_PARAM_GRAVITY_VECTOR" value="1" enum="AreaParameter">
<constant name="AREA_PARAM_GRAVITY_VECTOR" value="2" enum="AreaParameter">
Constant to set/get gravity vector/center in an area.
</constant>
<constant name="AREA_PARAM_GRAVITY_IS_POINT" value="2" enum="AreaParameter">
<constant name="AREA_PARAM_GRAVITY_IS_POINT" value="3" enum="AreaParameter">
Constant to set/get whether the gravity vector of an area is a direction, or a center point.
</constant>
<constant name="AREA_PARAM_GRAVITY_DISTANCE_SCALE" value="3" enum="AreaParameter">
<constant name="AREA_PARAM_GRAVITY_DISTANCE_SCALE" value="4" enum="AreaParameter">
Constant to set/get the falloff factor for point gravity of an area. The greater this value is, the faster the strength of gravity decreases with the square of distance.
</constant>
<constant name="AREA_PARAM_GRAVITY_POINT_ATTENUATION" value="4" enum="AreaParameter">
<constant name="AREA_PARAM_GRAVITY_POINT_ATTENUATION" value="5" enum="AreaParameter">
This constant was used to set/get the falloff factor for point gravity. It has been superseded by [constant AREA_PARAM_GRAVITY_DISTANCE_SCALE].
</constant>
<constant name="AREA_PARAM_LINEAR_DAMP" value="5" enum="AreaParameter">
Constant to set/get the linear dampening factor of an area.
<constant name="AREA_PARAM_LINEAR_DAMP_OVERRIDE_MODE" value="6" enum="AreaParameter">
Constant to set/get linear damping override mode in an area. See [enum AreaSpaceOverrideMode] for possible values.
</constant>
<constant name="AREA_PARAM_ANGULAR_DAMP" value="6" enum="AreaParameter">
Constant to set/get the angular dampening factor of an area.
<constant name="AREA_PARAM_LINEAR_DAMP" value="7" enum="AreaParameter">
Constant to set/get the linear damping factor of an area.
</constant>
<constant name="AREA_PARAM_PRIORITY" value="7" enum="AreaParameter">
<constant name="AREA_PARAM_ANGULAR_DAMP_OVERRIDE_MODE" value="8" enum="AreaParameter">
Constant to set/get angular damping override mode in an area. See [enum AreaSpaceOverrideMode] for possible values.
</constant>
<constant name="AREA_PARAM_ANGULAR_DAMP" value="9" enum="AreaParameter">
Constant to set/get the angular damping factor of an area.
</constant>
<constant name="AREA_PARAM_PRIORITY" value="10" enum="AreaParameter">
Constant to set/get the priority (order of processing) of an area.
</constant>
<constant name="AREA_SPACE_OVERRIDE_DISABLED" value="0" enum="AreaSpaceOverrideMode">

View file

@ -85,13 +85,6 @@
Returns the space assigned to the area.
</description>
</method>
<method name="area_get_space_override_mode" qualifiers="const">
<return type="int" enum="PhysicsServer3D.AreaSpaceOverrideMode" />
<argument index="0" name="area" type="RID" />
<description>
Returns the space override mode for the area.
</description>
</method>
<method name="area_get_transform" qualifiers="const">
<return type="Transform3D" />
<argument index="0" name="area" type="RID" />
@ -201,14 +194,6 @@
Assigns a space to the area.
</description>
</method>
<method name="area_set_space_override_mode">
<return type="void" />
<argument index="0" name="area" type="RID" />
<argument index="1" name="mode" type="int" enum="PhysicsServer3D.AreaSpaceOverrideMode" />
<description>
Sets the space override mode for the area. The modes are described in the [enum AreaSpaceOverrideMode] constants.
</description>
</method>
<method name="area_set_transform">
<return type="void" />
<argument index="0" name="area" type="RID" />
@ -320,7 +305,7 @@
<return type="PhysicsDirectBodyState3D" />
<argument index="0" name="body" type="RID" />
<description>
Returns the [PhysicsDirectBodyState3D] of the body.
Returns the [PhysicsDirectBodyState3D] of the body. Returns [code]null[/code] if the body is destroyed or removed from the physics space.
</description>
</method>
<method name="body_get_max_contacts_reported" qualifiers="const">
@ -1211,40 +1196,49 @@
<constant name="SHAPE_CUSTOM" value="10" enum="ShapeType">
This constant is used internally by the engine. Any attempt to create this kind of shape results in an error.
</constant>
<constant name="AREA_PARAM_GRAVITY" value="0" enum="AreaParameter">
<constant name="AREA_PARAM_GRAVITY_OVERRIDE_MODE" value="0" enum="AreaParameter">
Constant to set/get gravity override mode in an area. See [enum AreaSpaceOverrideMode] for possible values.
</constant>
<constant name="AREA_PARAM_GRAVITY" value="1" enum="AreaParameter">
Constant to set/get gravity strength in an area.
</constant>
<constant name="AREA_PARAM_GRAVITY_VECTOR" value="1" enum="AreaParameter">
<constant name="AREA_PARAM_GRAVITY_VECTOR" value="2" enum="AreaParameter">
Constant to set/get gravity vector/center in an area.
</constant>
<constant name="AREA_PARAM_GRAVITY_IS_POINT" value="2" enum="AreaParameter">
<constant name="AREA_PARAM_GRAVITY_IS_POINT" value="3" enum="AreaParameter">
Constant to set/get whether the gravity vector of an area is a direction, or a center point.
</constant>
<constant name="AREA_PARAM_GRAVITY_DISTANCE_SCALE" value="3" enum="AreaParameter">
<constant name="AREA_PARAM_GRAVITY_DISTANCE_SCALE" value="4" enum="AreaParameter">
Constant to set/get the falloff factor for point gravity of an area. The greater this value is, the faster the strength of gravity decreases with the square of distance.
</constant>
<constant name="AREA_PARAM_GRAVITY_POINT_ATTENUATION" value="4" enum="AreaParameter">
<constant name="AREA_PARAM_GRAVITY_POINT_ATTENUATION" value="5" enum="AreaParameter">
This constant was used to set/get the falloff factor for point gravity. It has been superseded by [constant AREA_PARAM_GRAVITY_DISTANCE_SCALE].
</constant>
<constant name="AREA_PARAM_LINEAR_DAMP" value="5" enum="AreaParameter">
Constant to set/get the linear dampening factor of an area.
<constant name="AREA_PARAM_LINEAR_DAMP_OVERRIDE_MODE" value="6" enum="AreaParameter">
Constant to set/get linear damping override mode in an area. See [enum AreaSpaceOverrideMode] for possible values.
</constant>
<constant name="AREA_PARAM_ANGULAR_DAMP" value="6" enum="AreaParameter">
Constant to set/get the angular dampening factor of an area.
<constant name="AREA_PARAM_LINEAR_DAMP" value="7" enum="AreaParameter">
Constant to set/get the linear damping factor of an area.
</constant>
<constant name="AREA_PARAM_PRIORITY" value="7" enum="AreaParameter">
<constant name="AREA_PARAM_ANGULAR_DAMP_OVERRIDE_MODE" value="8" enum="AreaParameter">
Constant to set/get angular damping override mode in an area. See [enum AreaSpaceOverrideMode] for possible values.
</constant>
<constant name="AREA_PARAM_ANGULAR_DAMP" value="9" enum="AreaParameter">
Constant to set/get the angular damping factor of an area.
</constant>
<constant name="AREA_PARAM_PRIORITY" value="10" enum="AreaParameter">
Constant to set/get the priority (order of processing) of an area.
</constant>
<constant name="AREA_PARAM_WIND_FORCE_MAGNITUDE" value="8" enum="AreaParameter">
<constant name="AREA_PARAM_WIND_FORCE_MAGNITUDE" value="11" enum="AreaParameter">
Constant to set/get the magnitude of area-specific wind force.
</constant>
<constant name="AREA_PARAM_WIND_SOURCE" value="9" enum="AreaParameter">
<constant name="AREA_PARAM_WIND_SOURCE" value="12" enum="AreaParameter">
Constant to set/get the 3D vector that specifies the origin from which an area-specific wind blows.
</constant>
<constant name="AREA_PARAM_WIND_DIRECTION" value="10" enum="AreaParameter">
<constant name="AREA_PARAM_WIND_DIRECTION" value="13" enum="AreaParameter">
Constant to set/get the 3D vector that specifies the direction in which an area-specific wind blows.
</constant>
<constant name="AREA_PARAM_WIND_ATTENUATION_FACTOR" value="11" enum="AreaParameter">
<constant name="AREA_PARAM_WIND_ATTENUATION_FACTOR" value="14" enum="AreaParameter">
Constant to set/get the exponential rate at which wind force decreases with distance from its origin.
</constant>
<constant name="AREA_SPACE_OVERRIDE_DISABLED" value="0" enum="AreaSpaceOverrideMode">

View file

@ -15,7 +15,7 @@
<return type="void" />
<argument index="0" name="label" type="String" />
<argument index="1" name="id" type="int" default="-1" />
<argument index="2" name="accel" type="int" default="0" />
<argument index="2" name="accel" type="int" enum="Key" default="0" />
<description>
Adds a new checkable item with text [code]label[/code].
An [code]id[/code] can optionally be provided, as well as an accelerator ([code]accel[/code]). If no [code]id[/code] is provided, one will be created from the index. If no [code]accel[/code] is provided then the default [code]0[/code] will be assigned to it. See [method get_item_accelerator] for more info on accelerators.
@ -38,7 +38,7 @@
<argument index="0" name="texture" type="Texture2D" />
<argument index="1" name="label" type="String" />
<argument index="2" name="id" type="int" default="-1" />
<argument index="3" name="accel" type="int" default="0" />
<argument index="3" name="accel" type="int" enum="Key" default="0" />
<description>
Adds a new checkable item with text [code]label[/code] and icon [code]texture[/code].
An [code]id[/code] can optionally be provided, as well as an accelerator ([code]accel[/code]). If no [code]id[/code] is provided, one will be created from the index. If no [code]accel[/code] is provided then the default [code]0[/code] will be assigned to it. See [method get_item_accelerator] for more info on accelerators.
@ -62,7 +62,7 @@
<argument index="0" name="texture" type="Texture2D" />
<argument index="1" name="label" type="String" />
<argument index="2" name="id" type="int" default="-1" />
<argument index="3" name="accel" type="int" default="0" />
<argument index="3" name="accel" type="int" enum="Key" default="0" />
<description>
Adds a new item with text [code]label[/code] and icon [code]texture[/code].
An [code]id[/code] can optionally be provided, as well as an accelerator ([code]accel[/code]). If no [code]id[/code] is provided, one will be created from the index. If no [code]accel[/code] is provided then the default [code]0[/code] will be assigned to it. See [method get_item_accelerator] for more info on accelerators.
@ -73,7 +73,7 @@
<argument index="0" name="texture" type="Texture2D" />
<argument index="1" name="label" type="String" />
<argument index="2" name="id" type="int" default="-1" />
<argument index="3" name="accel" type="int" default="0" />
<argument index="3" name="accel" type="int" enum="Key" default="0" />
<description>
Same as [method add_icon_check_item], but uses a radio check button.
</description>
@ -103,7 +103,7 @@
<return type="void" />
<argument index="0" name="label" type="String" />
<argument index="1" name="id" type="int" default="-1" />
<argument index="2" name="accel" type="int" default="0" />
<argument index="2" name="accel" type="int" enum="Key" default="0" />
<description>
Adds a new item with text [code]label[/code].
An [code]id[/code] can optionally be provided, as well as an accelerator ([code]accel[/code]). If no [code]id[/code] is provided, one will be created from the index. If no [code]accel[/code] is provided then the default [code]0[/code] will be assigned to it. See [method get_item_accelerator] for more info on accelerators.
@ -115,7 +115,7 @@
<argument index="1" name="max_states" type="int" />
<argument index="2" name="default_state" type="int" default="0" />
<argument index="3" name="id" type="int" default="-1" />
<argument index="4" name="accel" type="int" default="0" />
<argument index="4" name="accel" type="int" enum="Key" default="0" />
<description>
Adds a new multistate item with text [code]label[/code].
Contrarily to normal binary items, multistate items can have more than two states, as defined by [code]max_states[/code]. Each press or activate of the item will increase the state by one. The default value is defined by [code]default_state[/code].
@ -126,7 +126,7 @@
<return type="void" />
<argument index="0" name="label" type="String" />
<argument index="1" name="id" type="int" default="-1" />
<argument index="2" name="accel" type="int" default="0" />
<argument index="2" name="accel" type="int" enum="Key" default="0" />
<description>
Adds a new radio check button with text [code]label[/code].
An [code]id[/code] can optionally be provided, as well as an accelerator ([code]accel[/code]). If no [code]id[/code] is provided, one will be created from the index. If no [code]accel[/code] is provided then the default [code]0[/code] will be assigned to it. See [method get_item_accelerator] for more info on accelerators.
@ -193,7 +193,7 @@
</description>
</method>
<method name="get_item_accelerator" qualifiers="const">
<return type="int" />
<return type="int" enum="Key" />
<argument index="0" name="idx" type="int" />
<description>
Returns the accelerator of the item at index [code]idx[/code]. Accelerators are special combinations of keys that activate the item, no matter which control is focused.
@ -333,7 +333,7 @@
<method name="set_item_accelerator">
<return type="void" />
<argument index="0" name="idx" type="int" />
<argument index="1" name="accel" type="int" />
<argument index="1" name="accel" type="int" enum="Key" />
<description>
Sets the accelerator of the item at index [code]idx[/code]. Accelerators are special combinations of keys that activate the item, no matter which control is focused.
</description>

View file

@ -289,7 +289,9 @@
Safer override for [member audio/driver/mix_rate] in the Web platform. Here [code]0[/code] means "let the browser choose" (since some browsers do not like forcing the mix rate).
</member>
<member name="audio/driver/output_latency" type="int" setter="" getter="" default="15">
Output latency in milliseconds for audio. Lower values will result in lower audio latency at the cost of increased CPU usage. Low values may result in audible cracking on slower hardware.
Specifies the preferred output latency in milliseconds for audio. Lower values will result in lower audio latency at the cost of increased CPU usage. Low values may result in audible cracking on slower hardware.
Audio output latency may be constrained by the host operating system and audio hardware drivers. If the host can not provide the specified audio output latency then Godot will attempt to use the nearest latency allowed by the host. As such you should always use [method AudioServer.get_output_latency] to determine the actual audio output latency.
[b]Note:[/b] This setting is ignored on all versions of Windows prior to Windows 10.
</member>
<member name="audio/driver/output_latency.web" type="int" setter="" getter="" default="50">
Safer override for [member audio/driver/output_latency] in the Web platform, to avoid audio issues especially on mobile devices.
@ -1315,7 +1317,9 @@
</member>
<member name="mono/profiler/enabled" type="bool" setter="" getter="" default="false">
</member>
<member name="mono/unhandled_exception_policy" type="int" setter="" getter="" default="0">
<member name="mono/runtime/unhandled_exception_policy" type="int" setter="" getter="" default="0">
The policy to use for unhandled Mono (C#) exceptions. The default "Terminate Application" exits the project as soon as an unhandled exception is thrown. "Log Error" logs an error message to the console instead, and will not interrupt the project execution when an unhandled exception is thrown.
[b]Note:[/b] The unhandled exception policy is always set to "Log Error" in the editor, which also includes C# [code]tool[/code] scripts running within the editor as well as editor plugin code.
</member>
<member name="navigation/2d/default_cell_size" type="int" setter="" getter="" default="10">
Default cell size for 2D navigation maps. See [method NavigationServer2D.map_set_cell_size].

View file

@ -63,7 +63,7 @@
<method name="get_collision_normal" qualifiers="const">
<return type="Vector2" />
<description>
Returns the normal of the intersecting object's shape at the collision point.
Returns the normal of the intersecting object's shape at the collision point, or [code]Vector2(0, 0)[/code] if the ray starts inside the shape and [member hit_from_inside] is [code]true[/code].
</description>
</method>
<method name="get_collision_point" qualifiers="const">
@ -118,6 +118,9 @@
<member name="exclude_parent" type="bool" setter="set_exclude_parent_body" getter="get_exclude_parent_body" default="true">
If [code]true[/code], the parent node will be excluded from collision detection.
</member>
<member name="hit_from_inside" type="bool" setter="set_hit_from_inside" getter="is_hit_from_inside_enabled" default="false">
If [code]true[/code], the ray will detect a hit when starting inside shapes. In this case the collision normal will be [code]Vector2(0, 0)[/code]. Does not affect concave polygon shapes.
</member>
<member name="target_position" type="Vector2" setter="set_target_position" getter="get_target_position" default="Vector2(0, 50)">
The ray's destination point, relative to the RayCast's [code]position[/code].
</member>

View file

@ -65,7 +65,7 @@
<method name="get_collision_normal" qualifiers="const">
<return type="Vector3" />
<description>
Returns the normal of the intersecting object's shape at the collision point.
Returns the normal of the intersecting object's shape at the collision point, or [code]Vector3(0, 0, 0)[/code] if the ray starts inside the shape and [member hit_from_inside] is [code]true[/code].
</description>
</method>
<method name="get_collision_point" qualifiers="const">
@ -127,6 +127,9 @@
<member name="exclude_parent" type="bool" setter="set_exclude_parent_body" getter="get_exclude_parent_body" default="true">
If [code]true[/code], collisions will be ignored for this RayCast3D's immediate parent.
</member>
<member name="hit_from_inside" type="bool" setter="set_hit_from_inside" getter="is_hit_from_inside_enabled" default="false">
If [code]true[/code], the ray will detect a hit when starting inside shapes. In this case the collision normal will be [code]Vector3(0, 0, 0)[/code]. Does not affect shapes with no volume like concave polygon or heightmap.
</member>
<member name="target_position" type="Vector3" setter="set_target_position" getter="get_target_position" default="Vector3(0, -1, 0)">
The ray's destination point, relative to the RayCast's [code]position[/code].
</member>

View file

@ -71,7 +71,22 @@
<return type="Rect2" />
<argument index="0" name="to" type="Vector2" />
<description>
Returns this [Rect2] expanded to include a given point.
Returns a copy of this [Rect2] expanded to include a given point.
[b]Example:[/b]
[codeblocks]
[gdscript]
# position (-3, 2), size (1, 1)
var rect = Rect2(Vector2(-3, 2), Vector2(1, 1))
# position (-3, -1), size (3, 4), so we fit both rect and Vector2(0, -1)
var rect2 = rect.expand(Vector2(0, -1))
[/gdscript]
[csharp]
# position (-3, 2), size (1, 1)
var rect = new Rect2(new Vector2(-3, 2), new Vector2(1, 1));
# position (-3, -1), size (3, 4), so we fit both rect and Vector2(0, -1)
var rect2 = rect.Expand(new Vector2(0, -1));
[/csharp]
[/codeblocks]
</description>
</method>
<method name="get_area" qualifiers="const">
@ -121,7 +136,8 @@
<return type="bool" />
<argument index="0" name="point" type="Vector2" />
<description>
Returns [code]true[/code] if the [Rect2] contains a point.
Returns [code]true[/code] if the [Rect2] contains a point. By convention, the right and bottom edges of the [Rect2] are considered exclusive, so points on these edges are [b]not[/b] included.
[b]Note:[/b] This method is not reliable for [Rect2] with a [i]negative size[/i]. Use [method abs] to get a positive sized equivalent rectangle to check for contained points.
</description>
</method>
<method name="intersection" qualifiers="const">

View file

@ -69,7 +69,21 @@
<return type="Rect2i" />
<argument index="0" name="to" type="Vector2i" />
<description>
Returns this [Rect2i] expanded to include a given point.
Returns a copy of this [Rect2i] expanded to include a given point.
[codeblocks]
[gdscript]
# position (-3, 2), size (1, 1)
var rect = Rect2i(Vector2i(-3, 2), Vector2i(1, 1))
# position (-3, -1), size (3, 4), so we fit both rect and Vector2i(0, -1)
var rect2 = rect.expand(Vector2i(0, -1))
[/gdscript]
[csharp]
# position (-3, 2), size (1, 1)
var rect = new Rect2i(new Vector2i(-3, 2), new Vector2i(1, 1));
# position (-3, -1), size (3, 4), so we fit both rect and Vector2i(0, -1)
var rect2 = rect.Expand(new Vector2i(0, -1));
[/csharp]
[/codeblocks]
</description>
</method>
<method name="get_area" qualifiers="const">
@ -120,7 +134,8 @@
<return type="bool" />
<argument index="0" name="point" type="Vector2i" />
<description>
Returns [code]true[/code] if the [Rect2i] contains a point.
Returns [code]true[/code] if the [Rect2i] contains a point. By convention, the right and bottom edges of the [Rect2i] are considered exclusive, so points on these edges are [b]not[/b] included.
[b]Note:[/b] This method is not reliable for [Rect2i] with a [i]negative size[/i]. Use [method abs] to get a positive sized equivalent rectangle to check for contained points.
</description>
</method>
<method name="intersection" qualifiers="const">

View file

@ -2661,8 +2661,10 @@
<return type="RID" />
<argument index="0" name="shader" type="RID" />
<argument index="1" name="param" type="StringName" />
<argument index="2" name="index" type="int" default="0" />
<description>
Returns a default texture from a shader searched by name.
[b]Note:[/b] If the sampler array is used use [code]index[/code] to access the specified texture.
</description>
</method>
<method name="shader_get_param_default" qualifiers="const">
@ -2684,8 +2686,10 @@
<argument index="0" name="shader" type="RID" />
<argument index="1" name="param" type="StringName" />
<argument index="2" name="texture" type="RID" />
<argument index="3" name="index" type="int" default="0" />
<description>
Sets a shader's default texture. Overwrites the texture given by name.
[b]Note:[/b] If the sampler array is used use [code]index[/code] to access the specified texture.
</description>
</method>
<method name="shadows_quality_set">

View file

@ -13,9 +13,11 @@
<method name="get_default_texture_param" qualifiers="const">
<return type="Texture2D" />
<argument index="0" name="param" type="StringName" />
<argument index="1" name="index" type="int" default="0" />
<description>
Returns the texture that is set as default for the specified parameter.
[b]Note:[/b] [code]param[/code] must match the name of the uniform in the code exactly.
[b]Note:[/b] If the sampler array is used use [code]index[/code] to access the specified texture.
</description>
</method>
<method name="get_mode" qualifiers="const">
@ -36,9 +38,11 @@
<return type="void" />
<argument index="0" name="param" type="StringName" />
<argument index="1" name="texture" type="Texture2D" />
<argument index="2" name="index" type="int" default="0" />
<description>
Sets the default texture to be used with a texture uniform. The default is used if a texture is not set in the [ShaderMaterial].
[b]Note:[/b] [code]param[/code] must match the name of the uniform in the code exactly.
[b]Note:[/b] If the sampler array is used use [code]index[/code] to access the specified texture.
</description>
</method>
</methods>

157
doc/classes/ShapeCast2D.xml Normal file
View file

@ -0,0 +1,157 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="ShapeCast2D" inherits="Node2D" version="4.0">
<brief_description>
Node for physics collision sweep and immediate overlap queries. Similar to the [RayCast2D] node.
</brief_description>
<description>
Shape casting allows to detect collision objects by sweeping the [member shape] along the cast direction determined by [member target_position] (useful for things like beam weapons).
Immediate collision overlaps can be done with the [member target_position] set to [code]Vector2(0, 0)[/code] and by calling [method force_shapecast_update] within the same [b]physics_frame[/b]. This also helps to overcome some limitations of [Area2D] when used as a continuous detection area, often requiring waiting a couple of frames before collision information is available to [Area2D] nodes, and when using the signals creates unnecessary complexity.
The node can detect multiple collision objects, but usually the first detected collision
[b]Note:[/b] shape casting is more computationally expensive compared to ray casting.
</description>
<tutorials>
</tutorials>
<methods>
<method name="add_exception">
<return type="void" />
<argument index="0" name="node" type="Object" />
<description>
Adds a collision exception so the shape does not report collisions with the specified node.
</description>
</method>
<method name="add_exception_rid">
<return type="void" />
<argument index="0" name="rid" type="RID" />
<description>
Adds a collision exception so the shape does not report collisions with the specified [RID].
</description>
</method>
<method name="clear_exceptions">
<return type="void" />
<description>
Removes all collision exceptions for this shape.
</description>
</method>
<method name="force_shapecast_update">
<return type="void" />
<description>
Updates the collision information for the shape. Use this method to update the collision information immediately instead of waiting for the next [code]_physics_process[/code] call, for example if the shape or its parent has changed state.
[b]Note:[/b] [code]enabled == true[/code] is not required for this to work.
</description>
</method>
<method name="get_closest_collision_safe_fraction" qualifiers="const">
<return type="float" />
<description>
The fraction of the motion (between 0 and 1) of how far the shape can move without triggering a collision. The motion is determined by [member target_position].
</description>
</method>
<method name="get_closest_collision_unsafe_fraction" qualifiers="const">
<return type="float" />
<description>
The fraction of the motion (between 0 and 1) when the shape triggers a collision. The motion is determined by [member target_position].
</description>
</method>
<method name="get_collider" qualifiers="const">
<return type="Object" />
<argument index="0" name="index" type="int" />
<description>
Returns the [Object] of one of the multiple collisions at [code]index[/code], or [code]null[/code] if no object is intersecting the shape (i.e. [method is_colliding] returns [code]false[/code]).
</description>
</method>
<method name="get_collider_shape" qualifiers="const">
<return type="int" />
<argument index="0" name="index" type="int" />
<description>
Returns the shape ID of one of the multiple collisions at [code]index[/code] that the shape intersects, or [code]0[/code] if no object is intersecting the shape (i.e. [method is_colliding] returns [code]false[/code]).
</description>
</method>
<method name="get_collision_count" qualifiers="const">
<return type="int" />
<description>
The number of collisions detected at the point of impact. Use this to iterate over multiple collisions as provided by [method get_collider], [method get_collider_shape], [method get_collision_point], and [method get_collision_normal] methods.
</description>
</method>
<method name="get_collision_mask_value" qualifiers="const">
<return type="bool" />
<argument index="0" name="layer_number" type="int" />
<description>
Returns whether or not the specified layer of the [member collision_mask] is enabled, given a [code]layer_number[/code] between 1 and 32.
</description>
</method>
<method name="get_collision_normal" qualifiers="const">
<return type="Vector2" />
<argument index="0" name="index" type="int" />
<description>
Returns the normal containing one of the multiple collisions at [code]index[/code] of the intersecting object.
</description>
</method>
<method name="get_collision_point" qualifiers="const">
<return type="Vector2" />
<argument index="0" name="index" type="int" />
<description>
Returns the collision point containing one of the multiple collisions at [code]index[/code] at which the shape intersects the object.
[b]Note:[/b] this point is in the [b]global[/b] coordinate system.
</description>
</method>
<method name="is_colliding" qualifiers="const">
<return type="bool" />
<description>
Returns whether any object is intersecting with the shape's vector (considering the vector length).
</description>
</method>
<method name="remove_exception">
<return type="void" />
<argument index="0" name="node" type="Object" />
<description>
Removes a collision exception so the shape does report collisions with the specified node.
</description>
</method>
<method name="remove_exception_rid">
<return type="void" />
<argument index="0" name="rid" type="RID" />
<description>
Removes a collision exception so the shape does report collisions with the specified [RID].
</description>
</method>
<method name="set_collision_mask_value">
<return type="void" />
<argument index="0" name="layer_number" type="int" />
<argument index="1" name="value" type="bool" />
<description>
Based on [code]value[/code], enables or disables the specified layer in the [member collision_mask], given a [code]layer_number[/code] between 1 and 32.
</description>
</method>
</methods>
<members>
<member name="collide_with_areas" type="bool" setter="set_collide_with_areas" getter="is_collide_with_areas_enabled" default="false">
If [code]true[/code], collision with [Area2D]s will be reported.
</member>
<member name="collide_with_bodies" type="bool" setter="set_collide_with_bodies" getter="is_collide_with_bodies_enabled" default="true">
If [code]true[/code], collision with [PhysicsBody2D]s will be reported.
</member>
<member name="collision_mask" type="int" setter="set_collision_mask" getter="get_collision_mask" default="1">
The shape's collision mask. Only objects in at least one collision layer enabled in the mask will be detected.
</member>
<member name="collision_result" type="Array" setter="" getter="_get_collision_result" default="[]">
A complete collision information. The data returned is the same as in the [method PhysicsDirectSpaceState2D.get_rest_info] method.
</member>
<member name="enabled" type="bool" setter="set_enabled" getter="is_enabled" default="true">
If [code]true[/code], collisions will be reported.
</member>
<member name="exclude_parent" type="bool" setter="set_exclude_parent_body" getter="get_exclude_parent_body" default="true">
If [code]true[/code], the parent node will be excluded from collision detection.
</member>
<member name="margin" type="float" setter="set_margin" getter="get_margin" default="0.0">
The collision margin for the shape. A larger margin helps detecting collisions more consistently, at the cost of precision.
</member>
<member name="max_results" type="int" setter="set_max_results" getter="get_max_results" default="32">
The number of intersections can be limited with this parameter, to reduce the processing time.
</member>
<member name="shape" type="Shape2D" setter="set_shape" getter="get_shape">
Any [Shape2D] derived shape used for collision queries.
</member>
<member name="target_position" type="Vector2" setter="set_target_position" getter="get_target_position" default="Vector2(0, 50)">
The shape's destination point, relative to this node's [code]position[/code].
</member>
</members>
</class>

View file

@ -45,6 +45,21 @@
Returns the alternative ID a following call to [method create_alternative_tile] would return.
</description>
</method>
<method name="get_runtime_texture" qualifiers="const">
<return type="Texture2D" />
<description>
If [member use_texture_padding] is [code]false[/code], returns [member texture]. Otherwise, returns and internal [ImageTexture] created that includes the padding.
</description>
</method>
<method name="get_runtime_tile_texture_region" qualifiers="const">
<return type="Rect2i" />
<argument index="0" name="atlas_coords" type="Vector2i" />
<argument index="1" name="frame" type="int" />
<description>
Returns the region of the tile at coordinates [code]atlas_coords[/code] for frame [code]frame[/code] inside the texture returned by [method get_runtime_texture].
[b]Note:[/b] If [member use_texture_padding] is [code]false[/code], returns the same as [method get_tile_texture_region].
</description>
</method>
<method name="get_tile_animation_columns" qualifiers="const">
<return type="int" />
<argument index="0" name="atlas_coords" type="Vector2i" />
@ -232,5 +247,9 @@
<member name="texture_region_size" type="Vector2i" setter="set_texture_region_size" getter="get_texture_region_size" default="Vector2i(16, 16)">
The base tile size in the texture (in pixel). This size must be bigger than the TileSet's [code]tile_size[/code] value.
</member>
<member name="use_texture_padding" type="bool" setter="set_use_texture_padding" getter="get_use_texture_padding" default="true">
If [code]true[/code], generates an internal texture with an additional one pixel padding around each tile. Texture padding avoids a common artifact where lines appear between tiles.
Disabling this setting might lead a small performance improvement, as generating the internal texture requires both memory and processing time when the TileSetAtlasSource resource is modified.
</member>
</members>
</class>

View file

@ -27,8 +27,8 @@
<return type="String" />
<argument index="0" name="input_vars" type="PackedStringArray" />
<argument index="1" name="output_vars" type="String[]" />
<argument index="2" name="mode" type="int" />
<argument index="3" name="type" type="int" />
<argument index="2" name="mode" type="int" enum="Shader.Mode" />
<argument index="3" name="type" type="int" enum="VisualShader.Type" />
<description>
Override this method to define the actual shader code of the associated custom node. The shader code should be returned as a string, which can have multiple lines (the [code]"""[/code] multiline string construct can be used for convenience).
The [code]input_vars[/code] and [code]output_vars[/code] arrays contain the string names of the various input and output variables, as defined by [code]_get_input_*[/code] and [code]_get_output_*[/code] virtual methods in this class.
@ -46,7 +46,7 @@
</method>
<method name="_get_global_code" qualifiers="virtual const">
<return type="String" />
<argument index="0" name="mode" type="int" />
<argument index="0" name="mode" type="int" enum="Shader.Mode" />
<description>
Override this method to add shader code on top of the global shader, to define your own standard library of reusable methods, varyings, constants, uniforms, etc. The shader code should be returned as a string, which can have multiple lines (the [code]"""[/code] multiline string construct can be used for convenience).
Be careful with this functionality as it can cause name conflicts with other custom nodes, so be sure to give the defined entities unique names.

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="VisualShaderNodeParticleMeshEmitter" inherits="VisualShaderNodeParticleEmitter" version="4.0">
<brief_description>
</brief_description>
<description>
</description>
<tutorials>
</tutorials>
<members>
<member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh">
</member>
<member name="surface_index" type="int" setter="set_surface_index" getter="get_surface_index" default="0">
</member>
<member name="use_all_surfaces" type="bool" setter="set_use_all_surfaces" getter="is_use_all_surfaces" default="true">
</member>
</members>
</class>

View file

@ -1871,31 +1871,38 @@ void RasterizerStorageGLES3::shader_get_param_list(RID p_shader, List<PropertyIn
}
}
void RasterizerStorageGLES3::shader_set_default_texture_param(RID p_shader, const StringName &p_name, RID p_texture) {
void RasterizerStorageGLES3::shader_set_default_texture_param(RID p_shader, const StringName &p_name, RID p_texture, int p_index) {
Shader *shader = shader_owner.get_or_null(p_shader);
ERR_FAIL_COND(!shader);
ERR_FAIL_COND(p_texture.is_valid() && !texture_owner.owns(p_texture));
if (p_texture.is_valid()) {
shader->default_textures[p_name] = p_texture;
if (!p_texture.is_valid()) {
if (shader->default_textures.has(p_name) && shader->default_textures[p_name].has(p_index)) {
shader->default_textures[p_name].erase(p_index);
if (shader->default_textures[p_name].is_empty()) {
shader->default_textures.erase(p_name);
}
}
} else {
shader->default_textures.erase(p_name);
if (!shader->default_textures.has(p_name)) {
shader->default_textures[p_name] = Map<int, RID>();
}
shader->default_textures[p_name][p_index] = p_texture;
}
_shader_make_dirty(shader);
}
RID RasterizerStorageGLES3::shader_get_default_texture_param(RID p_shader, const StringName &p_name) const {
RID RasterizerStorageGLES3::shader_get_default_texture_param(RID p_shader, const StringName &p_name, int p_index) const {
const Shader *shader = shader_owner.get_or_null(p_shader);
ERR_FAIL_COND_V(!shader, RID());
const Map<StringName, RID>::Element *E = shader->default_textures.find(p_name);
if (!E) {
return RID();
if (shader->default_textures.has(p_name) && shader->default_textures[p_name].has(p_index)) {
return shader->default_textures[p_name][p_index];
}
return E->get();
return RID();
}
void RasterizerStorageGLES3::shader_add_custom_define(RID p_shader, const String &p_define) {
@ -2195,10 +2202,11 @@ void RasterizerStorageGLES3::_update_material(Material *p_material) {
}
if (!texture.is_valid()) {
Map<StringName, RID>::Element *W = p_material->shader->default_textures.find(E->key());
Map<StringName, Map<int, RID>>::Element *W = p_material->shader->default_textures.find(E->key());
if (W) {
texture = W->get();
// TODO: make texture uniform array properly works with GLES3
if (W && W->get().has(0)) {
texture = W->get()[0];
}
}

View file

@ -580,7 +580,7 @@ public:
SelfList<Shader> dirty_list;
Map<StringName, RID> default_textures;
Map<StringName, Map<int, RID>> default_textures;
Vector<ShaderLanguage::ShaderNode::Uniform::Hint> texture_hints;
@ -706,8 +706,8 @@ public:
String shader_get_code(RID p_shader) const override;
void shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list) const override;
void shader_set_default_texture_param(RID p_shader, const StringName &p_name, RID p_texture) override;
RID shader_get_default_texture_param(RID p_shader, const StringName &p_name) const override;
void shader_set_default_texture_param(RID p_shader, const StringName &p_name, RID p_texture, int p_index) override;
RID shader_get_default_texture_param(RID p_shader, const StringName &p_name, int p_index) const override;
RS::ShaderNativeSourceCode shader_get_native_source_code(RID p_shader) const override { return RS::ShaderNativeSourceCode(); };

View file

@ -121,6 +121,12 @@ const IID IID_IAudioCaptureClient = __uuidof(IAudioCaptureClient);
static bool default_render_device_changed = false;
static bool default_capture_device_changed = false;
// Silence warning due to a COM API weirdness (GH-35194).
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
#endif
class CMMNotificationClient : public IMMNotificationClient {
LONG _cRef = 1;
IMMDeviceEnumerator *_pEnumerator = nullptr;
@ -162,7 +168,7 @@ public:
HRESULT STDMETHODCALLTYPE OnDeviceAdded(LPCWSTR pwstrDeviceId) {
return S_OK;
};
}
HRESULT STDMETHODCALLTYPE OnDeviceRemoved(LPCWSTR pwstrDeviceId) {
return S_OK;
@ -189,6 +195,10 @@ public:
}
};
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic pop
#endif
static CMMNotificationClient notif_client;
Error AudioDriverWASAPI::audio_device_init(AudioDeviceWASAPI *p_device, bool p_capture, bool reinit) {
@ -373,7 +383,7 @@ Error AudioDriverWASAPI::audio_device_init(AudioDeviceWASAPI *p_device, bool p_c
hr = p_device->audio_client->Initialize(AUDCLNT_SHAREMODE_SHARED, streamflags, p_capture ? REFTIMES_PER_SEC : 0, 0, pwfex, nullptr);
ERR_FAIL_COND_V_MSG(hr != S_OK, ERR_CANT_OPEN, "WASAPI: Initialize failed with error 0x" + String::num_uint64(hr, 16) + ".");
UINT32 max_frames;
HRESULT hr = p_device->audio_client->GetBufferSize(&max_frames);
hr = p_device->audio_client->GetBufferSize(&max_frames);
ERR_FAIL_COND_V(hr != S_OK, ERR_CANT_OPEN);
// Due to WASAPI Shared Mode we have no control of the buffer size

View file

@ -36,8 +36,8 @@
/////////////////////////////////////////
// Maps to 2*axis if value is neg, or + 1 if value is pos.
static const char *_joy_axis_descriptions[JOY_AXIS_MAX * 2] = {
// Maps to 2*axis if value is neg, or 2*axis+1 if value is pos.
static const char *_joy_axis_descriptions[(size_t)JoyAxis::MAX * 2] = {
TTRC("Left Stick Left, Joystick 0 Left"),
TTRC("Left Stick Right, Joystick 0 Right"),
TTRC("Left Stick Up, Joystick 0 Up"),
@ -67,11 +67,11 @@ String InputEventConfigurationDialog::get_event_text(const Ref<InputEvent> &p_ev
Ref<InputEventJoypadMotion> jpmotion = p_event;
if (jpmotion.is_valid()) {
String desc = TTR("Unknown Joypad Axis");
if (jpmotion->get_axis() < JOY_AXIS_MAX) {
desc = RTR(_joy_axis_descriptions[2 * jpmotion->get_axis() + (jpmotion->get_axis_value() < 0 ? 0 : 1)]);
if (jpmotion->get_axis() < JoyAxis::MAX) {
desc = RTR(_joy_axis_descriptions[2 * (size_t)jpmotion->get_axis() + (jpmotion->get_axis_value() < 0 ? 0 : 1)]);
}
return vformat("Joypad Axis %s %s (%s)", itos(jpmotion->get_axis()), jpmotion->get_axis_value() < 0 ? "-" : "+", desc);
return vformat("Joypad Axis %s %s (%s)", itos((int64_t)jpmotion->get_axis()), jpmotion->get_axis_value() < 0 ? "-" : "+", desc);
} else {
return p_event->as_text();
}
@ -108,7 +108,7 @@ void InputEventConfigurationDialog::_set_event(const Ref<InputEvent> &p_event) {
if (k.is_valid()) {
show_phys_key = true;
physical_key_checkbox->set_pressed(k->get_physical_keycode() != 0 && k->get_keycode() == 0);
physical_key_checkbox->set_pressed(k->get_physical_keycode() != Key::NONE && k->get_keycode() == Key::NONE);
} else if (joyb.is_valid() || joym.is_valid() || mb.is_valid()) {
show_device = true;
@ -268,9 +268,9 @@ void InputEventConfigurationDialog::_listen_window_input(const Ref<InputEvent> &
k->set_pressed(false); // to avoid serialisation of 'pressed' property - doesn't matter for actions anyway.
// Maintain physical keycode option state
if (physical_key_checkbox->is_pressed()) {
k->set_keycode(KEY_NONE);
k->set_keycode(Key::NONE);
} else {
k->set_physical_keycode(KEY_NONE);
k->set_physical_keycode(Key::NONE);
}
}
@ -325,7 +325,7 @@ void InputEventConfigurationDialog::_update_input_list() {
mouse_root->set_collapsed(collapse);
mouse_root->set_meta("__type", INPUT_MOUSE_BUTTON);
MouseButton mouse_buttons[9] = { MOUSE_BUTTON_LEFT, MOUSE_BUTTON_RIGHT, MOUSE_BUTTON_MIDDLE, MOUSE_BUTTON_WHEEL_UP, MOUSE_BUTTON_WHEEL_DOWN, MOUSE_BUTTON_WHEEL_LEFT, MOUSE_BUTTON_WHEEL_RIGHT, MOUSE_BUTTON_XBUTTON1, MOUSE_BUTTON_XBUTTON2 };
MouseButton mouse_buttons[9] = { MouseButton::LEFT, MouseButton::RIGHT, MouseButton::MIDDLE, MouseButton::WHEEL_UP, MouseButton::WHEEL_DOWN, MouseButton::WHEEL_LEFT, MouseButton::WHEEL_RIGHT, MouseButton::MB_XBUTTON1, MouseButton::MB_XBUTTON2 };
for (int i = 0; i < 9; i++) {
Ref<InputEventMouseButton> mb;
mb.instantiate();
@ -349,7 +349,7 @@ void InputEventConfigurationDialog::_update_input_list() {
joyb_root->set_collapsed(collapse);
joyb_root->set_meta("__type", INPUT_JOY_BUTTON);
for (int i = 0; i < JOY_BUTTON_MAX; i++) {
for (int i = 0; i < (int)JoyButton::MAX; i++) {
Ref<InputEventJoypadButton> joyb;
joyb.instantiate();
joyb->set_button_index((JoyButton)i);
@ -372,7 +372,7 @@ void InputEventConfigurationDialog::_update_input_list() {
joya_root->set_collapsed(collapse);
joya_root->set_meta("__type", INPUT_JOY_MOTION);
for (int i = 0; i < JOY_AXIS_MAX * 2; i++) {
for (int i = 0; i < (int)JoyAxis::MAX * 2; i++) {
int axis = i / 2;
int direction = (i & 1) ? 1 : -1;
Ref<InputEventJoypadMotion> joym;
@ -453,10 +453,10 @@ void InputEventConfigurationDialog::_physical_keycode_toggled(bool p_checked) {
if (p_checked) {
k->set_physical_keycode(k->get_keycode());
k->set_keycode(KEY_NONE);
k->set_keycode(Key::NONE);
} else {
k->set_keycode((Key)k->get_physical_keycode());
k->set_physical_keycode(KEY_NONE);
k->set_physical_keycode(Key::NONE);
}
_set_event(k);
@ -480,9 +480,9 @@ void InputEventConfigurationDialog::_input_list_item_selected() {
if (physical_key_checkbox->is_pressed()) {
k->set_physical_keycode(keycode);
k->set_keycode(KEY_NONE);
k->set_keycode(Key::NONE);
} else {
k->set_physical_keycode(KEY_NONE);
k->set_physical_keycode(Key::NONE);
k->set_keycode(keycode);
}

View file

@ -618,7 +618,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
}
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) {
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::WHEEL_DOWN) {
const float v_zoom_orig = v_zoom;
if (mb->is_command_pressed()) {
timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() / 1.05);
@ -631,7 +631,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
update();
}
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) {
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::WHEEL_UP) {
const float v_zoom_orig = v_zoom;
if (mb->is_command_pressed()) {
timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() * 1.05);
@ -644,7 +644,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
update();
}
if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_MIDDLE) {
if (mb.is_valid() && mb->get_button_index() == MouseButton::MIDDLE) {
if (mb->is_pressed()) {
int x = mb->get_position().x - timeline->get_name_limit();
panning_timeline_from = x / timeline->get_zoom_scale();
@ -655,7 +655,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
}
}
if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) {
if (mb.is_valid() && mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed()) {
menu_insert_key = mb->get_position();
if (menu_insert_key.x >= timeline->get_name_limit() && menu_insert_key.x <= get_size().width - timeline->get_buttons_width()) {
Vector2 popup_pos = get_global_transform().xform(mb->get_position());
@ -675,7 +675,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
}
}
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) {
if (close_icon_rect.has_point(mb->get_position())) {
emit_signal(SNAME("close_request"));
return;
@ -792,7 +792,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
}
}
if (box_selecting_attempt && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (box_selecting_attempt && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) {
if (box_selecting) {
//do actual select
if (!box_selecting_add) {
@ -822,7 +822,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
update();
}
if (moving_handle != 0 && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (moving_handle != 0 && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) {
undo_redo->create_action(TTR("Move Bezier Points"));
undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_in_handle", track, moving_handle_key, moving_handle_left);
undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_out_handle", track, moving_handle_key, moving_handle_right);
@ -834,7 +834,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
update();
}
if (moving_selection_attempt && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (moving_selection_attempt && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) {
if (moving_selection) {
//combit it
@ -929,7 +929,7 @@ void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
}
Ref<InputEventMouseMotion> mm = p_event;
if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) {
if (mm.is_valid() && (mm->get_button_mask() & MouseButton::MASK_MIDDLE) != MouseButton::NONE) {
v_scroll += mm->get_relative().y * v_zoom;
if (v_scroll > 100000) {
v_scroll = 100000;

View file

@ -1722,48 +1722,48 @@ void AnimationTimelineEdit::gui_input(const Ref<InputEvent> &p_event) {
const Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->is_command_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) {
if (mb.is_valid() && mb->is_pressed() && mb->is_command_pressed() && mb->get_button_index() == MouseButton::WHEEL_UP) {
get_zoom()->set_value(get_zoom()->get_value() * 1.05);
accept_event();
}
if (mb.is_valid() && mb->is_pressed() && mb->is_command_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) {
if (mb.is_valid() && mb->is_pressed() && mb->is_command_pressed() && mb->get_button_index() == MouseButton::WHEEL_DOWN) {
get_zoom()->set_value(get_zoom()->get_value() / 1.05);
accept_event();
}
if (mb.is_valid() && mb->is_pressed() && mb->is_alt_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) {
if (mb.is_valid() && mb->is_pressed() && mb->is_alt_pressed() && mb->get_button_index() == MouseButton::WHEEL_UP) {
if (track_edit) {
track_edit->get_editor()->goto_prev_step(true);
}
accept_event();
}
if (mb.is_valid() && mb->is_pressed() && mb->is_alt_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) {
if (mb.is_valid() && mb->is_pressed() && mb->is_alt_pressed() && mb->get_button_index() == MouseButton::WHEEL_DOWN) {
if (track_edit) {
track_edit->get_editor()->goto_next_step(true);
}
accept_event();
}
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && hsize_rect.has_point(mb->get_position())) {
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT && hsize_rect.has_point(mb->get_position())) {
dragging_hsize = true;
dragging_hsize_from = mb->get_position().x;
dragging_hsize_at = name_limit;
}
if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && dragging_hsize) {
if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT && dragging_hsize) {
dragging_hsize = false;
}
if (mb.is_valid() && mb->get_position().x > get_name_limit() && mb->get_position().x < (get_size().width - get_buttons_width())) {
if (!panning_timeline && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (!panning_timeline && mb->get_button_index() == MouseButton::LEFT) {
int x = mb->get_position().x - get_name_limit();
float ofs = x / get_zoom_scale() + get_value();
emit_signal(SNAME("timeline_changed"), ofs, false, Input::get_singleton()->is_key_pressed(KEY_ALT));
emit_signal(SNAME("timeline_changed"), ofs, false, Input::get_singleton()->is_key_pressed(Key::ALT));
dragging_timeline = true;
}
if (!dragging_timeline && mb->get_button_index() == MOUSE_BUTTON_MIDDLE) {
if (!dragging_timeline && mb->get_button_index() == MouseButton::MIDDLE) {
int x = mb->get_position().x - get_name_limit();
panning_timeline_from = x / get_zoom_scale();
panning_timeline = true;
@ -1771,11 +1771,11 @@ void AnimationTimelineEdit::gui_input(const Ref<InputEvent> &p_event) {
}
}
if (dragging_timeline && mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT && !mb->is_pressed()) {
if (dragging_timeline && mb.is_valid() && mb->get_button_index() == MouseButton::LEFT && !mb->is_pressed()) {
dragging_timeline = false;
}
if (panning_timeline && mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_MIDDLE && !mb->is_pressed()) {
if (panning_timeline && mb.is_valid() && mb->get_button_index() == MouseButton::MIDDLE && !mb->is_pressed()) {
panning_timeline = false;
}
@ -1799,7 +1799,7 @@ void AnimationTimelineEdit::gui_input(const Ref<InputEvent> &p_event) {
if (dragging_timeline) {
int x = mm->get_position().x - get_name_limit();
float ofs = x / get_zoom_scale() + get_value();
emit_signal(SNAME("timeline_changed"), ofs, false, Input::get_singleton()->is_key_pressed(KEY_ALT));
emit_signal(SNAME("timeline_changed"), ofs, false, Input::get_singleton()->is_key_pressed(Key::ALT));
}
if (panning_timeline) {
int x = mm->get_position().x - get_name_limit();
@ -2655,7 +2655,7 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
}
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) {
Point2 pos = mb->get_position();
if (check_rect.has_point(pos)) {
@ -2801,7 +2801,7 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
}
}
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) {
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) {
Point2 pos = mb->get_position();
if (pos.x >= timeline->get_name_limit() && pos.x <= get_size().width - timeline->get_buttons_width()) {
// Can do something with menu too! show insert key.
@ -2831,7 +2831,7 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
}
}
if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && clicking_on_name) {
if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT && clicking_on_name) {
if (!path) {
path_popup = memnew(Popup);
path_popup->set_wrap_controls(true);
@ -2853,7 +2853,7 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
}
if (mb.is_valid() && moving_selection_attempt) {
if (!mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (!mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) {
moving_selection_attempt = false;
if (moving_selection) {
emit_signal(SNAME("move_selection_commit"));
@ -2864,7 +2864,7 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
select_single_attempt = -1;
}
if (moving_selection && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) {
if (moving_selection && mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) {
moving_selection_attempt = false;
moving_selection = false;
emit_signal(SNAME("move_selection_cancel"));
@ -2872,7 +2872,7 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
}
Ref<InputEventMouseMotion> mm = p_event;
if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT && moving_selection_attempt) {
if (mm.is_valid() && (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE && moving_selection_attempt) {
if (!moving_selection) {
moving_selection = true;
emit_signal(SNAME("move_selection_begin"));
@ -4166,7 +4166,7 @@ bool AnimationTrackEditor::is_selection_active() const {
}
bool AnimationTrackEditor::is_snap_enabled() const {
return snap->is_pressed() ^ Input::get_singleton()->is_key_pressed(KEY_CTRL);
return snap->is_pressed() ^ Input::get_singleton()->is_key_pressed(Key::CTRL);
}
void AnimationTrackEditor::_update_tracks() {
@ -5147,27 +5147,27 @@ void AnimationTrackEditor::_box_selection_draw() {
void AnimationTrackEditor::_scroll_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->is_command_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) {
if (mb.is_valid() && mb->is_pressed() && mb->is_command_pressed() && mb->get_button_index() == MouseButton::WHEEL_UP) {
timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() * 1.05);
scroll->accept_event();
}
if (mb.is_valid() && mb->is_pressed() && mb->is_command_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) {
if (mb.is_valid() && mb->is_pressed() && mb->is_command_pressed() && mb->get_button_index() == MouseButton::WHEEL_DOWN) {
timeline->get_zoom()->set_value(timeline->get_zoom()->get_value() / 1.05);
scroll->accept_event();
}
if (mb.is_valid() && mb->is_pressed() && mb->is_alt_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) {
if (mb.is_valid() && mb->is_pressed() && mb->is_alt_pressed() && mb->get_button_index() == MouseButton::WHEEL_UP) {
goto_prev_step(true);
scroll->accept_event();
}
if (mb.is_valid() && mb->is_pressed() && mb->is_alt_pressed() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) {
if (mb.is_valid() && mb->is_pressed() && mb->is_alt_pressed() && mb->get_button_index() == MouseButton::WHEEL_DOWN) {
goto_next_step(true);
scroll->accept_event();
}
if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT) {
if (mb->is_pressed()) {
box_selecting = true;
box_selecting_from = scroll->get_global_transform().xform(mb->get_position());
@ -5195,12 +5195,12 @@ void AnimationTrackEditor::_scroll_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseMotion> mm = p_event;
if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_MIDDLE) {
if (mm.is_valid() && (mm->get_button_mask() & MouseButton::MASK_MIDDLE) != MouseButton::NONE) {
timeline->set_value(timeline->get_value() - mm->get_relative().x / timeline->get_zoom_scale());
}
if (mm.is_valid() && box_selecting) {
if (!(mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT)) {
if ((mm->get_button_mask() & MouseButton::MASK_LEFT) == MouseButton::NONE) {
// No longer.
box_selection->hide();
box_selecting = false;
@ -5349,7 +5349,7 @@ void AnimationTrackEditor::goto_prev_step(bool p_from_mouse_event) {
if (step == 0) {
step = 1;
}
if (p_from_mouse_event && Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
if (p_from_mouse_event && Input::get_singleton()->is_key_pressed(Key::SHIFT)) {
// Use more precise snapping when holding Shift.
// This is used when scrobbling the timeline using Alt + Mouse wheel.
step *= 0.25;
@ -5372,7 +5372,7 @@ void AnimationTrackEditor::goto_next_step(bool p_from_mouse_event) {
if (step == 0) {
step = 1;
}
if (p_from_mouse_event && Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
if (p_from_mouse_event && Input::get_singleton()->is_key_pressed(Key::SHIFT)) {
// Use more precise snapping when holding Shift.
// This is used when scrobbling the timeline using Alt + Mouse wheel.
// Do not use precise snapping when using the menu action or keyboard shortcut,
@ -5808,7 +5808,7 @@ float AnimationTrackEditor::snap_time(float p_value, bool p_relative) {
snap_increment = step->get_value();
}
if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
if (Input::get_singleton()->is_key_pressed(Key::SHIFT)) {
// Use more precise snapping when holding Shift.
snap_increment *= 0.25;
}
@ -5922,10 +5922,10 @@ void AnimationTrackEditor::_pick_track_filter_input(const Ref<InputEvent> &p_ie)
if (k.is_valid()) {
switch (k->get_keycode()) {
case KEY_UP:
case KEY_DOWN:
case KEY_PAGEUP:
case KEY_PAGEDOWN: {
case Key::UP:
case Key::DOWN:
case Key::PAGEUP:
case Key::PAGEDOWN: {
pick_track->get_scene_tree()->get_scene_tree()->gui_input(k);
pick_track->get_filter_line_edit()->accept_event();
} break;
@ -6086,14 +6086,14 @@ AnimationTrackEditor::AnimationTrackEditor() {
edit->get_popup()->add_item(TTR("Scale Selection"), EDIT_SCALE_SELECTION);
edit->get_popup()->add_item(TTR("Scale From Cursor"), EDIT_SCALE_FROM_CURSOR);
edit->get_popup()->add_separator();
edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/duplicate_selection", TTR("Duplicate Selection"), KEY_MASK_CMD | KEY_D), EDIT_DUPLICATE_SELECTION);
edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/duplicate_selection_transposed", TTR("Duplicate Transposed"), KEY_MASK_SHIFT | KEY_MASK_CMD | KEY_D), EDIT_DUPLICATE_TRANSPOSED);
edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/duplicate_selection", TTR("Duplicate Selection"), KeyModifierMask::CMD | Key::D), EDIT_DUPLICATE_SELECTION);
edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/duplicate_selection_transposed", TTR("Duplicate Transposed"), KeyModifierMask::SHIFT | KeyModifierMask::CMD | Key::D), EDIT_DUPLICATE_TRANSPOSED);
edit->get_popup()->add_separator();
edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/delete_selection", TTR("Delete Selection"), KEY_DELETE), EDIT_DELETE_SELECTION);
edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/delete_selection", TTR("Delete Selection"), Key::KEY_DELETE), EDIT_DELETE_SELECTION);
edit->get_popup()->add_separator();
edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/goto_next_step", TTR("Go to Next Step"), KEY_MASK_CMD | KEY_RIGHT), EDIT_GOTO_NEXT_STEP);
edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/goto_prev_step", TTR("Go to Previous Step"), KEY_MASK_CMD | KEY_LEFT), EDIT_GOTO_PREV_STEP);
edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/goto_next_step", TTR("Go to Next Step"), KeyModifierMask::CMD | Key::RIGHT), EDIT_GOTO_NEXT_STEP);
edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/goto_prev_step", TTR("Go to Previous Step"), KeyModifierMask::CMD | Key::LEFT), EDIT_GOTO_PREV_STEP);
edit->get_popup()->add_separator();
edit->get_popup()->add_shortcut(ED_SHORTCUT("animation_editor/apply_reset", TTR("Apply Reset")), EDIT_APPLY_RESET);
edit->get_popup()->add_separator();

View file

@ -1098,7 +1098,7 @@ void AnimationTrackEditTypeAudio::gui_input(const Ref<InputEvent> &p_event) {
}
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT && get_default_cursor_shape() == CURSOR_HSIZE) {
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT && get_default_cursor_shape() == CURSOR_HSIZE) {
len_resizing = true;
len_resizing_start = mb->is_shift_pressed();
len_resizing_from_px = mb->get_position().x;
@ -1108,7 +1108,7 @@ void AnimationTrackEditTypeAudio::gui_input(const Ref<InputEvent> &p_event) {
return;
}
if (len_resizing && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (len_resizing && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) {
float ofs_local = -len_resizing_rel / get_timeline()->get_zoom_scale();
if (len_resizing_start) {
float prev_ofs = get_animation()->audio_track_get_key_start_offset(get_track(), len_resizing_index);

View file

@ -127,7 +127,7 @@ void FindReplaceBar::unhandled_input(const Ref<InputEvent> &p_event) {
bool accepted = true;
switch (k->get_keycode()) {
case KEY_ESCAPE: {
case Key::ESCAPE: {
_hide_bar();
} break;
default: {
@ -542,7 +542,7 @@ void FindReplaceBar::_search_text_changed(const String &p_text) {
}
void FindReplaceBar::_search_text_submitted(const String &p_text) {
if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
if (Input::get_singleton()->is_key_pressed(Key::SHIFT)) {
search_prev();
} else {
search_next();
@ -553,7 +553,7 @@ void FindReplaceBar::_replace_text_submitted(const String &p_text) {
if (selection_only->is_pressed() && text_editor->has_selection()) {
_replace_all();
_hide_bar();
} else if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
} else if (Input::get_singleton()->is_key_pressed(Key::SHIFT)) {
_replace();
search_prev();
} else {
@ -766,9 +766,9 @@ void CodeTextEditor::_text_editor_gui_input(const Ref<InputEvent> &p_event) {
if (mb.is_valid()) {
if (mb->is_pressed() && mb->is_command_pressed()) {
if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) {
if (mb->get_button_index() == MouseButton::WHEEL_UP) {
_zoom_in();
} else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) {
} else if (mb->get_button_index() == MouseButton::WHEEL_DOWN) {
_zoom_out();
}
}
@ -1654,7 +1654,7 @@ void CodeTextEditor::_toggle_scripts_pressed() {
void CodeTextEditor::_error_pressed(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) {
goto_error();
}
}
@ -1788,9 +1788,9 @@ void CodeTextEditor::update_toggle_scripts_button() {
CodeTextEditor::CodeTextEditor() {
code_complete_func = nullptr;
ED_SHORTCUT("script_editor/zoom_in", TTR("Zoom In"), KEY_MASK_CMD | KEY_EQUAL);
ED_SHORTCUT("script_editor/zoom_out", TTR("Zoom Out"), KEY_MASK_CMD | KEY_MINUS);
ED_SHORTCUT("script_editor/reset_zoom", TTR("Reset Zoom"), KEY_MASK_CMD | KEY_0);
ED_SHORTCUT("script_editor/zoom_in", TTR("Zoom In"), KeyModifierMask::CMD | Key::EQUAL);
ED_SHORTCUT("script_editor/zoom_out", TTR("Zoom Out"), KeyModifierMask::CMD | Key::MINUS);
ED_SHORTCUT("script_editor/reset_zoom", TTR("Reset Zoom"), KeyModifierMask::CMD | Key::KEY_0);
text_editor = memnew(CodeEdit);
add_child(text_editor);

View file

@ -352,10 +352,10 @@ void CreateDialog::_sbox_input(const Ref<InputEvent> &p_ie) {
Ref<InputEventKey> k = p_ie;
if (k.is_valid()) {
switch (k->get_keycode()) {
case KEY_UP:
case KEY_DOWN:
case KEY_PAGEUP:
case KEY_PAGEDOWN: {
case Key::UP:
case Key::DOWN:
case Key::PAGEUP:
case Key::PAGEDOWN: {
search_options->gui_input(k);
search_box->accept_event();
} break;

View file

@ -249,7 +249,7 @@ TreeItem *EditorPerformanceProfiler::_create_monitor_item(const StringName &p_mo
void EditorPerformanceProfiler::_marker_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) {
Vector<StringName> active;
for (OrderedHashMap<StringName, Monitor>::Element i = monitors.front(); i; i = i.next()) {
if (i.value().item->is_checked(0)) {

View file

@ -438,7 +438,7 @@ void EditorProfiler::_graph_tex_input(const Ref<InputEvent> &p_ev) {
Ref<InputEventMouseMotion> mm = p_ev;
if (
(mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) ||
(mb.is_valid() && mb->get_button_index() == MouseButton::LEFT && mb->is_pressed()) ||
(mm.is_valid())) {
int x = me->get_position().x - 1;
x = x * frame_metrics.size() / graph->get_size().width;
@ -453,7 +453,7 @@ void EditorProfiler::_graph_tex_input(const Ref<InputEvent> &p_ev) {
x = frame_metrics.size() - 1;
}
if (mb.is_valid() || mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) {
if (mb.is_valid() || (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) {
updating_frame = true;
if (x < total_metrics)

View file

@ -517,7 +517,7 @@ void EditorVisualProfiler::_graph_tex_input(const Ref<InputEvent> &p_ev) {
Ref<InputEventMouseMotion> mm = p_ev;
if (
(mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) ||
(mb.is_valid() && mb->get_button_index() == MouseButton::LEFT && mb->is_pressed()) ||
(mm.is_valid())) {
int half_w = graph->get_size().width / 2;
int x = me->get_position().x;
@ -549,7 +549,7 @@ void EditorVisualProfiler::_graph_tex_input(const Ref<InputEvent> &p_ev) {
hover_metric = -1;
}
if (mb.is_valid() || mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) {
if (mb.is_valid() || (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) {
//cursor_metric=x;
updating_frame = true;

View file

@ -41,7 +41,7 @@
#include "scene/resources/theme.h"
// Used for a hack preserving Mono properties on non-Mono builds.
#include "modules/modules_enabled.gen.h"
#include "modules/modules_enabled.gen.h" // For mono.
void DocTools::merge_from(const DocTools &p_data) {
for (KeyValue<String, DocData::ClassDoc> &E : class_list) {

View file

@ -303,7 +303,7 @@ void EditorAudioBus::_volume_changed(float p_normalized) {
const float p_db = this->_normalized_volume_to_scaled_db(p_normalized);
if (Input::get_singleton()->is_key_pressed(KEY_CTRL)) {
if (Input::get_singleton()->is_key_pressed(Key::CTRL)) {
// Snap the value when holding Ctrl for easier editing.
// To do so, it needs to be converted back to normalized volume (as the slider uses that unit).
slider->set_value(_scaled_db_to_normalized_volume(Math::round(p_db)));
@ -363,7 +363,7 @@ float EditorAudioBus::_scaled_db_to_normalized_volume(float db) {
void EditorAudioBus::_show_value(float slider_value) {
float db;
if (Input::get_singleton()->is_key_pressed(KEY_CTRL)) {
if (Input::get_singleton()->is_key_pressed(Key::CTRL)) {
// Display the correct (snapped) value when holding Ctrl
db = Math::round(_normalized_volume_to_scaled_db(slider_value));
} else {
@ -534,7 +534,7 @@ void EditorAudioBus::gui_input(const Ref<InputEvent> &p_event) {
ERR_FAIL_COND(p_event.is_null());
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) {
if (mb.is_valid() && mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed()) {
Vector2 pos = mb->get_position();
bus_popup->set_position(get_global_position() + pos);
bus_popup->popup();
@ -543,7 +543,7 @@ void EditorAudioBus::gui_input(const Ref<InputEvent> &p_event) {
void EditorAudioBus::_effects_gui_input(Ref<InputEvent> p_event) {
Ref<InputEventKey> k = p_event;
if (k.is_valid() && k->is_pressed() && !k->is_echo() && k->get_keycode() == KEY_DELETE) {
if (k.is_valid() && k->is_pressed() && !k->is_echo() && k->get_keycode() == Key::KEY_DELETE) {
TreeItem *current_effect = effects->get_selected();
if (current_effect && current_effect->get_metadata(0).get_type() == Variant::INT) {
_delete_effect_pressed(0);
@ -925,8 +925,8 @@ EditorAudioBus::EditorAudioBus(EditorAudioBuses *p_buses, bool p_is_master) {
hbc->add_child(bus_options);
bus_popup = bus_options->get_popup();
bus_popup->add_shortcut(ED_SHORTCUT("audio_bus_editor/duplicate_selected_bus", TTR("Duplicate Bus"), KEY_MASK_CMD | KEY_D));
bus_popup->add_shortcut(ED_SHORTCUT("audio_bus_editor/delete_selected_bus", TTR("Delete Bus"), KEY_DELETE));
bus_popup->add_shortcut(ED_SHORTCUT("audio_bus_editor/duplicate_selected_bus", TTR("Duplicate Bus"), KeyModifierMask::CMD | Key::D));
bus_popup->add_shortcut(ED_SHORTCUT("audio_bus_editor/delete_selected_bus", TTR("Delete Bus"), Key::KEY_DELETE));
bus_popup->set_item_disabled(1, is_master);
bus_popup->add_item(TTR("Reset Volume"));
bus_popup->connect("index_pressed", callable_mp(this, &EditorAudioBus::_bus_popup_pressed));

View file

@ -149,10 +149,10 @@ void EditorCommandPalette::_sbox_input(const Ref<InputEvent> &p_ie) {
Ref<InputEventKey> k = p_ie;
if (k.is_valid()) {
switch (k->get_keycode()) {
case KEY_UP:
case KEY_DOWN:
case KEY_PAGEUP:
case KEY_PAGEDOWN: {
case Key::UP:
case Key::DOWN:
case Key::PAGEUP:
case Key::PAGEDOWN: {
search_options->gui_input(k);
} break;
default:

View file

@ -99,6 +99,6 @@ public:
static EditorCommandPalette *get_singleton();
};
Ref<Shortcut> ED_SHORTCUT_AND_COMMAND(const String &p_path, const String &p_name, Key p_keycode = KEY_NONE, String p_command = "");
Ref<Shortcut> ED_SHORTCUT_AND_COMMAND(const String &p_path, const String &p_name, Key p_keycode = Key::NONE, String p_command = "");
#endif //EDITOR_COMMAND_PALETTE_H

View file

@ -598,7 +598,7 @@ void EditorFileDialog::_item_list_item_rmb_selected(int p_item, const Vector2 &p
item_menu->add_icon_item(item_list->get_theme_icon(SNAME("ActionCopy"), SNAME("EditorIcons")), TTR("Copy Path"), ITEM_MENU_COPY_PATH);
}
if (allow_delete) {
item_menu->add_icon_item(item_list->get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), TTR("Delete"), ITEM_MENU_DELETE, KEY_DELETE);
item_menu->add_icon_item(item_list->get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), TTR("Delete"), ITEM_MENU_DELETE, Key::KEY_DELETE);
}
if (single_item_selected) {
item_menu->add_separator();
@ -623,9 +623,9 @@ void EditorFileDialog::_item_list_rmb_clicked(const Vector2 &p_pos) {
item_menu->set_size(Size2(1, 1));
if (can_create_dir) {
item_menu->add_icon_item(item_list->get_theme_icon(SNAME("folder"), SNAME("FileDialog")), TTR("New Folder..."), ITEM_MENU_NEW_FOLDER, KEY_MASK_CMD | KEY_N);
item_menu->add_icon_item(item_list->get_theme_icon(SNAME("folder"), SNAME("FileDialog")), TTR("New Folder..."), ITEM_MENU_NEW_FOLDER, KeyModifierMask::CMD | Key::N);
}
item_menu->add_icon_item(item_list->get_theme_icon(SNAME("Reload"), SNAME("EditorIcons")), TTR("Refresh"), ITEM_MENU_REFRESH, KEY_F5);
item_menu->add_icon_item(item_list->get_theme_icon(SNAME("Reload"), SNAME("EditorIcons")), TTR("Refresh"), ITEM_MENU_REFRESH, Key::F5);
item_menu->add_separator();
item_menu->add_icon_item(item_list->get_theme_icon(SNAME("Filesystem"), SNAME("EditorIcons")), TTR("Open in File Manager"), ITEM_MENU_SHOW_IN_EXPLORER);
@ -1476,18 +1476,18 @@ EditorFileDialog::EditorFileDialog() {
mode = FILE_MODE_SAVE_FILE;
set_title(TTR("Save a File"));
ED_SHORTCUT("file_dialog/go_back", TTR("Go Back"), KEY_MASK_ALT | KEY_LEFT);
ED_SHORTCUT("file_dialog/go_forward", TTR("Go Forward"), KEY_MASK_ALT | KEY_RIGHT);
ED_SHORTCUT("file_dialog/go_up", TTR("Go Up"), KEY_MASK_ALT | KEY_UP);
ED_SHORTCUT("file_dialog/refresh", TTR("Refresh"), KEY_F5);
ED_SHORTCUT("file_dialog/toggle_hidden_files", TTR("Toggle Hidden Files"), KEY_MASK_CMD | KEY_H);
ED_SHORTCUT("file_dialog/toggle_favorite", TTR("Toggle Favorite"), KEY_MASK_ALT | KEY_F);
ED_SHORTCUT("file_dialog/toggle_mode", TTR("Toggle Mode"), KEY_MASK_ALT | KEY_V);
ED_SHORTCUT("file_dialog/create_folder", TTR("Create Folder"), KEY_MASK_CMD | KEY_N);
ED_SHORTCUT("file_dialog/delete", TTR("Delete"), KEY_DELETE);
ED_SHORTCUT("file_dialog/focus_path", TTR("Focus Path"), KEY_MASK_CMD | KEY_D);
ED_SHORTCUT("file_dialog/move_favorite_up", TTR("Move Favorite Up"), KEY_MASK_CMD | KEY_UP);
ED_SHORTCUT("file_dialog/move_favorite_down", TTR("Move Favorite Down"), KEY_MASK_CMD | KEY_DOWN);
ED_SHORTCUT("file_dialog/go_back", TTR("Go Back"), KeyModifierMask::ALT | Key::LEFT);
ED_SHORTCUT("file_dialog/go_forward", TTR("Go Forward"), KeyModifierMask::ALT | Key::RIGHT);
ED_SHORTCUT("file_dialog/go_up", TTR("Go Up"), KeyModifierMask::ALT | Key::UP);
ED_SHORTCUT("file_dialog/refresh", TTR("Refresh"), Key::F5);
ED_SHORTCUT("file_dialog/toggle_hidden_files", TTR("Toggle Hidden Files"), KeyModifierMask::CMD | Key::H);
ED_SHORTCUT("file_dialog/toggle_favorite", TTR("Toggle Favorite"), KeyModifierMask::ALT | Key::F);
ED_SHORTCUT("file_dialog/toggle_mode", TTR("Toggle Mode"), KeyModifierMask::ALT | Key::V);
ED_SHORTCUT("file_dialog/create_folder", TTR("Create Folder"), KeyModifierMask::CMD | Key::N);
ED_SHORTCUT("file_dialog/delete", TTR("Delete"), Key::KEY_DELETE);
ED_SHORTCUT("file_dialog/focus_path", TTR("Focus Path"), KeyModifierMask::CMD | Key::D);
ED_SHORTCUT("file_dialog/move_favorite_up", TTR("Move Favorite Up"), KeyModifierMask::CMD | Key::UP);
ED_SHORTCUT("file_dialog/move_favorite_down", TTR("Move Favorite Down"), KeyModifierMask::CMD | Key::DOWN);
HBoxContainer *pathhb = memnew(HBoxContainer);

View file

@ -1429,14 +1429,15 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) {
bbcode = bbcode.replace("[/gdscript]", "[/codeblock]");
for (int pos = bbcode.find("[csharp]"); pos != -1; pos = bbcode.find("[csharp]")) {
if (bbcode.find("[/csharp]") == -1) {
int end_pos = bbcode.find("[/csharp]");
if (end_pos == -1) {
WARN_PRINT("Unclosed [csharp] block or parse fail in code (search for tag errors)");
break;
}
bbcode.erase(pos, bbcode.find("[/csharp]") + 9 - pos);
bbcode = bbcode.left(pos) + bbcode.substr(end_pos + 9); // 9 is length of "[/csharp]".
while (bbcode[pos] == '\n') {
bbcode.erase(pos, 1);
bbcode = bbcode.left(pos) + bbcode.substr(pos + 1);
}
}
break;
@ -1445,14 +1446,15 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) {
bbcode = bbcode.replace("[/csharp]", "[/codeblock]");
for (int pos = bbcode.find("[gdscript]"); pos != -1; pos = bbcode.find("[gdscript]")) {
if (bbcode.find("[/gdscript]") == -1) {
int end_pos = bbcode.find("[/gdscript]");
if (end_pos == -1) {
WARN_PRINT("Unclosed [gdscript] block or parse fail in code (search for tag errors)");
break;
}
bbcode.erase(pos, bbcode.find("[/gdscript]") + 11 - pos);
bbcode = bbcode.left(pos) + bbcode.substr(end_pos + 11); // 11 is length of "[/gdscript]".
while (bbcode[pos] == '\n') {
bbcode.erase(pos, 1);
bbcode = bbcode.left(pos) + bbcode.substr(pos + 1);
}
}
break;
@ -2021,7 +2023,7 @@ void FindBar::unhandled_input(const Ref<InputEvent> &p_event) {
bool accepted = true;
switch (k->get_keycode()) {
case KEY_ESCAPE: {
case Key::ESCAPE: {
_hide_bar();
} break;
default: {
@ -2041,7 +2043,7 @@ void FindBar::_search_text_changed(const String &p_text) {
}
void FindBar::_search_text_submitted(const String &p_text) {
if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
if (Input::get_singleton()->is_key_pressed(Key::SHIFT)) {
search_prev();
} else {
search_next();

View file

@ -67,10 +67,10 @@ void EditorHelpSearch::_search_box_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventKey> key = p_event;
if (key.is_valid()) {
switch (key->get_keycode()) {
case KEY_UP:
case KEY_DOWN:
case KEY_PAGEUP:
case KEY_PAGEDOWN: {
case Key::UP:
case Key::DOWN:
case Key::PAGEUP:
case Key::PAGEDOWN: {
results_tree->gui_input(key);
search_box->accept_event();
} break;

View file

@ -571,7 +571,7 @@ void EditorProperty::gui_input(const Ref<InputEvent> &p_event) {
if (is_layout_rtl()) {
mpos.x = get_size().x - mpos.x;
}
bool button_left = me->get_button_mask() & MOUSE_BUTTON_MASK_LEFT;
bool button_left = (me->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE;
bool new_keying_hover = keying_rect.has_point(mpos) && !button_left;
if (new_keying_hover != keying_hover) {
@ -600,7 +600,7 @@ void EditorProperty::gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) {
Vector2 mpos = mb->get_position();
if (is_layout_rtl()) {
mpos.x = get_size().x - mpos.x;
@ -647,7 +647,7 @@ void EditorProperty::gui_input(const Ref<InputEvent> &p_event) {
update();
emit_signal(SNAME("property_checked"), property, checked);
}
} else if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) {
} else if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) {
_update_popup();
menu->set_position(get_screen_position() + get_local_mouse_position());
menu->set_size(Vector2(1, 1));
@ -1014,11 +1014,15 @@ bool EditorInspectorPlugin::can_handle(Object *p_object) {
}
void EditorInspectorPlugin::parse_begin(Object *p_object) {
GDVIRTUAL_CALL(_parse_begin);
GDVIRTUAL_CALL(_parse_begin, p_object);
}
void EditorInspectorPlugin::parse_category(Object *p_object, const String &p_parse_category) {
GDVIRTUAL_CALL(_parse_category, p_object, p_parse_category);
void EditorInspectorPlugin::parse_category(Object *p_object, const String &p_category) {
GDVIRTUAL_CALL(_parse_category, p_object, p_category);
}
void EditorInspectorPlugin::parse_group(Object *p_object, const String &p_group) {
GDVIRTUAL_CALL(_parse_group, p_object, p_group);
}
bool EditorInspectorPlugin::parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide) {
@ -1029,8 +1033,8 @@ bool EditorInspectorPlugin::parse_property(Object *p_object, const Variant::Type
return false;
}
void EditorInspectorPlugin::parse_end() {
GDVIRTUAL_CALL(_parse_end);
void EditorInspectorPlugin::parse_end(Object *p_object) {
GDVIRTUAL_CALL(_parse_end, p_object);
}
void EditorInspectorPlugin::_bind_methods() {
@ -1039,10 +1043,11 @@ void EditorInspectorPlugin::_bind_methods() {
ClassDB::bind_method(D_METHOD("add_property_editor_for_multiple_properties", "label", "properties", "editor"), &EditorInspectorPlugin::add_property_editor_for_multiple_properties);
GDVIRTUAL_BIND(_can_handle, "object")
GDVIRTUAL_BIND(_parse_begin)
GDVIRTUAL_BIND(_parse_begin, "object")
GDVIRTUAL_BIND(_parse_category, "object", "category")
GDVIRTUAL_BIND(_parse_group, "object", "group")
GDVIRTUAL_BIND(_parse_property, "object", "type", "name", "hint_type", "hint_string", "usage_flags", "wide");
GDVIRTUAL_BIND(_parse_end)
GDVIRTUAL_BIND(_parse_end, "object")
}
////////////////////////////////////////////////
@ -1217,7 +1222,7 @@ void EditorInspectorSection::_notification(int p_what) {
Color c = bg_color;
c.a *= 0.4;
if (foldable && header_rect.has_point(get_local_mouse_position())) {
c = c.lightened(Input::get_singleton()->is_mouse_button_pressed(MOUSE_BUTTON_LEFT) ? -0.05 : 0.2);
c = c.lightened(Input::get_singleton()->is_mouse_button_pressed(MouseButton::LEFT) ? -0.05 : 0.2);
}
draw_rect(header_rect, c);
@ -1335,7 +1340,7 @@ void EditorInspectorSection::gui_input(const Ref<InputEvent> &p_event) {
}
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) {
Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Tree"));
int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Tree"));
if (mb->get_position().y > font->get_height(font_size)) { //clicked outside
@ -1538,7 +1543,7 @@ void EditorInspectorArray::_panel_gui_input(Ref<InputEvent> p_event, int p_index
if (key_ref.is_valid()) {
const InputEventKey &key = **key_ref;
if (array_elements[p_index].panel->has_focus() && key.is_pressed() && key.get_keycode() == KEY_DELETE) {
if (array_elements[p_index].panel->has_focus() && key.is_pressed() && key.get_keycode() == Key::KEY_DELETE) {
_move_element(begin_array_index + p_index, -1);
array_elements[p_index].panel->accept_event();
}
@ -1546,7 +1551,7 @@ void EditorInspectorArray::_panel_gui_input(Ref<InputEvent> p_event, int p_index
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid()) {
if (mb->get_button_index() == MOUSE_BUTTON_RIGHT) {
if (mb->get_button_index() == MouseButton::RIGHT) {
popup_array_index_pressed = begin_array_index + p_index;
rmb_popup->set_item_disabled(OPTION_MOVE_UP, popup_array_index_pressed == 0);
rmb_popup->set_item_disabled(OPTION_MOVE_DOWN, popup_array_index_pressed == count - 1);
@ -2628,6 +2633,12 @@ void EditorInspector::update_tree() {
c.a /= level;
section->setup(acc_path, component, object, c, use_folding);
// Add editors at the start of a group.
for (Ref<EditorInspectorPlugin> &ped : valid_plugins) {
ped->parse_group(object, path);
_parse_added_editors(section->get_vbox(), ped);
}
vbox_per_path[root_vbox][acc_path] = section->get_vbox();
}
@ -2837,7 +2848,7 @@ void EditorInspector::update_tree() {
// Get the lists of to add at the end.
for (Ref<EditorInspectorPlugin> &ped : valid_plugins) {
ped->parse_end();
ped->parse_end(object);
_parse_added_editors(main_vbox, ped);
}
}
@ -3075,12 +3086,20 @@ void EditorInspector::_edit_set(const String &p_name, const Variant &p_value, bo
} else {
undo_redo->create_action(vformat(TTR("Set %s"), p_name), UndoRedo::MERGE_ENDS);
undo_redo->add_do_property(object, p_name, p_value);
undo_redo->add_undo_property(object, p_name, object->get(p_name));
bool valid = false;
Variant value = object->get(p_name, &valid);
if (valid) {
undo_redo->add_undo_property(object, p_name, value);
}
PropertyInfo prop_info;
if (ClassDB::get_property_info(object->get_class_name(), p_name, &prop_info)) {
for (const String &linked_prop : prop_info.linked_properties) {
undo_redo->add_undo_property(object, linked_prop, object->get(linked_prop));
valid = false;
value = object->get(linked_prop, &valid);
if (valid) {
undo_redo->add_undo_property(object, linked_prop, value);
}
}
}
@ -3557,7 +3576,7 @@ EditorInspector::EditorInspector() {
refresh_countdown = 0.33;
}
ED_SHORTCUT("property_editor/copy_property", TTR("Copy Property"), KEY_MASK_CMD | KEY_C);
ED_SHORTCUT("property_editor/paste_property", TTR("Paste Property"), KEY_MASK_CMD | KEY_V);
ED_SHORTCUT("property_editor/copy_property_path", TTR("Copy Property Path"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_C);
ED_SHORTCUT("property_editor/copy_property", TTR("Copy Property"), KeyModifierMask::CMD | Key::C);
ED_SHORTCUT("property_editor/paste_property", TTR("Paste Property"), KeyModifierMask::CMD | Key::V);
ED_SHORTCUT("property_editor/copy_property_path", TTR("Copy Property Path"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::C);
}

View file

@ -215,10 +215,11 @@ protected:
static void _bind_methods();
GDVIRTUAL1RC(bool, _can_handle, Variant)
GDVIRTUAL0(_parse_begin)
GDVIRTUAL1(_parse_begin, Object *)
GDVIRTUAL2(_parse_category, Object *, String)
GDVIRTUAL2(_parse_group, Object *, String)
GDVIRTUAL7R(bool, _parse_property, Object *, int, String, int, String, int, bool)
GDVIRTUAL0(_parse_end)
GDVIRTUAL1(_parse_end, Object *)
public:
void add_custom_control(Control *control);
@ -227,9 +228,10 @@ public:
virtual bool can_handle(Object *p_object);
virtual void parse_begin(Object *p_object);
virtual void parse_category(Object *p_object, const String &p_parse_category);
virtual void parse_category(Object *p_object, const String &p_category);
virtual void parse_group(Object *p_object, const String &p_group);
virtual bool parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false);
virtual void parse_end();
virtual void parse_end(Object *p_object);
};
class EditorInspectorCategory : public Control {

View file

@ -46,15 +46,15 @@ void EditorLayoutsDialog::_line_gui_input(const Ref<InputEvent> &p_event) {
}
switch (k->get_keycode()) {
case KEY_KP_ENTER:
case KEY_ENTER: {
case Key::KP_ENTER:
case Key::ENTER: {
if (get_hide_on_ok()) {
hide();
}
ok_pressed();
set_input_as_handled();
} break;
case KEY_ESCAPE: {
case Key::ESCAPE: {
hide();
set_input_as_handled();
} break;

View file

@ -366,7 +366,7 @@ EditorLog::EditorLog() {
clear_button = memnew(Button);
clear_button->set_flat(true);
clear_button->set_focus_mode(FOCUS_NONE);
clear_button->set_shortcut(ED_SHORTCUT("editor/clear_output", TTR("Clear Output"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_K));
clear_button->set_shortcut(ED_SHORTCUT("editor/clear_output", TTR("Clear Output"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::K));
clear_button->set_shortcut_context(this);
clear_button->connect("pressed", callable_mp(this, &EditorLog::_clear_request));
hb_tools->add_child(clear_button);
@ -375,7 +375,7 @@ EditorLog::EditorLog() {
copy_button = memnew(Button);
copy_button->set_flat(true);
copy_button->set_focus_mode(FOCUS_NONE);
copy_button->set_shortcut(ED_SHORTCUT("editor/copy_output", TTR("Copy Selection"), KEY_MASK_CMD | KEY_C));
copy_button->set_shortcut(ED_SHORTCUT("editor/copy_output", TTR("Copy Selection"), KeyModifierMask::CMD | Key::C));
copy_button->set_shortcut_context(this);
copy_button->connect("pressed", callable_mp(this, &EditorLog::_copy_request));
hb_tools->add_child(copy_button);
@ -401,7 +401,7 @@ EditorLog::EditorLog() {
show_search_button->set_focus_mode(FOCUS_NONE);
show_search_button->set_toggle_mode(true);
show_search_button->set_pressed(true);
show_search_button->set_shortcut(ED_SHORTCUT("editor/open_search", TTR("Focus Search/Filter Bar"), KEY_MASK_CMD | KEY_F));
show_search_button->set_shortcut(ED_SHORTCUT("editor/open_search", TTR("Focus Search/Filter Bar"), KeyModifierMask::CMD | Key::F));
show_search_button->set_shortcut_context(this);
show_search_button->connect("toggled", callable_mp(this, &EditorLog::_set_search_visible));
hb_tools2->add_child(show_search_button);

View file

@ -2646,7 +2646,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
} break;
case EDIT_UNDO: {
if (Input::get_singleton()->get_mouse_button_mask() & 0x7) {
if ((int)Input::get_singleton()->get_mouse_button_mask() & 0x7) {
log->add_message(TTR("Can't undo while mouse buttons are pressed."), EditorLog::MSG_TYPE_EDITOR);
} else {
String action = editor_data.get_undo_redo().get_current_action_name();
@ -2659,7 +2659,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
}
} break;
case EDIT_REDO: {
if (Input::get_singleton()->get_mouse_button_mask() & 0x7) {
if ((int)Input::get_singleton()->get_mouse_button_mask() & 0x7) {
log->add_message(TTR("Can't redo while mouse buttons are pressed."), EditorLog::MSG_TYPE_EDITOR);
} else {
if (!editor_data.get_undo_redo().redo()) {
@ -4325,7 +4325,7 @@ void EditorNode::_dock_select_input(const Ref<InputEvent> &p_input) {
Ref<InputEventMouseButton> mb = me;
if (mb.is_valid() && mb->get_button_index() == 1 && mb->is_pressed() && dock_popup_selected != nrect) {
if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT && mb->is_pressed() && dock_popup_selected != nrect) {
Control *dock = dock_slot[dock_popup_selected]->get_current_tab_control();
if (dock) {
dock_slot[dock_popup_selected]->remove_child(dock);
@ -5018,15 +5018,15 @@ void EditorNode::_scene_tab_input(const Ref<InputEvent> &p_input) {
if (mb.is_valid()) {
if (scene_tabs->get_hovered_tab() >= 0) {
if (mb->get_button_index() == MOUSE_BUTTON_MIDDLE && mb->is_pressed()) {
if (mb->get_button_index() == MouseButton::MIDDLE && mb->is_pressed()) {
_scene_tab_closed(scene_tabs->get_hovered_tab());
}
} else {
if ((mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_double_click()) || (mb->get_button_index() == MOUSE_BUTTON_MIDDLE && mb->is_pressed())) {
if ((mb->get_button_index() == MouseButton::LEFT && mb->is_double_click()) || (mb->get_button_index() == MouseButton::MIDDLE && mb->is_pressed())) {
_menu_option_confirm(FILE_NEW_SCENE, true);
}
}
if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed()) {
if (mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed()) {
// context menu
scene_tabs_context_menu->clear();
scene_tabs_context_menu->set_size(Size2(1, 1));
@ -5059,12 +5059,12 @@ void EditorNode::_scene_tab_input(const Ref<InputEvent> &p_input) {
scene_tabs_context_menu->set_position(mb->get_global_position());
scene_tabs_context_menu->popup();
}
if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP && mb->is_pressed()) {
if (mb->get_button_index() == MouseButton::WHEEL_UP && mb->is_pressed()) {
int previous_tab = editor_data.get_edited_scene() - 1;
previous_tab = previous_tab >= 0 ? previous_tab : editor_data.get_edited_scene_count() - 1;
_scene_tab_changed(previous_tab);
}
if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN && mb->is_pressed()) {
if (mb->get_button_index() == MouseButton::WHEEL_DOWN && mb->is_pressed()) {
int next_tab = editor_data.get_edited_scene() + 1;
next_tab %= editor_data.get_edited_scene_count();
_scene_tab_changed(next_tab);
@ -6258,8 +6258,8 @@ EditorNode::EditorNode() {
tabbar_container->add_child(scene_tabs);
distraction_free = memnew(Button);
distraction_free->set_flat(true);
ED_SHORTCUT_AND_COMMAND("editor/distraction_free_mode", TTR("Distraction Free Mode"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F11);
ED_SHORTCUT_OVERRIDE("editor/distraction_free_mode", "macos", KEY_MASK_CMD | KEY_MASK_CTRL | KEY_D);
ED_SHORTCUT_AND_COMMAND("editor/distraction_free_mode", TTR("Distraction Free Mode"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::F11);
ED_SHORTCUT_OVERRIDE("editor/distraction_free_mode", "macos", KeyModifierMask::CMD | KeyModifierMask::CTRL | Key::D);
distraction_free->set_shortcut(ED_GET_SHORTCUT("editor/distraction_free_mode"));
distraction_free->set_tooltip(TTR("Toggle distraction-free mode."));
distraction_free->connect("pressed", callable_mp(this, &EditorNode::_toggle_distraction_free_mode));
@ -6357,9 +6357,9 @@ EditorNode::EditorNode() {
gui_base->add_child(warning);
warning->connect("custom_action", callable_mp(this, &EditorNode::_copy_warning));
ED_SHORTCUT("editor/next_tab", TTR("Next Scene Tab"), KEY_MASK_CMD + KEY_TAB);
ED_SHORTCUT("editor/prev_tab", TTR("Previous Scene Tab"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_TAB);
ED_SHORTCUT("editor/filter_files", TTR("Focus FileSystem Filter"), KEY_MASK_CMD + KEY_MASK_ALT + KEY_P);
ED_SHORTCUT("editor/next_tab", TTR("Next Scene Tab"), KeyModifierMask::CMD + Key::TAB);
ED_SHORTCUT("editor/prev_tab", TTR("Previous Scene Tab"), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::TAB);
ED_SHORTCUT("editor/filter_files", TTR("Focus FileSystem Filter"), KeyModifierMask::CMD + KeyModifierMask::ALT + Key::P);
command_palette = EditorCommandPalette::get_singleton();
command_palette->set_title(TTR("Command Palette"));
@ -6371,22 +6371,22 @@ EditorNode::EditorNode() {
p = file_menu->get_popup();
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/new_scene", TTR("New Scene"), KEY_MASK_CMD + KEY_N), FILE_NEW_SCENE);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/new_inherited_scene", TTR("New Inherited Scene..."), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_N), FILE_NEW_INHERITED_SCENE);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/open_scene", TTR("Open Scene..."), KEY_MASK_CMD + KEY_O), FILE_OPEN_SCENE);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/reopen_closed_scene", TTR("Reopen Closed Scene"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_T), FILE_OPEN_PREV);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/new_scene", TTR("New Scene"), KeyModifierMask::CMD + Key::N), FILE_NEW_SCENE);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/new_inherited_scene", TTR("New Inherited Scene..."), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::N), FILE_NEW_INHERITED_SCENE);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/open_scene", TTR("Open Scene..."), KeyModifierMask::CMD + Key::O), FILE_OPEN_SCENE);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/reopen_closed_scene", TTR("Reopen Closed Scene"), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::T), FILE_OPEN_PREV);
p->add_submenu_item(TTR("Open Recent"), "RecentScenes", FILE_OPEN_RECENT);
p->add_separator();
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_scene", TTR("Save Scene"), KEY_MASK_CMD + KEY_S), FILE_SAVE_SCENE);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_scene_as", TTR("Save Scene As..."), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_S), FILE_SAVE_AS_SCENE);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_all_scenes", TTR("Save All Scenes"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_MASK_ALT + KEY_S), FILE_SAVE_ALL_SCENES);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_scene", TTR("Save Scene"), KeyModifierMask::CMD + Key::S), FILE_SAVE_SCENE);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_scene_as", TTR("Save Scene As..."), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::S), FILE_SAVE_AS_SCENE);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_all_scenes", TTR("Save All Scenes"), KeyModifierMask::CMD + KeyModifierMask::SHIFT + KeyModifierMask::ALT + Key::S), FILE_SAVE_ALL_SCENES);
p->add_separator();
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/quick_open", TTR("Quick Open..."), KEY_MASK_SHIFT + KEY_MASK_ALT + KEY_O), FILE_QUICK_OPEN);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/quick_open_scene", TTR("Quick Open Scene..."), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_O), FILE_QUICK_OPEN_SCENE);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/quick_open_script", TTR("Quick Open Script..."), KEY_MASK_CMD + KEY_MASK_ALT + KEY_O), FILE_QUICK_OPEN_SCRIPT);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/quick_open", TTR("Quick Open..."), KeyModifierMask::SHIFT + KeyModifierMask::ALT + Key::O), FILE_QUICK_OPEN);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/quick_open_scene", TTR("Quick Open Scene..."), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::O), FILE_QUICK_OPEN_SCENE);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/quick_open_script", TTR("Quick Open Script..."), KeyModifierMask::CMD + KeyModifierMask::ALT + Key::O), FILE_QUICK_OPEN_SCRIPT);
p->add_separator();
PopupMenu *pm_export = memnew(PopupMenu);
@ -6402,7 +6402,7 @@ EditorNode::EditorNode() {
p->add_separator();
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/reload_saved_scene", TTR("Reload Saved Scene")), EDIT_RELOAD_SAVED_SCENE);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/close_scene", TTR("Close Scene"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_W), FILE_CLOSE);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/close_scene", TTR("Close Scene"), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::W), FILE_CLOSE);
recent_scenes = memnew(PopupMenu);
recent_scenes->set_name("RecentScenes");
@ -6410,7 +6410,7 @@ EditorNode::EditorNode() {
recent_scenes->connect("id_pressed", callable_mp(this, &EditorNode::_open_recent_scene));
p->add_separator();
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/file_quit", TTR("Quit"), KEY_MASK_CMD + KEY_Q), FILE_QUIT, true);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/file_quit", TTR("Quit"), KeyModifierMask::CMD + Key::Q), FILE_QUIT, true);
project_menu = memnew(MenuButton);
project_menu->set_flat(false);
@ -6422,7 +6422,7 @@ EditorNode::EditorNode() {
p = project_menu->get_popup();
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/project_settings", TTR("Project Settings..."), KEY_NONE, TTR("Project Settings")), RUN_SETTINGS);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/project_settings", TTR("Project Settings..."), Key::NONE, TTR("Project Settings")), RUN_SETTINGS);
p->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option));
vcs_actions_menu = VersionControlEditorPlugin::get_singleton()->get_version_control_actions_panel();
@ -6435,7 +6435,7 @@ EditorNode::EditorNode() {
vcs_actions_menu->add_item(TTR("Shut Down Version Control"), RUN_VCS_SHUT_DOWN);
p->add_separator();
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/export", TTR("Export..."), KEY_NONE, TTR("Export")), FILE_EXPORT_PROJECT);
p->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/export", TTR("Export..."), Key::NONE, TTR("Export")), FILE_EXPORT_PROJECT);
p->add_item(TTR("Install Android Build Template..."), FILE_INSTALL_ANDROID_SOURCE);
p->add_item(TTR("Open Project Data Folder"), RUN_PROJECT_DATA_FOLDER);
@ -6452,8 +6452,8 @@ EditorNode::EditorNode() {
p->add_separator();
p->add_shortcut(ED_SHORTCUT("editor/reload_current_project", TTR("Reload Current Project")), RUN_RELOAD_CURRENT_PROJECT);
ED_SHORTCUT_AND_COMMAND("editor/quit_to_project_list", TTR("Quit to Project List"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_Q);
ED_SHORTCUT_OVERRIDE("editor/quit_to_project_list", "macos", KEY_MASK_SHIFT + KEY_MASK_ALT + KEY_Q);
ED_SHORTCUT_AND_COMMAND("editor/quit_to_project_list", TTR("Quit to Project List"), KeyModifierMask::CMD + KeyModifierMask::SHIFT + Key::Q);
ED_SHORTCUT_OVERRIDE("editor/quit_to_project_list", "macos", KeyModifierMask::SHIFT + KeyModifierMask::ALT + Key::Q);
p->add_shortcut(ED_GET_SHORTCUT("editor/quit_to_project_list"), RUN_PROJECT_MANAGER, true);
menu_hb->add_spacer();
@ -6481,9 +6481,9 @@ EditorNode::EditorNode() {
p = settings_menu->get_popup();
ED_SHORTCUT_AND_COMMAND("editor/editor_settings", TTR("Editor Settings..."));
ED_SHORTCUT_OVERRIDE("editor/editor_settings", "macos", KEY_MASK_CMD + KEY_COMMA);
ED_SHORTCUT_OVERRIDE("editor/editor_settings", "macos", KeyModifierMask::CMD + Key::COMMA);
p->add_shortcut(ED_GET_SHORTCUT("editor/editor_settings"), SETTINGS_PREFERENCES);
p->add_shortcut(ED_SHORTCUT("editor/command_palette", TTR("Command Palette..."), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_P), HELP_COMMAND_PALETTE);
p->add_shortcut(ED_SHORTCUT("editor/command_palette", TTR("Command Palette..."), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::P), HELP_COMMAND_PALETTE);
p->add_separator();
editor_layouts = memnew(PopupMenu);
@ -6493,14 +6493,14 @@ EditorNode::EditorNode() {
p->add_submenu_item(TTR("Editor Layout"), "Layouts");
p->add_separator();
ED_SHORTCUT_AND_COMMAND("editor/take_screenshot", TTR("Take Screenshot"), KEY_MASK_CTRL | KEY_F12);
ED_SHORTCUT_OVERRIDE("editor/take_screenshot", "macos", KEY_MASK_CMD | KEY_F12);
ED_SHORTCUT_AND_COMMAND("editor/take_screenshot", TTR("Take Screenshot"), KeyModifierMask::CTRL | Key::F12);
ED_SHORTCUT_OVERRIDE("editor/take_screenshot", "macos", KeyModifierMask::CMD | Key::F12);
p->add_shortcut(ED_GET_SHORTCUT("editor/take_screenshot"), EDITOR_SCREENSHOT);
p->set_item_tooltip(p->get_item_count() - 1, TTR("Screenshots are stored in the Editor Data/Settings Folder."));
ED_SHORTCUT_AND_COMMAND("editor/fullscreen_mode", TTR("Toggle Fullscreen"), KEY_MASK_SHIFT | KEY_F11);
ED_SHORTCUT_OVERRIDE("editor/fullscreen_mode", "macos", KEY_MASK_CMD | KEY_MASK_CTRL | KEY_F);
ED_SHORTCUT_AND_COMMAND("editor/fullscreen_mode", TTR("Toggle Fullscreen"), KeyModifierMask::SHIFT | Key::F11);
ED_SHORTCUT_OVERRIDE("editor/fullscreen_mode", "macos", KeyModifierMask::CMD | KeyModifierMask::CTRL | Key::F);
p->add_shortcut(ED_GET_SHORTCUT("editor/fullscreen_mode"), SETTINGS_TOGGLE_FULLSCREEN);
#if defined(WINDOWS_ENABLED) && defined(WINDOWS_SUBSYSTEM_CONSOLE)
@ -6534,8 +6534,8 @@ EditorNode::EditorNode() {
p = help_menu->get_popup();
p->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option));
ED_SHORTCUT_AND_COMMAND("editor/editor_help", TTR("Search Help"), KEY_F1);
ED_SHORTCUT_OVERRIDE("editor/editor_help", "macos", KEY_MASK_ALT | KEY_SPACE);
ED_SHORTCUT_AND_COMMAND("editor/editor_help", TTR("Search Help"), Key::F1);
ED_SHORTCUT_OVERRIDE("editor/editor_help", "macos", KeyModifierMask::ALT | Key::SPACE);
p->add_icon_shortcut(gui_base->get_theme_icon(SNAME("HelpSearch"), SNAME("EditorIcons")), ED_GET_SHORTCUT("editor/editor_help"), HELP_SEARCH);
p->add_separator();
p->add_icon_shortcut(gui_base->get_theme_icon(SNAME("Instance"), SNAME("EditorIcons")), ED_SHORTCUT_AND_COMMAND("editor/online_docs", TTR("Online Documentation")), HELP_DOCS);
@ -6560,8 +6560,8 @@ EditorNode::EditorNode() {
play_button->connect("pressed", callable_mp(this, &EditorNode::_menu_option), make_binds(RUN_PLAY));
play_button->set_tooltip(TTR("Play the project."));
ED_SHORTCUT_AND_COMMAND("editor/play", TTR("Play"), KEY_F5);
ED_SHORTCUT_OVERRIDE("editor/play", "macos", KEY_MASK_CMD | KEY_B);
ED_SHORTCUT_AND_COMMAND("editor/play", TTR("Play"), Key::F5);
ED_SHORTCUT_OVERRIDE("editor/play", "macos", KeyModifierMask::CMD | Key::B);
play_button->set_shortcut(ED_GET_SHORTCUT("editor/play"));
pause_button = memnew(Button);
@ -6573,8 +6573,8 @@ EditorNode::EditorNode() {
pause_button->set_disabled(true);
play_hb->add_child(pause_button);
ED_SHORTCUT("editor/pause_scene", TTR("Pause Scene"), KEY_F7);
ED_SHORTCUT_OVERRIDE("editor/pause_scene", "macos", KEY_MASK_CMD | KEY_MASK_CTRL | KEY_Y);
ED_SHORTCUT("editor/pause_scene", TTR("Pause Scene"), Key::F7);
ED_SHORTCUT_OVERRIDE("editor/pause_scene", "macos", KeyModifierMask::CMD | KeyModifierMask::CTRL | Key::Y);
pause_button->set_shortcut(ED_GET_SHORTCUT("editor/pause_scene"));
stop_button = memnew(Button);
@ -6586,8 +6586,8 @@ EditorNode::EditorNode() {
stop_button->set_tooltip(TTR("Stop the scene."));
stop_button->set_disabled(true);
ED_SHORTCUT("editor/stop", TTR("Stop"), KEY_F8);
ED_SHORTCUT_OVERRIDE("editor/stop", "macos", KEY_MASK_CMD | KEY_PERIOD);
ED_SHORTCUT("editor/stop", TTR("Stop"), Key::F8);
ED_SHORTCUT_OVERRIDE("editor/stop", "macos", KeyModifierMask::CMD | Key::PERIOD);
stop_button->set_shortcut(ED_GET_SHORTCUT("editor/stop"));
run_native = memnew(EditorRunNative);
@ -6603,8 +6603,8 @@ EditorNode::EditorNode() {
play_scene_button->connect("pressed", callable_mp(this, &EditorNode::_menu_option), make_binds(RUN_PLAY_SCENE));
play_scene_button->set_tooltip(TTR("Play the edited scene."));
ED_SHORTCUT_AND_COMMAND("editor/play_scene", TTR("Play Scene"), KEY_F6);
ED_SHORTCUT_OVERRIDE("editor/play_scene", "macos", KEY_MASK_CMD | KEY_R);
ED_SHORTCUT_AND_COMMAND("editor/play_scene", TTR("Play Scene"), Key::F6);
ED_SHORTCUT_OVERRIDE("editor/play_scene", "macos", KeyModifierMask::CMD | Key::R);
play_scene_button->set_shortcut(ED_GET_SHORTCUT("editor/play_scene"));
play_custom_scene_button = memnew(Button);
@ -6616,8 +6616,8 @@ EditorNode::EditorNode() {
play_custom_scene_button->connect("pressed", callable_mp(this, &EditorNode::_menu_option), make_binds(RUN_PLAY_CUSTOM_SCENE));
play_custom_scene_button->set_tooltip(TTR("Play custom scene"));
ED_SHORTCUT_AND_COMMAND("editor/play_custom_scene", TTR("Play Custom Scene"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F5);
ED_SHORTCUT_OVERRIDE("editor/play_custom_scene", "macos", KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_R);
ED_SHORTCUT_AND_COMMAND("editor/play_custom_scene", TTR("Play Custom Scene"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::F5);
ED_SHORTCUT_OVERRIDE("editor/play_custom_scene", "macos", KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::R);
play_custom_scene_button->set_shortcut(ED_GET_SHORTCUT("editor/play_custom_scene"));
HBoxContainer *right_menu_hb = memnew(HBoxContainer);
@ -6804,7 +6804,7 @@ EditorNode::EditorNode() {
bottom_panel_raise->set_flat(true);
bottom_panel_raise->set_icon(gui_base->get_theme_icon(SNAME("ExpandBottomDock"), SNAME("EditorIcons")));
bottom_panel_raise->set_shortcut(ED_SHORTCUT_AND_COMMAND("editor/bottom_panel_expand", TTR("Expand Bottom Panel"), KEY_MASK_SHIFT | KEY_F12));
bottom_panel_raise->set_shortcut(ED_SHORTCUT_AND_COMMAND("editor/bottom_panel_expand", TTR("Expand Bottom Panel"), KeyModifierMask::SHIFT | Key::F12));
bottom_panel_hb->add_child(bottom_panel_raise);
bottom_panel_raise->hide();
@ -7174,15 +7174,15 @@ EditorNode::EditorNode() {
ResourceLoader::set_load_callback(_resource_loaded);
// Use the Ctrl modifier so F2 can be used to rename nodes in the scene tree dock.
ED_SHORTCUT_AND_COMMAND("editor/editor_2d", TTR("Open 2D Editor"), KEY_MASK_CTRL | KEY_F1);
ED_SHORTCUT_AND_COMMAND("editor/editor_3d", TTR("Open 3D Editor"), KEY_MASK_CTRL | KEY_F2);
ED_SHORTCUT_AND_COMMAND("editor/editor_script", TTR("Open Script Editor"), KEY_MASK_CTRL | KEY_F3);
ED_SHORTCUT_AND_COMMAND("editor/editor_assetlib", TTR("Open Asset Library"), KEY_MASK_CTRL | KEY_F4);
ED_SHORTCUT_AND_COMMAND("editor/editor_2d", TTR("Open 2D Editor"), KeyModifierMask::CTRL | Key::F1);
ED_SHORTCUT_AND_COMMAND("editor/editor_3d", TTR("Open 3D Editor"), KeyModifierMask::CTRL | Key::F2);
ED_SHORTCUT_AND_COMMAND("editor/editor_script", TTR("Open Script Editor"), KeyModifierMask::CTRL | Key::F3);
ED_SHORTCUT_AND_COMMAND("editor/editor_assetlib", TTR("Open Asset Library"), KeyModifierMask::CTRL | Key::F4);
ED_SHORTCUT_OVERRIDE("editor/editor_2d", "macos", KEY_MASK_ALT | KEY_1);
ED_SHORTCUT_OVERRIDE("editor/editor_3d", "macos", KEY_MASK_ALT | KEY_2);
ED_SHORTCUT_OVERRIDE("editor/editor_script", "macos", KEY_MASK_ALT | KEY_3);
ED_SHORTCUT_OVERRIDE("editor/editor_assetlib", "macos", KEY_MASK_ALT | KEY_4);
ED_SHORTCUT_OVERRIDE("editor/editor_2d", "macos", KeyModifierMask::ALT | Key::KEY_1);
ED_SHORTCUT_OVERRIDE("editor/editor_3d", "macos", KeyModifierMask::ALT | Key::KEY_2);
ED_SHORTCUT_OVERRIDE("editor/editor_script", "macos", KeyModifierMask::ALT | Key::KEY_3);
ED_SHORTCUT_OVERRIDE("editor/editor_assetlib", "macos", KeyModifierMask::ALT | Key::KEY_4);
ED_SHORTCUT_AND_COMMAND("editor/editor_next", TTR("Open the next Editor"));
ED_SHORTCUT_AND_COMMAND("editor/editor_prev", TTR("Open the previous Editor"));

View file

@ -818,7 +818,7 @@ public:
}
const Ref<InputEventMouseButton> mb = p_ev;
if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) {
if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT && mb->is_pressed()) {
if (hovered_index >= 0) {
// Toggle the flag.
// We base our choice on the hovered flag, so that it always matches the hovered flag.
@ -1278,11 +1278,11 @@ void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &p_ev) {
}
const Ref<InputEventMouseButton> mb = p_ev;
if (mb.is_valid()) {
if (mb->is_double_click() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb->is_double_click() && mb->get_button_index() == MouseButton::LEFT) {
_setup_spin();
}
if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) {
if (mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) {
preset->set_position(easing_draw->get_screen_transform().xform(mb->get_position()));
preset->popup();
@ -1291,7 +1291,7 @@ void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &p_ev) {
easing_draw->update();
}
if (mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb->get_button_index() == MouseButton::LEFT) {
dragging = mb->is_pressed();
// Update to display the correct dragging color
easing_draw->update();
@ -1300,7 +1300,7 @@ void EditorPropertyEasing::_drag_easing(const Ref<InputEvent> &p_ev) {
const Ref<InputEventMouseMotion> mm = p_ev;
if (dragging && mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) {
if (dragging && mm.is_valid() && (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) {
float rel = mm->get_relative().x;
if (rel == 0) {
return;
@ -3170,11 +3170,7 @@ EditorPropertyResource::EditorPropertyResource() {
////////////// DEFAULT PLUGIN //////////////////////
bool EditorInspectorDefaultPlugin::can_handle(Object *p_object) {
return true; //can handle everything
}
void EditorInspectorDefaultPlugin::parse_begin(Object *p_object) {
//do none
return true; // Can handle everything.
}
bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide) {
@ -3185,10 +3181,6 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, const Varian
return false;
}
void EditorInspectorDefaultPlugin::parse_end() {
//do none
}
struct EditorPropertyRangeHint {
bool angle_in_degrees = false;
bool greater = true;

View file

@ -696,9 +696,7 @@ class EditorInspectorDefaultPlugin : public EditorInspectorPlugin {
public:
virtual bool can_handle(Object *p_object) override;
virtual void parse_begin(Object *p_object) override;
virtual bool parse_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false) override;
virtual void parse_end() override;
static EditorProperty *get_editor_for_property(Object *p_object, const Variant::Type p_type, const String &p_path, const PropertyHint p_hint, const String &p_hint_text, const uint32_t p_usage, const bool p_wide = false);
};

View file

@ -464,7 +464,7 @@ void EditorResourcePicker::_button_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid()) {
if (mb->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) {
if (mb->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) {
_update_menu_items();
Vector2 pos = get_screen_position() + mb->get_position();

View file

@ -1482,7 +1482,7 @@ void ED_SHORTCUT_OVERRIDE(const String &p_path, const String &p_feature, Key p_k
ERR_FAIL_COND_MSG(!sc.is_valid(), "Used ED_SHORTCUT_OVERRIDE with invalid shortcut: " + p_path + ".");
PackedInt32Array arr;
arr.push_back(p_keycode);
arr.push_back((int32_t)p_keycode);
ED_SHORTCUT_OVERRIDE_ARRAY(p_path, p_feature, arr);
}
@ -1503,13 +1503,12 @@ void ED_SHORTCUT_OVERRIDE_ARRAY(const String &p_path, const String &p_feature, c
#ifdef OSX_ENABLED
// Use Cmd+Backspace as a general replacement for Delete shortcuts on macOS
if (keycode == KEY_DELETE) {
keycode = KEY_MASK_CMD | KEY_BACKSPACE;
if (keycode == Key::KEY_DELETE) {
keycode = KeyModifierMask::CMD | Key::BACKSPACE;
}
#endif
Ref<InputEventKey> ie;
if (keycode) {
if (keycode != Key::NONE) {
ie = InputEventKey::create_reference(keycode);
events.push_back(ie);
}
@ -1522,7 +1521,7 @@ void ED_SHORTCUT_OVERRIDE_ARRAY(const String &p_path, const String &p_feature, c
Ref<Shortcut> ED_SHORTCUT(const String &p_path, const String &p_name, Key p_keycode) {
PackedInt32Array arr;
arr.push_back(p_keycode);
arr.push_back((int32_t)p_keycode);
return ED_SHORTCUT_ARRAY(p_path, p_name, arr);
}
@ -1534,13 +1533,13 @@ Ref<Shortcut> ED_SHORTCUT_ARRAY(const String &p_path, const String &p_name, cons
#ifdef OSX_ENABLED
// Use Cmd+Backspace as a general replacement for Delete shortcuts on macOS
if (keycode == KEY_DELETE) {
keycode = KEY_MASK_CMD | KEY_BACKSPACE;
if (keycode == Key::KEY_DELETE) {
keycode = KeyModifierMask::CMD | Key::BACKSPACE;
}
#endif
Ref<InputEventKey> ie;
if (keycode) {
if (keycode != Key::NONE) {
ie = InputEventKey::create_reference(keycode);
events.push_back(ie);
}

View file

@ -200,9 +200,9 @@ Variant _EDITOR_DEF(const String &p_setting, const Variant &p_default, bool p_re
Variant _EDITOR_GET(const String &p_setting);
#define ED_IS_SHORTCUT(p_name, p_ev) (EditorSettings::get_singleton()->is_shortcut(p_name, p_ev))
Ref<Shortcut> ED_SHORTCUT(const String &p_path, const String &p_name, Key p_keycode = KEY_NONE);
Ref<Shortcut> ED_SHORTCUT(const String &p_path, const String &p_name, Key p_keycode = Key::NONE);
Ref<Shortcut> ED_SHORTCUT_ARRAY(const String &p_path, const String &p_name, const PackedInt32Array &p_keycodes);
void ED_SHORTCUT_OVERRIDE(const String &p_path, const String &p_feature, Key p_keycode = KEY_NONE);
void ED_SHORTCUT_OVERRIDE(const String &p_path, const String &p_feature, Key p_keycode = Key::NONE);
void ED_SHORTCUT_OVERRIDE_ARRAY(const String &p_path, const String &p_feature, const PackedInt32Array &p_keycodes);
Ref<Shortcut> ED_GET_SHORTCUT(const String &p_path);

View file

@ -39,9 +39,9 @@
String EditorSpinSlider::get_tooltip(const Point2 &p_pos) const {
if (grabber->is_visible()) {
#ifdef OSX_ENABLED
const int key = KEY_META;
Key key = Key::META;
#else
const int key = KEY_CTRL;
Key key = Key::CTRL;
#endif
return TS->format_number(rtos(get_value())) + "\n\n" + vformat(TTR("Hold %s to round to integers. Hold Shift for more precise changes."), find_keycode_name(key));
}
@ -61,7 +61,7 @@ void EditorSpinSlider::gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid()) {
if (mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb->get_button_index() == MouseButton::LEFT) {
if (mb->is_pressed()) {
if (updown_offset != -1 && mb->get_position().x > updown_offset) {
//there is an updown, so use it.
@ -92,7 +92,7 @@ void EditorSpinSlider::gui_input(const Ref<InputEvent> &p_event) {
grabbing_spinner_attempt = false;
}
}
} else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP || mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) {
} else if (mb->get_button_index() == MouseButton::WHEEL_UP || mb->get_button_index() == MouseButton::WHEEL_DOWN) {
if (grabber->is_visible()) {
call_deferred(SNAME("update"));
}
@ -154,17 +154,17 @@ void EditorSpinSlider::_grabber_gui_input(const Ref<InputEvent> &p_event) {
if (grabbing_grabber) {
if (mb.is_valid()) {
if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) {
if (mb->get_button_index() == MouseButton::WHEEL_UP) {
set_value(get_value() + get_step());
mousewheel_over_grabber = true;
} else if (mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) {
} else if (mb->get_button_index() == MouseButton::WHEEL_DOWN) {
set_value(get_value() - get_step());
mousewheel_over_grabber = true;
}
}
}
if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT) {
if (mb->is_pressed()) {
grabbing_grabber = true;
if (!mousewheel_over_grabber) {
@ -212,9 +212,9 @@ void EditorSpinSlider::_value_input_gui_input(const Ref<InputEvent> &p_event) {
step *= 0.1;
}
uint32_t code = k->get_keycode();
Key code = k->get_keycode();
switch (code) {
case KEY_UP: {
case Key::UP: {
_evaluate_input_text();
double last_value = get_value();
@ -228,7 +228,7 @@ void EditorSpinSlider::_value_input_gui_input(const Ref<InputEvent> &p_event) {
value_input_dirty = true;
set_process_internal(true);
} break;
case KEY_DOWN: {
case Key::DOWN: {
_evaluate_input_text();
double last_value = get_value();
@ -242,6 +242,8 @@ void EditorSpinSlider::_value_input_gui_input(const Ref<InputEvent> &p_event) {
value_input_dirty = true;
set_process_internal(true);
} break;
default:
break;
}
}
}

View file

@ -36,7 +36,7 @@
#include "editor_scale.h"
#include "editor_settings.h"
#include "modules/modules_enabled.gen.h"
#include "modules/modules_enabled.gen.h" // For svg.
#ifdef MODULE_SVG_ENABLED
#include "modules/svg/image_loader_svg.h"
#endif

View file

@ -51,7 +51,7 @@ void EditorZoomWidget::_update_zoom_label() {
}
void EditorZoomWidget::_button_zoom_minus() {
set_zoom_by_increments(-6, Input::get_singleton()->is_key_pressed(KEY_ALT));
set_zoom_by_increments(-6, Input::get_singleton()->is_key_pressed(Key::ALT));
emit_signal(SNAME("zoom_changed"), zoom);
}
@ -61,7 +61,7 @@ void EditorZoomWidget::_button_zoom_reset() {
}
void EditorZoomWidget::_button_zoom_plus() {
set_zoom_by_increments(6, Input::get_singleton()->is_key_pressed(KEY_ALT));
set_zoom_by_increments(6, Input::get_singleton()->is_key_pressed(Key::ALT));
emit_signal(SNAME("zoom_changed"), zoom);
}
@ -169,7 +169,7 @@ EditorZoomWidget::EditorZoomWidget() {
zoom_minus->set_flat(true);
add_child(zoom_minus);
zoom_minus->connect("pressed", callable_mp(this, &EditorZoomWidget::_button_zoom_minus));
zoom_minus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_minus", TTR("Zoom Out"), KEY_MASK_CMD | KEY_MINUS));
zoom_minus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_minus", TTR("Zoom Out"), KeyModifierMask::CMD | Key::MINUS));
zoom_minus->set_shortcut_context(this);
zoom_minus->set_focus_mode(FOCUS_NONE);
@ -180,7 +180,7 @@ EditorZoomWidget::EditorZoomWidget() {
zoom_reset->add_theme_color_override("font_outline_color", Color(0, 0, 0));
zoom_reset->add_theme_color_override("font_color", Color(1, 1, 1));
zoom_reset->connect("pressed", callable_mp(this, &EditorZoomWidget::_button_zoom_reset));
zoom_reset->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_reset", TTR("Zoom Reset"), KEY_MASK_CMD | KEY_0));
zoom_reset->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_reset", TTR("Zoom Reset"), KeyModifierMask::CMD | Key::KEY_0));
zoom_reset->set_shortcut_context(this);
zoom_reset->set_focus_mode(FOCUS_NONE);
zoom_reset->set_text_align(Button::TextAlign::ALIGN_CENTER);
@ -191,7 +191,7 @@ EditorZoomWidget::EditorZoomWidget() {
zoom_plus->set_flat(true);
add_child(zoom_plus);
zoom_plus->connect("pressed", callable_mp(this, &EditorZoomWidget::_button_zoom_plus));
zoom_plus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_plus", TTR("Zoom In"), KEY_MASK_CMD | KEY_EQUAL)); // Usually direct access key for PLUS
zoom_plus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_plus", TTR("Zoom In"), KeyModifierMask::CMD | Key::EQUAL)); // Usually direct access key for PLUS
zoom_plus->set_shortcut_context(this);
zoom_plus->set_focus_mode(FOCUS_NONE);

View file

@ -2273,7 +2273,7 @@ void FileSystemDock::drop_data_fw(const Point2 &p_point, const Variant &p_data,
}
}
if (!to_move.is_empty()) {
if (Input::get_singleton()->is_key_pressed(KEY_CTRL)) {
if (Input::get_singleton()->is_key_pressed(Key::CTRL)) {
for (int i = 0; i < to_move.size(); i++) {
String new_path;
String new_path_base;
@ -2794,11 +2794,12 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
editor = p_editor;
path = "res://";
// `KEY_MASK_CMD | KEY_C` conflicts with other editor shortcuts.
ED_SHORTCUT("filesystem_dock/copy_path", TTR("Copy Path"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_C);
ED_SHORTCUT("filesystem_dock/duplicate", TTR("Duplicate..."), KEY_MASK_CMD | KEY_D);
ED_SHORTCUT("filesystem_dock/delete", TTR("Delete"), KEY_DELETE);
ED_SHORTCUT("filesystem_dock/rename", TTR("Rename..."), KEY_F2);
// `KeyModifierMask::CMD | Key::C` conflicts with other editor shortcuts.
ED_SHORTCUT("filesystem_dock/copy_path", TTR("Copy Path"), KeyModifierMask::CMD | KeyModifierMask::SHIFT | Key::C);
ED_SHORTCUT("filesystem_dock/duplicate", TTR("Duplicate..."), KeyModifierMask::CMD | Key::D);
ED_SHORTCUT("filesystem_dock/delete", TTR("Delete"), Key::KEY_DELETE);
ED_SHORTCUT("filesystem_dock/rename", TTR("Rename..."), Key::F2);
ED_SHORTCUT_OVERRIDE("filesystem_dock/rename", "macos", Key::ENTER);
VBoxContainer *top_vbc = memnew(VBoxContainer);
add_child(top_vbc);

1
editor/icons/MirrorX.svg Normal file
View file

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="#e0e0e0" stroke-opacity=".99608" stroke-width="2" transform="translate(0 -1036.4)"><path d="m4 1042.4-2 2 2 2" stroke-linecap="round" stroke-linejoin="round"/><path d="m2 1044.4h11"/><path d="m12 1042.4 2 2-2 2" stroke-linecap="round" stroke-linejoin="round"/></g></svg>

After

Width:  |  Height:  |  Size: 377 B

1
editor/icons/MirrorY.svg Normal file
View file

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m11.012 1048.4a1.0001 1.0001 0 0 0 -1.7168-.6973l-.29297.293v-7.1719l.29297.293a1.0001 1.0001 0 0 0 1.7148-.7266 1.0001 1.0001 0 0 0 -.30078-.6875l-2-2a1.0001 1.0001 0 0 0 -1.4141 0l-2 2a1.0001 1.0001 0 1 0 1.4141 1.4141l.29297-.293v7.1719l-.29297-.293a1.0001 1.0001 0 1 0 -1.4141 1.4141l2 2a1.0001 1.0001 0 0 0 1.4141 0l2-2a1.0001 1.0001 0 0 0 .30273-.7168z" fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"/></svg>

After

Width:  |  Height:  |  Size: 530 B

View file

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-opacity=".99608" transform="translate(0 -1036.4)"><path d="m9 2a6 6 0 0 0 -6 6h2a4 4 0 0 1 4-4 4 4 0 0 1 4 4 4 4 0 0 1 -4 4v2a6 6 0 0 0 6-6 6 6 0 0 0 -6-6z" transform="translate(0 1036.4)"/><path d="m4.118 1048.3-1.6771-.9683-1.6771-.9682 1.6771-.9683 1.6771-.9682-.0000001 1.9365z" transform="matrix(0 -1.1926 1.5492 0 -1617 1049.3)"/></g></svg>

After

Width:  |  Height:  |  Size: 453 B

View file

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" fill-opacity=".99608" transform="matrix(-1 0 0 1 16.026308 -1036.4)"><path d="m9 2a6 6 0 0 0 -6 6h2a4 4 0 0 1 4-4 4 4 0 0 1 4 4 4 4 0 0 1 -4 4v2a6 6 0 0 0 6-6 6 6 0 0 0 -6-6z" transform="translate(0 1036.4)"/><path d="m4.118 1048.3-1.6771-.9683-1.6771-.9682 1.6771-.9683 1.6771-.9682-.0000001 1.9365z" transform="matrix(0 -1.1926 1.5492 0 -1617 1049.3)"/></g></svg>

After

Width:  |  Height:  |  Size: 467 B

View file

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#a5b7f3"><path d="m7 1v9h-3l4 5 4-5h-3v-9z"/><circle cx="7.990566" cy="4.8202" r="4.009434"/></g></svg>

After

Width:  |  Height:  |  Size: 196 B

View file

@ -57,6 +57,7 @@ void EditorImportPlugin::get_recognized_extensions(List<String> *p_extensions) c
for (int i = 0; i < extensions.size(); i++) {
p_extensions->push_back(extensions[i]);
}
return;
}
ERR_FAIL_MSG("Unimplemented _get_recognized_extensions in add-on.");
}
@ -139,6 +140,7 @@ void EditorImportPlugin::get_import_options(List<ResourceImporter::ImportOption>
ImportOption option(PropertyInfo(default_value.get_type(), name, hint, hint_string, usage), default_value);
r_options->push_back(option);
}
return;
}
ERR_FAIL_MSG("Unimplemented _get_import_options in add-on.");

View file

@ -30,12 +30,12 @@
#include "resource_importer_dynamicfont.h"
#include "dynamicfont_import_settings.h"
#include "core/io/file_access.h"
#include "core/io/resource_saver.h"
#include "dynamicfont_import_settings.h"
#include "editor/editor_node.h"
#include "modules/modules_enabled.gen.h"
#include "modules/modules_enabled.gen.h" // For freetype.
String ResourceImporterDynamicFont::get_importer_name() const {
return "font_data_dynamic";

View file

@ -1462,7 +1462,7 @@ Node *ResourceImporterScene::import_scene_from_other_importer(EditorSceneFormatI
for (const String &F : extensions) {
if (F.to_lower() == ext) {
importer = E;
importer = E->get();
break;
}
}
@ -1492,7 +1492,7 @@ Ref<Animation> ResourceImporterScene::import_animation_from_other_importer(Edito
for (const String &F : extensions) {
if (F.to_lower() == ext) {
importer = E;
importer = E->get();
break;
}
}

View file

@ -737,21 +737,21 @@ void SceneImportSettings::_viewport_input(const Ref<InputEvent> &p_input) {
zoom = &md.cam_zoom;
}
Ref<InputEventMouseMotion> mm = p_input;
if (mm.is_valid() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) {
if (mm.is_valid() && (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) {
(*rot_x) -= mm->get_relative().y * 0.01 * EDSCALE;
(*rot_y) -= mm->get_relative().x * 0.01 * EDSCALE;
(*rot_x) = CLAMP((*rot_x), -Math_PI / 2, Math_PI / 2);
_update_camera();
}
Ref<InputEventMouseButton> mb = p_input;
if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_DOWN) {
if (mb.is_valid() && mb->get_button_index() == MouseButton::WHEEL_DOWN) {
(*zoom) *= 1.1;
if ((*zoom) > 10.0) {
(*zoom) = 10.0;
}
_update_camera();
}
if (mb.is_valid() && mb->get_button_index() == MOUSE_BUTTON_WHEEL_UP) {
if (mb.is_valid() && mb->get_button_index() == MouseButton::WHEEL_UP) {
(*zoom) /= 1.1;
if ((*zoom) < 0.1) {
(*zoom) = 0.1;

View file

@ -38,7 +38,7 @@
#include "editor/project_settings_editor.h"
#include "scene/gui/grid_container.h"
#include "modules/modules_enabled.gen.h"
#include "modules/modules_enabled.gen.h" // For gdscript.
#ifdef MODULE_GDSCRIPT_ENABLED
#include "modules/gdscript/gdscript.h"
#endif

View file

@ -245,11 +245,11 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
Ref<InputEventMouseButton> mb = p_event;
if (!_has_resource()) {
if (mb.is_valid() && mb->get_button_index() == 1 && mb->is_pressed()) {
if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT && mb->is_pressed()) {
create_resource->set_text(String("No polygon resource on this node.\nCreate and assign one?"));
create_resource->popup_centered();
}
return (mb.is_valid() && mb->get_button_index() == 1);
return (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT);
}
CanvasItemEditor::Tool tool = CanvasItemEditor::get_singleton()->get_current_tool();
@ -264,7 +264,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
Vector2 cpoint = _get_node()->to_local(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mb->get_position())));
if (mode == MODE_EDIT || (_is_line() && mode == MODE_CREATE)) {
if (mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb->get_button_index() == MouseButton::LEFT) {
if (mb->is_pressed()) {
if (mb->is_ctrl_pressed() || mb->is_shift_pressed() || mb->is_alt_pressed()) {
return false;
@ -326,7 +326,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
return true;
}
}
} else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed() && !edited_point.valid()) {
} else if (mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed() && !edited_point.valid()) {
const PosVertex closest = closest_point(gpoint);
if (closest.valid()) {
@ -335,7 +335,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
}
}
} else if (mode == MODE_DELETE) {
if (mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) {
if (mb->get_button_index() == MouseButton::LEFT && mb->is_pressed()) {
const PosVertex closest = closest_point(gpoint);
if (closest.valid()) {
@ -346,7 +346,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
}
if (mode == MODE_CREATE) {
if (mb->get_button_index() == MOUSE_BUTTON_LEFT && mb->is_pressed()) {
if (mb->get_button_index() == MouseButton::LEFT && mb->is_pressed()) {
if (_is_line()) {
// for lines, we don't have a wip mode, and we can undo each single add point.
Vector<Vector2> vertices = _get_polygon(0);
@ -384,7 +384,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
return true;
}
}
} else if (mb->get_button_index() == MOUSE_BUTTON_RIGHT && mb->is_pressed() && wip_active) {
} else if (mb->get_button_index() == MouseButton::RIGHT && mb->is_pressed() && wip_active) {
_wip_cancel();
}
}
@ -395,7 +395,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
if (mm.is_valid()) {
Vector2 gpoint = mm->get_position();
if (edited_point.valid() && (wip_active || (mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT))) {
if (edited_point.valid() && (wip_active || (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE)) {
Vector2 cpoint = _get_node()->to_local(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint)));
//Move the point in a single axis. Should only work when editing a polygon and while holding shift.
@ -443,7 +443,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
Ref<InputEventKey> k = p_event;
if (k.is_valid() && k->is_pressed()) {
if (k->get_keycode() == KEY_DELETE || k->get_keycode() == KEY_BACKSPACE) {
if (k->get_keycode() == Key::KEY_DELETE || k->get_keycode() == Key::BACKSPACE) {
if (wip_active && selected_point.polygon == -1) {
if (wip.size() > selected_point.vertex) {
wip.remove(selected_point.vertex);
@ -460,9 +460,9 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
return true;
}
}
} else if (wip_active && k->get_keycode() == KEY_ENTER) {
} else if (wip_active && k->get_keycode() == Key::ENTER) {
_wip_close();
} else if (wip_active && k->get_keycode() == KEY_ESCAPE) {
} else if (wip_active && k->get_keycode() == Key::ESCAPE) {
_wip_cancel();
}
}

View file

@ -42,7 +42,7 @@ StringName AnimationNodeBlendSpace1DEditor::get_blend_position_path() const {
void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventKey> k = p_event;
if (tool_select->is_pressed() && k.is_valid() && k->is_pressed() && k->get_keycode() == KEY_DELETE && !k->is_echo()) {
if (tool_select->is_pressed() && k.is_valid() && k->is_pressed() && k->get_keycode() == Key::KEY_DELETE && !k->is_echo()) {
if (selected_point != -1) {
_erase_selected();
accept_event();
@ -51,7 +51,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && ((tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) || (mb->get_button_index() == MOUSE_BUTTON_LEFT && tool_create->is_pressed()))) {
if (mb.is_valid() && mb->is_pressed() && ((tool_select->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) || (mb->get_button_index() == MouseButton::LEFT && tool_create->is_pressed()))) {
menu->clear();
animations_menu->clear();
animations_to_add.clear();
@ -110,7 +110,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven
}
}
if (mb.is_valid() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb.is_valid() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == MouseButton::LEFT) {
blend_space_draw->update(); // why not
// try to see if a point can be selected
@ -132,7 +132,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven
}
}
if (mb.is_valid() && !mb->is_pressed() && dragging_selected_attempt && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb.is_valid() && !mb->is_pressed() && dragging_selected_attempt && mb->get_button_index() == MouseButton::LEFT) {
if (dragging_selected) {
// move
float point = blend_space->get_blend_point_position(selected_point);
@ -161,7 +161,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven
}
// *set* the blend
if (mb.is_valid() && !mb->is_pressed() && tool_blend->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb.is_valid() && !mb->is_pressed() && tool_blend->is_pressed() && mb->get_button_index() == MouseButton::LEFT) {
float blend_pos = mb->get_position().x / blend_space_draw->get_size().x;
blend_pos *= blend_space->get_max_space() - blend_space->get_min_space();
blend_pos += blend_space->get_min_space();
@ -184,7 +184,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven
_update_edited_point_pos();
}
if (mm.is_valid() && tool_blend->is_pressed() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) {
if (mm.is_valid() && tool_blend->is_pressed() && (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) {
float blend_pos = mm->get_position().x / blend_space_draw->get_size().x;
blend_pos *= blend_space->get_max_space() - blend_space->get_min_space();
blend_pos += blend_space->get_min_space();

View file

@ -70,7 +70,7 @@ StringName AnimationNodeBlendSpace2DEditor::get_blend_position_path() const {
void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventKey> k = p_event;
if (tool_select->is_pressed() && k.is_valid() && k->is_pressed() && k->get_keycode() == KEY_DELETE && !k->is_echo()) {
if (tool_select->is_pressed() && k.is_valid() && k->is_pressed() && k->get_keycode() == Key::KEY_DELETE && !k->is_echo()) {
if (selected_point != -1 || selected_triangle != -1) {
_erase_selected();
accept_event();
@ -79,7 +79,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && ((tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_RIGHT) || (mb->get_button_index() == MOUSE_BUTTON_LEFT && tool_create->is_pressed()))) {
if (mb.is_valid() && mb->is_pressed() && ((tool_select->is_pressed() && mb->get_button_index() == MouseButton::RIGHT) || (mb->get_button_index() == MouseButton::LEFT && tool_create->is_pressed()))) {
menu->clear();
animations_menu->clear();
animations_to_add.clear();
@ -133,7 +133,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven
}
}
if (mb.is_valid() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb.is_valid() && mb->is_pressed() && tool_select->is_pressed() && mb->get_button_index() == MouseButton::LEFT) {
blend_space_draw->update(); //update anyway
//try to see if a point can be selected
selected_point = -1;
@ -173,7 +173,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven
}
}
if (mb.is_valid() && mb->is_pressed() && tool_triangle->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb.is_valid() && mb->is_pressed() && tool_triangle->is_pressed() && mb->get_button_index() == MouseButton::LEFT) {
blend_space_draw->update(); //update anyway
//try to see if a point can be selected
selected_point = -1;
@ -208,7 +208,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven
}
}
if (mb.is_valid() && !mb->is_pressed() && dragging_selected_attempt && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb.is_valid() && !mb->is_pressed() && dragging_selected_attempt && mb->get_button_index() == MouseButton::LEFT) {
if (dragging_selected) {
//move
Vector2 point = blend_space->get_blend_point_position(selected_point);
@ -234,7 +234,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven
blend_space_draw->update();
}
if (mb.is_valid() && mb->is_pressed() && tool_blend->is_pressed() && mb->get_button_index() == MOUSE_BUTTON_LEFT) {
if (mb.is_valid() && mb->is_pressed() && tool_blend->is_pressed() && mb->get_button_index() == MouseButton::LEFT) {
Vector2 blend_pos = (mb->get_position() / blend_space_draw->get_size());
blend_pos.y = 1.0 - blend_pos.y;
blend_pos *= (blend_space->get_max_space() - blend_space->get_min_space());
@ -268,7 +268,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven
blend_space_draw->update();
}
if (mm.is_valid() && tool_blend->is_pressed() && mm->get_button_mask() & MOUSE_BUTTON_MASK_LEFT) {
if (mm.is_valid() && tool_blend->is_pressed() && (mm->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) {
Vector2 blend_pos = (mm->get_position() / blend_space_draw->get_size());
blend_pos.y = 1.0 - blend_pos.y;
blend_pos *= (blend_space->get_max_space() - blend_space->get_min_space());

Some files were not shown because too many files have changed in this diff Show more