1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

split massive handleCurrentEvent method into per-event parts

This commit is contained in:
Ivan Savenko 2023-05-17 17:16:09 +03:00
parent cb4cf224a9
commit 008a1ebec4
2 changed files with 178 additions and 127 deletions

View File

@ -295,19 +295,48 @@ void CGuiHandler::fakeMouseButtonEventRelativeMode(bool down, bool right)
void CGuiHandler::handleCurrentEvent( SDL_Event & current )
{
if(current.type == SDL_KEYDOWN || current.type == SDL_KEYUP)
switch (current.type)
{
SDL_KeyboardEvent key = current.key;
case SDL_KEYDOWN:
return handleEventKeyDown(current);
case SDL_KEYUP:
return handleEventKeyUp(current);
case SDL_MOUSEMOTION:
return handleEventMouseMotion(current);
case SDL_MOUSEBUTTONDOWN:
return handleEventMouseButtonDown(current);
case SDL_MOUSEWHEEL:
return handleEventMouseWheel(current);
case SDL_TEXTINPUT:
return handleEventTextInput(current);
case SDL_TEXTEDITING:
return handleEventTextEditing(current);
case SDL_MOUSEBUTTONUP:
return handleEventMouseButtonUp(current);
case SDL_FINGERMOTION:
return handleEventFingerMotion(current);
case SDL_FINGERDOWN:
return handleEventFingerDown(current);
case SDL_FINGERUP:
return handleEventFingerUp(current);
}
}
if (key.repeat != 0)
return; // ignore periodic event resends
void CGuiHandler::handleEventKeyDown(SDL_Event & current)
{
SDL_KeyboardEvent key = current.key;
if(current.type == SDL_KEYDOWN && key.keysym.sym >= SDLK_F1 && key.keysym.sym <= SDLK_F15 && settings["session"]["spectate"].Bool())
if(key.repeat != 0)
return; // ignore periodic event resends
assert(key.state == SDL_PRESSED);
if(current.type == SDL_KEYDOWN && key.keysym.sym >= SDLK_F1 && key.keysym.sym <= SDLK_F15 && settings["session"]["spectate"].Bool())
{
//TODO: we need some central place for all interface-independent hotkeys
Settings s = settings.write["session"];
switch(key.keysym.sym)
{
//TODO: we need some central place for all interface-independent hotkeys
Settings s = settings.write["session"];
switch(key.keysym.sym)
{
case SDLK_F5:
if(settings["session"]["spectate-locked-pim"].Bool())
LOCPLINT->pim->unlock();
@ -328,59 +357,63 @@ void CGuiHandler::handleCurrentEvent( SDL_Event & current )
s["spectate-skip-battle-result"].Bool() = !settings["session"]["spectate-skip-battle-result"].Bool();
break;
case SDLK_F9:
//not working yet since CClient::run remain locked after BattleInterface removal
// if(LOCPLINT->battleInt)
// {
// GH.windows().popInts(1);
// vstd::clear_pointer(LOCPLINT->battleInt);
// }
break;
default:
break;
}
return;
}
auto shortcutsVector = shortcutsHandler().translateKeycode(key.keysym.sym);
bool keysCaptured = false;
for(auto i = keyinterested.begin(); i != keyinterested.end() && continueEventHandling; i++)
{
for (EShortcut shortcut : shortcutsVector)
{
if((*i)->captureThisKey(shortcut))
{
keysCaptured = true;
break;
}
}
}
std::list<CIntObject*> miCopy = keyinterested;
for(auto i = miCopy.begin(); i != miCopy.end() && continueEventHandling; i++)
{
for (EShortcut shortcut : shortcutsVector)
{
if(vstd::contains(keyinterested,*i) && (!keysCaptured || (*i)->captureThisKey(shortcut)))
{
if (key.state == SDL_PRESSED)
(**i).keyPressed(shortcut);
if (key.state == SDL_RELEASED)
(**i).keyReleased(shortcut);
}
}
}
return;
}
else if(current.type == SDL_MOUSEMOTION)
auto shortcutsVector = shortcutsHandler().translateKeycode(key.keysym.sym);
bool keysCaptured = false;
for(auto i = keyinterested.begin(); i != keyinterested.end() && continueEventHandling; i++)
for(EShortcut shortcut : shortcutsVector)
if((*i)->captureThisKey(shortcut))
keysCaptured = true;
std::list<CIntObject *> miCopy = keyinterested;
for(auto i = miCopy.begin(); i != miCopy.end() && continueEventHandling; i++)
for(EShortcut shortcut : shortcutsVector)
if(vstd::contains(keyinterested, *i) && (!keysCaptured || (*i)->captureThisKey(shortcut)))
(**i).keyPressed(shortcut);
}
void CGuiHandler::handleEventKeyUp(SDL_Event & current)
{
SDL_KeyboardEvent key = current.key;
if(key.repeat != 0)
return; // ignore periodic event resends
assert(key.state == SDL_RELEASED);
auto shortcutsVector = shortcutsHandler().translateKeycode(key.keysym.sym);
bool keysCaptured = false;
for(auto i = keyinterested.begin(); i != keyinterested.end() && continueEventHandling; i++)
for(EShortcut shortcut : shortcutsVector)
if((*i)->captureThisKey(shortcut))
keysCaptured = true;
std::list<CIntObject *> miCopy = keyinterested;
for(auto i = miCopy.begin(); i != miCopy.end() && continueEventHandling; i++)
for(EShortcut shortcut : shortcutsVector)
if(vstd::contains(keyinterested, *i) && (!keysCaptured || (*i)->captureThisKey(shortcut)))
(**i).keyReleased(shortcut);
}
void CGuiHandler::handleEventMouseMotion(SDL_Event & current)
{
handleMouseMotion(current);
}
void CGuiHandler::handleEventMouseButtonDown(SDL_Event & current)
{
switch(current.button.button)
{
handleMouseMotion(current);
}
else if(current.type == SDL_MOUSEBUTTONDOWN)
{
switch(current.button.button)
{
case SDL_BUTTON_LEFT:
{
auto doubleClicked = false;
@ -414,40 +447,44 @@ void CGuiHandler::handleCurrentEvent( SDL_Event & current )
break;
default:
break;
}
}
else if(current.type == SDL_MOUSEWHEEL)
}
void CGuiHandler::handleEventMouseWheel(SDL_Event & current)
{
std::list<CIntObject*> hlp = wheelInterested;
for(auto i = hlp.begin(); i != hlp.end() && continueEventHandling; i++)
{
std::list<CIntObject*> hlp = wheelInterested;
for(auto i = hlp.begin(); i != hlp.end() && continueEventHandling; i++)
{
if(!vstd::contains(wheelInterested,*i)) continue;
// SDL doesn't have the proper values for mouse positions on SDL_MOUSEWHEEL, refetch them
int x = 0, y = 0;
SDL_GetMouseState(&x, &y);
(*i)->wheelScrolled(current.wheel.y < 0, (*i)->pos.isInside(x, y));
}
if(!vstd::contains(wheelInterested,*i)) continue;
// SDL doesn't have the proper values for mouse positions on SDL_MOUSEWHEEL, refetch them
int x = 0, y = 0;
SDL_GetMouseState(&x, &y);
(*i)->wheelScrolled(current.wheel.y < 0, (*i)->pos.isInside(x, y));
}
else if(current.type == SDL_TEXTINPUT)
}
void CGuiHandler::handleEventTextInput(SDL_Event & current)
{
for(auto it : textInterested)
{
for(auto it : textInterested)
{
it->textInputed(current.text.text);
}
it->textInputed(current.text.text);
}
else if(current.type == SDL_TEXTEDITING)
}
void CGuiHandler::handleEventTextEditing(SDL_Event & current)
{
for(auto it : textInterested)
{
for(auto it : textInterested)
{
it->textEdited(current.edit.text);
}
it->textEdited(current.edit.text);
}
else if(current.type == SDL_MOUSEBUTTONUP)
}
void CGuiHandler::handleEventMouseButtonUp(SDL_Event & current)
{
if(!multifinger)
{
if(!multifinger)
switch(current.button.button)
{
switch(current.button.button)
{
case SDL_BUTTON_LEFT:
handleMouseButtonClick(lclickable, MouseButton::LEFT, false);
break;
@ -457,66 +494,68 @@ void CGuiHandler::handleCurrentEvent( SDL_Event & current )
case SDL_BUTTON_MIDDLE:
handleMouseButtonClick(mclickable, MouseButton::MIDDLE, false);
break;
}
}
}
else if(current.type == SDL_FINGERMOTION)
}
void CGuiHandler::handleEventFingerMotion(SDL_Event & current)
{
if(isPointerRelativeMode)
{
if(isPointerRelativeMode)
fakeMoveCursor(current.tfinger.dx, current.tfinger.dy);
}
}
void CGuiHandler::handleEventFingerDown(SDL_Event & current)
{
auto fingerCount = SDL_GetNumTouchFingers(current.tfinger.touchId);
multifinger = fingerCount > 1;
if(isPointerRelativeMode)
{
if(current.tfinger.x > 0.5)
{
fakeMoveCursor(current.tfinger.dx, current.tfinger.dy);
bool isRightClick = current.tfinger.y < 0.5;
fakeMouseButtonEventRelativeMode(true, isRightClick);
}
}
else if(current.type == SDL_FINGERDOWN)
{
auto fingerCount = SDL_GetNumTouchFingers(current.tfinger.touchId);
multifinger = fingerCount > 1;
if(isPointerRelativeMode)
{
if(current.tfinger.x > 0.5)
{
bool isRightClick = current.tfinger.y < 0.5;
fakeMouseButtonEventRelativeMode(true, isRightClick);
}
}
#ifndef VCMI_IOS
else if(fingerCount == 2)
{
convertTouchToMouse(&current);
handleMouseMotion(current);
handleMouseButtonClick(rclickable, MouseButton::RIGHT, true);
}
else if(fingerCount == 2)
{
convertTouchToMouse(&current);
handleMouseMotion(current);
handleMouseButtonClick(rclickable, MouseButton::RIGHT, true);
}
#endif //VCMI_IOS
}
else if(current.type == SDL_FINGERUP)
{
}
void CGuiHandler::handleEventFingerUp(SDL_Event & current)
{
#ifndef VCMI_IOS
auto fingerCount = SDL_GetNumTouchFingers(current.tfinger.touchId);
auto fingerCount = SDL_GetNumTouchFingers(current.tfinger.touchId);
#endif //VCMI_IOS
if(isPointerRelativeMode)
if(isPointerRelativeMode)
{
if(current.tfinger.x > 0.5)
{
if(current.tfinger.x > 0.5)
{
bool isRightClick = current.tfinger.y < 0.5;
bool isRightClick = current.tfinger.y < 0.5;
fakeMouseButtonEventRelativeMode(false, isRightClick);
}
fakeMouseButtonEventRelativeMode(false, isRightClick);
}
#ifndef VCMI_IOS
else if(multifinger)
{
convertTouchToMouse(&current);
handleMouseMotion(current);
handleMouseButtonClick(rclickable, MouseButton::RIGHT, false);
multifinger = fingerCount != 0;
}
#endif //VCMI_IOS
}
} //event end
#ifndef VCMI_IOS
else if(multifinger)
{
convertTouchToMouse(&current);
handleMouseMotion(current);
handleMouseButtonClick(rclickable, MouseButton::RIGHT, false);
multifinger = fingerCount != 0;
}
#endif //VCMI_IOS
}
void CGuiHandler::handleMouseButtonClick(CIntObjectList & interestedObjs, MouseButton btn, bool isPressed)
{

View File

@ -91,6 +91,18 @@ private:
void fakeMoveCursor(float dx, float dy);
void fakeMouseButtonEventRelativeMode(bool down, bool right);
void handleEventKeyDown(SDL_Event & current);
void handleEventKeyUp(SDL_Event & current);
void handleEventMouseMotion(SDL_Event & current);
void handleEventMouseButtonDown(SDL_Event & current);
void handleEventMouseWheel(SDL_Event & current);
void handleEventTextInput(SDL_Event & current);
void handleEventTextEditing(SDL_Event & current);
void handleEventMouseButtonUp(SDL_Event & current);
void handleEventFingerMotion(SDL_Event & current);
void handleEventFingerDown(SDL_Event & current);
void handleEventFingerUp(SDL_Event & current);
public:
void handleElementActivate(CIntObject * elem, ui16 activityFlag);
void handleElementDeActivate(CIntObject * elem, ui16 activityFlag);