#pragma once #include #include "../DrawData.hpp" #include #include "../CoordSpaceHelper.hpp" #include "../DrawComponents/DrawComponent.hpp" class DrawingProgram; class RectSelectTool { public: RectSelectTool(DrawingProgram& initDrawP); void gui_toolbox(); void tool_update(); void draw(SkCanvas* canvas, const DrawData& drawData); void reset_tool(); void paste_clipboard(); private: struct RectSelectControls { int selectionMode = 0; Vector2f selectStartAt; CoordSpaceHelper coords; WorldVec moveStartAt; SCollision::AABB finalSelectionAABB; std::array newT; WorldVec scaleStartAt; WorldVec scaleCenterPoint; WorldVec scaleCurrentPoint; WorldVec rotationCenter; // Temporary, per frame colliders for handles Vector2f rotationPoint; SCollision::Circle scaleSelectionCircle; SCollision::Circle rotationCenterCircle; SCollision::Circle rotationPointCircle; double rotationPointAngle; struct SelectedItemInfo { std::shared_ptr comp; ServerClientID id; CoordSpaceHelper oldCoords; }; std::vector selectedItems; } controls; void selection_to_clipboard(); Vector2f get_rotation_point_pos_from_angle(double angle); void update_drag_circles(); void set_selected_items(); bool create_selection_aabb(); void commit_transformation(); DrawingProgram& drawP; };