mirror of
https://github.com/edubart/otclient.git
synced 2025-10-17 04:53:27 +02:00
implement auto repeat configuration for key press events, to give more flexibility
This commit is contained in:
@@ -37,8 +37,8 @@ struct InputEvent {
|
||||
mouseButton = Fw::MouseNoButton;
|
||||
keyCode = Fw::KeyUnknown;
|
||||
keyText = "";
|
||||
autoRepeatTicks = 0;
|
||||
mouseMoved = Point();
|
||||
wouldFilter = false;
|
||||
};
|
||||
|
||||
Fw::InputEventType type;
|
||||
@@ -49,7 +49,7 @@ struct InputEvent {
|
||||
int keyboardModifiers;
|
||||
Point mousePos;
|
||||
Point mouseMoved;
|
||||
bool wouldFilter;
|
||||
int autoRepeatTicks;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@@ -101,6 +101,7 @@ void Application::registerLuaFunctions()
|
||||
g_lua.bindClassMemberFunction<UIWidget>("setPhantom", &UIWidget::setPhantom);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("setFixedSize", &UIWidget::setFixedSize);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("setLastFocusReason", &UIWidget::setLastFocusReason);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("setAutoRepeatDelay", &UIWidget::setAutoRepeatDelay);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("isVisible", &UIWidget::isVisible);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("isChildLocked", &UIWidget::isChildLocked);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("hasChild", &UIWidget::hasChild);
|
||||
@@ -154,6 +155,7 @@ void Application::registerLuaFunctions()
|
||||
g_lua.bindClassMemberFunction<UIWidget>("getStyle", &UIWidget::getStyle);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("getChildCount", &UIWidget::getChildCount);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("getLastFocusReason", &UIWidget::getLastFocusReason);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("getAutoRepeatDelay", &UIWidget::getAutoRepeatDelay);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("getStyleName", &UIWidget::getStyleName);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("setX", &UIWidget::setX);
|
||||
g_lua.bindClassMemberFunction<UIWidget>("setY", &UIWidget::setY);
|
||||
|
@@ -58,7 +58,7 @@ void PlatformWindow::processKeyDown(Fw::Key keyCode)
|
||||
else if(keyCode == Fw::KeyShift)
|
||||
m_inputEvent.keyboardModifiers |= Fw::KeyboardShiftModifier;
|
||||
|
||||
m_inputEvent.reset();
|
||||
m_inputEvent.reset(Fw::KeyDownInputEvent);
|
||||
m_inputEvent.type = Fw::KeyDownInputEvent;
|
||||
m_inputEvent.keyCode = keyCode;
|
||||
|
||||
@@ -126,7 +126,7 @@ void PlatformWindow::fireKeysPress()
|
||||
if(m_onInputEvent) {
|
||||
m_inputEvent.reset(Fw::KeyPressInputEvent);
|
||||
m_inputEvent.keyCode = keyCode;
|
||||
m_inputEvent.wouldFilter = g_clock.ticksElapsed(firstKeyPress) < KEY_PRESS_REPEAT_DELAY;
|
||||
m_inputEvent.autoRepeatTicks = g_clock.ticksElapsed(firstKeyPress);
|
||||
m_onInputEvent(m_inputEvent);
|
||||
}
|
||||
m_lastKeysPress[keyCode] = g_clock.ticks();
|
||||
|
@@ -31,7 +31,6 @@ class PlatformWindow
|
||||
{
|
||||
enum {
|
||||
KEY_PRESS_REPEAT_INTERVAL = 30,
|
||||
KEY_PRESS_REPEAT_DELAY = 500
|
||||
};
|
||||
|
||||
typedef std::function<void(const Size&)> OnResizeCallback;
|
||||
|
@@ -429,36 +429,33 @@ void UILineEdit::onFocusChange(bool focused, Fw::FocusReason reason)
|
||||
UIWidget::onFocusChange(focused, reason);
|
||||
}
|
||||
|
||||
bool UILineEdit::onKeyPress(uchar keyCode, int keyboardModifiers, bool wouldFilter)
|
||||
bool UILineEdit::onKeyPress(uchar keyCode, int keyboardModifiers, int autoRepeatTicks)
|
||||
{
|
||||
if(UIWidget::onKeyPress(keyCode, keyboardModifiers, wouldFilter))
|
||||
if(UIWidget::onKeyPress(keyCode, keyboardModifiers, autoRepeatTicks))
|
||||
return true;
|
||||
|
||||
if(!wouldFilter) {
|
||||
if(keyCode == Fw::KeyDelete) // erase right character
|
||||
removeCharacter(true);
|
||||
else if(keyCode == Fw::KeyBackspace) // erase left character {
|
||||
removeCharacter(false);
|
||||
else if(keyCode == Fw::KeyRight) // move cursor right
|
||||
moveCursor(true);
|
||||
else if(keyCode == Fw::KeyLeft) // move cursor left
|
||||
moveCursor(false);
|
||||
else if(keyCode == Fw::KeyHome) // move cursor to first character
|
||||
setCursorPos(0);
|
||||
else if(keyCode == Fw::KeyEnd) // move cursor to last character
|
||||
setCursorPos(m_text.length());
|
||||
else if(keyCode == Fw::KeyV && keyboardModifiers == Fw::KeyboardCtrlModifier)
|
||||
appendText(g_window.getClipboardText());
|
||||
else if(keyCode == Fw::KeyTab) {
|
||||
if(!m_alwaysActive) {
|
||||
if(UIWidgetPtr parent = getParent())
|
||||
parent->focusNextChild(Fw::KeyboardFocusReason);
|
||||
}
|
||||
} else
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
if(keyCode == Fw::KeyDelete) // erase right character
|
||||
removeCharacter(true);
|
||||
else if(keyCode == Fw::KeyBackspace) // erase left character {
|
||||
removeCharacter(false);
|
||||
else if(keyCode == Fw::KeyRight) // move cursor right
|
||||
moveCursor(true);
|
||||
else if(keyCode == Fw::KeyLeft) // move cursor left
|
||||
moveCursor(false);
|
||||
else if(keyCode == Fw::KeyHome) // move cursor to first character
|
||||
setCursorPos(0);
|
||||
else if(keyCode == Fw::KeyEnd) // move cursor to last character
|
||||
setCursorPos(m_text.length());
|
||||
else if(keyCode == Fw::KeyV && keyboardModifiers == Fw::KeyboardCtrlModifier)
|
||||
appendText(g_window.getClipboardText());
|
||||
else if(keyCode == Fw::KeyTab) {
|
||||
if(!m_alwaysActive) {
|
||||
if(UIWidgetPtr parent = getParent())
|
||||
parent->focusNextChild(Fw::KeyboardFocusReason);
|
||||
}
|
||||
} else
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool UILineEdit::onKeyText(const std::string& keyText)
|
||||
|
@@ -63,7 +63,7 @@ protected:
|
||||
virtual void onGeometryChange(const Rect& oldRect, const Rect& newRect);
|
||||
virtual void onFocusChange(bool focused, Fw::FocusReason reason);
|
||||
virtual bool onKeyText(const std::string& keyText);
|
||||
virtual bool onKeyPress(uchar keyCode, int keyboardModifiers, bool wouldFilter);
|
||||
virtual bool onKeyPress(uchar keyCode, int keyboardModifiers, int autoRepeatTicks);
|
||||
virtual bool onMousePress(const Point& mousePos, Fw::MouseButton button);
|
||||
|
||||
private:
|
||||
|
@@ -69,7 +69,7 @@ void UIManager::inputEvent(const InputEvent& event)
|
||||
m_keyboardReceiver->propagateOnKeyDown(event.keyCode, event.keyboardModifiers);
|
||||
break;
|
||||
case Fw::KeyPressInputEvent:
|
||||
m_keyboardReceiver->propagateOnKeyPress(event.keyCode, event.keyboardModifiers, event.wouldFilter);
|
||||
m_keyboardReceiver->propagateOnKeyPress(event.keyCode, event.keyboardModifiers, event.autoRepeatTicks);
|
||||
break;
|
||||
case Fw::KeyUpInputEvent:
|
||||
m_keyboardReceiver->propagateOnKeyUp(event.keyCode, event.keyboardModifiers);
|
||||
|
@@ -36,6 +36,7 @@ UIWidget::UIWidget()
|
||||
m_lastFocusReason = Fw::ActiveFocusReason;
|
||||
m_states = Fw::DefaultState;
|
||||
m_clickTimer.stop();
|
||||
m_autoRepeatDelay = 500;
|
||||
|
||||
initBaseStyle();
|
||||
initText();
|
||||
@@ -1152,9 +1153,9 @@ bool UIWidget::onKeyDown(uchar keyCode, int keyboardModifiers)
|
||||
return callLuaField<bool>("onKeyDown", keyCode, keyboardModifiers);
|
||||
}
|
||||
|
||||
bool UIWidget::onKeyPress(uchar keyCode, int keyboardModifiers, bool wouldFilter)
|
||||
bool UIWidget::onKeyPress(uchar keyCode, int keyboardModifiers, int autoRepeatTicks)
|
||||
{
|
||||
return callLuaField<bool>("onKeyPress", keyCode, keyboardModifiers, wouldFilter);
|
||||
return callLuaField<bool>("onKeyPress", keyCode, keyboardModifiers, autoRepeatTicks);
|
||||
}
|
||||
|
||||
bool UIWidget::onKeyUp(uchar keyCode, int keyboardModifiers)
|
||||
@@ -1260,7 +1261,7 @@ bool UIWidget::propagateOnKeyDown(uchar keyCode, int keyboardModifiers)
|
||||
return onKeyDown(keyCode, keyboardModifiers);
|
||||
}
|
||||
|
||||
bool UIWidget::propagateOnKeyPress(uchar keyCode, int keyboardModifiers, bool wouldFilter)
|
||||
bool UIWidget::propagateOnKeyPress(uchar keyCode, int keyboardModifiers, int autoRepeatTicks)
|
||||
{
|
||||
// do a backup of children list, because it may change while looping it
|
||||
UIWidgetList children;
|
||||
@@ -1275,11 +1276,14 @@ bool UIWidget::propagateOnKeyPress(uchar keyCode, int keyboardModifiers, bool wo
|
||||
}
|
||||
|
||||
for(const UIWidgetPtr& child : children) {
|
||||
if(child->propagateOnKeyPress(keyCode, keyboardModifiers, wouldFilter))
|
||||
if(child->propagateOnKeyPress(keyCode, keyboardModifiers, autoRepeatTicks))
|
||||
return true;
|
||||
}
|
||||
|
||||
return onKeyPress(keyCode, keyboardModifiers, wouldFilter);
|
||||
if(autoRepeatTicks == 0 || autoRepeatTicks >= m_autoRepeatDelay) {
|
||||
return onKeyPress(keyCode, keyboardModifiers, autoRepeatTicks);
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
|
||||
bool UIWidget::propagateOnKeyUp(uchar keyCode, int keyboardModifiers)
|
||||
|
@@ -124,6 +124,7 @@ public:
|
||||
void setDragable(bool dragable);
|
||||
void setFixedSize(bool fixed);
|
||||
void setLastFocusReason(Fw::FocusReason reason);
|
||||
void setAutoRepeatDelay(int delay) { m_autoRepeatDelay = delay; }
|
||||
|
||||
bool isVisible();
|
||||
bool isChildLocked(const UIWidgetPtr& child);
|
||||
@@ -177,7 +178,7 @@ protected:
|
||||
virtual void onDrop(UIWidgetPtr draggedWidget, const Point& mousePos);
|
||||
virtual bool onKeyText(const std::string& keyText);
|
||||
virtual bool onKeyDown(uchar keyCode, int keyboardModifiers);
|
||||
virtual bool onKeyPress(uchar keyCode, int keyboardModifiers, bool wouldFilter);
|
||||
virtual bool onKeyPress(uchar keyCode, int keyboardModifiers, int autoRepeatTicks);
|
||||
virtual bool onKeyUp(uchar keyCode, int keyboardModifiers);
|
||||
virtual bool onMousePress(const Point& mousePos, Fw::MouseButton button);
|
||||
virtual bool onMouseRelease(const Point& mousePos, Fw::MouseButton button);
|
||||
@@ -188,7 +189,7 @@ protected:
|
||||
|
||||
bool propagateOnKeyText(const std::string& keyText);
|
||||
bool propagateOnKeyDown(uchar keyCode, int keyboardModifiers);
|
||||
bool propagateOnKeyPress(uchar keyCode, int keyboardModifiers, bool wouldFilter);
|
||||
bool propagateOnKeyPress(uchar keyCode, int keyboardModifiers, int autoRepeatTicks);
|
||||
bool propagateOnKeyUp(uchar keyCode, int keyboardModifiers);
|
||||
bool propagateOnMousePress(const Point& mousePos, Fw::MouseButton button);
|
||||
bool propagateOnMouseRelease(const Point& mousePos, Fw::MouseButton button);
|
||||
@@ -240,6 +241,7 @@ public:
|
||||
OTMLNodePtr getStyle() { return m_style; }
|
||||
int getChildCount() { return m_children.size(); }
|
||||
Fw::FocusReason getLastFocusReason() { return m_lastFocusReason; }
|
||||
int getAutoRepeatDelay() { return m_autoRepeatDelay; }
|
||||
std::string getStyleName() { return m_style->tag(); }
|
||||
|
||||
|
||||
@@ -264,6 +266,7 @@ protected:
|
||||
EdgeGroup<int> m_margin;
|
||||
EdgeGroup<int> m_padding;
|
||||
float m_opacity;
|
||||
int m_autoRepeatDelay;
|
||||
|
||||
public:
|
||||
void setX(int x) { move(x, getY()); }
|
||||
|
@@ -25,9 +25,9 @@
|
||||
#include <framework/ui/uilineedit.h>
|
||||
#include <framework/platform/platformwindow.h>
|
||||
|
||||
bool UIGame::onKeyPress(uchar keyCode, int keyboardModifiers, bool wouldFilter)
|
||||
bool UIGame::onKeyPress(uchar keyCode, int keyboardModifiers, int autoRepeatTicks)
|
||||
{
|
||||
if(UIWidget::onKeyPress(keyCode, keyboardModifiers, wouldFilter))
|
||||
if(UIWidget::onKeyPress(keyCode, keyboardModifiers, autoRepeatTicks))
|
||||
return true;
|
||||
|
||||
UILineEditPtr chatLineEdit = std::dynamic_pointer_cast<UILineEdit>(getParent()->recursiveGetChildById("consoleLineEdit"));
|
||||
@@ -58,8 +58,6 @@ bool UIGame::onKeyPress(uchar keyCode, int keyboardModifiers, bool wouldFilter)
|
||||
} else if(keyCode == Fw::KeyNumpad7) {
|
||||
g_game.walk(Otc::NorthWest);
|
||||
return true;
|
||||
} else if(wouldFilter) {
|
||||
return false;
|
||||
} else if(keyCode == Fw::KeyDelete) {
|
||||
chatLineEdit->removeCharacter(true);
|
||||
return true;
|
||||
|
@@ -29,7 +29,7 @@
|
||||
class UIGame : public UIWidget
|
||||
{
|
||||
protected:
|
||||
bool onKeyPress(uchar keyCode, int keyboardModifiers, bool wouldFilter);
|
||||
bool onKeyPress(uchar keyCode, int keyboardModifiers, int autoRepeatTicks);
|
||||
bool onKeyText(const std::string& keyText);
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user