mirror of
https://github.com/zhenyan121/Cubed.git
synced 2026-08-09 02:07:04 +08:00
refactor(ui): centralize item info label in inventory and add update
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "Cubed/ui/item_slot.hpp"
|
||||
#include "Cubed/ui/label.hpp"
|
||||
#include "Cubed/ui/ui_manager.hpp"
|
||||
namespace Cubed {
|
||||
class WorldScene;
|
||||
@@ -9,8 +11,12 @@ public:
|
||||
|
||||
void init() override;
|
||||
void on_re_enter();
|
||||
void update(float dt) override;
|
||||
|
||||
private:
|
||||
WorldScene& m_scene;
|
||||
std::vector<ItemSlot*> m_slots;
|
||||
Label* m_item_info = nullptr;
|
||||
void update_item_info();
|
||||
};
|
||||
} // namespace Cubed
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
#include "Cubed/gameplay/block.hpp"
|
||||
#include "Cubed/ui/image.hpp"
|
||||
#include "Cubed/ui/label.hpp"
|
||||
#include "Cubed/ui/widget.hpp"
|
||||
namespace Cubed {
|
||||
class TextureManager;
|
||||
@@ -17,16 +16,16 @@ public:
|
||||
ItemSlot& set_item(BlockType id, const Texture* texture);
|
||||
float width() const override;
|
||||
float height() const override;
|
||||
bool handle_mouse_move_event(const MouseMoveEvent& e) override;
|
||||
BlockType block() const;
|
||||
bool hovered() const;
|
||||
|
||||
private:
|
||||
static constexpr const char* DEFAULT_SLOT_PATH = "texture/ui/slot.png";
|
||||
void on_render(Renderer& renderer) override;
|
||||
void on_update(float dt) override;
|
||||
bool handle_mouse_move_event(const MouseMoveEvent& e) override;
|
||||
bool handle_window_resize_event(const WindowResizeEvent& e) override;
|
||||
std::unique_ptr<Image> m_background;
|
||||
std::unique_ptr<Image> m_foreground;
|
||||
std::unique_ptr<Label> m_label;
|
||||
BlockType m_block_type;
|
||||
float m_scale = 1.0f;
|
||||
bool m_hovered = false;
|
||||
|
||||
@@ -34,10 +34,38 @@ void InventoryUI::init() {
|
||||
slot.set_default_background(texture_manager);
|
||||
slot.set_scale(5.0f);
|
||||
slot.set_item(i, block_textures[i].get());
|
||||
m_slots.emplace_back(&slot);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
auto& label = back->add_child<Label>();
|
||||
auto rect = std::make_unique<Rect>(&label);
|
||||
rect->set_fill_parent(true);
|
||||
rect->set_color(Color::BLACK);
|
||||
label.set_background(std::move(rect));
|
||||
label.set_anchor(Anchor::FOLLOW_MOUSE);
|
||||
label.set_scale(0.8f);
|
||||
label.set_visible(false);
|
||||
label.set_offset({20, -20});
|
||||
m_item_info = &label;
|
||||
}
|
||||
m_root_widget = std::move(back);
|
||||
}
|
||||
void InventoryUI::on_re_enter() {}
|
||||
void InventoryUI::update(float dt) {
|
||||
UIManager::update(dt);
|
||||
update_item_info();
|
||||
}
|
||||
|
||||
void InventoryUI::update_item_info() {
|
||||
for (auto& slot : m_slots) {
|
||||
if (slot->hovered()) {
|
||||
m_item_info->set_text(BlockManager::name_form_id(slot->block()))
|
||||
.set_visible(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
m_item_info->set_visible(false);
|
||||
}
|
||||
|
||||
} // namespace Cubed
|
||||
@@ -8,10 +8,6 @@ ItemSlot::ItemSlot(Widget* parent) : Widget(parent) {
|
||||
m_foreground->set_texture(nullptr, false).set_fill_parent(true);
|
||||
Widget::set_width(DEFAULT_WIDTH);
|
||||
Widget::set_height(DEFAULT_HEIGHT);
|
||||
m_label = std::make_unique<Label>(this);
|
||||
m_label->set_scale(0.6f);
|
||||
m_label->set_anchor(Anchor::FOLLOW_MOUSE);
|
||||
m_label->set_visible(false);
|
||||
}
|
||||
|
||||
ItemSlot& ItemSlot::set_default_background(TextureManager& texture_manager) {
|
||||
@@ -26,7 +22,6 @@ ItemSlot& ItemSlot::set_scale(float scale) {
|
||||
ItemSlot& ItemSlot::set_item(BlockType id, const Texture* texture) {
|
||||
m_foreground->set_texture(texture, false);
|
||||
m_block_type = id;
|
||||
m_label->set_text(BlockManager::name_form_id(id));
|
||||
return *this;
|
||||
}
|
||||
float ItemSlot::width() const {
|
||||
@@ -50,9 +45,6 @@ void ItemSlot::on_render(Renderer& renderer) {
|
||||
if (m_foreground) {
|
||||
m_foreground->render(renderer);
|
||||
}
|
||||
if (m_label) {
|
||||
m_label->render(renderer);
|
||||
}
|
||||
}
|
||||
void ItemSlot::on_update(float dt) {
|
||||
|
||||
@@ -62,9 +54,6 @@ void ItemSlot::on_update(float dt) {
|
||||
if (m_foreground) {
|
||||
m_foreground->update(dt);
|
||||
}
|
||||
if (m_label) {
|
||||
m_label->update(dt);
|
||||
}
|
||||
Widget::on_update(dt);
|
||||
}
|
||||
|
||||
@@ -73,15 +62,11 @@ bool ItemSlot::handle_mouse_move_event(const MouseMoveEvent& e) {
|
||||
if (e.xpos >= p.x && e.xpos <= p.x + width() && e.ypos >= p.y &&
|
||||
e.ypos <= p.y + height()) {
|
||||
m_hovered = true;
|
||||
m_label->set_visible(true);
|
||||
|
||||
} else {
|
||||
m_hovered = false;
|
||||
m_label->set_visible(false);
|
||||
}
|
||||
|
||||
if (m_label && m_label->handle_mouse_move_event(e)) {
|
||||
return true;
|
||||
}
|
||||
if (m_foreground && m_foreground->handle_mouse_move_event(e)) {
|
||||
return true;
|
||||
}
|
||||
@@ -91,15 +76,7 @@ bool ItemSlot::handle_mouse_move_event(const MouseMoveEvent& e) {
|
||||
|
||||
return Widget::handle_mouse_move_event(e);
|
||||
}
|
||||
bool ItemSlot::handle_window_resize_event(const WindowResizeEvent& e) {
|
||||
if (m_label && m_label->handle_window_resize_event(e)) {
|
||||
}
|
||||
if (m_foreground && m_foreground->handle_window_resize_event(e)) {
|
||||
}
|
||||
if (m_background && m_background->handle_window_resize_event(e)) {
|
||||
}
|
||||
|
||||
return Widget::handle_window_resize_event(e);
|
||||
}
|
||||
|
||||
BlockType ItemSlot::block() const { return m_block_type; }
|
||||
bool ItemSlot::hovered() const { return m_hovered; }
|
||||
} // namespace Cubed
|
||||
Reference in New Issue
Block a user