diff --git a/src/application/application.cpp b/src/application/application.cpp index 36537d1..993e842 100644 --- a/src/application/application.cpp +++ b/src/application/application.cpp @@ -1,5 +1,6 @@ #include "application.h" #include "core/inputtype.h" +#include "core/editor.h" #include "mainmenu.h" #include "gamestate.h" @@ -32,7 +33,7 @@ Application::Application() : const auto main_menu = std::make_shared(_game_window, std::move(callbacks), _font_holder); const auto game_state = std::make_shared(_game_window, classic::initGame(_game_window), GameState::Callbacks()); - const auto editor = std::make_shared(_game_window, std::move(editor_callbacks), std::make_unique(), _font_holder); + const auto editor = std::make_shared(_game_window, classic::initEditor(_game_window), std::move(editor_callbacks), _font_holder); _states[GUIState::Tag::MAIN_MENU] = main_menu; _states[GUIState::Tag::GAME] = game_state; diff --git a/src/application/editorstate.cpp b/src/application/editorstate.cpp index ab0b899..176aeb6 100644 --- a/src/application/editorstate.cpp +++ b/src/application/editorstate.cpp @@ -7,13 +7,18 @@ #include "widgets/bpmcalculatorwidget.h" #include "tools/bpmcalculator.h" +#include "core/editor.h" + #include -EditorState::EditorState(sf::RenderWindow& game_window, Callbacks&& callbacks, std::unique_ptr&& music, const FontHolder& font_holder) : +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)), - _music(std::move(music)) + _editor(std::move(editor)) +{} + +EditorState::~EditorState() {} void EditorState::input(const sf::Event& event) @@ -35,12 +40,14 @@ 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(); + bpm_widget->init(_editor); const auto bpm_widget_callback = [&group, bpm_widget=bpm_widget, &music]() { music->stop(); @@ -99,11 +106,29 @@ void EditorState::enter() menu_bar->setVisibility(true); - //auto editor_widget = std::make_unique(_edito) + 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() diff --git a/src/application/editorstate.h b/src/application/editorstate.h index bad9761..f1047f3 100644 --- a/src/application/editorstate.h +++ b/src/application/editorstate.h @@ -7,6 +7,7 @@ class BPMCalculator; class Group; +class Editor; class EditorState : public GUIState { @@ -17,7 +18,8 @@ public: std::function onLeaveEditorState; }; - explicit EditorState(sf::RenderWindow& game_window, Callbacks&& callbacks, std::unique_ptr&& music, const FontHolder& font_holder); + explicit EditorState(sf::RenderWindow& game_window, std::unique_ptr&& editor, Callbacks&& callbacks, const FontHolder& font_holder); + virtual ~EditorState() override; virtual void input(const sf::Event& event) override; virtual void update(const sf::Time& dt) override; virtual void draw() const override; @@ -34,5 +36,7 @@ private: std::shared_ptr _music; std::shared_ptr _bpm_calculator; std::shared_ptr _group; + + std::unique_ptr _editor; }; diff --git a/src/application/widgets/bpmcalculatorwidget.cpp b/src/application/widgets/bpmcalculatorwidget.cpp index 88e9afc..3ef8016 100644 --- a/src/application/widgets/bpmcalculatorwidget.cpp +++ b/src/application/widgets/bpmcalculatorwidget.cpp @@ -1,5 +1,6 @@ #include "bpmcalculatorwidget.h" #include "tools/bpmcalculator.h" +#include "core/editor.h" #include @@ -70,6 +71,7 @@ void BPMCalculatorWidget::draw(sf::RenderTarget& target, sf::RenderStates states _slider->draw(target, states); _button_start->draw(target, states); _button_stop->draw(target, states); + _button_apply->draw(target, states); target.draw(_bpm_value, states); } } @@ -89,6 +91,10 @@ void BPMCalculatorWidget::setRect(const sf::FloatRect& rect) _button_stop->setPosition({_window_content.getGlobalBounds().left + rect.width / 7, _window_content.getGlobalBounds().top + _window_content.getGlobalBounds().height - 40}); + _button_apply->setRect(sf::FloatRect{0, 0, rect.width / 10 * 3, 30}); + _button_apply->setPosition({_window_content.getGlobalBounds().left + 20 + (2 * (rect.width / 7)), + _window_content.getGlobalBounds().top + _window_content.getGlobalBounds().height - 40}); + _bpm_value.setPosition({_window_content.getGlobalBounds().left + rect.width / 8, _window_content.getGlobalBounds().top + rect.height / 8 }); } @@ -105,12 +111,13 @@ void BPMCalculatorWidget::setPosition(const sf::Vector2f &position) Window::setPosition(position); } -void BPMCalculatorWidget::init() +void BPMCalculatorWidget::init(const std::unique_ptr& _editor) { auto& bpm_calculator = _bpm_calculator; _button_start = std::make_shared("Start", _font); _button_stop = std::make_shared("Stop", _font); + _button_apply = std::make_shared("Apply", _font); _button_start->setCallback([bpm_calculator, button_start=_button_start, button_stop=_button_stop]() { @@ -128,8 +135,19 @@ void BPMCalculatorWidget::init() button_stop->setVisibility(false); }); + _button_apply->setCallback([&_editor, bpm_calculator]() + { + BPMSection section; + section.bpm = bpm_calculator->fetchApproximatedInfo().BPM; + section.fraction = 2; + section.offset_start = bpm_calculator->getStartingOffset(); + + _editor->insertBPMSection(std::move(section)); + }); + addChild(_button_start); addChild(_button_stop); + addChild(_button_apply); _button_stop->setVisibility(false); } @@ -139,6 +157,6 @@ void BPMCalculatorWidget::setVisibility(bool is_visible) Window::setVisibility(is_visible); bool can_stop = _bpm_calculator->calculating(); - _button_stop->setVisibility(can_stop); - _button_start->setVisibility(!can_stop); + _button_stop->setVisibility(can_stop && is_visible); + _button_start->setVisibility(!can_stop && is_visible); } diff --git a/src/application/widgets/bpmcalculatorwidget.h b/src/application/widgets/bpmcalculatorwidget.h index 2d2f14d..31255fc 100644 --- a/src/application/widgets/bpmcalculatorwidget.h +++ b/src/application/widgets/bpmcalculatorwidget.h @@ -10,6 +10,7 @@ #include class BPMCalculator; +class Editor; class BPMCalculatorWidget : public Window { @@ -25,11 +26,13 @@ public: virtual void setVisibility(bool is_visible = true) override; - void init(); + void init(const std::unique_ptr& _editor); private: std::shared_ptr _button_start; std::shared_ptr _button_stop; + std::shared_ptr _button_apply; + std::shared_ptr _bpm_calculator; std::shared_ptr _slider; diff --git a/src/application/widgets/editorwidget.cpp b/src/application/widgets/editorwidget.cpp index 5d7e060..ef4c64e 100644 --- a/src/application/widgets/editorwidget.cpp +++ b/src/application/widgets/editorwidget.cpp @@ -1,25 +1,25 @@ #include "editorwidget.h" #include "core/editor.h" -EditorWidget::EditorWidget(const std::shared_ptr& editor) : - _editor(editor) +EditorWidget::EditorWidget(Callbacks&& callbacks) : + _input(std::move(callbacks.onInput)), + _update(std::move(callbacks.onUpdate)), + _draw(std::move(callbacks.onDraw)) {} void EditorWidget::input(const sf::Event& event) { - _editor->input(PlayerInput{0, event}); + _input(event); } void EditorWidget::update(const sf::Time& dt) { - _editor->update(dt); + _update(dt); } void EditorWidget::draw(sf::RenderTarget& target, sf::RenderStates states) const { - // !!!!!!!!!!!!!!!!! - (void)target; (void)states; - _editor->draw(); + _draw(target, states); } void EditorWidget::move(const sf::Vector2f& delta) diff --git a/src/application/widgets/editorwidget.h b/src/application/widgets/editorwidget.h index fbb9aa3..0c10b41 100644 --- a/src/application/widgets/editorwidget.h +++ b/src/application/widgets/editorwidget.h @@ -2,12 +2,18 @@ #include "widget.h" -class Editor; - class EditorWidget : public Widget { public: - explicit EditorWidget(const std::shared_ptr& editor); + + struct Callbacks + { + std::function onInput; + std::function onUpdate; + std::function onDraw; + }; + + explicit EditorWidget(Callbacks&& callbacks); virtual void input(const sf::Event& event) override; virtual void update(const sf::Time& dt) override; @@ -22,6 +28,8 @@ public: virtual sf::Vector2f position() const override; private: - std::shared_ptr _editor; + std::function _input; + std::function _update; + std::function _draw; };