From cbdc1b65314d1eeb2799deae5cf6f113d6d67b46 Mon Sep 17 00:00:00 2001 From: H0neyBadger Date: Mon, 4 Jan 2021 20:36:19 +0100 Subject: [PATCH] Add enum kbdDisableBitmask to manage keyboard imput (#72) (#73) * Add enum kbdDisableBitmask to manage keyboard imput (#72) * Add InputListItem & IntegerInputListItem examples --- example/main.cpp | 6 ++++ library/include/borealis/list.hpp | 6 ++-- library/include/borealis/swkbd.hpp | 17 ++++++++-- library/lib/list.cpp | 11 ++++--- library/lib/swkbd.cpp | 51 +++++++++++++++++++++++++++--- resources/i18n/en-US/main.json | 12 +++++++ resources/i18n/fr/main.json | 12 +++++++ 7 files changed, 102 insertions(+), 13 deletions(-) diff --git a/example/main.cpp b/example/main.cpp index 1876dd0e1..cb94bad48 100644 --- a/example/main.cpp +++ b/example/main.cpp @@ -129,6 +129,10 @@ int main(int argc, char* argv[]) brls::SelectListItem* layerSelectItem = new brls::SelectListItem("main/layers/title"_i18n, { "main/layers/layer1"_i18n, "main/layers/layer2"_i18n }); + brls::InputListItem* keyboardItem = new brls::InputListItem("main/keyboard/string/title"_i18n, "main/keyboard/string/default"_i18n, "main/keyboard/string/help"_i18n, "", 16); + + brls::IntegerInputListItem* keyboardNumberItem = new brls::IntegerInputListItem("main/keyboard/number/title"_i18n, 1337, "main/keyboard/number/help"_i18n, "", 10); + testList->addView(dialogItem); testList->addView(notificationItem); testList->addView(themeItem); @@ -137,6 +141,8 @@ int main(int argc, char* argv[]) testList->addView(crashItem); testList->addView(installerItem); testList->addView(popupItem); + testList->addView(keyboardItem); + testList->addView(keyboardNumberItem); brls::Label* testLabel = new brls::Label(brls::LabelStyle::REGULAR, "main/more"_i18n, true); testList->addView(testLabel); diff --git a/library/include/borealis/list.hpp b/library/include/borealis/list.hpp index d8a7da379..04a085450 100644 --- a/library/include/borealis/list.hpp +++ b/library/include/borealis/list.hpp @@ -24,6 +24,7 @@ #include #include #include +#include #include namespace brls @@ -162,9 +163,10 @@ class InputListItem : public ListItem protected: std::string helpText; int maxInputLength; + int kbdDisableBitmask; public: - InputListItem(std::string label, std::string initialValue, std::string helpText, std::string description = "", int maxInputLength = 32); + InputListItem(std::string label, std::string initialValue, std::string helpText, std::string description = "", int maxInputLength = 32, int kbdDisableBitmask = KeyboardKeyDisableBitmask::KEYBOARD_DISABLE_NONE); virtual bool onClick() override; }; @@ -174,7 +176,7 @@ class InputListItem : public ListItem class IntegerInputListItem : public InputListItem { public: - IntegerInputListItem(std::string label, int initialValue, std::string helpText, std::string description = "", int maxInputLength = 32); + IntegerInputListItem(std::string label, int initialValue, std::string helpText, std::string description = "", int maxInputLength = 32, int kbdDisableBitmask = KeyboardKeyDisableBitmask::KEYBOARD_DISABLE_NONE); virtual bool onClick() override; }; diff --git a/library/include/borealis/swkbd.hpp b/library/include/borealis/swkbd.hpp index 4aaa0971f..16a304c92 100644 --- a/library/include/borealis/swkbd.hpp +++ b/library/include/borealis/swkbd.hpp @@ -25,11 +25,24 @@ namespace brls { +enum KeyboardKeyDisableBitmask +{ + KEYBOARD_DISABLE_NONE = 0, + KEYBOARD_DISABLE_SPACE = 1, + KEYBOARD_DISABLE_AT = 1 << 1, + KEYBOARD_DISABLE_PERCENT = 1 << 2, + KEYBOARD_DISABLE_FORWSLASH = 1 << 3, + KEYBOARD_DISABLE_BACKSLASH = 1 << 4, + KEYBOARD_DISABLE_NUMBERS = 1 << 5, + KEYBOARD_DISABLE_DOWNLOADCODE = 1 << 6, + KEYBOARD_DISABLE_USERNAME = 1 << 7, +}; + class Swkbd { public: - static bool openForText(std::function f, std::string headerText = "", std::string subText = "", int maxStringLength = 32, std::string initialText = ""); - static bool openForNumber(std::function f, std::string headerText = "", std::string subText = "", int maxStringLength = 32, std::string initialText = "", std::string leftButton = "", std::string rightButton = ""); + static bool openForText(std::function f, std::string headerText = "", std::string subText = "", int maxStringLength = 32, std::string initialText = "", int kbdDisableBitmask = KeyboardKeyDisableBitmask::KEYBOARD_DISABLE_NONE); + static bool openForNumber(std::function f, std::string headerText = "", std::string subText = "", int maxStringLength = 32, std::string initialText = "", std::string leftButton = "", std::string rightButton = "", int kbdDisableBitmask = KeyboardKeyDisableBitmask::KEYBOARD_DISABLE_NONE); }; } // namespace brls diff --git a/library/lib/list.cpp b/library/lib/list.cpp index 2fb33b46b..b17a05378 100644 --- a/library/lib/list.cpp +++ b/library/lib/list.cpp @@ -491,10 +491,11 @@ bool ToggleListItem::getToggleState() return this->toggleState; } -InputListItem::InputListItem(std::string label, std::string initialValue, std::string helpText, std::string description, int maxInputLength) +InputListItem::InputListItem(std::string label, std::string initialValue, std::string helpText, std::string description, int maxInputLength, int kbdDisableBitmask) : ListItem(label, description) , helpText(helpText) , maxInputLength(maxInputLength) + , kbdDisableBitmask(kbdDisableBitmask) { this->setValue(initialValue, false); } @@ -504,14 +505,14 @@ bool InputListItem::onClick() Swkbd::openForText([&](std::string text) { this->setValue(text, false); }, - this->helpText, "", this->maxInputLength, this->getValue()); + this->helpText, "", this->maxInputLength, this->getValue(), this->kbdDisableBitmask); ListItem::onClick(); return true; } -IntegerInputListItem::IntegerInputListItem(std::string label, int initialValue, std::string helpText, std::string description, int maxInputLength) - : InputListItem(label, std::to_string(initialValue), helpText, description, maxInputLength) +IntegerInputListItem::IntegerInputListItem(std::string label, int initialValue, std::string helpText, std::string description, int maxInputLength, int kbdDisableBitmask) + : InputListItem(label, std::to_string(initialValue), helpText, description, maxInputLength, kbdDisableBitmask) { } @@ -520,7 +521,7 @@ bool IntegerInputListItem::onClick() Swkbd::openForNumber([&](int number) { this->setValue(std::to_string(number), false); }, - this->helpText, "", this->maxInputLength, this->getValue()); + this->helpText, "", this->maxInputLength, this->getValue(), "", "", this->kbdDisableBitmask); ListItem::onClick(); return true; diff --git a/library/lib/swkbd.cpp b/library/lib/swkbd.cpp index 2a0a62ab9..fac1c691d 100644 --- a/library/lib/swkbd.cpp +++ b/library/lib/swkbd.cpp @@ -30,6 +30,7 @@ namespace brls { #ifdef __SWITCH__ + static SwkbdConfig createSwkbdBaseConfig(std::string headerText, std::string subText, int maxStringLength, std::string initialText) { SwkbdConfig config; @@ -46,6 +47,48 @@ static SwkbdConfig createSwkbdBaseConfig(std::string headerText, std::string sub return config; } + +int getSwkbdKeyDisableBitmask(int borealis_key) +{ + // translate brls to Switch libnx values + int ret = 0; + if (borealis_key == brls::KeyboardKeyDisableBitmask::KEYBOARD_DISABLE_NONE) + return 0; + + if (borealis_key & brls::KeyboardKeyDisableBitmask::KEYBOARD_DISABLE_SPACE) + // Disable space-bar + ret |= SwkbdKeyDisableBitmask_Space; + + if (borealis_key & brls::KeyboardKeyDisableBitmask::KEYBOARD_DISABLE_AT) + // Disable '@'. + ret |= SwkbdKeyDisableBitmask_At; + + if (borealis_key & brls::KeyboardKeyDisableBitmask::KEYBOARD_DISABLE_PERCENT) + // Disable '%'. + ret |= SwkbdKeyDisableBitmask_Percent; + + if (borealis_key & brls::KeyboardKeyDisableBitmask::KEYBOARD_DISABLE_FORWSLASH) + // Disable '/'. + ret |= SwkbdKeyDisableBitmask_ForwardSlash; + + if (borealis_key & brls::KeyboardKeyDisableBitmask::KEYBOARD_DISABLE_BACKSLASH) + // Disable '\'. + ret |= SwkbdKeyDisableBitmask_Backslash; + + if (borealis_key & brls::KeyboardKeyDisableBitmask::KEYBOARD_DISABLE_NUMBERS) + // Disable numbers. + ret |= SwkbdKeyDisableBitmask_Numbers; + + if (borealis_key & brls::KeyboardKeyDisableBitmask::KEYBOARD_DISABLE_DOWNLOADCODE) + // Used for swkbdConfigMakePresetDownloadCode. + ret |= SwkbdKeyDisableBitmask_DownloadCode; + + if (borealis_key & brls::KeyboardKeyDisableBitmask::KEYBOARD_DISABLE_USERNAME) + // Used for swkbdConfigMakePresetUserName. Disables '@', '%', and '\'. + ret |= SwkbdKeyDisableBitmask_UserName; + + return ret; +} #else static std::string terminalInput(std::string text) { @@ -56,13 +99,13 @@ static std::string terminalInput(std::string text) } #endif -bool Swkbd::openForText(std::function f, std::string headerText, std::string subText, int maxStringLength, std::string initialText) +bool Swkbd::openForText(std::function f, std::string headerText, std::string subText, int maxStringLength, std::string initialText, int kbdDisableBitmask) { #ifdef __SWITCH__ SwkbdConfig config = createSwkbdBaseConfig(headerText, subText, maxStringLength, initialText); swkbdConfigSetType(&config, SwkbdType_Normal); - swkbdConfigSetKeySetDisableBitmask(&config, SwkbdKeyDisableBitmask_At | SwkbdKeyDisableBitmask_Percent | SwkbdKeyDisableBitmask_ForwardSlash | SwkbdKeyDisableBitmask_Backslash); + swkbdConfigSetKeySetDisableBitmask(&config, getSwkbdKeyDisableBitmask(kbdDisableBitmask)); char buffer[0x100]; @@ -84,7 +127,7 @@ bool Swkbd::openForText(std::function f, std::string headerTe #endif } -bool Swkbd::openForNumber(std::function f, std::string headerText, std::string subText, int maxStringLength, std::string initialText, std::string leftButton, std::string rightButton) +bool Swkbd::openForNumber(std::function f, std::string headerText, std::string subText, int maxStringLength, std::string initialText, std::string leftButton, std::string rightButton, int kbdDisableBitmask) { #ifdef __SWITCH__ SwkbdConfig config = createSwkbdBaseConfig(headerText, subText, maxStringLength, initialText); @@ -92,7 +135,7 @@ bool Swkbd::openForNumber(std::function f, std::string headerText, st swkbdConfigSetType(&config, SwkbdType_NumPad); swkbdConfigSetLeftOptionalSymbolKey(&config, leftButton.c_str()); swkbdConfigSetRightOptionalSymbolKey(&config, rightButton.c_str()); - swkbdConfigSetKeySetDisableBitmask(&config, SwkbdKeyDisableBitmask_At | SwkbdKeyDisableBitmask_Percent | SwkbdKeyDisableBitmask_ForwardSlash | SwkbdKeyDisableBitmask_Backslash); + swkbdConfigSetKeySetDisableBitmask(&config, getSwkbdKeyDisableBitmask(kbdDisableBitmask)); char buffer[0x100]; diff --git a/resources/i18n/en-US/main.json b/resources/i18n/en-US/main.json index 3d230b5f8..f265712dd 100644 --- a/resources/i18n/en-US/main.json +++ b/resources/i18n/en-US/main.json @@ -60,6 +60,18 @@ "item1": "Item 1", "item2": "Item 2", "item3": "Item 3" + }, + + "keyboard": { + "string": { + "title": "Open Keyboard", + "default": "Default text", + "help": "Help message" + }, + "number": { + "title": "Open Num Keyboard", + "help": "Help message" + } } } diff --git a/resources/i18n/fr/main.json b/resources/i18n/fr/main.json index 912ca1d8e..160cb6f61 100644 --- a/resources/i18n/fr/main.json +++ b/resources/i18n/fr/main.json @@ -60,6 +60,18 @@ "item1": "Item 1", "item2": "Item 2", "item3": "Item 3" + }, + + "keyboard": { + "string": { + "title": "Ouvrir le clavier", + "default": "Texte par défaut", + "help": "Message d'aide" + }, + "number": { + "title": "Ouvrir le clavier numérique", + "help": "Message d'aide" + } } }