Files
Cubed/src/ui/world_ui_manager.cpp
zhenyan121 2fd9f0b854 refactor(ui): decouple ChatBox from image dependencies, allow custom TextField backgrounds
TextField's background is now a generic `Widget` pointer, enabling use of any widget (e.g., `Rect`, `Image`) as background. `ChatBox` no longer creates its own `TextField`; it accepts one via `set_text_field`. Removed `set_d_image` and `set_default_image` in favor of `set_background`. Added a shared default image constant in `default_image.hpp`. Updated `host_game_ui.cpp`, `join_game_ui.cpp`, and `world_ui_manager.cpp` to construct backgrounds accordingly.
2026-07-19 20:15:21 +08:00

82 lines
2.7 KiB
C++

#include "Cubed/ui/world_ui_manager.hpp"
#include "Cubed/app.hpp"
#include "Cubed/debug_collector.hpp"
#include "Cubed/gameplay/client_world.hpp"
#include "Cubed/render/renderer.hpp"
#include "Cubed/scene/scene_manager.hpp"
#include "Cubed/scene/world_scene.hpp"
#include "Cubed/ui/chat_box.hpp"
namespace Cubed {
WorldUIManager::WorldUIManager(WorldScene& scene) : m_scene(scene) {}
WorldUIManager::~WorldUIManager() {}
void WorldUIManager::init() {
m_root_widget = std::make_unique<Widget>(nullptr);
auto& renderer = m_scene.scene_manager().app().renderer();
m_root_widget->set_window_size(renderer.window_width(),
renderer.window_height());
auto& crosshair = m_root_widget->add_child<Image>();
crosshair.set_image("texture/ui/0.png",
m_scene.scene_manager().app().texture_manager());
crosshair.set_window_size(renderer.window_width(),
renderer.window_height());
crosshair.set_anchor(Anchor::CENTER);
crosshair.set_scale(3.0f);
m_widgets.try_emplace("crosshair", &crosshair);
auto& chat_box = m_root_widget->add_child<ChatBox>();
auto text_field = std::make_unique<TextField>(&chat_box);
text_field->set_anchor(Anchor::BOTTOM_LEFT);
auto rect = std::make_unique<Rect>(text_field.get());
rect->set_color(Color::GRAY).set_alpha(0.6f).set_fill(true);
text_field->set_background(std::move(rect))
.set_app(&m_scene.scene_manager().app())
.set_fill_width(true)
.set_visible(false);
chat_box.set_text_field(std::move(text_field));
chat_box.set_spacing(15);
chat_box.set_anchor(Anchor::BOTTOM_LEFT);
chat_box.set_offset({0, -10});
chat_box.set_width(200);
chat_box.set_scale(2.0f);
chat_box.set_text_scale(0.6f);
chat_box.set_on_finish([this, &chat_box]() {
ChatMessage message{m_scene.client_world().get_player().get_name(),
std::move(chat_box.get_input_text()), 0};
chat_box.clear_input();
m_scene.client_world().send_chat_message(message);
});
m_chat_box = &chat_box;
}
void WorldUIManager::render(Renderer& renderer) {
renderer.begin_render_ui();
auto& widget = DebugCollector::get().get_widget();
widget.render(renderer);
m_root_widget->render(renderer);
renderer.end_render_ui();
}
void WorldUIManager::set_chatting(bool chantting, bool send) {
m_chat_box->set_typing(chantting, send);
}
void WorldUIManager::add_chat_message(ChatMessage& message) {
m_chat_box->add_message(message);
}
bool WorldUIManager::handle_key_event(const KeyEvent& e) {
return UIManager::handle_key_event(e);
}
} // namespace Cubed