diff --git a/src/Resources/Marker.hpp b/src/Resources/Marker.hpp index 17900e7..291eeef 100644 --- a/src/Resources/Marker.hpp +++ b/src/Resources/Marker.hpp @@ -82,6 +82,6 @@ namespace Resources { sf::Texture m_perfect; }; - using Markers = std::multimap; + using Markers = std::map; Markers load_markers(); } diff --git a/src/Screens/MusicSelect/MusicSelect.cpp b/src/Screens/MusicSelect/MusicSelect.cpp index 3c28393..32eddf5 100644 --- a/src/Screens/MusicSelect/MusicSelect.cpp +++ b/src/Screens/MusicSelect/MusicSelect.cpp @@ -1,7 +1,8 @@ #include "MusicSelect.hpp" -#include "imgui/imgui.h" -#include "imgui-sfml/imgui-SFML.h" +#include +#include +#include #include @@ -31,6 +32,9 @@ MusicSelect::Screen::Screen( resources.m_preferences.layout.panel_step()*resources.m_preferences.screen.width*4.f )); Toolkit::set_origin_normalized(panel_filter, 0.5f, 0.5f); + if (resources.m_preferences.options.marker.empty()) { + resources.m_preferences.options.marker = markers.begin()->second.m_metadata.name; + } panel_filter.setFillColor(sf::Color(0,0,0,128)); std::cout << "loaded MusicSelect::Screen" << std::endl; } @@ -114,6 +118,7 @@ void MusicSelect::Screen::select_chart(sf::RenderWindow& window) { window.draw(button_highlight); window.draw(song_info); window.draw(black_frame); + draw_debug(); ImGui::SFML::Render(window); window.display(); resources.music_preview.update(); @@ -121,6 +126,34 @@ void MusicSelect::Screen::select_chart(sf::RenderWindow& window) { ImGui::SFML::Shutdown(); } +void MusicSelect::Screen::draw_debug() { + if (debug) { + if (ImGui::Begin("MusicSelect::Screen")) { + if (ImGui::CollapsingHeader("Preferences")) { + if (ImGui::TreeNode("screen")) { + ImGui::TextUnformatted("width : "); ImGui::SameLine(); + ImGui::Text("%s", std::to_string(resources.m_preferences.screen.width).c_str()); + ImGui::TextUnformatted("height : "); ImGui::SameLine(); + ImGui::Text("%s", std::to_string(resources.m_preferences.screen.height).c_str()); + ImGui::TextUnformatted("fullscreen : "); ImGui::SameLine(); + ImGui::Text("%s", resources.m_preferences.screen.fullscreen ? "true" : "false"); + ImGui::TreePop(); + } + if (ImGui::TreeNode("layout")) { + + ImGui::TreePop(); + } + if (ImGui::TreeNode("options")) { + ImGui::TextUnformatted("marker : "); ImGui::SameLine(); + ImGui::Text("%s", resources.m_preferences.options.marker.c_str()); + ImGui::TreePop(); + } + } + } + ImGui::End(); + } +} + void MusicSelect::Screen::handle_key_press(const sf::Event::KeyEvent& key_event) { auto button = key_mapping.key_to_button(key_event.code); if (button) { @@ -129,6 +162,7 @@ void MusicSelect::Screen::handle_key_press(const sf::Event::KeyEvent& key_event) switch (key_event.code){ case sf::Keyboard::F12: ribbon.debug = not ribbon.debug; + debug = not debug; break; default: break; diff --git a/src/Screens/MusicSelect/MusicSelect.hpp b/src/Screens/MusicSelect/MusicSelect.hpp index 153fbc2..bbc739a 100644 --- a/src/Screens/MusicSelect/MusicSelect.hpp +++ b/src/Screens/MusicSelect/MusicSelect.hpp @@ -12,6 +12,7 @@ #include "../../Drawables/BlackFrame.hpp" #include "../../Resources/Marker.hpp" #include "../../Toolkit/AffineTransform.hpp" +#include "../../Toolkit/Debuggable.hpp" #include "Ribbon.hpp" #include "SongInfo.hpp" #include "SharedResources.hpp" @@ -23,7 +24,7 @@ namespace MusicSelect { class SongPanel; // The music select screen is created only once // it loads a cache of available songs in the song_list attribute - class Screen { + class Screen : public Toolkit::Debuggable { public: Screen( const Data::SongList& t_song_list, @@ -31,7 +32,7 @@ namespace MusicSelect { const Resources::Markers& t_markers ); void select_chart(sf::RenderWindow& window); - + void draw_debug() override; private: // Data const Data::SongList song_list; diff --git a/src/Screens/MusicSelect/Panels/MarkerPanel.cpp b/src/Screens/MusicSelect/Panels/MarkerPanel.cpp index dda517b..10f436a 100644 --- a/src/Screens/MusicSelect/Panels/MarkerPanel.cpp +++ b/src/Screens/MusicSelect/Panels/MarkerPanel.cpp @@ -8,26 +8,43 @@ namespace MusicSelect { m_marker(marker) { if (m_resources.m_preferences.options.marker == marker.m_metadata.name) { - selected_since.emplace(); + select(); } } void MarkerPanel::click(Ribbon&, const Data::Button&) { - if (not selected_since) { - selected_since.emplace(); - m_resources.m_preferences.options.marker = m_marker.m_metadata.name; + if (selected) { + m_resources.selected_marker->last_click.restart(); + m_resources.selected_marker->is_first_click = false; + } else { + select(); } } void MarkerPanel::draw(sf::RenderTarget& target, sf::RenderStates states) const { states.transform *= getTransform(); float animation_time = 0.f; - if (selected_since) { - animation_time = std::fmod(selected_since->getElapsedTime().asSeconds(), 2.f) - 1.f; + if (selected) { + animation_time = std::fmod(m_resources.selected_marker->last_click.getElapsedTime().asSeconds(), 2.f) - 1.f; } auto sprite = m_marker.get_sprite(Resources::MarkerAnimation::APPROACH, animation_time); if (sprite) { + auto bounds = sprite->getGlobalBounds(); + sprite->setScale(get_panel_size()/bounds.width, get_panel_size()/bounds.height); target.draw(*sprite, states); } } + + void MarkerPanel::select() { + if (m_resources.selected_marker) { + m_resources.selected_marker->obj.unselect(); + } + m_resources.selected_marker.emplace(*this); + m_resources.m_preferences.options.marker == m_marker.m_metadata.name; + this->selected = true; + } + + void MarkerPanel::unselect() { + this->selected = false; + } } diff --git a/src/Screens/MusicSelect/Panels/MarkerPanel.hpp b/src/Screens/MusicSelect/Panels/MarkerPanel.hpp index 18661ce..132b83a 100644 --- a/src/Screens/MusicSelect/Panels/MarkerPanel.hpp +++ b/src/Screens/MusicSelect/Panels/MarkerPanel.hpp @@ -14,7 +14,9 @@ namespace MusicSelect { void click(Ribbon&, const Data::Button&) override; private: void draw(sf::RenderTarget& target, sf::RenderStates states) const override; + void select(); + void unselect(); const Resources::Marker& m_marker; - mutable std::optional selected_since; + bool selected = false; }; } \ No newline at end of file diff --git a/src/Screens/MusicSelect/Panels/Panel.cpp b/src/Screens/MusicSelect/Panels/Panel.cpp index a27a682..0076a87 100644 --- a/src/Screens/MusicSelect/Panels/Panel.cpp +++ b/src/Screens/MusicSelect/Panels/Panel.cpp @@ -87,9 +87,9 @@ namespace MusicSelect { } // The song was not selected before : first unselect the last one if (m_resources.selected_panel.has_value()) { - m_resources.selected_panel->panel.unselect(); + m_resources.selected_panel->obj.unselect(); } - m_resources.selected_panel.emplace(TimedSelectedPanel{*this}); + m_resources.selected_panel.emplace(*this); m_resources.music_preview.play(m_song->full_audio_path(), m_song->preview); } } diff --git a/src/Screens/MusicSelect/SharedResources.cpp b/src/Screens/MusicSelect/SharedResources.cpp index 1e6129c..394ffbb 100644 --- a/src/Screens/MusicSelect/SharedResources.cpp +++ b/src/Screens/MusicSelect/SharedResources.cpp @@ -44,7 +44,7 @@ namespace MusicSelect { if (not selected_panel.has_value()) { return {}; } - auto chart_selection = selected_panel->panel.get_selected_difficulty(); + auto chart_selection = selected_panel->obj.get_selected_difficulty(); if (not chart_selection.has_value()) { return {}; } @@ -55,7 +55,7 @@ namespace MusicSelect { if (not selected_panel.has_value()) { return {}; } - auto chart_selection = selected_panel->panel.get_selected_difficulty(); + auto chart_selection = selected_panel->obj.get_selected_difficulty(); if (not chart_selection.has_value()) { return {}; } diff --git a/src/Screens/MusicSelect/SharedResources.hpp b/src/Screens/MusicSelect/SharedResources.hpp index 15f0dbb..d52fdcc 100644 --- a/src/Screens/MusicSelect/SharedResources.hpp +++ b/src/Screens/MusicSelect/SharedResources.hpp @@ -19,11 +19,13 @@ namespace MusicSelect { class SelectablePanel; + class MarkerPanel; class OptionPage; - struct TimedSelectedPanel { - TimedSelectedPanel(SelectablePanel& s) : panel(s), first_click(), last_click() {}; - SelectablePanel& panel; + template + struct Timed { + Timed(Object& t_obj) : obj(t_obj), first_click(), last_click() {}; + Object& obj; sf::Clock first_click; sf::Clock last_click; bool is_first_click = true; @@ -47,7 +49,7 @@ namespace MusicSelect { MusicSelect::DensityGraphCache density_graphs; - std::optional selected_panel; + std::optional> selected_panel; std::string get_last_selected_difficulty(); std::optional get_selected_difficulty(); std::optional> get_selected_song(); @@ -62,6 +64,8 @@ namespace MusicSelect { std::stack> options_state; const Resources::Markers& markers; + + std::optional> selected_marker; }; // Proxy for HoldsPreferences diff --git a/src/Screens/MusicSelect/SongInfo.cpp b/src/Screens/MusicSelect/SongInfo.cpp index 9aa3b5f..b293d96 100644 --- a/src/Screens/MusicSelect/SongInfo.cpp +++ b/src/Screens/MusicSelect/SongInfo.cpp @@ -28,7 +28,7 @@ namespace MusicSelect { if (not selected_panel.has_value()) { return; } - auto selected_chart = selected_panel->panel.get_selected_difficulty(); + auto selected_chart = selected_panel->obj.get_selected_difficulty(); if (not selected_chart.has_value()) { return; } @@ -73,7 +73,7 @@ namespace MusicSelect { if (not selected_panel.has_value()) { return; } - auto selected_chart = selected_panel->panel.get_selected_difficulty(); + auto selected_chart = selected_panel->obj.get_selected_difficulty(); if (not selected_chart.has_value()) { return; } @@ -126,7 +126,7 @@ namespace MusicSelect { if (not selected_panel.has_value()) { return; } - auto selected_chart = selected_panel->panel.get_selected_difficulty(); + auto selected_chart = selected_panel->obj.get_selected_difficulty(); if (not selected_chart.has_value()) { return; } @@ -175,7 +175,7 @@ namespace MusicSelect { if (not selected_panel.has_value()) { return; } - auto selected_chart = selected_panel->panel.get_selected_difficulty(); + auto selected_chart = selected_panel->obj.get_selected_difficulty(); if (not selected_chart.has_value()) { return; } @@ -225,7 +225,7 @@ namespace MusicSelect { if (not selected_panel.has_value()) { return; } - auto selected_difficulty = selected_panel->panel.get_selected_difficulty(); + auto selected_difficulty = selected_panel->obj.get_selected_difficulty(); if (not selected_difficulty.has_value()) { return; }