diff --git a/include/Cubed/scene/world_scene.hpp b/include/Cubed/scene/world_scene.hpp index f789a76..6878d4b 100644 --- a/include/Cubed/scene/world_scene.hpp +++ b/include/Cubed/scene/world_scene.hpp @@ -6,6 +6,7 @@ #include "Cubed/gameplay/network_server.hpp" #include "Cubed/scene/scene.hpp" #include "Cubed/ui/error_ui.hpp" +#include "Cubed/ui/inventory_ui.hpp" #include "Cubed/ui/pasue_menu_ui_manager.hpp" #include "Cubed/ui/world_ui_manager.hpp" namespace Cubed { @@ -42,6 +43,7 @@ public: bool is_recording() const; private: + enum class PauseUI { PAUSE_MENU, INVENTORY }; SceneManager& m_scene_manager; DevPanel m_dev_panel; Camera m_camera; @@ -53,6 +55,8 @@ private: bool m_show_dev_pannel = true; bool m_chatting = false; PauseMenuUIManager m_pasue_menu; + InventoryUI m_inventory_ui; + PauseUI m_paused_ui = PauseUI::PAUSE_MENU; WorldUIManager m_hud_ui; ErrorUI m_error_ui; const Argument& m_argument; diff --git a/include/Cubed/ui/inventory_ui.hpp b/include/Cubed/ui/inventory_ui.hpp new file mode 100644 index 0000000..b8ed945 --- /dev/null +++ b/include/Cubed/ui/inventory_ui.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "Cubed/ui/ui_manager.hpp" +namespace Cubed { +class WorldScene; +class InventoryUI : public UIManager { +public: + InventoryUI(WorldScene& m_scene); + + void init() override; + void on_re_enter(); + +private: + WorldScene& m_scene; +}; +} // namespace Cubed \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cda79e0..f16a3f8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -91,4 +91,5 @@ target_sources(${PROJECT_NAME} tools/sensitive_filter.cpp ui/row_layout.cpp ui/item_slot.cpp + ui/inventory_ui.cpp ) \ No newline at end of file diff --git a/src/scene/world_scene.cpp b/src/scene/world_scene.cpp index c06521b..827ab4b 100644 --- a/src/scene/world_scene.cpp +++ b/src/scene/world_scene.cpp @@ -8,8 +8,8 @@ WorldScene::WorldScene(SceneManager& scene_manager) : m_scene_manager(scene_manager), m_dev_panel(*this), m_client_world(scene_manager.app().audio(), scene_manager.app().config(), *this), - m_pasue_menu(*this), m_hud_ui(*this), m_error_ui(*this), - m_argument(scene_manager.app().argument()) {} + m_pasue_menu(*this), m_inventory_ui(*this), m_hud_ui(*this), + m_error_ui(*this), m_argument(scene_manager.app().argument()) {} WorldScene::~WorldScene() { if (m_client) { @@ -46,7 +46,14 @@ void WorldScene::update(float dt) { } }*/ if (m_paused) { - m_pasue_menu.update(dt); + switch (m_paused_ui) { + case PauseUI::INVENTORY: + m_inventory_ui.update(dt); + break; + case PauseUI::PAUSE_MENU: + m_pasue_menu.update(dt); + break; + } } else { m_hud_ui.update(dt); } @@ -62,7 +69,14 @@ void WorldScene::render(Renderer& renderer) { m_hud_ui.render(renderer); } if (m_paused) { - m_pasue_menu.render(renderer); + switch (m_paused_ui) { + case PauseUI::INVENTORY: + m_inventory_ui.render(renderer); + break; + case PauseUI::PAUSE_MENU: + m_pasue_menu.render(renderer); + break; + } } else { if (m_show_dev_pannel && m_show_hud) { renderer.render_dev_panel(m_dev_panel); @@ -139,6 +153,7 @@ void WorldScene::on_enter() { m_dev_panel.init(); m_pasue_menu.init(); m_hud_ui.init(); + m_inventory_ui.init(); m_scene_manager.app().audio().set_client(m_client); m_scene_manager.app().window().set_game_running(true); } catch (const std::exception& e) { @@ -191,8 +206,11 @@ bool WorldScene::handle_mouse_move_event(const MouseMoveEvent& e) { return true; } if (m_paused) { - if (m_pasue_menu.handle_event(e)) { - return true; + switch (m_paused_ui) { + case PauseUI::INVENTORY: + return m_inventory_ui.handle_event(e); + case PauseUI::PAUSE_MENU: + return m_pasue_menu.handle_event(e); } } else { if (m_hud_ui.handle_event(e)) { @@ -217,8 +235,11 @@ bool WorldScene::handle_mouse_button_event(const MouseButtonEvent& e) { return true; } if (m_paused) { - if (m_pasue_menu.handle_event(e)) { - return true; + switch (m_paused_ui) { + case PauseUI::INVENTORY: + return m_inventory_ui.handle_event(e); + case PauseUI::PAUSE_MENU: + return m_pasue_menu.handle_event(e); } } else { if (m_hud_ui.handle_event(e)) { @@ -257,8 +278,11 @@ bool WorldScene::handle_mouse_wheel_event(const MouseWheelEvent& e) { return true; } if (m_paused) { - if (m_pasue_menu.handle_event(e)) { - return true; + switch (m_paused_ui) { + case PauseUI::INVENTORY: + return m_inventory_ui.handle_event(e); + case PauseUI::PAUSE_MENU: + return m_pasue_menu.handle_event(e); } } else { if (m_hud_ui.handle_event(e)) { @@ -286,6 +310,14 @@ bool WorldScene::handle_key_event(const KeyEvent& e) { } bool pasued = pause(); pasued = !pasued; + m_paused_ui = PauseUI::PAUSE_MENU; + set_pause(pasued); + return true; + } + if (e.key == Key::E && e.action == KeyAction::PRESS) { + bool pasued = pause(); + pasued = !pasued; + m_paused_ui = PauseUI::INVENTORY; set_pause(pasued); return true; } @@ -327,8 +359,11 @@ bool WorldScene::handle_key_event(const KeyEvent& e) { } if (m_paused) { - if (m_pasue_menu.handle_event(e)) { - return true; + switch (m_paused_ui) { + case PauseUI::INVENTORY: + return m_inventory_ui.handle_event(e); + case PauseUI::PAUSE_MENU: + return m_pasue_menu.handle_event(e); } } else { if (m_hud_ui.handle_event(e)) { @@ -353,7 +388,12 @@ bool WorldScene::handle_text_input_event(const TextInputEvent& e) { return m_error_ui.handle_event(e); } if (m_paused) { - return m_pasue_menu.handle_text_input_event(e); + switch (m_paused_ui) { + case PauseUI::INVENTORY: + return m_inventory_ui.handle_event(e); + case PauseUI::PAUSE_MENU: + return m_pasue_menu.handle_event(e); + } } return m_hud_ui.handle_text_input_event(e); diff --git a/src/ui/inventory_ui.cpp b/src/ui/inventory_ui.cpp new file mode 100644 index 0000000..f87154a --- /dev/null +++ b/src/ui/inventory_ui.cpp @@ -0,0 +1,45 @@ +#include "Cubed/ui/inventory_ui.hpp" + +#include "Cubed/app.hpp" +#include "Cubed/scene/scene_manager.hpp" +#include "Cubed/scene/world_scene.hpp" +#include "Cubed/ui/column_layout.hpp" +#include "Cubed/ui/image.hpp" + +namespace Cubed { +InventoryUI::InventoryUI(WorldScene& scene) : m_scene(scene) {} + +void InventoryUI::init() { + auto back = std::make_unique(nullptr); + auto& renderer = m_scene.scene_manager().app().renderer(); + auto& texture_manager = m_scene.scene_manager().app().texture_manager(); + + back->set_window_size(renderer.window_width(), renderer.window_height()); + back->set_anchor(Anchor::TOP_LEFT); + back->set_color(Color::BLACK).set_alpha(0.7f); + back->set_fill_parent(true); + + auto& column = back->add_child(); + column.set_anchor(Anchor::CENTER); + column.set_child_anchor(ColumnLayoutAnchor::LEFT); + auto& block_textures = texture_manager.get_item_textures(); + auto sum = block_textures.size(); + { + auto& row_layout = column.add_child(); + auto row = &row_layout; + for (size_t i = 0; i < sum; ++i) { + if (i % 10 == 0) { + auto& r = column.add_child(); + row = &r; + } + auto& slot = row->add_child(); + slot.set_default_background(texture_manager); + slot.set_scale(5.0f); + slot.set_item(i, block_textures[i].get()); + } + } + + m_root_widget = std::move(back); +} +void InventoryUI::on_re_enter() {} +} // namespace Cubed \ No newline at end of file diff --git a/src/ui/pause_menu_ui_manager.cpp b/src/ui/pause_menu_ui_manager.cpp index 4ee2559..a4f9074 100644 --- a/src/ui/pause_menu_ui_manager.cpp +++ b/src/ui/pause_menu_ui_manager.cpp @@ -14,7 +14,7 @@ void PauseMenuUIManager::init() { rect->set_fill_parent(true); rect->set_color(Color::BLACK); - rect->set_alpha(0.5f); + rect->set_alpha(0.7f); rect->set_anchor(Anchor::TOP_LEFT); auto& renderer = m_scene.scene_manager().app().renderer(); rect->set_window_size(renderer.window_width(), renderer.window_height());