/
yaseeeeechka
/
CenterControl
Обзор
Документация
Войти
/
yaseeeeechka
/
CenterControl
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
CenterControl_TCP/include/client/AuthScreen.h
216 строк
8 KB
Yaroslava
New structure of Repo. TCP impl
11 дек 2025, 21:12
11 дек 2025, 21:12
6fdf9d7
Код
Авторство
О чём код?
#ifndef AUTHSCREEN_H #define AUTHSCREEN_H #include "IScreen.h" #include "Session.h" // ==================== AuthScreen ======================================= class AuthScreen : public IScreen { public: AuthScreen(Session *session, IScreenApp *app, const sf::Font &font) : session_(session), app_(app), form_(font), btn_login_txt_(font, "Login", 20), btn_reg_txt_(font, "Register", 20), font_(font), message_txt_(font, "", 16), title_txt_(font, "Welcome back", 28), subtitle_txt_(font, "Sign in to continue", 16) { // --- Базовая палитра для экрана авторизации --- btn_primary_color_ = sf::Color(90, 140, 255); btn_primary_hover_color_ = sf::Color(110, 170, 255); btn_secondary_color_ = sf::Color(60, 65, 90); btn_secondary_hover_color_= sf::Color(80, 90, 120); auto winSize = app_->GetWindow().getSize(); const float panelWidth = 460.f; const float panelHeight = 360.f; sf::Vector2f panelPos( (winSize.x - panelWidth) / 2.f, (winSize.y - panelHeight) / 2.f ); // --- Тень под карточкой --- panel_shadow_.setSize({panelWidth, panelHeight}); panel_shadow_.setFillColor(sf::Color(0, 0, 0, 120)); panel_shadow_.setPosition(panelPos + sf::Vector2f(6.f, 6.f)); // --- Карточка авторизации --- bg_.setSize({panelWidth, panelHeight}); bg_.setFillColor(sf::Color(20, 20, 35, 240)); bg_.setOutlineThickness(1.f); bg_.setOutlineColor(sf::Color(80, 120, 200)); bg_.setPosition(panelPos); // --- Заголовок и подзаголовок --- title_txt_.setFillColor(sf::Color(230, 230, 245)); title_txt_.setPosition({panelPos.x + 32.f, panelPos.y + 24.f}); subtitle_txt_.setFillColor(sf::Color(160, 165, 190)); subtitle_txt_.setPosition({panelPos.x + 32.f, panelPos.y + 64.f}); // --- Поля ввода --- float fieldX = panelPos.x + 40.f; float loginY = panelPos.y + 110.f; float passY = loginY + 60.f; form_.AddField("Login", fieldX, loginY); form_.AddField("Password", fieldX, passY); // --- Сообщение об ошибке / статусе --- message_txt_.setFillColor(sf::Color(220, 80, 80)); message_txt_.setPosition({fieldX, passY + 40.f}); // --- Кнопки --- float btnWidth = 160.f; float btnHeight = 44.f; float btnY = panelPos.y + panelHeight - 70.f; btn_login_.setSize({btnWidth, btnHeight}); btn_login_.setPosition({fieldX, btnY}); btn_login_.setFillColor(btn_primary_color_); btn_login_.setOutlineThickness(0.f); btn_reg_.setSize({btnWidth, btnHeight}); btn_reg_.setPosition({fieldX + btnWidth + 20.f, btnY}); btn_reg_.setFillColor(btn_secondary_color_); btn_reg_.setOutlineThickness(0.f); btn_login_txt_.setFillColor(sf::Color::White); btn_reg_txt_.setFillColor(sf::Color::White); CenterTextInButton(btn_login_txt_, btn_login_); CenterTextInButton(btn_reg_txt_, btn_reg_); // --- Callback результата авторизации/регистрации --- if (session_) { session_->SetAuthResultCallback([this](bool ok, const std::string &msg) { if (ok) { message_txt_.setString(msg); message_txt_.setFillColor(sf::Color(90, 200, 140)); app_->SwitchScreen("main"); } else { message_txt_.setString(msg); message_txt_.setFillColor(sf::Color(220, 80, 80)); } }); } } void HandleEvent(const sf::Event &e) override { form_.HandleEvent(e, app_->GetWindow()); if (e.is<sf::Event::MouseMoved>()) { auto m = sf::Mouse::getPosition(app_->GetWindow()); UpdateButtonHover({m.x, m.y}); } if (e.is<sf::Event::MouseButtonPressed>()) { auto m = sf::Mouse::getPosition(app_->GetWindow()); UpdateButtonHover({m.x, m.y}); if (btn_login_.getGlobalBounds().contains({(float)m.x, (float)m.y})) { OnLoginPressed(); } else if (btn_reg_.getGlobalBounds().contains({(float)m.x, (float)m.y})) { OnRegisterPressed(); } } } void Render(sf::RenderWindow &w) override { // Затемненный фон можно добавить снаружи, если нужен, // здесь рисуем тень + карточку + содержимое w.draw(panel_shadow_); w.draw(bg_); w.draw(title_txt_); w.draw(subtitle_txt_); form_.Draw(w); w.draw(btn_login_); w.draw(btn_login_txt_); w.draw(btn_reg_); w.draw(btn_reg_txt_); w.draw(message_txt_); }; Session *GetSession() const { return session_; } private: Session *session_; IScreenApp *app_; InputForm form_; sf::RectangleShape panel_shadow_; sf::RectangleShape bg_; sf::RectangleShape btn_login_; sf::RectangleShape btn_reg_; sf::Text btn_login_txt_; sf::Text btn_reg_txt_; sf::Font font_; sf::Text message_txt_; sf::Text title_txt_; sf::Text subtitle_txt_; // Цвета кнопок sf::Color btn_primary_color_; sf::Color btn_primary_hover_color_; sf::Color btn_secondary_color_; sf::Color btn_secondary_hover_color_; void OnLoginPressed() { auto login = form_.GetFieldValue("Login"); auto pass = form_.GetFieldValue("Password"); if (!login.empty() && !pass.empty()) { session_->SendAuthData(login, pass); } else { message_txt_.setString("Please enter both login and password"); message_txt_.setFillColor(sf::Color(220, 80, 80)); } } void OnRegisterPressed() { auto login = form_.GetFieldValue("Login"); auto pass = form_.GetFieldValue("Password"); if (!login.empty() && !pass.empty()) { session_->SendRegisterData(login, pass); } else { message_txt_.setString("Please enter both login and password"); message_txt_.setFillColor(sf::Color(220, 80, 80)); } } void UpdateButtonHover(const sf::Vector2i &mousePos) { bool overLogin = btn_login_.getGlobalBounds().contains({ static_cast<float>(mousePos.x), static_cast<float>(mousePos.y) }); bool overReg = btn_reg_.getGlobalBounds().contains({ static_cast<float>(mousePos.x), static_cast<float>(mousePos.y) }); btn_login_.setFillColor(overLogin ? btn_primary_hover_color_ : btn_primary_color_); btn_reg_.setFillColor (overReg ? btn_secondary_hover_color_: btn_secondary_color_); } void CenterTextInButton(sf::Text &txt, const sf::RectangleShape &btn) { // Локальные границы текста (в его собственной системе координат) sf::FloatRect bounds = txt.getLocalBounds(); sf::Vector2f btnPos = btn.getPosition(); sf::Vector2f btnSize = btn.getSize(); sf::Vector2f textPos; textPos.x = btnPos.x + (btnSize.x - bounds.size.x) / 2.f - bounds.position.x; textPos.y = btnPos.y + (btnSize.y - bounds.size.y) / 2.f - bounds.position.y; txt.setPosition(textPos); } }; #endif //AUTHSCREEN_H