mirror of
https://github.com/Oibaf66/frodo-wii.git
synced 2025-02-16 20:39:15 +01:00
Refactor listeners to handle both key and string callbacks
This commit is contained in:
parent
0a3bc3e081
commit
46757f1f1e
@ -1,6 +1,6 @@
|
||||
#include "menu.hh"
|
||||
|
||||
class KeyboardTypingListener : public StringListener
|
||||
class KeyboardTypingListener : public KeyboardListener
|
||||
{
|
||||
virtual void stringCallback(const char *str)
|
||||
{
|
||||
@ -8,10 +8,15 @@ class KeyboardTypingListener : public StringListener
|
||||
/* Remove thyself! */
|
||||
delete this;
|
||||
}
|
||||
|
||||
virtual void keyCallback(bool shift, const char *str)
|
||||
{
|
||||
printf("Vobb: %d: %s\n", shift, str);
|
||||
}
|
||||
};
|
||||
|
||||
class MainView;
|
||||
class MainMenu : public Menu, KeyListener
|
||||
class MainMenu : public Menu
|
||||
{
|
||||
friend class MainView;
|
||||
|
||||
@ -84,9 +89,7 @@ public:
|
||||
case 4:
|
||||
Gui::gui->pushView(Gui::gui->kv);
|
||||
Gui::gui->kv->activate();
|
||||
Gui::gui->kv->registerKeyListener(this);
|
||||
if (this->p_submenus[2].sel == 0)
|
||||
Gui::gui->kv->registerStringListener(new KeyboardTypingListener());
|
||||
Gui::gui->kv->registerListener(new KeyboardTypingListener());
|
||||
break;
|
||||
|
||||
case 11:
|
||||
@ -98,11 +101,6 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
virtual void keyCallback(bool shift, const char *str)
|
||||
{
|
||||
printf("Vobb: %d: %s\n", shift, str);
|
||||
}
|
||||
|
||||
virtual void hoverCallback(int which)
|
||||
{
|
||||
this->help->updateHelpMessage(which);
|
||||
|
@ -82,8 +82,7 @@ VirtualKeyboard::VirtualKeyboard(Font *font) : GuiView()
|
||||
this->buf_head = 0;
|
||||
|
||||
memset(this->buf, 0, sizeof(this->buf));
|
||||
memset(this->stringListeners, 0, sizeof(this->stringListeners));
|
||||
memset(this->keyListeners, 0, sizeof(this->keyListeners));
|
||||
this->flushListeners();
|
||||
}
|
||||
|
||||
void VirtualKeyboard::draw(SDL_Surface *where, int x_base, int y_base, int w, int h)
|
||||
@ -221,52 +220,29 @@ const char VirtualKeyboard::keycodeToChar(int kc)
|
||||
return s[0];
|
||||
}
|
||||
|
||||
void VirtualKeyboard::registerKeyListener(KeyListener *kl)
|
||||
void VirtualKeyboard::registerListener(KeyboardListener *kl)
|
||||
{
|
||||
int n_listeners = sizeof(this->keyListeners) / sizeof(*this->keyListeners);
|
||||
int n_listeners = sizeof(this->listeners) / sizeof(*this->listeners);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n_listeners; i++)
|
||||
if (!this->keyListeners[i])
|
||||
break;
|
||||
panic_if(i == n_listeners,
|
||||
"No free listeners!\n");
|
||||
this->keyListeners[i] = kl;
|
||||
}
|
||||
|
||||
/* Templates FTW! */
|
||||
void VirtualKeyboard::registerStringListener(StringListener *sl)
|
||||
{
|
||||
int n_listeners = sizeof(this->stringListeners) / sizeof(*this->stringListeners);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n_listeners; i++)
|
||||
if (!this->stringListeners[i])
|
||||
break;
|
||||
panic_if(i == n_listeners,
|
||||
"No free listeners!\n");
|
||||
this->stringListeners[i] = sl;
|
||||
}
|
||||
|
||||
void VirtualKeyboard::unregisterKeyListener(KeyListener *kl)
|
||||
{
|
||||
int n_listeners = sizeof(this->keyListeners) / sizeof(*this->keyListeners);
|
||||
|
||||
for (int i = 0; i < n_listeners; i++)
|
||||
{
|
||||
if (this->keyListeners[i] == kl)
|
||||
this->keyListeners[i] = NULL;
|
||||
if (!this->listeners[i])
|
||||
break;
|
||||
}
|
||||
panic_if(i == n_listeners,
|
||||
"No free listeners!\n");
|
||||
this->listeners[i] = kl;
|
||||
}
|
||||
|
||||
void VirtualKeyboard::unregisterStringListener(StringListener *sl)
|
||||
void VirtualKeyboard::unregisterListener(KeyboardListener *kl)
|
||||
{
|
||||
int n_listeners = sizeof(this->stringListeners) / sizeof(*this->stringListeners);
|
||||
int n_listeners = sizeof(this->listeners) / sizeof(*this->listeners);
|
||||
|
||||
for (int i = 0; i < n_listeners; i++)
|
||||
{
|
||||
if (this->stringListeners[i] == sl)
|
||||
this->stringListeners[i] = NULL;
|
||||
if (this->listeners[i] == kl)
|
||||
this->listeners[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@ -310,12 +286,12 @@ void VirtualKeyboard::runLogic()
|
||||
this->toggleShift();
|
||||
else if (key->is_done)
|
||||
{
|
||||
int n_listeners = sizeof(this->stringListeners) / sizeof(*this->stringListeners);
|
||||
int n_listeners = sizeof(this->listeners) / sizeof(*this->listeners);
|
||||
|
||||
for (int i = 0; i < n_listeners; i++)
|
||||
{
|
||||
if (this->stringListeners[i])
|
||||
this->stringListeners[i]->stringCallback(this->buf);
|
||||
if (this->listeners[i])
|
||||
this->listeners[i]->stringCallback(this->buf);
|
||||
}
|
||||
/* We're done! */
|
||||
this->deactivate();
|
||||
@ -330,7 +306,7 @@ void VirtualKeyboard::runLogic()
|
||||
}
|
||||
else
|
||||
{
|
||||
int n_listeners = sizeof(this->keyListeners) / sizeof(*this->keyListeners);
|
||||
int n_listeners = sizeof(this->listeners) / sizeof(*this->listeners);
|
||||
char c;
|
||||
|
||||
/* Add to buf */
|
||||
@ -343,24 +319,23 @@ void VirtualKeyboard::runLogic()
|
||||
this->buf_head = 0; /* OK, not good, but well... */
|
||||
for (int i = 0; i < n_listeners; i++)
|
||||
{
|
||||
if (this->keyListeners[i])
|
||||
this->keyListeners[i]->keyCallback(this->shift_on,
|
||||
if (this->listeners[i])
|
||||
this->listeners[i]->keyCallback(this->shift_on,
|
||||
key->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void VirtualKeyboard::flushKeyListeners()
|
||||
void VirtualKeyboard::flushListeners()
|
||||
{
|
||||
memset(this->keyListeners, 0, sizeof(this->keyListeners));
|
||||
memset(this->stringListeners, 0, sizeof(this->stringListeners));
|
||||
memset(this->listeners, 0, sizeof(this->listeners));
|
||||
}
|
||||
|
||||
void VirtualKeyboard::deactivate()
|
||||
{
|
||||
this->is_active = false;
|
||||
this->flushKeyListeners();
|
||||
this->flushListeners();
|
||||
Gui::gui->popView();
|
||||
}
|
||||
|
||||
@ -378,12 +353,7 @@ void VirtualKeyboard::updateTheme()
|
||||
VirtualKeyboard *VirtualKeyboard::kbd;
|
||||
|
||||
|
||||
KeyListener::~KeyListener()
|
||||
KeyboardListener::~KeyboardListener()
|
||||
{
|
||||
VirtualKeyboard::kbd->unregisterKeyListener(this);
|
||||
}
|
||||
|
||||
StringListener::~StringListener()
|
||||
{
|
||||
VirtualKeyboard::kbd->unregisterStringListener(this);
|
||||
VirtualKeyboard::kbd->unregisterListener(this);
|
||||
}
|
||||
|
@ -20,21 +20,19 @@
|
||||
|
||||
struct virtkey;
|
||||
|
||||
class KeyListener
|
||||
class KeyboardListener
|
||||
{
|
||||
public:
|
||||
~KeyListener();
|
||||
~KeyboardListener();
|
||||
|
||||
/* Each key is a string */
|
||||
virtual void keyCallback(bool shift, const char *str) = 0;
|
||||
};
|
||||
virtual void keyCallback(bool shift, const char *str)
|
||||
{
|
||||
}
|
||||
|
||||
class StringListener
|
||||
{
|
||||
public:
|
||||
~StringListener();
|
||||
|
||||
virtual void stringCallback(const char *str) = 0;
|
||||
virtual void stringCallback(const char *str)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
class VirtualKeyboard : public GuiView
|
||||
@ -42,10 +40,8 @@ class VirtualKeyboard : public GuiView
|
||||
public:
|
||||
VirtualKeyboard(Font *font);
|
||||
|
||||
void registerKeyListener(KeyListener *kl);
|
||||
void registerStringListener(StringListener *sl);
|
||||
void unregisterKeyListener(KeyListener *kl);
|
||||
void unregisterStringListener(StringListener *sl);
|
||||
void registerListener(KeyboardListener *kl);
|
||||
void unregisterListener(KeyboardListener *kl);
|
||||
|
||||
/* Conversions */
|
||||
const char *keycodeToString(int kc);
|
||||
@ -78,13 +74,12 @@ public:
|
||||
/* Singleton object */
|
||||
static VirtualKeyboard *kbd;
|
||||
private:
|
||||
KeyListener *keyListeners[8];
|
||||
StringListener *stringListeners[8];
|
||||
KeyboardListener *listeners[8];
|
||||
|
||||
void selectNext(int dx, int dy);
|
||||
void toggleShift();
|
||||
|
||||
void flushKeyListeners();
|
||||
void flushListeners();
|
||||
|
||||
Font *font;
|
||||
int sel_x;
|
||||
|
Loading…
x
Reference in New Issue
Block a user