1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-11-28 08:48:48 +02:00

Merge pull request #3051 from Laserlicht/name_change

possibility to change name in lobby
This commit is contained in:
Nordsoft91 2023-10-16 22:28:31 +02:00 committed by GitHub
commit 1ffc246c8b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 130 additions and 5 deletions

View File

@ -465,6 +465,14 @@ void CServerHandler::setPlayer(PlayerColor color) const
sendLobbyPack(lsp);
}
void CServerHandler::setPlayerName(PlayerColor color, const std::string & name) const
{
LobbySetPlayerName lspn;
lspn.color = color;
lspn.name = name;
sendLobbyPack(lspn);
}
void CServerHandler::setPlayerOption(ui8 what, int32_t value, PlayerColor player) const
{
LobbyChangePlayerOption lcpo;

View File

@ -67,6 +67,7 @@ public:
virtual void setCampaignBonus(int bonusId) const = 0;
virtual void setMapInfo(std::shared_ptr<CMapInfo> to, std::shared_ptr<CMapGenOptions> mapGenOpts = {}) const = 0;
virtual void setPlayer(PlayerColor color) const = 0;
virtual void setPlayerName(PlayerColor color, const std::string & name) const = 0;
virtual void setPlayerOption(ui8 what, int32_t value, PlayerColor player) const = 0;
virtual void setDifficulty(int to) const = 0;
virtual void setTurnTimerInfo(const TurnTimerInfo &) const = 0;
@ -152,6 +153,7 @@ public:
void setCampaignBonus(int bonusId) const override;
void setMapInfo(std::shared_ptr<CMapInfo> to, std::shared_ptr<CMapGenOptions> mapGenOpts = {}) const override;
void setPlayer(PlayerColor color) const override;
void setPlayerName(PlayerColor color, const std::string & name) const override;
void setPlayerOption(ui8 what, int32_t value, PlayerColor player) const override;
void setDifficulty(int to) const override;
void setTurnTimerInfo(const TurnTimerInfo &) const override;

View File

@ -1041,9 +1041,11 @@ void OptionsTab::SelectedBox::scrollBy(int distance)
}
OptionsTab::PlayerOptionsEntry::PlayerOptionsEntry(const PlayerSettings & S, const OptionsTab & parent)
: pi(std::make_unique<PlayerInfo>(SEL->getPlayerInfo(S.color)))
: CIntObject(LCLICK | KEYBOARD | TEXTINPUT)
, pi(std::make_unique<PlayerInfo>(SEL->getPlayerInfo(S.color)))
, s(std::make_unique<PlayerSettings>(S))
, parentTab(parent)
, name(S.name)
{
OBJ_CONSTRUCTION;
defActions |= SHARE_POS;
@ -1081,7 +1083,13 @@ OptionsTab::PlayerOptionsEntry::PlayerOptionsEntry(const PlayerSettings & S, con
}};
background = std::make_shared<CPicture>(ImagePath::builtin(bgs[s->color]), 0, 0);
labelPlayerName = std::make_shared<CLabel>(55, 10, EFonts::FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, s->name);
if(s->isControlledByAI() || CSH->isGuest())
labelPlayerName = std::make_shared<CLabel>(55, 10, EFonts::FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, name);
else
{
labelPlayerNameEdit = std::make_shared<CTextInput>(Rect(6, 3, 95, 15), EFonts::FONT_SMALL, nullptr, false);
labelPlayerNameEdit->setText(name);
}
labelWhoCanPlay = std::make_shared<CMultiLineLabel>(Rect(6, 23, 45, (int)graphics->fonts[EFonts::FONT_TINY]->getLineHeight()*2), EFonts::FONT_TINY, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->arraytxt[206 + whoCanPlay]);
if(SEL->screenType == ESelectionScreen::newGame)
@ -1115,6 +1123,43 @@ OptionsTab::PlayerOptionsEntry::PlayerOptionsEntry(const PlayerSettings & S, con
bonus = std::make_shared<SelectedBox>(Point(271, 2), *s, BONUS);
}
bool OptionsTab::PlayerOptionsEntry::captureThisKey(EShortcut key)
{
return labelPlayerNameEdit && labelPlayerNameEdit->hasFocus() && key == EShortcut::GLOBAL_ACCEPT;
}
void OptionsTab::PlayerOptionsEntry::keyPressed(EShortcut key)
{
if(labelPlayerNameEdit && key == EShortcut::GLOBAL_ACCEPT)
updateName();
}
bool OptionsTab::PlayerOptionsEntry::receiveEvent(const Point & position, int eventType) const
{
return eventType == AEventsReceiver::LCLICK; // capture all left clicks (not only within control)
}
void OptionsTab::PlayerOptionsEntry::clickReleased(const Point & cursorPosition)
{
if(labelPlayerNameEdit && !labelPlayerNameEdit->pos.isInside(cursorPosition))
updateName();
}
void OptionsTab::PlayerOptionsEntry::updateName() {
if(labelPlayerNameEdit->getText() != name)
{
CSH->setPlayerName(s->color, labelPlayerNameEdit->getText());
if(CSH->isMyColor(s->color))
{
Settings set = settings.write["general"]["playerName"];
set->String() = labelPlayerNameEdit->getText();
}
}
labelPlayerNameEdit->removeFocus();
name = labelPlayerNameEdit->getText();
}
void OptionsTab::onSetPlayerClicked(const PlayerSettings & ps) const
{
if(ps.isControlledByAI() || humanPlayers > 0)

View File

@ -167,9 +167,11 @@ private:
struct PlayerOptionsEntry : public CIntObject
{
std::string name;
std::unique_ptr<PlayerInfo> pi;
std::unique_ptr<PlayerSettings> s;
std::shared_ptr<CLabel> labelPlayerName;
std::shared_ptr<CTextInput> labelPlayerNameEdit;
std::shared_ptr<CMultiLineLabel> labelWhoCanPlay;
std::shared_ptr<CPicture> background;
std::shared_ptr<CButton> buttonTownLeft;
@ -186,8 +188,14 @@ private:
PlayerOptionsEntry(const PlayerSettings & S, const OptionsTab & parentTab);
void hideUnavailableButtons();
bool captureThisKey(EShortcut key) override;
void keyPressed(EShortcut key) override;
void clickReleased(const Point & cursorPosition) override;
bool receiveEvent(const Point & position, int eventType) const override;
private:
const OptionsTab & parentTab;
void updateName();
};
};

