project-kyoku/include/core/editor.h

93 lines
2.3 KiB
C
Raw Normal View History

2021-10-05 14:48:28 -04:00
#pragma once
#include <set>
2021-12-29 09:59:18 -05:00
#include <algorithm>
#include "core/gameevent.h"
#include "core/updatedata.h"
2021-10-05 14:48:28 -04:00
#include "core/bpmsection.h"
2021-12-29 09:59:18 -05:00
namespace kku
{
2022-05-07 23:43:12 -04:00
/// Editor
///
/// Functional aggregation of
/// logic for Editor game mode
2021-10-05 14:48:28 -04:00
class Editor
{
public:
virtual ~Editor() = default;
2021-12-29 09:59:18 -05:00
virtual void input(GameEvent&& input) = 0;
virtual void update(UpdateData&& updatedata) = 0;
virtual void display() const = 0;
virtual void recalculate(const microsec& timestamp) = 0;
2021-10-05 14:48:28 -04:00
2021-12-29 09:59:18 -05:00
void setBPMSections(const std::set<BPMSection, BPMSectionComparator>& sections) noexcept
2021-10-05 14:48:28 -04:00
{
_bpm_sections = sections;
}
2021-12-29 09:59:18 -05:00
void setBPMSections(std::set<BPMSection, BPMSectionComparator>&& sections) noexcept
2021-10-05 14:48:28 -04:00
{
_bpm_sections = std::move(sections);
}
bool insertBPMSection(const BPMSection& section)
2021-10-05 14:48:28 -04:00
{
return _bpm_sections.insert(section).second;
2021-10-05 14:48:28 -04:00
}
bool insertBPMSection(BPMSection&& section)
2021-10-05 14:48:28 -04:00
{
2021-12-13 11:52:26 -05:00
return _bpm_sections.insert(section).second;
2021-10-05 14:48:28 -04:00
}
bool removeBPMSectionAt(const microsec& offset)
2021-10-05 14:48:28 -04:00
{
auto section_it = std::find_if(_bpm_sections.rbegin(), _bpm_sections.rend(),
[offset](const auto& section)
{
return section.offset_start < offset;
});
2021-10-05 14:48:28 -04:00
if (section_it != _bpm_sections.rend())
{
++section_it;
_bpm_sections.erase(section_it.base());
2021-10-05 14:48:28 -04:00
return true;
}
return false;
}
BPMSection getBPMSectionAt(const microsec& offset) const
{
auto section_it = std::find_if(_bpm_sections.rbegin(), _bpm_sections.rend(),
[offset](const auto& section)
{
return section.offset_start < offset;
});
if (section_it != _bpm_sections.rend())
{
++section_it;
return *section_it.base();
}
return BPMSection();
}
void clearBPMSections() noexcept
2021-10-05 14:48:28 -04:00
{
_bpm_sections.clear();
}
protected:
2021-12-29 09:59:18 -05:00
std::set<BPMSection, BPMSectionComparator> _bpm_sections;
2021-10-05 14:48:28 -04:00
};
2021-12-29 09:59:18 -05:00
2022-05-07 23:43:12 -04:00
}