Files
Blitz2/src/client/states/JoinServerState.cpp
2024-08-07 11:54:09 +02:00

98 lines
3.1 KiB
C++

#include <Nazara/Network/Enums.hpp>
#include <Nazara/Network/IpAddress.hpp>
#include <client/states/ConnectingState.h>
#include <client/states/JoinServerState.h>
#include <Nazara/Core/StateMachine.hpp>
#include <Nazara/TextRenderer.hpp>
namespace blitz {
namespace client {
JoinServerState::JoinServerState(std::shared_ptr<StateData> a_StateData, std::shared_ptr<AbstractState> a_PreviousState) :
AbstractState(std::move(a_StateData)), m_PreviousState(std::move(a_PreviousState)) {
Nz::SimpleTextDrawer textDrawer;
textDrawer.SetTextColor({0.0, 0.0, 0.0, 1.0});
textDrawer.SetCharacterSize(75);
m_InputAddress = CreateWidget<Nz::TextAreaWidget>();
m_InputAddress->SetBackgroundColor(Nz::Color::White());
m_InputAddress->EnableBackground(true);
m_InputAddress->EnableMultiline(false);
m_InputAddress->SetTextColor(Nz::Color::Black());
m_InputAddress->SetText("localhost");
m_JoinServerButton = CreateWidget<Nz::ButtonWidget>();
textDrawer.SetText("Join Server");
m_JoinServerButton->UpdateText(textDrawer);
m_JoinServerButton->Resize(m_JoinServerButton->GetPreferredSize());
m_JoinServerButton->OnButtonTrigger.Connect([this](const Nz::ButtonWidget*) { OnJoinServerPressed(); });
m_BackButton = CreateWidget<Nz::ButtonWidget>();
textDrawer.SetText("Back");
m_BackButton->UpdateText(textDrawer);
m_BackButton->Resize(m_BackButton->GetPreferredSize());
m_BackButton->OnButtonTrigger.Connect([this](const Nz::ButtonWidget*) { OnBackPressed(); });
}
JoinServerState::~JoinServerState() {}
bool JoinServerState::Update(Nz::StateMachine& fsm, Nz::Time /*elapsedTime*/) {
if (m_NextState)
fsm.ChangeState(std::move(m_NextState));
return true;
}
void JoinServerState::LayoutWidgets() {
Nz::Vector2f canvasSize = GetStateData().m_Canvas->GetSize();
Nz::Vector2f center = canvasSize / 2.f;
constexpr float padding = 10.f;
std::array<Nz::BaseWidget*, 3> widgets = {m_InputAddress, m_JoinServerButton, m_BackButton};
float maxWidth = 0.f;
float totalSize = padding * (widgets.size() - 1);
for (Nz::BaseWidget* widget : widgets) {
Nz::Vector2f size = widget->GetSize();
maxWidth = std::max(maxWidth, size.x);
totalSize += size.y;
}
Nz::Vector2f cursor = center;
cursor.y += totalSize / 2.f;
for (Nz::BaseWidget* widget : widgets) {
widget->Resize({maxWidth, widget->GetHeight()});
widget->SetPosition({0.f, cursor.y - widget->GetSize().y, 0.f});
widget->CenterHorizontal();
cursor.y -= widget->GetSize().y + padding;
}
}
void JoinServerState::OnJoinServerPressed() {
std::string address = m_InputAddress->GetText();
auto separator = address.find(':');
std::string name = address.substr(0, separator);
std::uint16_t port = 25565;
if (separator != std::string::npos) {
try {
std::string rawPort = address.substr(separator + 1, std::string::npos);
port = std::stoi(rawPort);
} catch (std::exception& e) {
return;
}
}
m_NextState = std::make_shared<ConnectingState>(GetStateDataPtr(), shared_from_this(), name, port, false);
}
void JoinServerState::OnBackPressed() {
m_NextState = std::move(m_PreviousState);
}
} // namespace client
} // namespace blitz