From c386d629667f5d2d122e1135fd5c5c832181e1f0 Mon Sep 17 00:00:00 2001 From: Quentin Bazin Date: Fri, 13 Mar 2020 23:08:57 +0100 Subject: [PATCH] Fixed #30 using gk::EventHandler. --- client/source/event/Events.hpp | 36 ++++++++++++++++++++++ client/source/hud/HUD.cpp | 7 +++++ client/source/hud/HUD.hpp | 3 ++ client/source/states/GameState.cpp | 9 ++++++ client/source/states/GameState.hpp | 4 +++ client/source/states/PauseMenuState.cpp | 16 ++++++++++ client/source/states/PauseMenuState.hpp | 5 +++ client/source/states/SettingsMenuState.cpp | 32 +++++++++++++++++-- client/source/states/SettingsMenuState.hpp | 8 +++++ client/source/states/TitleScreenState.cpp | 15 +++++++++ client/source/states/TitleScreenState.hpp | 6 ++++ 11 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 client/source/event/Events.hpp diff --git a/client/source/event/Events.hpp b/client/source/event/Events.hpp new file mode 100644 index 000000000..8d8aa245b --- /dev/null +++ b/client/source/event/Events.hpp @@ -0,0 +1,36 @@ +/* + * ===================================================================================== + * + * OpenMiner + * + * Copyright (C) 2018-2020 Unarelith, Quentin Bazin + * Copyright (C) 2019-2020 the OpenMiner contributors (see CONTRIBUTORS.md) + * + * This file is part of OpenMiner. + * + * OpenMiner is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * OpenMiner is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with OpenMiner; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * ===================================================================================== + */ +#ifndef EVENTS_HPP_ +#define EVENTS_HPP_ + +#include + +struct GuiScaleChangedEvent { + u8 guiScale; +}; + +#endif // EVENTS_HPP_ diff --git a/client/source/hud/HUD.cpp b/client/source/hud/HUD.cpp index 294717f49..8e8f0675a 100644 --- a/client/source/hud/HUD.cpp +++ b/client/source/hud/HUD.cpp @@ -31,6 +31,7 @@ #include "ClientCommandHandler.hpp" #include "ClientPlayer.hpp" #include "Config.hpp" +#include "Events.hpp" #include "HUD.hpp" HUD::HUD(ClientPlayer &player, ClientWorld &world, ClientCommandHandler &client) @@ -71,6 +72,12 @@ void HUD::onEvent(const SDL_Event &event) { m_blockCursor.onEvent(event, m_hotbar); } +void HUD::onGuiScaleChanged(const GuiScaleChangedEvent &event) { + setScale(event.guiScale, event.guiScale, 1); + + setup(); +} + void HUD::update() { // FIXME: Shouldn't be called every tick if (Config::isHotbarVisible) diff --git a/client/source/hud/HUD.hpp b/client/source/hud/HUD.hpp index d1c78d902..dcc82ec99 100644 --- a/client/source/hud/HUD.hpp +++ b/client/source/hud/HUD.hpp @@ -36,6 +36,8 @@ #include "DebugOverlay.hpp" #include "Hotbar.hpp" +class GuiScaleChangedEvent; + class HUD : public gk::Transformable, public gk::Drawable { public: HUD(ClientPlayer &player, ClientWorld &world, ClientCommandHandler &client); @@ -43,6 +45,7 @@ class HUD : public gk::Transformable, public gk::Drawable { void setup(); void onEvent(const SDL_Event &event); + void onGuiScaleChanged(const GuiScaleChangedEvent &event); void update(); diff --git a/client/source/states/GameState.cpp b/client/source/states/GameState.cpp index 4c3b2da56..000d8d97c 100644 --- a/client/source/states/GameState.cpp +++ b/client/source/states/GameState.cpp @@ -38,6 +38,7 @@ #include #include "ChatState.hpp" +#include "Events.hpp" #include "GameKey.hpp" #include "GameState.hpp" #include "LuaGUIState.hpp" @@ -61,6 +62,10 @@ GameState::GameState() m_world.setCamera(m_player.camera()); } +void GameState::init() { + m_eventHandler->addListener(&GameState::onGuiScaleChanged, this); +} + void GameState::connect(const std::string &host, int port) { m_client.connect(host, port); m_player.setClientID(m_client.id()); @@ -159,6 +164,10 @@ void GameState::initShaders() { m_shader.linkProgram(); } +void GameState::onGuiScaleChanged(const GuiScaleChangedEvent &event) { + m_hud.onGuiScaleChanged(event); +} + void GameState::draw(gk::RenderTarget &target, gk::RenderStates states) const { // FIXME: This uniform is not used anymore since water/leaves effects are disabled // gk::Shader::bind(&m_shader); diff --git a/client/source/states/GameState.hpp b/client/source/states/GameState.hpp index 2edeecd8e..52df5c93c 100644 --- a/client/source/states/GameState.hpp +++ b/client/source/states/GameState.hpp @@ -47,6 +47,8 @@ class GameState : public gk::ApplicationState { public: GameState(); + void init() override; + void connect(const std::string &host, int port); void onEvent(const SDL_Event &event) override; @@ -66,6 +68,8 @@ class GameState : public gk::ApplicationState { private: void initShaders(); + void onGuiScaleChanged(const GuiScaleChangedEvent &event); + void draw(gk::RenderTarget &target, gk::RenderStates states) const override; gk::Shader m_shader; diff --git a/client/source/states/PauseMenuState.cpp b/client/source/states/PauseMenuState.cpp index af0b84d7a..3e2ab9b14 100644 --- a/client/source/states/PauseMenuState.cpp +++ b/client/source/states/PauseMenuState.cpp @@ -27,10 +27,12 @@ #include #include +#include #include #include "Client.hpp" #include "Config.hpp" +#include "Events.hpp" #include "PauseMenuState.hpp" #include "SettingsMenuState.hpp" #include "TitleScreenState.hpp" @@ -69,6 +71,10 @@ PauseMenuState::PauseMenuState(Client &client, gk::ApplicationState *parent) }); } +void PauseMenuState::init() { + m_eventHandler->addListener(&PauseMenuState::onGuiScaleChanged, this); +} + void PauseMenuState::onEvent(const SDL_Event &event) { InterfaceState::onEvent(event); @@ -90,6 +96,16 @@ void PauseMenuState::onEvent(const SDL_Event &event) { } } +void PauseMenuState::onGuiScaleChanged(const GuiScaleChangedEvent &event) { + m_menuWidget.setScale(event.guiScale, event.guiScale); + + // FIXME: Ugly hack to get MenuWidget working, will change soon + SDL_Event e; + e.type = SDL_WINDOWEVENT; + e.window.event = SDL_WINDOWEVENT_SIZE_CHANGED; + m_menuWidget.onEvent(e); +} + void PauseMenuState::draw(gk::RenderTarget &target, gk::RenderStates states) const { if (m_parent) target.draw(*m_parent, states); diff --git a/client/source/states/PauseMenuState.hpp b/client/source/states/PauseMenuState.hpp index 3e9a7c887..0f293b0e9 100644 --- a/client/source/states/PauseMenuState.hpp +++ b/client/source/states/PauseMenuState.hpp @@ -33,14 +33,19 @@ #include "MenuWidget.hpp" class Client; +class GuiScaleChangedEvent; class PauseMenuState : public InterfaceState { public: PauseMenuState(Client &client, gk::ApplicationState *parent = nullptr); + void init() override; + void onEvent(const SDL_Event &event) override; private: + void onGuiScaleChanged(const GuiScaleChangedEvent &event); + void draw(gk::RenderTarget &target, gk::RenderStates states) const override; MenuWidget m_menuWidget{1, 4}; diff --git a/client/source/states/SettingsMenuState.cpp b/client/source/states/SettingsMenuState.cpp index e68ede330..3ff2548be 100644 --- a/client/source/states/SettingsMenuState.cpp +++ b/client/source/states/SettingsMenuState.cpp @@ -32,30 +32,37 @@ #include #include #include +#include #include #include "Config.hpp" +#include "Events.hpp" #include "SettingsMenuState.hpp" #include "World.hpp" SettingsMenuState::SettingsMenuState(gk::ApplicationState *parent) : InterfaceState(parent) { m_menuWidget.setScale(Config::guiScale, Config::guiScale, 1); - m_doneButton.setPosition(Config::screenWidth / 2.0f - m_doneButton.getGlobalBounds().sizeX * Config::guiScale / 2.0f, Config::screenHeight - 291); m_doneButton.setScale(Config::guiScale, Config::guiScale, 1); m_doneButton.setText("Done"); m_doneButton.setCallback([this] (TextButton &) { doneButtonAction(); }); + updateDoneButtonPosition(); + addMainButtons(); } +void SettingsMenuState::init() { + m_eventHandler->addListener(&SettingsMenuState::onGuiScaleChanged, this); +} + void SettingsMenuState::onEvent(const SDL_Event &event) { InterfaceState::onEvent(event); if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { - m_doneButton.setPosition(Config::screenWidth / 2.0f - m_doneButton.getGlobalBounds().sizeX / 2.0f, Config::screenHeight - 291); + updateDoneButtonPosition(); if (&m_stateStack->top() != this) m_menuWidget.onEvent(event); @@ -78,6 +85,23 @@ void SettingsMenuState::onEvent(const SDL_Event &event) { } } +void SettingsMenuState::onGuiScaleChanged(const GuiScaleChangedEvent &event) { + m_menuWidget.setScale(event.guiScale, event.guiScale); + m_doneButton.setScale(event.guiScale, event.guiScale); + + updateDoneButtonPosition(); + + // FIXME: Ugly hack to get MenuWidget working, will change soon + SDL_Event e; + e.type = SDL_WINDOWEVENT; + e.window.event = SDL_WINDOWEVENT_SIZE_CHANGED; + m_menuWidget.onEvent(e); +} + +void SettingsMenuState::updateDoneButtonPosition() { + m_doneButton.setPosition(Config::screenWidth / 2.0f - m_doneButton.getGlobalBounds().sizeX / 2.0f, Config::screenHeight * 0.75); +} + void SettingsMenuState::doneButtonAction() { if (m_state != MenuState::Main) { m_state = MenuState::Main; @@ -142,9 +166,11 @@ void SettingsMenuState::addGraphicsButtons() { addToggleButton("Sun Smooth Lighting", Config::isSunSmoothLightingEnabled, true); addToggleButton("Ambient Occlusion", Config::isAmbientOcclusionEnabled, false); - m_menuWidget.addButton("GUI Scale: " + std::to_string(Config::guiScale), [] (TextButton &button) { + m_menuWidget.addButton("GUI Scale: " + std::to_string(Config::guiScale), [this] (TextButton &button) { Config::guiScale = 1 + (Config::guiScale + 1) % 3; button.setText("GUI Scale: " + std::to_string(Config::guiScale)); + + m_eventHandler->emplaceEvent(Config::guiScale); }); addToggleButton("Fullscreen", Config::isFullscreenModeEnabled, false); diff --git a/client/source/states/SettingsMenuState.hpp b/client/source/states/SettingsMenuState.hpp index 54e4e463f..ef418162e 100644 --- a/client/source/states/SettingsMenuState.hpp +++ b/client/source/states/SettingsMenuState.hpp @@ -33,13 +33,21 @@ #include "InterfaceState.hpp" #include "MenuWidget.hpp" +class GuiScaleChangedEvent; + class SettingsMenuState : public InterfaceState { public: SettingsMenuState(gk::ApplicationState *parent = nullptr); + void init() override; + void onEvent(const SDL_Event &event) override; private: + void onGuiScaleChanged(const GuiScaleChangedEvent &event); + + void updateDoneButtonPosition(); + void doneButtonAction(); void addMainButtons(); diff --git a/client/source/states/TitleScreenState.cpp b/client/source/states/TitleScreenState.cpp index 951ee8ee7..a727f0da1 100644 --- a/client/source/states/TitleScreenState.cpp +++ b/client/source/states/TitleScreenState.cpp @@ -27,6 +27,7 @@ #include #include "Config.hpp" +#include "Events.hpp" #include "GameState.hpp" #include "ServerConnectState.hpp" #include "ServerLoadingState.hpp" @@ -68,6 +69,10 @@ void TitleScreenState::centerBackground() { m_background.setPosition(Config::screenWidth / 2.0 - m_background.width() / 2.0, Config::screenHeight / 2.0 - m_background.height() / 2.0); } +void TitleScreenState::init() { + m_eventHandler->addListener(&TitleScreenState::onGuiScaleChanged, this); +} + void TitleScreenState::onEvent(const SDL_Event &event) { InterfaceState::onEvent(event); @@ -107,6 +112,16 @@ void TitleScreenState::startMultiplayer(const std::string &host) { m_stateStack->push(game, false, this); } +void TitleScreenState::onGuiScaleChanged(const GuiScaleChangedEvent &event) { + m_menuWidget.setScale(event.guiScale, event.guiScale); + + // FIXME: Ugly hack to get MenuWidget working, will change soon + SDL_Event e; + e.type = SDL_WINDOWEVENT; + e.window.event = SDL_WINDOWEVENT_SIZE_CHANGED; + m_menuWidget.onEvent(e); +} + void TitleScreenState::draw(gk::RenderTarget &target, gk::RenderStates states) const { prepareDraw(target, states); diff --git a/client/source/states/TitleScreenState.hpp b/client/source/states/TitleScreenState.hpp index b34577d39..276f7991d 100644 --- a/client/source/states/TitleScreenState.hpp +++ b/client/source/states/TitleScreenState.hpp @@ -32,6 +32,8 @@ #include "InterfaceState.hpp" #include "MenuWidget.hpp" +class GuiScaleChangedEvent; + class TitleScreenState : public InterfaceState { public: TitleScreenState(u16 port = 4242); @@ -39,6 +41,8 @@ class TitleScreenState : public InterfaceState { void centerBackground(); + void init() override; + void onEvent(const SDL_Event &event) override; void update() override; @@ -47,6 +51,8 @@ class TitleScreenState : public InterfaceState { void startMultiplayer(const std::string &host); private: + void onGuiScaleChanged(const GuiScaleChangedEvent &event); + void draw(gk::RenderTarget &target, gk::RenderStates states) const override; MenuWidget m_menuWidget{1, 3};