try to improve typing in text boxes for RTL languages

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@8258 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria 2011-04-07 23:04:21 +00:00
parent 88a4f51f62
commit 0a18005a05
5 changed files with 96 additions and 5 deletions

View File

@ -9,13 +9,15 @@
<textbox id="textfield" width="75%" I18N="In the 'add new player' dialog" align="center"/>
<spacer height="20" width="20" />
<label id="preview" width="75%" align="center" text="" />
<spacer height="10" width="20" />
<!-- TODO: ok button? -->
<button id="cancel" I18N="When configuring input" text="Press ESC to cancel" align="center"/>
<spacer height="20" width="20" />
<spacer height="15" width="20" />
</div>

View File

@ -19,6 +19,50 @@
#include "guiengine/modaldialog.hpp"
#include "guiengine/widgets/text_box_widget.hpp"
#include <CGUIEditBox.h>
#include "utils/ptr_vector.hpp"
using namespace irr;
class MyCGUIEditBox : public gui::CGUIEditBox
{
PtrVector<GUIEngine::ITextBoxWidgetListener, REF> m_listeners;
public:
MyCGUIEditBox(const wchar_t* text, bool border, gui::IGUIEnvironment* environment,
gui:: IGUIElement* parent, s32 id, const core::rect<s32>& rectangle) :
CGUIEditBox(text, border, environment, parent, id, rectangle)
{
}
void addListener(GUIEngine::ITextBoxWidgetListener* listener)
{
m_listeners.push_back(listener);
}
void clearListeners()
{
m_listeners.clearWithoutDeleting();
}
virtual bool OnEvent(const SEvent& event)
{
bool out = CGUIEditBox::OnEvent(event);
if (event.EventType == EET_KEY_INPUT_EVENT && event.KeyInput.PressedDown)
{
for (int n=0; n<m_listeners.size(); n++)
{
m_listeners[n].onTextUpdated();
}
}
return out;
}
};
using namespace GUIEngine;
using namespace irr::core;
using namespace irr::gui;
@ -39,8 +83,13 @@ void TextBoxWidget::add()
// Don't call TextBoxWidget::getText(), which assumes that the irrlicht
// widget already exists.
const stringw& text = Widget::getText();
m_element = GUIEngine::getGUIEnv()->addEditBox(text.c_str(), widget_size,
true /* border */, m_parent, getNewID());
m_element = new MyCGUIEditBox(text.c_str(), true /* border */, GUIEngine::getGUIEnv(),
(m_parent ? m_parent : GUIEngine::getGUIEnv()->getRootGUIElement()),
getNewID(), widget_size);
//m_element = GUIEngine::getGUIEnv()->addEditBox(text.c_str(), widget_size,
// true /* border */, m_parent, getNewID());
m_id = m_element->getID();
m_element->setTabOrder(m_id);
m_element->setTabGroup(false);
@ -49,6 +98,20 @@ void TextBoxWidget::add()
// -----------------------------------------------------------------------------
void TextBoxWidget::addListener(ITextBoxWidgetListener* listener)
{
((MyCGUIEditBox*)m_element)->addListener(listener);
}
// -----------------------------------------------------------------------------
void TextBoxWidget::clearListeners()
{
((MyCGUIEditBox*)m_element)->clearListeners();
}
// -----------------------------------------------------------------------------
stringw TextBoxWidget::getText() const
{
const IGUIEditBox* textCtrl = Widget::getIrrlichtElement<IGUIEditBox>();

View File

@ -27,6 +27,13 @@
namespace GUIEngine
{
class ITextBoxWidgetListener
{
public:
virtual ~ITextBoxWidgetListener() {}
virtual void onTextUpdated() = 0;
};
/** \brief A text field widget.
* \ingroup widgets
*/
@ -53,6 +60,9 @@ namespace GUIEngine
virtual EventPropagation focused(const int playerID);
virtual void unfocused(const int playerID);
void addListener(ITextBoxWidgetListener* listener);
void clearListeners();
irr::core::stringw getText() const;
};
}

View File

@ -41,6 +41,8 @@ EnterPlayerNameDialog::EnterPlayerNameDialog(const float w, const float h) :
TextBoxWidget* textCtrl = getWidget<TextBoxWidget>("textfield");
assert(textCtrl != NULL);
textCtrl->setFocusForPlayer(PLAYER_ID_GAME_MASTER);
if (translations->isRTLLanguage()) textCtrl->addListener(this);
}
// -----------------------------------------------------------------------------
@ -50,6 +52,17 @@ EnterPlayerNameDialog::~EnterPlayerNameDialog()
// FIXME: what is this code for?
TextBoxWidget* textCtrl = getWidget<TextBoxWidget>("textfield");
textCtrl->getIrrlichtElement()->remove();
textCtrl->clearListeners();
}
// -----------------------------------------------------------------------------
void EnterPlayerNameDialog::onTextUpdated()
{
TextBoxWidget* textCtrl = getWidget<TextBoxWidget>("textfield");
LabelWidget* lbl = getWidget<LabelWidget>("preview");
lbl->setText( core::stringw(translations->fribidize(textCtrl->getText())), false );
}
// -----------------------------------------------------------------------------

View File

@ -20,6 +20,7 @@
#define HEADER_ENTERPLAYERNAME_DIALOG_HPP
#include "guiengine/modaldialog.hpp"
#include "guiengine/widgets/text_box_widget.hpp"
namespace GUIEngine
{
@ -32,7 +33,7 @@ namespace GUIEngine
* \brief Dialog that allows the player to enter the name for a new player
* \ingroup states_screens
*/
class EnterPlayerNameDialog : public GUIEngine::ModalDialog
class EnterPlayerNameDialog : public GUIEngine::ModalDialog, public GUIEngine::ITextBoxWidgetListener
{
public:
@ -44,6 +45,8 @@ public:
void onEnterPressedInternal();
GUIEngine::EventPropagation processEvent(const std::string& eventSource);
virtual void onTextUpdated();
};
#endif