KeyboardApplet.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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 TitleID:
  31. swkbdInit(&m_swkbdState, SWKBD_TYPE_NORMAL, 2, 16);
  32. swkbdSetValidation(&m_swkbdState, SWKBD_ANYTHING, 0, 0);
  33. break;
  34. case Text:
  35. // Fall through
  36. default:
  37. swkbdInit(&m_swkbdState, SWKBD_TYPE_NORMAL, 2, -1);
  38. swkbdSetValidation(&m_swkbdState, SWKBD_ANYTHING, 0, 0);
  39. swkbdSetFeatures(&m_swkbdState, SWKBD_PREDICTIVE_INPUT);
  40. }
  41. // swkbdSetPasswordMode(&m_swkbdState, SWKBD_PASSWORD_HIDE_DELAY);
  42. // swkbdSetFeatures(&m_swkbdState, SWKBD_FIXED_WIDTH);
  43. // swkbdSetNumpadKeys(&m_swkbdState, L'ツ', L'益');
  44. }
  45. KeyboardApplet::~KeyboardApplet()
  46. {
  47. delete m_swkbdLearning;
  48. }
  49. KeyboardApplet::operator SwkbdState*()
  50. {
  51. return &m_swkbdState;
  52. }
  53. cpp3ds::String KeyboardApplet::getInput()
  54. {
  55. if (!m_dictWords.empty())
  56. swkbdSetDictionary(&m_swkbdState, &m_dictWords[0], m_dictWords.size());
  57. char inputBuf[255];
  58. m_button = swkbdInputText(&m_swkbdState, inputBuf, sizeof(inputBuf));
  59. if (m_button == SWKBD_BUTTON_CONFIRM)
  60. {
  61. std::string str(inputBuf);
  62. return cpp3ds::String::fromUtf8(str.begin(), str.end());
  63. }
  64. else
  65. return cpp3ds::String();
  66. }
  67. void KeyboardApplet::addDictWord(const std::string &typedWord, const std::string &resultWord)
  68. {
  69. SwkbdDictWord dictWord;
  70. swkbdSetDictWord(&dictWord, typedWord.c_str(), resultWord.c_str());
  71. m_dictWords.push_back(dictWord);
  72. }
  73. } // namespace FreeShop