mirror of
https://github.com/wiiu-env/launchiine.git
synced 2024-11-22 01:39:18 +01:00
Add an option to filter the list using the built in on screen keyboard
This commit is contained in:
parent
b4cdf11f6a
commit
6af6c0baee
115
src/menu/KeyboardHelper.cpp
Normal file
115
src/menu/KeyboardHelper.cpp
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
#include <nn/swkbd.h>
|
||||||
|
#include "KeyboardHelper.h"
|
||||||
|
#include "utils/logger.h"
|
||||||
|
#include <coreinit/memdefaultheap.h>
|
||||||
|
|
||||||
|
KeyboardHelper::KeyboardHelper() {
|
||||||
|
FSClient *fsClient = (FSClient *)MEMAllocFromDefaultHeap(sizeof(FSClient));
|
||||||
|
FSAddClient(fsClient, 0);
|
||||||
|
|
||||||
|
// Create swkbd
|
||||||
|
nn::swkbd::CreateArg createArg;
|
||||||
|
createArg.regionType = nn::swkbd::RegionType::Europe;
|
||||||
|
createArg.workMemory = MEMAllocFromDefaultHeap(nn::swkbd::GetWorkMemorySize(0));
|
||||||
|
memset(createArg.workMemory,0, sizeof(nn::swkbd::GetWorkMemorySize(0)));
|
||||||
|
this->workMemory = createArg.workMemory;
|
||||||
|
createArg.fsClient = fsClient;
|
||||||
|
this->fsClient = createArg.fsClient;
|
||||||
|
DEBUG_FUNCTION_LINE("Calling create\n");
|
||||||
|
if (!nn::swkbd::Create(createArg)) {
|
||||||
|
DEBUG_FUNCTION_LINE("Failed to create keyboard\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
keyboardCreated = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
KeyboardHelper::~KeyboardHelper() {
|
||||||
|
if(keyboardCreated) {
|
||||||
|
nn::swkbd::Destroy();
|
||||||
|
MEMFreeToDefaultHeap(this->workMemory);
|
||||||
|
this->workMemory = NULL;
|
||||||
|
|
||||||
|
FSDelClient(fsClient, 0);
|
||||||
|
MEMFreeToDefaultHeap(this->fsClient);
|
||||||
|
keyboardCreated = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool KeyboardHelper::openKeyboard() {
|
||||||
|
if(keyboardCreated) {
|
||||||
|
// Show the keyboard
|
||||||
|
nn::swkbd::AppearArg appearArg;
|
||||||
|
appearArg.keyboardArg.configArg.languageType = nn::swkbd::LanguageType::English;
|
||||||
|
if (!nn::swkbd::AppearInputForm(appearArg)) {
|
||||||
|
DEBUG_FUNCTION_LINE("nn::swkbd::AppearInputForm failed\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
keyboardOpen = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string KeyboardHelper::getResult() {
|
||||||
|
return resultStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool KeyboardHelper::checkResult() {
|
||||||
|
if(keyboardCreated) {
|
||||||
|
VPADStatus vpadStatus;
|
||||||
|
if(keyboardOpen) {
|
||||||
|
VPADRead(VPAD_CHAN_0, &vpadStatus, 1, nullptr);
|
||||||
|
VPADGetTPCalibratedPoint(VPAD_CHAN_0, &vpadStatus.tpNormal, &vpadStatus.tpNormal);
|
||||||
|
}
|
||||||
|
// Update keyboard
|
||||||
|
nn::swkbd::ControllerInfo controllerInfo;
|
||||||
|
controllerInfo.vpad = &vpadStatus;
|
||||||
|
controllerInfo.kpad[0] = nullptr;
|
||||||
|
controllerInfo.kpad[1] = nullptr;
|
||||||
|
controllerInfo.kpad[2] = nullptr;
|
||||||
|
controllerInfo.kpad[3] = nullptr;
|
||||||
|
nn::swkbd::Calc(controllerInfo);
|
||||||
|
|
||||||
|
if (nn::swkbd::IsNeedCalcSubThreadFont()) {
|
||||||
|
nn::swkbd::CalcSubThreadFont();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nn::swkbd::IsNeedCalcSubThreadPredict()) {
|
||||||
|
nn::swkbd::CalcSubThreadPredict();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nn::swkbd::IsDecideOkButton(nullptr) || nn::swkbd::IsDecideCancelButton(nullptr)) {
|
||||||
|
const char16_t *str = nn::swkbd::GetInputFormString();
|
||||||
|
// Quick hack to get from a char16_t str to char for our log function
|
||||||
|
char logStr[128];
|
||||||
|
logStr[0] = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < 128; ++i) {
|
||||||
|
if (!str[i]) {
|
||||||
|
logStr[i] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (str[i] > 0x7F) {
|
||||||
|
logStr[i] = '?';
|
||||||
|
} else {
|
||||||
|
logStr[i] = str[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this->resultStr = logStr;
|
||||||
|
keyboardOpen = false;
|
||||||
|
nn::swkbd::DisappearInputForm();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void KeyboardHelper::drawDRC() {
|
||||||
|
nn::swkbd::DrawDRC();
|
||||||
|
}
|
||||||
|
|
||||||
|
void KeyboardHelper::drawTV() {
|
||||||
|
nn::swkbd::DrawTV();
|
||||||
|
}
|
32
src/menu/KeyboardHelper.h
Normal file
32
src/menu/KeyboardHelper.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <string>
|
||||||
|
#include <coreinit/filesystem.h>
|
||||||
|
|
||||||
|
class KeyboardHelper {
|
||||||
|
public:
|
||||||
|
KeyboardHelper();
|
||||||
|
|
||||||
|
~KeyboardHelper();
|
||||||
|
|
||||||
|
bool checkResult();
|
||||||
|
|
||||||
|
void drawTV();
|
||||||
|
|
||||||
|
void drawDRC();
|
||||||
|
|
||||||
|
bool openKeyboard();
|
||||||
|
|
||||||
|
bool isReady(){
|
||||||
|
return keyboardCreated;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getResult();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void * workMemory = NULL;
|
||||||
|
FSClient * fsClient = NULL;
|
||||||
|
bool keyboardOpen = false;
|
||||||
|
bool keyboardCreated = false;
|
||||||
|
std::string resultStr = "";
|
||||||
|
};
|
@ -33,7 +33,7 @@ public:
|
|||||||
, settingsIcon(settingsIconData)
|
, settingsIcon(settingsIconData)
|
||||||
, switchLayoutButton(switchIcon.getWidth(), switchIcon.getHeight())
|
, switchLayoutButton(switchIcon.getWidth(), switchIcon.getHeight())
|
||||||
, settingsButton(settingsIcon.getWidth(), settingsIcon.getHeight())
|
, settingsButton(settingsIcon.getWidth(), settingsIcon.getHeight())
|
||||||
, gameImageDownloadButton(w, h)
|
, gameListFilterButton(w, h)
|
||||||
, touchTrigger(GuiTrigger::CHANNEL_1, GuiTrigger::VPAD_TOUCH)
|
, touchTrigger(GuiTrigger::CHANNEL_1, GuiTrigger::VPAD_TOUCH)
|
||||||
, wpadTouchTrigger(GuiTrigger::CHANNEL_2 | GuiTrigger::CHANNEL_3 | GuiTrigger::CHANNEL_4 | GuiTrigger::CHANNEL_5, GuiTrigger::BUTTON_A)
|
, wpadTouchTrigger(GuiTrigger::CHANNEL_2 | GuiTrigger::CHANNEL_3 | GuiTrigger::CHANNEL_4 | GuiTrigger::CHANNEL_5, GuiTrigger::BUTTON_A)
|
||||||
, settingsTrigger(GuiTrigger::CHANNEL_ALL, GuiTrigger::BUTTON_ZL, true)
|
, settingsTrigger(GuiTrigger::CHANNEL_ALL, GuiTrigger::BUTTON_ZL, true)
|
||||||
@ -61,6 +61,12 @@ public:
|
|||||||
switchLayoutButton.setEffectGrow();
|
switchLayoutButton.setEffectGrow();
|
||||||
switchLayoutButton.clicked.connect(this, &MainDrcButtonsFrame::OnLayoutSwithClick);
|
switchLayoutButton.clicked.connect(this, &MainDrcButtonsFrame::OnLayoutSwithClick);
|
||||||
append(&switchLayoutButton);
|
append(&switchLayoutButton);
|
||||||
|
|
||||||
|
gameListFilterButton.setClickable(true);
|
||||||
|
gameListFilterButton.setSoundClick(buttonClickSound);
|
||||||
|
gameListFilterButton.setTrigger(&plusTrigger);
|
||||||
|
gameListFilterButton.clicked.connect(this, &MainDrcButtonsFrame::OnGameListFilterButtonClicked);
|
||||||
|
append(&gameListFilterButton);
|
||||||
}
|
}
|
||||||
virtual ~MainDrcButtonsFrame()
|
virtual ~MainDrcButtonsFrame()
|
||||||
{
|
{
|
||||||
@ -72,6 +78,7 @@ public:
|
|||||||
|
|
||||||
sigslot::signal1<GuiElement *> settingsButtonClicked;
|
sigslot::signal1<GuiElement *> settingsButtonClicked;
|
||||||
sigslot::signal1<GuiElement *> layoutSwitchClicked;
|
sigslot::signal1<GuiElement *> layoutSwitchClicked;
|
||||||
|
sigslot::signal1<GuiElement *> gameListFilterClicked;
|
||||||
private:
|
private:
|
||||||
void OnSettingsButtonClick(GuiButton *button, const GuiController *controller, GuiTrigger *) {
|
void OnSettingsButtonClick(GuiButton *button, const GuiController *controller, GuiTrigger *) {
|
||||||
settingsButtonClicked(this);
|
settingsButtonClicked(this);
|
||||||
@ -79,6 +86,9 @@ private:
|
|||||||
void OnLayoutSwithClick(GuiButton *button, const GuiController *controller, GuiTrigger *) {
|
void OnLayoutSwithClick(GuiButton *button, const GuiController *controller, GuiTrigger *) {
|
||||||
layoutSwitchClicked(this);
|
layoutSwitchClicked(this);
|
||||||
}
|
}
|
||||||
|
void OnGameListFilterButtonClicked(GuiButton *button, const GuiController *controller, GuiTrigger *) {
|
||||||
|
gameListFilterClicked(this);
|
||||||
|
}
|
||||||
|
|
||||||
GuiSound *buttonClickSound;
|
GuiSound *buttonClickSound;
|
||||||
GuiSound *screenSwitchSound;
|
GuiSound *screenSwitchSound;
|
||||||
@ -89,7 +99,7 @@ private:
|
|||||||
|
|
||||||
GuiButton switchLayoutButton;
|
GuiButton switchLayoutButton;
|
||||||
GuiButton settingsButton;
|
GuiButton settingsButton;
|
||||||
GuiButton gameImageDownloadButton;
|
GuiButton gameListFilterButton;
|
||||||
|
|
||||||
GuiTrigger touchTrigger;
|
GuiTrigger touchTrigger;
|
||||||
GuiTrigger wpadTouchTrigger;
|
GuiTrigger wpadTouchTrigger;
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
#include "utils/logger.h"
|
#include "utils/logger.h"
|
||||||
#include "utils/StringTools.h"
|
#include "utils/StringTools.h"
|
||||||
|
|
||||||
#include "resources/Resources.h"
|
#include "resources/Resources.h"
|
||||||
#include "gui/GuiTitleBrowser.h"
|
#include "gui/GuiTitleBrowser.h"
|
||||||
#include "gui/GuiIconGrid.h"
|
#include "gui/GuiIconGrid.h"
|
||||||
@ -107,6 +108,19 @@ void MainWindow::process() {
|
|||||||
tvElements[i]->process();
|
tvElements[i]->process();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(keyboardInstance != NULL) {
|
||||||
|
if(keyboardInstance->checkResult()) {
|
||||||
|
std::string result = keyboardInstance->getResult();
|
||||||
|
|
||||||
|
currentTvFrame->clearState(GuiElement::STATE_DISABLED);
|
||||||
|
currentDrcFrame->clearState(GuiElement::STATE_DISABLED);
|
||||||
|
mainSwitchButtonFrame->clearState(GuiElement::STATE_DISABLED);
|
||||||
|
|
||||||
|
gameList.filterList(result.c_str());
|
||||||
|
}else{
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::OnGameTitleListChanged(GameList * list) {
|
void MainWindow::OnGameTitleListChanged(GameList * list) {
|
||||||
@ -186,6 +200,10 @@ void MainWindow::drawDrc(CVideo *video) {
|
|||||||
pointerImg[i]->setAlpha(1.0f);
|
pointerImg[i]->setAlpha(1.0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(keyboardInstance != NULL) {
|
||||||
|
keyboardInstance->drawDRC();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::drawTv(CVideo *video) {
|
void MainWindow::drawTv(CVideo *video) {
|
||||||
@ -199,6 +217,9 @@ void MainWindow::drawTv(CVideo *video) {
|
|||||||
pointerValid[i] = false;
|
pointerValid[i] = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(keyboardInstance != NULL) {
|
||||||
|
keyboardInstance->drawTV();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::SetupMainView() {
|
void MainWindow::SetupMainView() {
|
||||||
@ -268,6 +289,23 @@ void MainWindow::OnLayoutSwitchClicked(GuiElement *element) {
|
|||||||
mainSwitchButtonFrame->setState(GuiElement::STATE_DISABLED);
|
mainSwitchButtonFrame->setState(GuiElement::STATE_DISABLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::OnGameListFilterButtonClicked(GuiElement *element) {
|
||||||
|
if(!currentTvFrame || !currentDrcFrame || !mainSwitchButtonFrame) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(keyboardInstance == NULL) {
|
||||||
|
keyboardInstance = new KeyboardHelper();
|
||||||
|
}
|
||||||
|
if(keyboardInstance->isReady()) {
|
||||||
|
if(keyboardInstance->openKeyboard()) {
|
||||||
|
currentTvFrame->setState(GuiElement::STATE_DISABLED);
|
||||||
|
currentDrcFrame->setState(GuiElement::STATE_DISABLED);
|
||||||
|
mainSwitchButtonFrame->setState(GuiElement::STATE_DISABLED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::OnLayoutSwitchEffectFinish(GuiElement *element) {
|
void MainWindow::OnLayoutSwitchEffectFinish(GuiElement *element) {
|
||||||
if(!currentTvFrame || !currentDrcFrame || !mainSwitchButtonFrame)
|
if(!currentTvFrame || !currentDrcFrame || !mainSwitchButtonFrame)
|
||||||
return;
|
return;
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include <gui/Gui.h>
|
#include <gui/Gui.h>
|
||||||
#include "game/GameList.h"
|
#include "game/GameList.h"
|
||||||
#include "system/CMutex.h"
|
#include "system/CMutex.h"
|
||||||
|
#include "KeyboardHelper.h"
|
||||||
#include "gui/GuiTitleBrowser.h"
|
#include "gui/GuiTitleBrowser.h"
|
||||||
#include "MainDrcButtonsFrame.h"
|
#include "MainDrcButtonsFrame.h"
|
||||||
|
|
||||||
@ -123,6 +124,7 @@ private:
|
|||||||
void OnSettingsButtonClicked(GuiElement *element);
|
void OnSettingsButtonClicked(GuiElement *element);
|
||||||
void OnLayoutSwitchClicked(GuiElement *element);
|
void OnLayoutSwitchClicked(GuiElement *element);
|
||||||
void OnLayoutSwitchEffectFinish(GuiElement *element);
|
void OnLayoutSwitchEffectFinish(GuiElement *element);
|
||||||
|
void OnGameListFilterButtonClicked(GuiElement *element);
|
||||||
|
|
||||||
void OnGameTitleListChanged(GameList * list);
|
void OnGameTitleListChanged(GameList * list);
|
||||||
void OnGameTitleUpdated(gameInfo * info);
|
void OnGameTitleUpdated(gameInfo * info);
|
||||||
@ -146,6 +148,7 @@ private:
|
|||||||
GameList gameList;
|
GameList gameList;
|
||||||
|
|
||||||
CMutex guiMutex;
|
CMutex guiMutex;
|
||||||
|
KeyboardHelper * keyboardInstance = NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //_MAIN_WINDOW_H_
|
#endif //_MAIN_WINDOW_H_
|
||||||
|
Loading…
Reference in New Issue
Block a user