KeyboardApplet.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "KeyboardApplet.hpp"
  2. #include "TitleKeys.hpp"
  3. namespace {
  4. SwkbdCallbackResult callbackUrl(void* user, const char** ppMessage, const char* text, size_t textlen)
  5. {
  6. cpp3ds::String strError;
  7. auto kb = reinterpret_cast<FreeShop::KeyboardApplet*>(user);
  8. if (FreeShop::TitleKeys::isValidUrl(text, &strError))
  9. return SWKBD_CALLBACK_OK;
  10. kb->error = strError.toUtf8();
  11. *ppMessage = reinterpret_cast<const char*>(kb->error.c_str());
  12. return SWKBD_CALLBACK_CONTINUE;
  13. }
  14. }
  15. namespace FreeShop {
  16. KeyboardApplet::KeyboardApplet(InputType type)
  17. : m_type(type)
  18. , m_button(SWKBD_BUTTON_NONE)
  19. , m_swkbdLearning(nullptr)
  20. {
  21. switch (type)
  22. {
  23. case URL:
  24. swkbdInit(&m_swkbdState, SWKBD_TYPE_NORMAL, 2, -1);
  25. swkbdSetHintText(&m_swkbdState, "https://");
  26. swkbdSetValidation(&m_swkbdState, SWKBD_NOTBLANK_NOTEMPTY, 0, 0);
  27. swkbdSetFilterCallback(&m_swkbdState, callbackUrl, this);
  28. swkbdSetFeatures(&m_swkbdState, SWKBD_PREDICTIVE_INPUT);
  29. break;
  30. case Text:
  31. // Fall through
  32. default:
  33. swkbdInit(&m_swkbdState, SWKBD_TYPE_NORMAL, 2, -1);
  34. swkbdSetValidation(&m_swkbdState, SWKBD_ANYTHING, 0, 0);
  35. }
  36. // swkbdSetPasswordMode(&m_swkbdState, SWKBD_PASSWORD_HIDE_DELAY);
  37. // swkbdSetFeatures(&m_swkbdState, SWKBD_FIXED_WIDTH);
  38. // swkbdSetNumpadKeys(&m_swkbdState, L'ツ', L'益');
  39. }
  40. KeyboardApplet::~KeyboardApplet()
  41. {
  42. delete m_swkbdLearning;
  43. }
  44. KeyboardApplet::operator SwkbdState*()
  45. {
  46. return &m_swkbdState;
  47. }
  48. cpp3ds::String KeyboardApplet::getInput()
  49. {
  50. if (!m_dictWords.empty())
  51. swkbdSetDictionary(&m_swkbdState, &m_dictWords[0], m_dictWords.size());
  52. char inputBuf[255];
  53. m_button = swkbdInputText(&m_swkbdState, inputBuf, sizeof(inputBuf));
  54. if (m_button == SWKBD_BUTTON_CONFIRM)
  55. {
  56. std::string str(inputBuf);
  57. return cpp3ds::String::fromUtf8(str.begin(), str.end());
  58. }
  59. else
  60. return cpp3ds::String();
  61. }
  62. void KeyboardApplet::addDictWord(const std::string &typedWord, const std::string &resultWord)
  63. {
  64. SwkbdDictWord dictWord;
  65. swkbdSetDictWord(&dictWord, typedWord.c_str(), resultWord.c_str());
  66. m_dictWords.push_back(dictWord);
  67. }
  68. } // namespace FreeShop