infinipaint/src/DrawingProgram/DrawingProgramSelection.hpp

82 lines
2.9 KiB
C++
Raw Normal View History

#pragma once
#include "DrawingProgramCache.hpp"
#include "../CoordSpaceHelperTransform.hpp"
class DrawingProgram;
class DrawingProgramSelection {
public:
DrawingProgramSelection(DrawingProgram& initDrawP);
void add_from_cam_coord_collider_to_selection(const SCollision::ColliderCollection<float>& cC);
2025-08-04 13:30:47 +03:00
void deselect_all(bool readdObjectsToCache = true);
void update();
2025-07-24 19:35:51 +03:00
void draw_components(SkCanvas* canvas, const DrawData& drawData);
void draw_gui(SkCanvas* canvas, const DrawData& drawData);
bool is_something_selected();
2025-07-24 20:36:40 +03:00
bool mouse_collided_with_selection();
2025-07-27 16:30:45 +03:00
void erase_component(const CollabListType::ObjectInfoPtr& objToCheck);
bool is_selected(const CollabListType::ObjectInfoPtr& objToCheck);
const std::unordered_set<CollabListType::ObjectInfoPtr>& get_selected_set();
void invalidate_cache_at_optional_aabb_before_pos(const std::optional<SCollision::AABB<WorldScalar>>& aabb, uint64_t placementToInvalidateAt);
void preupdate_component(const CollabListType::ObjectInfoPtr& objToCheck);
private:
void delete_all();
2025-07-24 20:36:40 +03:00
bool mouse_collided_with_selection_aabb();
bool mouse_collided_with_scale_point();
2025-07-25 10:00:39 +03:00
bool mouse_collided_with_rotate_center_handle_point();
bool mouse_collided_with_rotate_handle_point();
2025-07-28 11:09:59 +03:00
void selection_to_clipboard();
void paste_clipboard();
void set_to_selection(const std::unordered_set<CollabListType::ObjectInfoPtr>& newSelection);
2025-07-24 20:36:40 +03:00
2025-08-04 13:30:47 +03:00
void commit_transform_selection();
void calculate_aabb();
2025-07-25 10:00:39 +03:00
void calculate_initial_rotate_center_location();
2025-07-24 19:35:51 +03:00
void rebuild_cam_space();
2025-07-25 10:00:39 +03:00
Vector2f get_rotation_point_pos_from_angle(double angle);
2025-07-24 19:35:51 +03:00
SCollision::AABB<WorldScalar> initialSelectionAABB;
SCollision::ColliderCollection<float> camSpaceSelection;
2025-07-25 10:00:39 +03:00
std::array<WorldVec, 4> selectionRectPoints;
CoordSpaceHelperTransform selectionTransformCoords;
std::unordered_set<CollabListType::ObjectInfoPtr> selectedSet;
DrawingProgramCache cache;
DrawingProgram& drawP;
2025-07-24 19:35:51 +03:00
2025-07-24 20:36:40 +03:00
enum class TransformOperation {
NONE = 0,
TRANSLATE,
SCALE,
2025-07-25 10:00:39 +03:00
ROTATE_RELOCATE_CENTER,
2025-07-24 20:36:40 +03:00
ROTATE
2025-07-25 10:00:39 +03:00
} transformOpHappening = TransformOperation::NONE;
CoordSpaceHelperTransform startingSelectionTransformCoords;
2025-07-24 20:36:40 +03:00
struct TranslationData {
WorldVec startPos;
} translateData;
2025-07-24 20:36:40 +03:00
struct ScaleData {
WorldVec startPos;
WorldVec centerPos;
WorldVec currentPos;
Vector2f handlePoint;
} scaleData;
2025-07-25 10:00:39 +03:00
struct RotationData {
WorldVec centerPos;
Vector2f centerHandlePoint;
Vector2f handlePoint;
double rotationAngle = 0.0;
2025-07-25 10:00:39 +03:00
} rotateData;
void reset_selection_data();
void reset_transform_data();
};