mirror of
https://github.com/zhenyan121/Cubed.git
synced 2026-08-09 02:07:04 +08:00
feat(ui): add button enable/disable and reset on re-enter
Prevent double-clicking on buttons that push new scenes by disabling them on click and re-enabling when the UI manager's on_re_enter is called.
This commit is contained in:
@@ -31,7 +31,7 @@ public:
|
||||
Button& set_text(const std::string& text);
|
||||
|
||||
Button& set_auto_scale(bool auto_scale);
|
||||
|
||||
Button& set_enable(bool enable);
|
||||
float scale() const;
|
||||
template <typename F> Button& set_clicked(F&& f) {
|
||||
m_clicked = std::forward<F>(f);
|
||||
@@ -49,6 +49,7 @@ private:
|
||||
std::unique_ptr<Image> m_background;
|
||||
std::unique_ptr<Label> m_foreground;
|
||||
bool m_hovered = false;
|
||||
bool m_enable = true;
|
||||
float m_width = NORMAL_BUTTON_WIDTH;
|
||||
float m_height = NORMAL_BUTTON_HEIGHT;
|
||||
float m_scale = DEFAULT_SCALE;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include "Cubed/ui/button.hpp"
|
||||
#include "Cubed/ui/ui_manager.hpp"
|
||||
|
||||
namespace Cubed {
|
||||
@@ -15,8 +16,10 @@ public:
|
||||
~MainMenuUIManager();
|
||||
|
||||
void init() override;
|
||||
void on_re_enter();
|
||||
|
||||
private:
|
||||
MainMenuScene& m_scene;
|
||||
std::vector<Button*> m_pending_enable;
|
||||
};
|
||||
} // namespace Cubed
|
||||
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include "Cubed/ui/button.hpp"
|
||||
#include "Cubed/ui/ui_manager.hpp"
|
||||
namespace Cubed {
|
||||
class WorldScene;
|
||||
@@ -11,8 +12,10 @@ public:
|
||||
PauseMenuUIManager& operator=(PauseMenuUIManager&&) = delete;
|
||||
PauseMenuUIManager(WorldScene& scene);
|
||||
void init() override;
|
||||
void on_re_enter();
|
||||
|
||||
private:
|
||||
WorldScene& m_scene;
|
||||
std::vector<Button*> m_pending_enable;
|
||||
};
|
||||
} // namespace Cubed
|
||||
@@ -21,6 +21,7 @@ bool MainMenuScene::handle_event(const Event& e) {
|
||||
void MainMenuScene::on_enter() { m_ui_manager.init(); }
|
||||
void MainMenuScene::on_leave() {}
|
||||
void MainMenuScene::on_re_enter() {
|
||||
m_ui_manager.on_re_enter();
|
||||
auto width = m_scene_manager.app().renderer().window_width();
|
||||
auto height = m_scene_manager.app().renderer().window_height();
|
||||
|
||||
|
||||
@@ -131,6 +131,7 @@ void WorldScene::on_leave() {
|
||||
}
|
||||
|
||||
void WorldScene::on_re_enter() {
|
||||
m_pasue_menu.on_re_enter();
|
||||
m_client_world.reload_config();
|
||||
auto width = m_scene_manager.app().renderer().window_width();
|
||||
auto height = m_scene_manager.app().renderer().window_height();
|
||||
|
||||
@@ -28,11 +28,13 @@ void Button::on_render(Renderer& renderer) {
|
||||
}
|
||||
|
||||
bool Button::handle_mouse_move_event(const MouseMoveEvent& e) {
|
||||
auto p = pos();
|
||||
if (e.xpos >= p.x && e.xpos <= p.x + width() && e.ypos >= p.y &&
|
||||
e.ypos <= p.y + height()) {
|
||||
m_hovered = true;
|
||||
return true;
|
||||
if (m_enable) {
|
||||
auto p = pos();
|
||||
if (e.xpos >= p.x && e.xpos <= p.x + width() && e.ypos >= p.y &&
|
||||
e.ypos <= p.y + height()) {
|
||||
m_hovered = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
m_hovered = false;
|
||||
|
||||
@@ -40,7 +42,7 @@ bool Button::handle_mouse_move_event(const MouseMoveEvent& e) {
|
||||
}
|
||||
bool Button::handle_mouse_button_event(const MouseButtonEvent& e) {
|
||||
if (e.action == KeyAction::PRESS && e.key == MouseKey::LEFT_BUTTON) {
|
||||
if (m_hovered && m_clicked) {
|
||||
if (m_hovered && m_clicked && m_enable) {
|
||||
m_clicked();
|
||||
|
||||
return true;
|
||||
@@ -91,7 +93,10 @@ Button& Button::set_auto_scale(bool auto_scale) {
|
||||
m_auto_scale = auto_scale;
|
||||
return *this;
|
||||
}
|
||||
|
||||
Button& Button::set_enable(bool enable) {
|
||||
m_enable = enable;
|
||||
return *this;
|
||||
}
|
||||
void Button::update_text_scale() {
|
||||
if (!m_auto_scale) {
|
||||
m_foreground->set_scale(TEXT_SCALE);
|
||||
|
||||
@@ -33,18 +33,22 @@ void MainMenuUIManager::init() {
|
||||
start_game_button.set_background_image("texture/ui/button001.png",
|
||||
texture_manager);
|
||||
start_game_button.set_text("Start Game");
|
||||
start_game_button.set_clicked([this]() {
|
||||
start_game_button.set_clicked([this, &start_game_button]() {
|
||||
start_game_button.set_enable(false);
|
||||
m_scene.scene_manager().request_push(SceneType::WORLD);
|
||||
});
|
||||
m_pending_enable.emplace_back(&start_game_button);
|
||||
}
|
||||
|
||||
{
|
||||
auto& button = layout.add_child<Button>();
|
||||
button.set_default_image(texture_manager);
|
||||
button.set_text("Settings");
|
||||
button.set_clicked([this]() {
|
||||
button.set_clicked([this, &button]() {
|
||||
button.set_enable(false);
|
||||
m_scene.scene_manager().request_push(SceneType::SETTINGS);
|
||||
});
|
||||
m_pending_enable.emplace_back(&button);
|
||||
}
|
||||
|
||||
{
|
||||
@@ -53,9 +57,11 @@ void MainMenuUIManager::init() {
|
||||
button.set_background_image("texture/ui/button001.png",
|
||||
texture_manager);
|
||||
button.set_text("Credits");
|
||||
button.set_clicked([this]() {
|
||||
button.set_clicked([this, &button]() {
|
||||
button.set_enable(false);
|
||||
m_scene.scene_manager().request_push(SceneType::CREDITS);
|
||||
});
|
||||
m_pending_enable.emplace_back(&button);
|
||||
}
|
||||
{
|
||||
auto& exit_game = layout.add_child<Button>();
|
||||
@@ -87,4 +93,10 @@ void MainMenuUIManager::init() {
|
||||
m_root_widget = std::move(image);
|
||||
}
|
||||
|
||||
void MainMenuUIManager::on_re_enter() {
|
||||
for (Button* b : m_pending_enable) {
|
||||
b->set_enable(true);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Cubed
|
||||
@@ -32,9 +32,11 @@ void PauseMenuUIManager::init() {
|
||||
auto& button = layout.add_child<Button>();
|
||||
button.set_default_image(texture_manager);
|
||||
button.set_text("Settings");
|
||||
button.set_clicked([this]() {
|
||||
button.set_clicked([this, &button]() {
|
||||
button.set_enable(false);
|
||||
m_scene.scene_manager().request_push(SceneType::SETTINGS);
|
||||
});
|
||||
m_pending_enable.emplace_back(&button);
|
||||
}
|
||||
|
||||
{
|
||||
@@ -43,11 +45,18 @@ void PauseMenuUIManager::init() {
|
||||
back_main.set_background_image("texture/ui/button001.png",
|
||||
texture_manager);
|
||||
back_main.set_text("Return to Menu");
|
||||
back_main.set_clicked(
|
||||
[this]() { m_scene.scene_manager().request_pop(); });
|
||||
back_main.set_clicked([this, &back_main]() {
|
||||
back_main.set_enable(false);
|
||||
m_scene.scene_manager().request_pop();
|
||||
});
|
||||
m_pending_enable.emplace_back(&back_main);
|
||||
}
|
||||
|
||||
m_root_widget = std::move(rect);
|
||||
}
|
||||
|
||||
void PauseMenuUIManager::on_re_enter() {
|
||||
for (Button* b : m_pending_enable) {
|
||||
b->set_enable(true);
|
||||
}
|
||||
}
|
||||
} // namespace Cubed
|
||||
Reference in New Issue
Block a user