mirror of
https://github.com/Oibaf66/frodo-wii.git
synced 2024-11-25 21:14:22 +01:00
Refactor dialogues: Simplify a lot and remove the tie-in to the main
menu class.
This commit is contained in:
parent
ed831048ce
commit
5f916a0dfd
8
Makefile
8
Makefile
@ -1,5 +1,5 @@
|
|||||||
OBJS=menu.oo main.oo utils.oo gui.oo dialogue_box.oo menu_messages.oo \
|
OBJS=menu.oo main.oo utils.oo gui.oo dialogue_box.oo menu_messages.oo \
|
||||||
timer.oo game_info.oo widget.oo virtual_keyboard.oo
|
timer.oo game_info.oo widget.oo virtual_keyboard.oo listener.oo
|
||||||
|
|
||||||
all: menu
|
all: menu
|
||||||
|
|
||||||
@ -15,7 +15,7 @@ gui.oo: gui.cpp gui.hh Makefile font.hh menu.hh sdl_ttf_font.hh \
|
|||||||
file_browser.hh timer.hh game_info.hh widget.hh options_menu.cpp \
|
file_browser.hh timer.hh game_info.hh widget.hh options_menu.cpp \
|
||||||
network_menu.cpp
|
network_menu.cpp
|
||||||
|
|
||||||
virtual_keyboard.oo: virtual_keyboard.hh virtual_keyboard.cpp widget.hh
|
virtual_keyboard.oo: virtual_keyboard.hh virtual_keyboard.cpp widget.hh listener.hh
|
||||||
|
|
||||||
game_info.oo: game_info.hh game_info.cpp
|
game_info.oo: game_info.hh game_info.cpp
|
||||||
|
|
||||||
@ -23,7 +23,9 @@ utils.oo: utils.cpp utils.hh Makefile
|
|||||||
|
|
||||||
timer.oo: timer.cpp timer.hh utils.hh Makefile
|
timer.oo: timer.cpp timer.hh utils.hh Makefile
|
||||||
|
|
||||||
dialogue_box.oo: dialogue_box.cpp dialogue_box.hh menu.hh Makefile
|
dialogue_box.oo: dialogue_box.cpp dialogue_box.hh menu.hh listener.hh
|
||||||
|
|
||||||
|
listener.oo: listener.cpp listener.hh
|
||||||
|
|
||||||
main.oo: menu.hh utils.hh sdl_ttf_font.hh Makefile
|
main.oo: menu.hh utils.hh sdl_ttf_font.hh Makefile
|
||||||
|
|
||||||
|
@ -1,10 +1,24 @@
|
|||||||
#include "dialogue_box.hh"
|
#include "dialogue_box.hh"
|
||||||
|
|
||||||
DialogueBox::DialogueBox(Font *font, const char *msgs[], int cancel) : Menu(font)
|
void DialogueListener::escapeCallback(DialogueBox *which, int selected)
|
||||||
|
{
|
||||||
|
Gui::gui->popDialogueBox();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DialogueListener::selectCallback(DialogueBox *which, int selected)
|
||||||
|
{
|
||||||
|
Gui::gui->popDialogueBox();
|
||||||
|
}
|
||||||
|
|
||||||
|
DialogueBox::DialogueBox(const char *msgs[], int cancel) : Menu(NULL), ListenerManager()
|
||||||
{
|
{
|
||||||
this->m_selected = -1;
|
|
||||||
this->m_cancel = cancel;
|
this->m_cancel = cancel;
|
||||||
|
|
||||||
|
this->setFont(Gui::gui->default_font);
|
||||||
|
this->setSelectedBackground(NULL, NULL, NULL,
|
||||||
|
Gui::gui->bg_left, Gui::gui->bg_middle,
|
||||||
|
Gui::gui->bg_right);
|
||||||
|
|
||||||
this->setText(msgs, NULL);
|
this->setText(msgs, NULL);
|
||||||
/* Place on the second to last entry */
|
/* Place on the second to last entry */
|
||||||
this->cur_sel = this->n_entries - 2;
|
this->cur_sel = this->n_entries - 2;
|
||||||
@ -12,6 +26,7 @@ DialogueBox::DialogueBox(Font *font, const char *msgs[], int cancel) : Menu(font
|
|||||||
|
|
||||||
int DialogueBox::selectNext(event_t ev)
|
int DialogueBox::selectNext(event_t ev)
|
||||||
{
|
{
|
||||||
|
printf("Al vobb: %d!\n", ev);
|
||||||
/* No up/down movement please! */
|
/* No up/down movement please! */
|
||||||
if (ev == KEY_UP || ev == KEY_DOWN)
|
if (ev == KEY_UP || ev == KEY_DOWN)
|
||||||
return this->cur_sel;
|
return this->cur_sel;
|
||||||
@ -20,7 +35,10 @@ int DialogueBox::selectNext(event_t ev)
|
|||||||
|
|
||||||
void DialogueBox::selectCallback(int which)
|
void DialogueBox::selectCallback(int which)
|
||||||
{
|
{
|
||||||
this->m_selected = this->p_submenus[0].sel;
|
for (int i = 0; i < this->nListeners(); i++)
|
||||||
|
if (this->listeners[i])
|
||||||
|
((DialogueListener*)this->listeners[i])->selectCallback(this,
|
||||||
|
this->p_submenus[0].sel);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DialogueBox::hoverCallback(int which)
|
void DialogueBox::hoverCallback(int which)
|
||||||
@ -29,5 +47,22 @@ void DialogueBox::hoverCallback(int which)
|
|||||||
|
|
||||||
void DialogueBox::escapeCallback(int which)
|
void DialogueBox::escapeCallback(int which)
|
||||||
{
|
{
|
||||||
this->m_selected = this->m_cancel;
|
for (int i = 0; i < this->nListeners(); i++)
|
||||||
|
if (this->listeners[i])
|
||||||
|
((DialogueListener*)this->listeners[i])->selectCallback(this,
|
||||||
|
this->p_submenus[0].sel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DialogueBox::draw(SDL_Surface *where)
|
||||||
|
{
|
||||||
|
int d_x = where->w / 2 - Gui::gui->dialogue_bg->w / 2;
|
||||||
|
int d_y = where->h / 2 - Gui::gui->dialogue_bg->h / 2;
|
||||||
|
|
||||||
|
SDL_Rect dst = (SDL_Rect){d_x, d_y,
|
||||||
|
Gui::gui->dialogue_bg->w, Gui::gui->dialogue_bg->h};
|
||||||
|
SDL_BlitSurface(Gui::gui->dialogue_bg, NULL, where, &dst);
|
||||||
|
|
||||||
|
Menu::draw(where, d_x + 10, d_y + 10,
|
||||||
|
Gui::gui->dialogue_bg->w - 10, Gui::gui->dialogue_bg->h - 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -2,11 +2,24 @@
|
|||||||
#define __DIALOGUE_BOX_HH__
|
#define __DIALOGUE_BOX_HH__
|
||||||
|
|
||||||
#include "menu.hh"
|
#include "menu.hh"
|
||||||
|
#include "listener.hh"
|
||||||
|
#include "gui_view.hh"
|
||||||
|
#include "gui.hh"
|
||||||
|
|
||||||
class DialogueBox : public Menu
|
class DialogueBox;
|
||||||
|
|
||||||
|
class DialogueListener : public Listener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DialogueBox(Font *font, const char *msgs[], int cancel = 1);
|
virtual void selectCallback(DialogueBox *which, int selected);
|
||||||
|
|
||||||
|
virtual void escapeCallback(DialogueBox *which, int selected);
|
||||||
|
};
|
||||||
|
|
||||||
|
class DialogueBox : public Menu, public ListenerManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DialogueBox(const char *msgs[], int cancel = 1);
|
||||||
|
|
||||||
virtual void selectCallback(int which);
|
virtual void selectCallback(int which);
|
||||||
|
|
||||||
@ -16,13 +29,14 @@ public:
|
|||||||
|
|
||||||
virtual int selectNext(event_t ev);
|
virtual int selectNext(event_t ev);
|
||||||
|
|
||||||
int selected()
|
virtual void draw(SDL_Surface *where);
|
||||||
|
|
||||||
|
int cancelIndex()
|
||||||
{
|
{
|
||||||
return this->m_selected;
|
return this->m_cancel;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
int m_selected;
|
|
||||||
int m_cancel;
|
int m_cancel;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
45
gui.cpp
45
gui.cpp
@ -38,6 +38,18 @@ GuiView::GuiView()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GuiView::updateTheme()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void GuiView::viewPushCallback()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void GuiView::viewPopCallback()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
Gui::Gui()
|
Gui::Gui()
|
||||||
{
|
{
|
||||||
this->focus = NULL;
|
this->focus = NULL;
|
||||||
@ -66,6 +78,8 @@ Gui::Gui()
|
|||||||
this->metadata_base_path = METADATA_ROOT_PATH;
|
this->metadata_base_path = METADATA_ROOT_PATH;
|
||||||
this->game_base_path = GAME_ROOT_PATH;
|
this->game_base_path = GAME_ROOT_PATH;
|
||||||
|
|
||||||
|
this->dlg = NULL;
|
||||||
|
|
||||||
/* Create the views */
|
/* Create the views */
|
||||||
this->mv = new MainView();
|
this->mv = new MainView();
|
||||||
this->dv = new DiscView();
|
this->dv = new DiscView();
|
||||||
@ -146,6 +160,9 @@ void Gui::runLogic(void)
|
|||||||
|
|
||||||
if (!this->is_active || !cur_view)
|
if (!this->is_active || !cur_view)
|
||||||
return;
|
return;
|
||||||
|
if (this->dlg)
|
||||||
|
this->dlg->runLogic();
|
||||||
|
else
|
||||||
cur_view->runLogic();
|
cur_view->runLogic();
|
||||||
this->timerController->tick();
|
this->timerController->tick();
|
||||||
}
|
}
|
||||||
@ -158,14 +175,29 @@ void Gui::pushView(GuiView *view)
|
|||||||
this->views = (GuiView**)xrealloc(this->views,
|
this->views = (GuiView**)xrealloc(this->views,
|
||||||
sizeof(GuiView*) * this->n_views);
|
sizeof(GuiView*) * this->n_views);
|
||||||
this->views[cur] = view;
|
this->views[cur] = view;
|
||||||
|
view->viewPushCallback();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gui::pushDialogueBox(DialogueBox *dlg)
|
||||||
|
{
|
||||||
|
this->dlg = dlg;
|
||||||
|
}
|
||||||
|
|
||||||
|
DialogueBox *Gui::popDialogueBox()
|
||||||
|
{
|
||||||
|
DialogueBox *out = this->dlg;
|
||||||
|
this->dlg = NULL;
|
||||||
|
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
GuiView *Gui::popView()
|
GuiView *Gui::popView()
|
||||||
{
|
{
|
||||||
GuiView *cur = this->peekView();
|
GuiView *cur = this->peekView();
|
||||||
|
|
||||||
if (cur)
|
if (!cur)
|
||||||
delete cur;
|
return NULL;
|
||||||
|
cur->viewPopCallback();
|
||||||
|
|
||||||
this->n_views--;
|
this->n_views--;
|
||||||
if (this->n_views <= 0)
|
if (this->n_views <= 0)
|
||||||
@ -181,7 +213,7 @@ GuiView *Gui::popView()
|
|||||||
|
|
||||||
this->views = (GuiView**)xrealloc(this->views,
|
this->views = (GuiView**)xrealloc(this->views,
|
||||||
sizeof(GuiView*) * this->n_views);
|
sizeof(GuiView*) * this->n_views);
|
||||||
return this->views[this->n_views - 1];
|
return cur;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gui::exitMenu()
|
void Gui::exitMenu()
|
||||||
@ -199,6 +231,11 @@ void Gui::pushEvent(SDL_Event *ev)
|
|||||||
|
|
||||||
if (!this->is_active || !cur_view)
|
if (!this->is_active || !cur_view)
|
||||||
return;
|
return;
|
||||||
|
if (this->dlg)
|
||||||
|
{
|
||||||
|
this->dlg->pushEvent(ev);
|
||||||
|
return;
|
||||||
|
}
|
||||||
cur_view->pushEvent(ev);
|
cur_view->pushEvent(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,6 +248,8 @@ void Gui::draw(SDL_Surface *where)
|
|||||||
|
|
||||||
SDL_BlitSurface(this->background, NULL, screen, NULL);
|
SDL_BlitSurface(this->background, NULL, screen, NULL);
|
||||||
cur_view->draw(where);
|
cur_view->draw(where);
|
||||||
|
if (this->dlg)
|
||||||
|
this->dlg->draw(where);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gui::activate()
|
void Gui::activate()
|
||||||
|
7
gui.hh
7
gui.hh
@ -9,6 +9,7 @@
|
|||||||
#include "gui_view.hh"
|
#include "gui_view.hh"
|
||||||
|
|
||||||
class MainView;
|
class MainView;
|
||||||
|
class DialogueBox;
|
||||||
class DiscView;
|
class DiscView;
|
||||||
class OptionsView;
|
class OptionsView;
|
||||||
class NetworkView;
|
class NetworkView;
|
||||||
@ -35,6 +36,10 @@ public:
|
|||||||
|
|
||||||
void pushView(GuiView *view);
|
void pushView(GuiView *view);
|
||||||
|
|
||||||
|
void pushDialogueBox(DialogueBox *dlg);
|
||||||
|
|
||||||
|
DialogueBox *popDialogueBox();
|
||||||
|
|
||||||
GuiView *popView();
|
GuiView *popView();
|
||||||
|
|
||||||
GuiView *peekView()
|
GuiView *peekView()
|
||||||
@ -72,6 +77,8 @@ public:
|
|||||||
Font *small_font;
|
Font *small_font;
|
||||||
TimerController *timerController;
|
TimerController *timerController;
|
||||||
|
|
||||||
|
DialogueBox *dlg;
|
||||||
|
|
||||||
MainView *mv;
|
MainView *mv;
|
||||||
DiscView *dv;
|
DiscView *dv;
|
||||||
OptionsView *ov;
|
OptionsView *ov;
|
||||||
|
34
listener.hh
Normal file
34
listener.hh
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#ifndef __LISTENER_HH__
|
||||||
|
#define __LISTENER_HH__
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
class Listener
|
||||||
|
{
|
||||||
|
/* Implemented by the child */
|
||||||
|
};
|
||||||
|
|
||||||
|
class ListenerManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ListenerManager();
|
||||||
|
|
||||||
|
void registerListener(Listener *l);
|
||||||
|
|
||||||
|
void unregisterListener(Listener *l);
|
||||||
|
|
||||||
|
void flushListeners()
|
||||||
|
{
|
||||||
|
memset(this->listeners, 0, sizeof(this->listeners));
|
||||||
|
}
|
||||||
|
|
||||||
|
int nListeners()
|
||||||
|
{
|
||||||
|
return sizeof(this->listeners) / sizeof(*this->listeners);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Listener *listeners[8];
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* __LISTENER_HH__ */
|
@ -1,4 +1,5 @@
|
|||||||
#include "menu.hh"
|
#include "menu.hh"
|
||||||
|
#include "dialogue_box.hh"
|
||||||
|
|
||||||
class KeyboardTypingListener : public KeyboardListener
|
class KeyboardTypingListener : public KeyboardListener
|
||||||
{
|
{
|
||||||
@ -15,63 +16,31 @@ class KeyboardTypingListener : public KeyboardListener
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ExitListener : public DialogueListener
|
||||||
|
{
|
||||||
|
void escapeCallback(DialogueBox *which, int selected)
|
||||||
|
{
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void selectCallback(DialogueBox *which, int selected)
|
||||||
|
{
|
||||||
|
if (selected != which->cancelIndex())
|
||||||
|
exit(0);
|
||||||
|
Gui::gui->popView();
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class MainView;
|
class MainView;
|
||||||
class MainMenu : public Menu
|
class MainMenu : public Menu
|
||||||
{
|
{
|
||||||
friend class MainView;
|
friend class MainView;
|
||||||
|
|
||||||
class ExitDialogue : public DialogueBox
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ExitDialogue(Font *font) : DialogueBox(font, exit_dialogue_messages, 1)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void selectCallback(int which)
|
|
||||||
{
|
|
||||||
this->m_selected = this->p_submenus[0].sel;
|
|
||||||
/* Do the exit */
|
|
||||||
if (this->m_selected != this->m_cancel)
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MainMenu(Font *font, HelpBox *help) : Menu(font)
|
MainMenu(Font *font, HelpBox *help) : Menu(font)
|
||||||
{
|
{
|
||||||
this->help = help;
|
this->help = help;
|
||||||
/* The dialogue box is only present when needed */
|
|
||||||
this->dialogue = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
~MainMenu()
|
|
||||||
{
|
|
||||||
if (this->dialogue)
|
|
||||||
delete this->dialogue;
|
|
||||||
}
|
|
||||||
|
|
||||||
void runLogic()
|
|
||||||
{
|
|
||||||
if (this->dialogue)
|
|
||||||
{
|
|
||||||
this->dialogue->runLogic();
|
|
||||||
if (this->dialogue->selected() >= 0)
|
|
||||||
{
|
|
||||||
delete this->dialogue;
|
|
||||||
this->dialogue = NULL;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Menu::runLogic();
|
|
||||||
}
|
|
||||||
|
|
||||||
void pushEvent(SDL_Event *ev)
|
|
||||||
{
|
|
||||||
if (this->dialogue)
|
|
||||||
this->dialogue->pushEvent(ev);
|
|
||||||
else
|
|
||||||
Menu::pushEvent(ev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void selectCallback(int which)
|
virtual void selectCallback(int which)
|
||||||
@ -105,10 +74,9 @@ public:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 11: /* Exit */
|
case 11: /* Exit */
|
||||||
this->dialogue = new ExitDialogue(this->font);
|
DialogueBox *exit_dialogue = new DialogueBox(exit_dialogue_messages, 1);
|
||||||
this->dialogue->setSelectedBackground(NULL, NULL, NULL,
|
exit_dialogue->registerListener(new ExitListener());
|
||||||
this->submenu_bg_left, this->submenu_bg_middle,
|
Gui::gui->pushDialogueBox(exit_dialogue);
|
||||||
this->submenu_bg_right);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -124,7 +92,6 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DialogueBox *dialogue;
|
|
||||||
HelpBox *help;
|
HelpBox *help;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -180,17 +147,6 @@ public:
|
|||||||
|
|
||||||
this->menu->draw(where, 50, 70, 300, 400);
|
this->menu->draw(where, 50, 70, 300, 400);
|
||||||
this->help->draw(where, 354, 24, 264, 210);
|
this->help->draw(where, 354, 24, 264, 210);
|
||||||
if (this->menu->dialogue) {
|
|
||||||
int d_x = where->w / 2 - Gui::gui->dialogue_bg->w / 2;
|
|
||||||
int d_y = where->h / 2 - Gui::gui->dialogue_bg->h / 2;
|
|
||||||
|
|
||||||
dst = (SDL_Rect){d_x, d_y,
|
|
||||||
Gui::gui->dialogue_bg->w, Gui::gui->dialogue_bg->h};
|
|
||||||
SDL_BlitSurface(Gui::gui->dialogue_bg, NULL, where, &dst);
|
|
||||||
|
|
||||||
this->menu->dialogue->draw(where, d_x + 10, d_y + 10,
|
|
||||||
Gui::gui->dialogue_bg->w - 10, Gui::gui->dialogue_bg->h - 10);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
2
menu.hh
2
menu.hh
@ -55,7 +55,7 @@ public:
|
|||||||
|
|
||||||
void setText(const char **messages, int *submenu_defaults = NULL);
|
void setText(const char **messages, int *submenu_defaults = NULL);
|
||||||
|
|
||||||
void runLogic();
|
virtual void runLogic();
|
||||||
|
|
||||||
void draw(SDL_Surface *where,
|
void draw(SDL_Surface *where,
|
||||||
int x, int y, int w, int h);
|
int x, int y, int w, int h);
|
||||||
|
@ -78,7 +78,7 @@ static const char *shifted_names[KEY_COLS * KEY_ROWS] = {
|
|||||||
NULL, NULL, NULL, NULL, NULL, NULL, "f2", "f4", "f6", "f8", "Ins", NULL, NULL, NULL, NULL,
|
NULL, NULL, NULL, NULL, NULL, NULL, "f2", "f4", "f6", "f8", "Ins", NULL, NULL, NULL, NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
VirtualKeyboard::VirtualKeyboard(Font *font) : GuiView()
|
VirtualKeyboard::VirtualKeyboard(Font *font) : GuiView(), ListenerManager()
|
||||||
{
|
{
|
||||||
this->font = font;
|
this->font = font;
|
||||||
this->sel_x = 0;
|
this->sel_x = 0;
|
||||||
@ -90,8 +90,6 @@ VirtualKeyboard::VirtualKeyboard(Font *font) : GuiView()
|
|||||||
this->buf_len = 255;
|
this->buf_len = 255;
|
||||||
this->buf = (struct virtkey*)xmalloc(sizeof(struct virtkey) * this->buf_len);
|
this->buf = (struct virtkey*)xmalloc(sizeof(struct virtkey) * this->buf_len);
|
||||||
memset(this->buf, 0, sizeof(struct virtkey) * this->buf_len);
|
memset(this->buf, 0, sizeof(struct virtkey) * this->buf_len);
|
||||||
|
|
||||||
this->flushListeners();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void VirtualKeyboard::draw(SDL_Surface *where, int x_base, int y_base, int w, int h)
|
void VirtualKeyboard::draw(SDL_Surface *where, int x_base, int y_base, int w, int h)
|
||||||
@ -259,36 +257,6 @@ const char VirtualKeyboard::keycodeToChar(int kc)
|
|||||||
return s[0];
|
return s[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
void VirtualKeyboard::registerListener(KeyboardListener *kl)
|
|
||||||
{
|
|
||||||
int n_listeners = sizeof(this->listeners) / sizeof(*this->listeners);
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Don't register already registered listeners */
|
|
||||||
for (i = 0; i < n_listeners; i++)
|
|
||||||
if (this->listeners[i] == kl)
|
|
||||||
return;
|
|
||||||
/* Find a free spot */
|
|
||||||
for (i = 0; i < n_listeners; i++)
|
|
||||||
if (!this->listeners[i])
|
|
||||||
break;
|
|
||||||
|
|
||||||
panic_if(i == n_listeners,
|
|
||||||
"No free listeners!\n");
|
|
||||||
this->listeners[i] = kl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VirtualKeyboard::unregisterListener(KeyboardListener *kl)
|
|
||||||
{
|
|
||||||
int n_listeners = sizeof(this->listeners) / sizeof(*this->listeners);
|
|
||||||
|
|
||||||
for (int i = 0; i < n_listeners; i++)
|
|
||||||
{
|
|
||||||
if (this->listeners[i] == kl)
|
|
||||||
this->listeners[i] = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void VirtualKeyboard::activate()
|
void VirtualKeyboard::activate()
|
||||||
{
|
{
|
||||||
this->is_active = true;
|
this->is_active = true;
|
||||||
@ -362,16 +330,11 @@ void VirtualKeyboard::pushKey(struct virtkey *vk)
|
|||||||
for (int i = 0; i < n_listeners; i++)
|
for (int i = 0; i < n_listeners; i++)
|
||||||
{
|
{
|
||||||
if (this->listeners[i])
|
if (this->listeners[i])
|
||||||
this->listeners[i]->keyCallback(this->shift_on,
|
((KeyboardListener*)this->listeners[i])->keyCallback(this->shift_on,
|
||||||
vk->name);
|
vk->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VirtualKeyboard::flushListeners()
|
|
||||||
{
|
|
||||||
memset(this->listeners, 0, sizeof(this->listeners));
|
|
||||||
}
|
|
||||||
|
|
||||||
void VirtualKeyboard::deactivate()
|
void VirtualKeyboard::deactivate()
|
||||||
{
|
{
|
||||||
this->is_active = false;
|
this->is_active = false;
|
||||||
@ -390,7 +353,7 @@ void VirtualKeyboard::done()
|
|||||||
for (int i = 0; i < n_listeners; i++)
|
for (int i = 0; i < n_listeners; i++)
|
||||||
{
|
{
|
||||||
if (this->listeners[i])
|
if (this->listeners[i])
|
||||||
this->listeners[i]->stringCallback(buf);
|
((KeyboardListener*)this->listeners[i])->stringCallback(buf);
|
||||||
}
|
}
|
||||||
free(buf);
|
free(buf);
|
||||||
this->deactivate();
|
this->deactivate();
|
||||||
|
@ -17,10 +17,11 @@
|
|||||||
#include "widget.hh"
|
#include "widget.hh"
|
||||||
#include "gui_view.hh"
|
#include "gui_view.hh"
|
||||||
#include "font.hh"
|
#include "font.hh"
|
||||||
|
#include "listener.hh"
|
||||||
|
|
||||||
struct virtkey;
|
struct virtkey;
|
||||||
|
|
||||||
class KeyboardListener
|
class KeyboardListener : public Listener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
~KeyboardListener();
|
~KeyboardListener();
|
||||||
@ -35,14 +36,11 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class VirtualKeyboard : public GuiView
|
class VirtualKeyboard : public GuiView, public ListenerManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
VirtualKeyboard(Font *font);
|
VirtualKeyboard(Font *font);
|
||||||
|
|
||||||
void registerListener(KeyboardListener *kl);
|
|
||||||
void unregisterListener(KeyboardListener *kl);
|
|
||||||
|
|
||||||
/* Conversions */
|
/* Conversions */
|
||||||
const char *keycodeToString(int kc);
|
const char *keycodeToString(int kc);
|
||||||
const char keycodeToChar(int kc);
|
const char keycodeToChar(int kc);
|
||||||
@ -77,8 +75,6 @@ public:
|
|||||||
/* Singleton object */
|
/* Singleton object */
|
||||||
static VirtualKeyboard *kbd;
|
static VirtualKeyboard *kbd;
|
||||||
private:
|
private:
|
||||||
KeyboardListener *listeners[8];
|
|
||||||
|
|
||||||
void selectNext(int dx, int dy);
|
void selectNext(int dx, int dy);
|
||||||
|
|
||||||
void toggleShift();
|
void toggleShift();
|
||||||
@ -87,8 +83,6 @@ private:
|
|||||||
|
|
||||||
void done();
|
void done();
|
||||||
|
|
||||||
void flushListeners();
|
|
||||||
|
|
||||||
Font *font;
|
Font *font;
|
||||||
int sel_x;
|
int sel_x;
|
||||||
int sel_y;
|
int sel_y;
|
||||||
|
Loading…
Reference in New Issue
Block a user