[studio/modlib] Add SelectionTracker
This commit is contained in:
parent
dc20c66797
commit
8ee016c130
@ -0,0 +1,90 @@
|
|||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <imgui.h>
|
||||||
|
|
||||||
|
#include <ox/std/math.hpp>
|
||||||
|
#include <ox/std/point.hpp>
|
||||||
|
#include <ox/std/typetraits.hpp>
|
||||||
|
|
||||||
|
namespace studio {
|
||||||
|
|
||||||
|
struct Selection {ox::Point a, b;};
|
||||||
|
|
||||||
|
constexpr auto iterateSelection(studio::Selection const&sel, auto const&cb) {
|
||||||
|
for (auto x = sel.a.x; x <= sel.b.x; ++x) {
|
||||||
|
for (auto y = sel.a.y; y <= sel.b.y; ++y) {
|
||||||
|
if constexpr(ox::is_same_v<decltype(cb(x, y)), ox::Error>) {
|
||||||
|
return cb(x, y);
|
||||||
|
} else {
|
||||||
|
cb(x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class SelectionTracker {
|
||||||
|
private:
|
||||||
|
bool m_selectionOngoing{};
|
||||||
|
ox::Point m_pointA;
|
||||||
|
ox::Point m_pointB;
|
||||||
|
public:
|
||||||
|
[[nodiscard]]
|
||||||
|
constexpr bool selectionOngoing() const noexcept {
|
||||||
|
return m_selectionOngoing;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr void startSelection(ox::Point cursor) noexcept {
|
||||||
|
m_pointA = cursor;
|
||||||
|
m_pointB = cursor;
|
||||||
|
m_selectionOngoing = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr void updateCursorPoint(ox::Point cursor, bool allowStart = true) noexcept {
|
||||||
|
if (!m_selectionOngoing && allowStart) {
|
||||||
|
m_pointA = cursor;
|
||||||
|
m_selectionOngoing = true;
|
||||||
|
}
|
||||||
|
if (m_selectionOngoing) {
|
||||||
|
m_pointB = cursor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr void updateCursorPoint(ox::Vec2 cursor, bool allowStart = true) noexcept {
|
||||||
|
updateCursorPoint(
|
||||||
|
ox::Point{
|
||||||
|
static_cast<int32_t>(cursor.x),
|
||||||
|
static_cast<int32_t>(cursor.y),
|
||||||
|
},
|
||||||
|
allowStart);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr void updateCursorPoint(ImVec2 cursor, bool allowStart = true) noexcept {
|
||||||
|
updateCursorPoint(
|
||||||
|
ox::Point{
|
||||||
|
static_cast<int32_t>(cursor.x),
|
||||||
|
static_cast<int32_t>(cursor.y),
|
||||||
|
},
|
||||||
|
allowStart);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr void finishSelection() noexcept {
|
||||||
|
m_selectionOngoing = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
constexpr Selection selection() const noexcept {
|
||||||
|
return {
|
||||||
|
{
|
||||||
|
ox::min(m_pointA.x, m_pointB.x),
|
||||||
|
ox::min(m_pointA.y, m_pointB.y),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ox::max(m_pointA.x, m_pointB.x),
|
||||||
|
ox::max(m_pointA.y, m_pointB.y),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
@ -4,7 +4,6 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <studio/color.hpp>
|
|
||||||
#include <studio/context.hpp>
|
#include <studio/context.hpp>
|
||||||
#include <studio/editor.hpp>
|
#include <studio/editor.hpp>
|
||||||
#include <studio/filedialog.hpp>
|
#include <studio/filedialog.hpp>
|
||||||
@ -13,6 +12,7 @@
|
|||||||
#include <studio/itemmaker.hpp>
|
#include <studio/itemmaker.hpp>
|
||||||
#include <studio/popup.hpp>
|
#include <studio/popup.hpp>
|
||||||
#include <studio/project.hpp>
|
#include <studio/project.hpp>
|
||||||
|
#include <studio/selectiontracker.hpp>
|
||||||
#include <studio/task.hpp>
|
#include <studio/task.hpp>
|
||||||
#include <studio/undocommand.hpp>
|
#include <studio/undocommand.hpp>
|
||||||
#include <studio/undostack.hpp>
|
#include <studio/undostack.hpp>
|
||||||
|
Loading…
Reference in New Issue
Block a user