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:
parent
88a4f51f62
commit
0a18005a05
@ -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>
|
||||
|
||||
|
@ -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>();
|
||||
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
@ -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 );
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user