View File

@ -532,7 +532,7 @@ Point CGStatusBar::getBorderSize()
return Point();
}
CTextInput::CTextInput(const Rect & Pos, EFonts font, const CFunctionList<void(const std::string &)> & CB)
CTextInput::CTextInput(const Rect & Pos, EFonts font, const CFunctionList<void(const std::string &)> & CB, bool giveFocusToInput)
: CLabel(Pos.x, Pos.y, font, ETextAlignment::CENTER),
cb(CB),
CFocusable(std::make_shared<CKeyboardFocusListener>(this))
@ -544,7 +544,8 @@ CTextInput::CTextInput(const Rect & Pos, EFonts font, const CFunctionList<void(c
addUsedEvents(LCLICK | SHOW_POPUP | KEYBOARD | TEXTINPUT);
#if !defined(VCMI_MOBILE)
giveFocus();
if(giveFocusToInput)
giveFocus();
#endif
}
@ -805,3 +806,15 @@ void CFocusable::moveFocus()
}
}
}
void CFocusable::removeFocus()
{
if(this == inputWithFocus)
{
focus = false;
focusListener->focusLost();
redraw();
inputWithFocus = nullptr;
}
}

View File

@ -184,6 +184,7 @@ public:
void giveFocus(); //captures focus
void moveFocus(); //moves focus to next active control (may be used for tab switching)
void removeFocus(); //remove focus
bool hasFocus() const;
static std::list<CFocusable *> focusables; //all existing objs
@ -224,7 +225,7 @@ public:
void setText(const std::string & nText, bool callCb);
void setHelpText(const std::string &);
CTextInput(const Rect & Pos, EFonts font, const CFunctionList<void(const std::string &)> & CB);
CTextInput(const Rect & Pos, EFonts font, const CFunctionList<void(const std::string &)> & CB, bool giveFocusToInput = true);
CTextInput(const Rect & Pos, const Point & bgOffset, const ImagePath & bgName, const CFunctionList<void(const std::string &)> & CB);
CTextInput(const Rect & Pos, std::shared_ptr<IImage> srf);

View File

