#include "editorstate.h" #include "widgets/button.h" #include "widgets/group.h" #include "widgets/menubar.h" #include "widgets/window.h" #include "widgets/editorwidget.h" #include "widgets/bpmcalculatorwidget.h" #include "tools/bpmcalculator.h" #include "core/editor.h" #include EditorState::EditorState(sf::RenderWindow& game_window, std::unique_ptr&& editor, Callbacks&& callbacks, const FontHolder& font_holder) : _font(font_holder.get(Fonts::Id::GUI)), _game_window(game_window), _callbacks(std::move(callbacks)), _editor(std::move(editor)) {} EditorState::~EditorState() {} void EditorState::input(const sf::Event& event) { _group->input(event); } void EditorState::update(const sf::Time& dt) { _group->update(dt); } void EditorState::draw() const { _game_window.draw(*_group); } void EditorState::enter() { auto& group = _group; auto& music = _music; auto& editor = _editor; _music->openFromFile("Uta-test.flac"); _music->setVolume(5); _bpm_calculator = std::make_shared(_music); std::shared_ptr bpm_widget = std::make_shared(_bpm_calculator, _font); bpm_widget->init(_editor); const auto bpm_widget_callback = [&group, bpm_widget=bpm_widget, &music]() { music->stop(); bpm_widget->setVisibility(false); group->unblock(); }; const float window_width = _game_window.getSize().x; auto menu_bar = std::make_shared(_font); auto bpm_button = std::make_shared("Calculate BPM", _font); bpm_button->setCallback([&group, bpm_widget=bpm_widget]() { group->blockBy(bpm_widget); bpm_widget->setVisibility(true); }); bpm_widget->setRect(sf::FloatRect(_game_window.getSize().x / 3, _game_window.getSize().y / 3, _game_window.getSize().x / 3, _game_window.getSize().y / 3)); bpm_widget->addBarButton("X", bpm_widget_callback); bpm_widget->setVisibility(false); auto test_menu_2 = std::make_shared(); test_menu_2->setRect(sf::FloatRect{0, 0, 200, 27 * 5}); auto test_menu_3 = std::make_shared(); test_menu_3->setRect(sf::FloatRect{0, 0, 200, 27 * 5}); auto test_cascade_button = std::make_shared("Show submenu", _font); auto test_cascade_button_2 = std::make_shared("Show submenu 2", _font); auto quit_button = std::make_shared("Quit", _font); quit_button->setCallback(_callbacks.onLeaveEditorState); auto test_menu = std::make_shared(); test_menu->setRect(sf::FloatRect{0, 0, 200, 27 * 3}); menu_bar->setRect(sf::FloatRect(0, 0, window_width, 27)); menu_bar->addRootSubMenu("test", test_menu); menu_bar->addDependentSubmenu(test_menu_2); menu_bar->addDependentSubmenu(test_menu_3); test_cascade_button->setSubmenu(test_menu_2); test_menu->addPushButton(bpm_button); test_menu->addCascadeButton(test_cascade_button); test_menu->addPushButton(quit_button); test_cascade_button->resetRect(); test_cascade_button_2->setSubmenu(test_menu_3); test_menu_2->addCascadeButton(test_cascade_button_2); test_cascade_button_2->resetRect(); menu_bar->setVisibility(true); EditorWidget::Callbacks callbacks; callbacks.onDraw = [&editor](sf::RenderTarget& target, sf::RenderStates states) { (void)target; (void)states; // fucking shit i am a retard damn fuck fuck editor->draw(); }; callbacks.onInput = [&editor](const sf::Event& event) { editor->input(PlayerInput{0, event}); }; callbacks.onUpdate = [&editor](const sf::Time& dt) { editor->update(dt); }; auto editor_widget = std::make_shared(std::move(callbacks)); _group = std::make_shared(); _group->addChild(menu_bar); _group->addChild(bpm_widget); _group->addChild(editor_widget); } void EditorState::leave() { _group.reset(); _bpm_calculator.reset(); }