From 5c0861ae0bea5597e843ecf1e4bc6c1a81c13bf1 Mon Sep 17 00:00:00 2001 From: Stepland <16676308+Stepland@users.noreply.github.com> Date: Tue, 3 Mar 2020 23:30:45 +0100 Subject: [PATCH] switch to shared_ptr --- src/Screens/MusicSelect/OptionPage.cpp | 14 +++---- src/Screens/MusicSelect/OptionPage.hpp | 2 +- src/Screens/MusicSelect/PanelLayout.cpp | 42 +++++++++---------- src/Screens/MusicSelect/PanelLayout.hpp | 6 +-- .../MusicSelect/Panels/SubpagePanel.cpp | 1 + .../MusicSelect/Panels/SubpagePanel.hpp | 8 ++-- src/Screens/MusicSelect/Ribbon.cpp | 6 +-- src/Screens/MusicSelect/Ribbon.hpp | 2 +- 8 files changed, 39 insertions(+), 42 deletions(-) diff --git a/src/Screens/MusicSelect/OptionPage.cpp b/src/Screens/MusicSelect/OptionPage.cpp index 14645e1..6dfad7f 100644 --- a/src/Screens/MusicSelect/OptionPage.cpp +++ b/src/Screens/MusicSelect/OptionPage.cpp @@ -1,6 +1,7 @@ #include "OptionPage.hpp" #include +#include #include #include "Ribbon.hpp" @@ -17,7 +18,6 @@ namespace MusicSelect { OptionPage(resources), m_ribbon(layout, resources) { - update(); } void RibbonPage::click(const Data::Button& button) { @@ -46,21 +46,19 @@ namespace MusicSelect { MainOptionPage::MainOptionPage(SharedResources& resources) : RibbonPage(MainOptionPage::create_layout(resources), resources) { - update(); } PanelLayout MainOptionPage::create_layout(SharedResources& resources) { - std::vector> subpages; - jbcoe::polymorphic_value marker_select{MarkerSelect{resources}}; - subpages.emplace_back(SubpagePanel{resources, marker_select, "markers"}); + std::vector> subpages; + auto marker_select = std::make_shared(MarkerSelect{resources}); + subpages.emplace_back(std::make_shared(resources, marker_select, "markers")); return PanelLayout{subpages, resources}; } MarkerSelect::MarkerSelect(SharedResources& resources) : RibbonPage(MarkerSelect::create_layout(resources), resources) { - update(); } MarkerSelect::~MarkerSelect() { @@ -68,9 +66,9 @@ namespace MusicSelect { } PanelLayout MarkerSelect::create_layout(SharedResources& resources) { - std::vector> markers; + std::vector> markers; for (const auto &[name, marker] : resources.markers) { - markers.emplace_back(MarkerPanel{resources, marker}); + markers.emplace_back(std::make_shared(resources, marker)); } return PanelLayout{markers, resources}; } diff --git a/src/Screens/MusicSelect/OptionPage.hpp b/src/Screens/MusicSelect/OptionPage.hpp index bd25237..5579acc 100644 --- a/src/Screens/MusicSelect/OptionPage.hpp +++ b/src/Screens/MusicSelect/OptionPage.hpp @@ -14,7 +14,7 @@ namespace MusicSelect { class OptionPage : public sf::Drawable, public sf::Transformable, public HoldsSharedResources { public: - OptionPage(SharedResources& resources) : HoldsSharedResources(resources) {}; + OptionPage(SharedResources& resources) : HoldsSharedResources(resources) {update();}; // An option page should only every recive button presses ranging for 1 to 14 // Going back a menu should be handled by the MusicSelect screen to avoid destroying the menu // while still being in a click() call on it diff --git a/src/Screens/MusicSelect/PanelLayout.cpp b/src/Screens/MusicSelect/PanelLayout.cpp index 9de972a..0ef4596 100644 --- a/src/Screens/MusicSelect/PanelLayout.cpp +++ b/src/Screens/MusicSelect/PanelLayout.cpp @@ -4,13 +4,13 @@ namespace MusicSelect { PanelLayout::PanelLayout( - const std::map>>& categories, + const std::map>>& categories, SharedResources& resources ) { for (auto &&[category, panels] : categories) { if (not panels.empty()) { - std::vector> current_column; - current_column.emplace_back(CategoryPanel{resources, category}); + std::vector> current_column; + current_column.emplace_back(std::make_shared(resources, category)); for (auto& panel : panels) { if (current_column.size() == 3) { push_back({ @@ -20,11 +20,11 @@ namespace MusicSelect { }); current_column.clear(); } - current_column.push_back(std::move(panel)); + current_column.push_back(panel); } if (not current_column.empty()) { while (current_column.size() < 3) { - current_column.emplace_back(EmptyPanel{resources}); + current_column.emplace_back(std::make_shared(resources)); } push_back({ std::move(current_column[0]), @@ -38,10 +38,10 @@ namespace MusicSelect { } PanelLayout::PanelLayout( - const std::vector>& panels, + const std::vector>& panels, SharedResources& resources ) { - std::vector> current_column; + std::vector> current_column; for (auto& panel : panels) { if (current_column.size() == 3) { push_back({ @@ -51,11 +51,11 @@ namespace MusicSelect { }); current_column.clear(); } - current_column.push_back(std::move(panel)); + current_column.push_back(panel); } if (not current_column.empty()) { while (current_column.size() < 3) { - current_column.emplace_back(EmptyPanel{resources}); + current_column.emplace_back(std::make_shared(resources)); } push_back({ std::move(current_column[0]), @@ -67,9 +67,9 @@ namespace MusicSelect { } PanelLayout PanelLayout::red_empty_layout(SharedResources& resources) { - std::vector> panels; + std::vector> panels; for (size_t i = 0; i < 3*4; i++) { - panels.emplace(std::make_unique(resources, sf::Color::Red, "- EMPTY -")); + panels.emplace_back(std::make_shared(resources, sf::Color::Red, "- EMPTY -")); } return PanelLayout{panels, resources}; } @@ -84,38 +84,34 @@ namespace MusicSelect { songs.end(), [](std::shared_ptr a, std::shared_ptr b){return Data::Song::sort_by_title(*a, *b);} ); - std::map>> categories; + std::map>> categories; for (const auto &song : songs) { if (song->title.size() > 0) { char letter = song->title[0]; if ('A' <= letter and letter <= 'Z') { categories [std::string(1, letter)] - .emplace_back(SongPanel{resources, song}); + .emplace_back(std::make_shared(resources, song)); } else if ('a' <= letter and letter <= 'z') { categories [std::string(1, 'A' + (letter - 'a'))] - .emplace_back(SongPanel{resources, song}); + .emplace_back(std::make_shared(resources, song)); } else { - categories["?"].emplace_back(SongPanel{resources, song}); + categories["?"].emplace_back(std::make_shared(resources, song)); } } else { - categories["?"].emplace_back(SongPanel{resources, song}); + categories["?"].emplace_back(std::make_shared(resources, song)); } } return PanelLayout{categories, resources}; } - - void PanelLayout::PanelLayout::push_vector(const std::vector>& panels) { - - } void PanelLayout::fill_layout(SharedResources& resources) { while (size() < 4) { push_back({ - std::unique_ptr{EmptyPanel{resources}}, - std::unique_ptr{EmptyPanel{resources}}, - std::unique_ptr{EmptyPanel{resources}} + std::make_shared(resources), + std::make_shared(resources), + std::make_shared(resources) }); } } diff --git a/src/Screens/MusicSelect/PanelLayout.hpp b/src/Screens/MusicSelect/PanelLayout.hpp index f742fc5..9b0567d 100644 --- a/src/Screens/MusicSelect/PanelLayout.hpp +++ b/src/Screens/MusicSelect/PanelLayout.hpp @@ -11,10 +11,10 @@ namespace MusicSelect { class Panel; // PanelLayout restricts the ways you can create a scrollable grid of panels - class PanelLayout : public std::vector,3>> { + class PanelLayout : public std::vector,3>> { public: - explicit PanelLayout(const std::map>>& categories, SharedResources& resources); - explicit PanelLayout(const std::vector>& panels, SharedResources& resources); + explicit PanelLayout(const std::map>>& categories, SharedResources& resources); + explicit PanelLayout(const std::vector>& panels, SharedResources& resources); static PanelLayout red_empty_layout(SharedResources& resources); static PanelLayout title_sort(const Data::SongList& song_list, SharedResources& resources); private: diff --git a/src/Screens/MusicSelect/Panels/SubpagePanel.cpp b/src/Screens/MusicSelect/Panels/SubpagePanel.cpp index a2dd99b..e84ffec 100644 --- a/src/Screens/MusicSelect/Panels/SubpagePanel.cpp +++ b/src/Screens/MusicSelect/Panels/SubpagePanel.cpp @@ -5,6 +5,7 @@ namespace MusicSelect { void SubpagePanel::click(Ribbon&, const Data::Button&) { m_resources.options_state.push(*m_subpage); + m_resources.options_state.top().get().update(); } void SubpagePanel::draw(sf::RenderTarget& target, sf::RenderStates states) const { diff --git a/src/Screens/MusicSelect/Panels/SubpagePanel.hpp b/src/Screens/MusicSelect/Panels/SubpagePanel.hpp index 183f2d9..f993dde 100644 --- a/src/Screens/MusicSelect/Panels/SubpagePanel.hpp +++ b/src/Screens/MusicSelect/Panels/SubpagePanel.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include #include @@ -13,17 +15,17 @@ namespace MusicSelect { public: SubpagePanel( SharedResources& resources, - const jbcoe::polymorphic_value& subpage, + std::shared_ptr subpage, const std::string& name ) : Panel(resources), - m_subpage(subpage), + m_subpage(std::move(subpage)), m_name(name) {}; void click(Ribbon& ribbon, const Data::Button& button) override; private: void draw(sf::RenderTarget& target, sf::RenderStates states) const override; - jbcoe::polymorphic_value m_subpage; + std::shared_ptr m_subpage; std::string m_name; }; } \ No newline at end of file diff --git a/src/Screens/MusicSelect/Ribbon.cpp b/src/Screens/MusicSelect/Ribbon.cpp index f234aa0..d5ed52f 100644 --- a/src/Screens/MusicSelect/Ribbon.cpp +++ b/src/Screens/MusicSelect/Ribbon.cpp @@ -77,7 +77,7 @@ namespace MusicSelect { return (m_position + (Data::button_to_index(button) % 4)) % m_layout.size(); } - std::unique_ptr& Ribbon::get_panel_under_button(const Data::Button& button) { + std::shared_ptr& Ribbon::get_panel_under_button(const Data::Button& button) { auto button_index = Data::button_to_index(button); return ( m_layout @@ -117,8 +117,8 @@ namespace MusicSelect { if (std::any_of( column.begin(), column.end(), - [](const std::unique_ptr panel) -> bool { - return std::dynamic_pointer_cast(panel) != nullptr; + [](const std::shared_ptr& panel) -> bool { + return std::dynamic_cast(panel.get()) != nullptr; } )) { found = true; diff --git a/src/Screens/MusicSelect/Ribbon.hpp b/src/Screens/MusicSelect/Ribbon.hpp index 5a9e606..c5a7ac9 100644 --- a/src/Screens/MusicSelect/Ribbon.hpp +++ b/src/Screens/MusicSelect/Ribbon.hpp @@ -41,7 +41,7 @@ namespace MusicSelect { class Ribbon : public sf::Drawable, public sf::Transformable, public HoldsSharedResources, public Toolkit::Debuggable { public: Ribbon(PanelLayout layout, SharedResources& t_resources); - std::unique_ptr& get_panel_under_button(const Data::Button& button); + std::shared_ptr& get_panel_under_button(const Data::Button& button); void click_on(const Data::Button& button); void move_right(); void move_left();