forked from NaiJi/project-kyoku
Implement selection functions for graphics managers
This commit is contained in:
parent
4b91146c33
commit
1953d2339d
|
@ -33,7 +33,7 @@ std::unique_ptr<kku::Editor> classic::getEditor(const std::shared_ptr<kku::CoreF
|
||||||
|
|
||||||
const auto factory = std::make_shared<ClassicGraphicsFactory>(core_factory);
|
const auto factory = std::make_shared<ClassicGraphicsFactory>(core_factory);
|
||||||
const auto timeline = std::make_shared<kku::Timeline<ClassicNote>>();
|
const auto timeline = std::make_shared<kku::Timeline<ClassicNote>>();
|
||||||
const auto selection_manager = std::make_shared<SelectionManager<ClassicNote>>();
|
const auto selection_manager = std::make_shared<SelectionManager>();
|
||||||
std::vector<std::shared_ptr<ClassicGraphicsManager>> graphics_managers;
|
std::vector<std::shared_ptr<ClassicGraphicsManager>> graphics_managers;
|
||||||
graphics_managers.emplace_back(std::make_shared<ClassicSceneGraphicsManager>(timeline, factory, visibility_offset));
|
graphics_managers.emplace_back(std::make_shared<ClassicSceneGraphicsManager>(timeline, factory, visibility_offset));
|
||||||
graphics_managers.emplace_back(std::make_shared<ClassicTimelineGraphicsManager>(timeline, factory, visibility_offset * 2));
|
graphics_managers.emplace_back(std::make_shared<ClassicTimelineGraphicsManager>(timeline, factory, visibility_offset * 2));
|
||||||
|
|
|
@ -45,6 +45,7 @@ ClassicEditor::ClassicEditor(const std::shared_ptr<kku::Timeline<ClassicNote>>&
|
||||||
|
|
||||||
element.position = kku::Point(x, 390.f);
|
element.position = kku::Point(x, 390.f);
|
||||||
element.falling_curve_interpolation = {};
|
element.falling_curve_interpolation = {};
|
||||||
|
element.id = 0;
|
||||||
|
|
||||||
element.keys = {kku::SystemEvent::Key::Code::W,
|
element.keys = {kku::SystemEvent::Key::Code::W,
|
||||||
kku::SystemEvent::Key::Code::Up};
|
kku::SystemEvent::Key::Code::Up};
|
||||||
|
@ -112,7 +113,6 @@ void ClassicEditor::input(kku::GameEvent&& input)
|
||||||
|
|
||||||
switch (input.event.type)
|
switch (input.event.type)
|
||||||
{
|
{
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -167,8 +167,6 @@ void ClassicEditor::input(kku::GameEvent&& input)
|
||||||
if (!_context->getSelectionManager()->isMultiselectionEnabled())
|
if (!_context->getSelectionManager()->isMultiselectionEnabled())
|
||||||
_context->getSelectionManager()->discard();
|
_context->getSelectionManager()->discard();
|
||||||
|
|
||||||
//_graphics_manager->input(std::move(input));
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include "graphics/classicgraphicsmanager.h"
|
#include "graphics/classicgraphicsmanager.h"
|
||||||
#include "graphics/classicnotegraphics.h"
|
#include "graphics/classicnotegraphics.h"
|
||||||
|
|
||||||
EditorContext::EditorContext(const std::shared_ptr<SelectionManager<ClassicNote>>& selection_manager,
|
EditorContext::EditorContext(const std::shared_ptr<SelectionManager>& selection_manager,
|
||||||
std::vector<std::shared_ptr<ClassicGraphicsManager>>&& graphics_managers) :
|
std::vector<std::shared_ptr<ClassicGraphicsManager>>&& graphics_managers) :
|
||||||
_selection_manager(selection_manager),
|
_selection_manager(selection_manager),
|
||||||
_graphics_managers(std::move(graphics_managers))
|
_graphics_managers(std::move(graphics_managers))
|
||||||
|
@ -12,40 +12,26 @@ EditorContext::EditorContext(const std::shared_ptr<SelectionManager<ClassicNote>
|
||||||
|
|
||||||
void EditorContext::input(ClassicArrowNote *note, kku::GameEvent&& input) const
|
void EditorContext::input(ClassicArrowNote *note, kku::GameEvent&& input) const
|
||||||
{
|
{
|
||||||
(void)note;
|
|
||||||
switch (input.event.type)
|
switch (input.event.type)
|
||||||
{
|
{
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/*case kku::SystemEvent::Type::MousePress:
|
case kku::SystemEvent::Type::MousePress:
|
||||||
{
|
{
|
||||||
bool selection_changed = false;
|
const auto clicked_position = std::get<kku::SystemEvent::Mouse>(input.event.data).position;
|
||||||
std::size_t amount_selected = 0;
|
|
||||||
|
|
||||||
const auto position = std::get<kku::SystemEvent::Mouse>(input.event.data).position;
|
|
||||||
for (auto& element : note->getElements())
|
for (auto& element : note->getElements())
|
||||||
{
|
{
|
||||||
if (element.sprite->getRectangle()->contains(position))
|
if (element.sprite->getRectangle()->contains(clicked_position))
|
||||||
{
|
{
|
||||||
element.selected = !element.selected;
|
if (_selection_manager->isSelected(note->getId(), element.id))
|
||||||
selection_changed = true;
|
_selection_manager->remove(note->getId(), element.id);
|
||||||
if (element.selected)
|
|
||||||
++amount_selected;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (selection_changed)
|
|
||||||
{
|
|
||||||
if (amount_selected > 0)
|
|
||||||
_selection_manager->fetch(note);
|
|
||||||
else
|
else
|
||||||
_selection_manager->remove(note);
|
_selection_manager->fetch(note->getId(), element.id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}*/
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -56,7 +42,8 @@ void EditorContext::update(ClassicArrowNote *note, const kku::microsec& music_of
|
||||||
|
|
||||||
switch (note->getState())
|
switch (note->getState())
|
||||||
{
|
{
|
||||||
default: return;
|
default:
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ClassicArrowNote::State::INITIAL:
|
case ClassicArrowNote::State::INITIAL:
|
||||||
|
@ -89,7 +76,7 @@ void EditorContext::update(ClassicArrowNote *note, const kku::microsec& music_of
|
||||||
element.animations[note->getState()]->update(music_offset);
|
element.animations[note->getState()]->update(music_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<SelectionManager<ClassicNote>> EditorContext::getSelectionManager() const
|
std::shared_ptr<SelectionManager> EditorContext::getSelectionManager() const
|
||||||
{
|
{
|
||||||
return _selection_manager;
|
return _selection_manager;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ class ClassicGraphicsManager;
|
||||||
class EditorContext : public Context
|
class EditorContext : public Context
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit EditorContext(const std::shared_ptr<SelectionManager<ClassicNote>>& selection_manager,
|
explicit EditorContext(const std::shared_ptr<SelectionManager>& selection_manager,
|
||||||
std::vector<std::shared_ptr<ClassicGraphicsManager>>&& graphics_managers);
|
std::vector<std::shared_ptr<ClassicGraphicsManager>>&& graphics_managers);
|
||||||
|
|
||||||
virtual void input(ClassicArrowNote *note, kku::GameEvent&& input) const override;
|
virtual void input(ClassicArrowNote *note, kku::GameEvent&& input) const override;
|
||||||
|
@ -21,9 +21,9 @@ public:
|
||||||
void updateGraphics(const kku::microsec& music_offset);
|
void updateGraphics(const kku::microsec& music_offset);
|
||||||
void displayGraphics() const;
|
void displayGraphics() const;
|
||||||
|
|
||||||
std::shared_ptr<SelectionManager<ClassicNote>> getSelectionManager() const;
|
std::shared_ptr<SelectionManager> getSelectionManager() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const std::shared_ptr<SelectionManager<ClassicNote>> _selection_manager;
|
const std::shared_ptr<SelectionManager> _selection_manager;
|
||||||
const std::vector<std::shared_ptr<ClassicGraphicsManager>> _graphics_managers;
|
const std::vector<std::shared_ptr<ClassicGraphicsManager>> _graphics_managers;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,50 +1,53 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
template <class T>
|
|
||||||
class SelectionManager
|
class SelectionManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SelectionManager() :
|
explicit SelectionManager() :
|
||||||
_multiselection_enabled(false)
|
_multiselection_enabled(false)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void discard()
|
void discard()
|
||||||
{
|
{
|
||||||
_selected_things.clear();
|
_selected_ids.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void fetch(T * const thing)
|
void fetch(int note_id, int element_id)
|
||||||
{
|
{
|
||||||
bool already_there = std::any_of(_selected_things.begin(), _selected_things.end(),
|
if (!isSelected(note_id, element_id))
|
||||||
[&thing](const auto& selected_thing)
|
_selected_ids[note_id].emplace_back(element_id);
|
||||||
{
|
|
||||||
return thing == selected_thing;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!already_there)
|
|
||||||
_selected_things.emplace_back(thing);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void remove(T * const thing)
|
void remove(int note_id, int element_id)
|
||||||
{
|
{
|
||||||
for (std::size_t i = 0; i < _selected_things.size(); ++i)
|
if (_selected_ids.count(note_id) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto& elements_ids = _selected_ids[note_id];
|
||||||
|
|
||||||
|
for (std::size_t i = 0; i < elements_ids.size(); ++i)
|
||||||
{
|
{
|
||||||
if (thing == _selected_things.at(i))
|
if (element_id == elements_ids.at(i))
|
||||||
{
|
{
|
||||||
_selected_things[i] = std::move(_selected_things.back());
|
elements_ids[i] = std::move(elements_ids.back());
|
||||||
_selected_things.pop_back();
|
elements_ids.pop_back();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isSelected(const T * const thing) const
|
bool isSelected(int note_id, int element_id) const
|
||||||
{
|
{
|
||||||
for (const auto& selected_thing : thing)
|
if (_selected_ids.count(note_id) == 0)
|
||||||
if (thing == selected_thing)
|
return false;
|
||||||
|
|
||||||
|
const std::vector<int>& selected_elements = _selected_ids.at(note_id);
|
||||||
|
for (const auto& selected_element : selected_elements)
|
||||||
|
if (selected_element == element_id)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -60,13 +63,7 @@ public:
|
||||||
return _multiselection_enabled;
|
return _multiselection_enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
void apply(const std::function<void(T*)>& function)
|
|
||||||
{
|
|
||||||
for (auto& thing : _selected_things)
|
|
||||||
function(thing);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<T*> _selected_things;
|
std::map<int, std::vector<int>> _selected_ids;
|
||||||
bool _multiselection_enabled;
|
bool _multiselection_enabled;
|
||||||
};
|
};
|
||||||
|
|
|
@ -10,10 +10,12 @@
|
||||||
#include <array>
|
#include <array>
|
||||||
|
|
||||||
class ClassicNoteGraphics;
|
class ClassicNoteGraphics;
|
||||||
|
class ClassicSelectionGraphics;
|
||||||
class ClassicAnimationScenario;
|
class ClassicAnimationScenario;
|
||||||
|
|
||||||
struct ArrowElement
|
struct ArrowElement
|
||||||
{
|
{
|
||||||
|
std::shared_ptr<ClassicSelectionGraphics> selection;
|
||||||
std::shared_ptr<ClassicNoteGraphics> sprite;
|
std::shared_ptr<ClassicNoteGraphics> sprite;
|
||||||
std::array<std::shared_ptr<ClassicAnimationScenario>, 5> animations;
|
std::array<std::shared_ptr<ClassicAnimationScenario>, 5> animations;
|
||||||
|
|
||||||
|
@ -24,6 +26,7 @@ struct ArrowElement
|
||||||
std::array<kku::SystemEvent::Key::Code, 2> keys;
|
std::array<kku::SystemEvent::Key::Code, 2> keys;
|
||||||
Type type = Type::NONE;
|
Type type = Type::NONE;
|
||||||
bool pressed = false;
|
bool pressed = false;
|
||||||
|
int id = 0;
|
||||||
|
|
||||||
// Each note may consist of several buttons.
|
// Each note may consist of several buttons.
|
||||||
// For example, ↑ → or ↓ → ←
|
// For example, ↑ → or ↓ → ←
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
class ClassicArrowNote;
|
class ClassicArrowNote;
|
||||||
|
class SelectionManager;
|
||||||
class ArrowElement;
|
class ArrowElement;
|
||||||
// class ClassicSliderNote;
|
// class ClassicSliderNote;
|
||||||
|
|
||||||
|
@ -22,11 +23,14 @@ public:
|
||||||
virtual void display() const = 0;
|
virtual void display() const = 0;
|
||||||
virtual void update(const kku::microsec& offset) = 0;
|
virtual void update(const kku::microsec& offset) = 0;
|
||||||
|
|
||||||
|
virtual void switchSelection(ArrowElement* element) = 0;
|
||||||
|
|
||||||
virtual void update(const kku::microsec& offset, ClassicArrowNote* note) = 0;
|
virtual void update(const kku::microsec& offset, ClassicArrowNote* note) = 0;
|
||||||
// virtual void update(const kku::microsec& offset, ClassicSliderNote* note) = 0;
|
// virtual void update(const kku::microsec& offset, ClassicSliderNote* note) = 0;
|
||||||
|
|
||||||
virtual void draw(const ClassicArrowNote * const note) const = 0;
|
virtual void draw(const ClassicArrowNote * const note) const = 0;
|
||||||
// virtual void draw(ClassicSliderNote* note) const = 0;
|
// virtual void draw(ClassicSliderNote* note) const = 0;
|
||||||
|
virtual void draw(const std::shared_ptr<SelectionManager>& selection_manager) const = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
kku::microsec _visibility_offset;
|
kku::microsec _visibility_offset;
|
||||||
|
|
|
@ -84,6 +84,17 @@ void ClassicSceneGraphicsManager::draw(const ClassicArrowNote * const note) cons
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClassicSceneGraphicsManager::switchSelection(ArrowElement* element)
|
||||||
|
{
|
||||||
|
if (element->selection)
|
||||||
|
element->selection->reset();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
element->selection = _factory->createSelection();
|
||||||
|
element->selection->adjustTo(element->sprite);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ClassicSceneGraphicsManager::setGraphics(std::vector<ArrowElement>& elements, kku::TimeRange&& range)
|
void ClassicSceneGraphicsManager::setGraphics(std::vector<ArrowElement>& elements, kku::TimeRange&& range)
|
||||||
{
|
{
|
||||||
for (auto& element : elements)
|
for (auto& element : elements)
|
||||||
|
|
|
@ -25,10 +25,12 @@ public:
|
||||||
virtual void update(const kku::microsec& offset, ClassicArrowNote* note) override;
|
virtual void update(const kku::microsec& offset, ClassicArrowNote* note) override;
|
||||||
virtual void draw(const ClassicArrowNote * const note) const override;
|
virtual void draw(const ClassicArrowNote * const note) const override;
|
||||||
|
|
||||||
|
virtual void switchSelection(ArrowElement* element) override;
|
||||||
|
virtual void draw(const std::shared_ptr<SelectionManager>& selection_manager) const override;
|
||||||
|
|
||||||
void setGraphics(std::vector<ArrowElement>& elements, kku::TimeRange&& range);
|
void setGraphics(std::vector<ArrowElement>& elements, kku::TimeRange&& range);
|
||||||
void removeGraphics(std::vector<ArrowElement>& elements);
|
void removeGraphics(std::vector<ArrowElement>& elements);
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
kku::SpriteContainer<Type, ClassicGraphicsFactory, ClassicNoteGraphics> _sprite_container;
|
kku::SpriteContainer<Type, ClassicGraphicsFactory, ClassicNoteGraphics> _sprite_container;
|
||||||
const std::shared_ptr<const ClassicGraphicsFactory> _factory;
|
const std::shared_ptr<const ClassicGraphicsFactory> _factory;
|
||||||
|
|
|
@ -25,6 +25,9 @@ public:
|
||||||
virtual void update(const kku::microsec& offset, ClassicArrowNote* note) override;
|
virtual void update(const kku::microsec& offset, ClassicArrowNote* note) override;
|
||||||
virtual void draw(const ClassicArrowNote * const note) const override;
|
virtual void draw(const ClassicArrowNote * const note) const override;
|
||||||
|
|
||||||
|
virtual void switchSelection(ArrowElement* element) override;
|
||||||
|
virtual void draw(const std::shared_ptr<SelectionManager>& selection_manager) const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
kku::SpriteContainer<Type, ClassicGraphicsFactory, ClassicNoteGraphics> _sprite_container;
|
kku::SpriteContainer<Type, ClassicGraphicsFactory, ClassicNoteGraphics> _sprite_container;
|
||||||
const std::shared_ptr<const ClassicGraphicsFactory> _factory;
|
const std::shared_ptr<const ClassicGraphicsFactory> _factory;
|
||||||
|
|
Loading…
Reference in New Issue