@ -159,6 +159,7 @@ public:
virtual void visitLobbySetCampaignBonus(LobbySetCampaignBonus & pack) {}
virtual void visitLobbyChangePlayerOption(LobbyChangePlayerOption & pack) {}
virtual void visitLobbySetPlayer(LobbySetPlayer & pack) {}
virtual void visitLobbySetPlayerName(LobbySetPlayerName & pack) {}
virtual void visitLobbySetSimturns(LobbySetSimturns & pack) {}
virtual void visitLobbySetTurnTime(LobbySetTurnTime & pack) {}
virtual void visitLobbySetDifficulty(LobbySetDifficulty & pack) {}

View File

@ -755,6 +755,11 @@ void LobbySetPlayer::visitTyped(ICPackVisitor & visitor)
visitor.visitLobbySetPlayer(*this);
}
void LobbySetPlayerName::visitTyped(ICPackVisitor & visitor)
{
visitor.visitLobbySetPlayerName(*this);
}
void LobbySetSimturns::visitTyped(ICPackVisitor & visitor)
{
visitor.visitLobbySetSimturns(*this);

View File

@ -250,6 +250,20 @@ struct DLL_LINKAGE LobbySetPlayer : public CLobbyPackToServer
}
};
struct DLL_LINKAGE LobbySetPlayerName : public CLobbyPackToServer
{
PlayerColor color = PlayerColor::CANNOT_DETERMINE;
std::string name = "";
virtual void visitTyped(ICPackVisitor & visitor) override;
template <typename Handler> void serialize(Handler &h, const int version)
{
h & color;
h & name;
}
};
struct DLL_LINKAGE LobbySetSimturns : public CLobbyPackToServer
{
SimturnsInfo simturnsInfo;

View File

@ -399,6 +399,7 @@ void registerTypesLobbyPacks(Serializer &s)
s.template registerType<CLobbyPackToServer, LobbySetCampaignMap>();
s.template registerType<CLobbyPackToServer, LobbySetCampaignBonus>();
s.template registerType<CLobbyPackToServer, LobbySetPlayer>();
s.template registerType<CLobbyPackToServer, LobbySetPlayerName>();
s.template registerType<CLobbyPackToServer, LobbySetTurnTime>();
s.template registerType<CLobbyPackToServer, LobbySetSimturns>();
s.template registerType<CLobbyPackToServer, LobbySetDifficulty>();

View File

@ -835,6 +835,25 @@ void CVCMIServer::setPlayer(PlayerColor clickedColor)
}
}
void CVCMIServer::setPlayerName(PlayerColor color, std::string name)
{
if(color == PlayerColor::CANNOT_DETERMINE)
return;
PlayerSettings & player = si->playerInfos.at(color);
if(!player.isControlledByHuman())
return;
if(player.connectedPlayerIDs.empty())
return;
int nameID = *(player.connectedPlayerIDs.begin()); //if not AI - set appropiate ID
playerNames[nameID].name = name;
setPlayerConnectedId(player, nameID);
}
void CVCMIServer::optionNextCastle(PlayerColor player, int dir)
{
PlayerSettings & s = si->playerInfos[player];

View File

@ -107,6 +107,7 @@ public:
// Work with LobbyInfo
void setPlayer(PlayerColor clickedColor);
void setPlayerName(PlayerColor player, std::string name);
void optionNextHero(PlayerColor player, int dir); //dir == -1 or +1
void optionSetHero(PlayerColor player, HeroTypeID id);
HeroTypeID nextAllowedHero(PlayerColor player, HeroTypeID id, int direction);

View File

@ -86,6 +86,7 @@ public:
virtual void visitLobbyChangeHost(LobbyChangeHost & pack) override;
virtual void visitLobbyChangePlayerOption(LobbyChangePlayerOption & pack) override;
virtual void visitLobbySetPlayer(LobbySetPlayer & pack) override;
virtual void visitLobbySetPlayerName(LobbySetPlayerName & pack) override;
virtual void visitLobbySetTurnTime(LobbySetTurnTime & pack) override;
virtual void visitLobbySetSimturns(LobbySetSimturns & pack) override;
virtual void visitLobbySetDifficulty(LobbySetDifficulty & pack) override;

View File

@ -397,6 +397,12 @@ void ApplyOnServerNetPackVisitor::visitLobbySetPlayer(LobbySetPlayer & pack)
result = true;
}
void ApplyOnServerNetPackVisitor::visitLobbySetPlayerName(LobbySetPlayerName & pack)
{
srv.setPlayerName(pack.color, pack.name);
result = true;
}
void ApplyOnServerNetPackVisitor::visitLobbySetSimturns(LobbySetSimturns & pack)
{
srv.si->simturnsInfo = pack.simturnsInfo;