infinipaint/src/DrawingProgram/DrawingProgram.hpp

152 lines
6.2 KiB
C++
Raw Normal View History

2025-07-06 20:43:53 +03:00
#pragma once
#include "../DrawData.hpp"
#include "DrawingProgramCache.hpp"
#include "Tools/GridModifyTool.hpp"
#include <Helpers/NetworkingObjects/NetObjWeakPtr.hpp>
#include "Tools/PanCanvasTool.hpp"
#include "Tools/ZoomCanvasTool.hpp"
2025-07-06 20:43:53 +03:00
#include "cereal/archives/portable_binary.hpp"
#include <include/core/SkCanvas.h>
#include <include/core/SkPath.h>
#include <include/core/SkVertices.h>
#include <Helpers/SCollision.hpp>
#include <Helpers/Hashes.hpp>
#include <Helpers/Random.hpp>
#include "Tools/DrawingProgramToolBase.hpp"
#include <Helpers/FileDownloader.hpp>
#include <Helpers/NetworkingObjects/NetObjOrderedList.hpp>
2025-12-25 17:18:28 +03:00
#include "Layers/DrawingProgramLayerManager.hpp"
#include "DrawingProgramSelection.hpp"
2025-07-06 20:43:53 +03:00
class World;
class DrawingProgram {
public:
DrawingProgram(World& initWorld);
2026-01-01 22:46:02 +03:00
void server_init_no_file();
2025-07-06 20:43:53 +03:00
void toolbar_gui();
void tool_options_gui();
2025-12-01 17:33:14 +03:00
bool right_click_popup_gui(Vector2f popupPos);
2025-07-06 20:43:53 +03:00
void update();
void scale_up(const WorldScalar& scaleUpAmount);
2025-07-06 20:43:53 +03:00
void draw(SkCanvas* canvas, const DrawData& drawData);
2025-12-15 16:49:51 +03:00
void write_components_server(cereal::PortableBinaryOutputArchive& a);
void read_components_client(cereal::PortableBinaryInputArchive& a);
2025-12-31 11:42:16 +03:00
void init_server_callbacks();
void init_client_callbacks();
2025-12-16 12:54:12 +03:00
void add_file_to_canvas_by_path(const std::filesystem::path& filePath, Vector2f dropPos, bool addInSameThread);
2026-01-06 19:06:44 +03:00
CanvasComponentContainer::ObjInfo* add_file_to_canvas_by_data(const std::string& fileName, std::string_view fileBuffer, Vector2f dropPos);
2026-01-01 23:28:26 +03:00
void get_used_resources(std::unordered_set<NetworkingObjects::NetObjID>& resourceSet);
2025-12-16 12:54:12 +03:00
void load_file(cereal::PortableBinaryInputArchive& a, VersionNumber version);
2025-11-16 16:39:12 +03:00
void save_file(cereal::PortableBinaryOutputArchive& a) const;
2025-07-06 20:43:53 +03:00
World& world;
bool prevent_undo_or_redo();
DrawingProgramCache drawCache;
2025-12-25 17:18:28 +03:00
DrawingProgramLayerManager layerMan;
2025-07-20 15:24:44 +03:00
2025-07-06 20:43:53 +03:00
Vector4f* get_foreground_color_ptr();
void switch_to_tool(DrawingProgramToolType newToolType, bool force = false);
void switch_to_tool_ptr(std::unique_ptr<DrawingProgramToolBase> newTool);
void modify_grid(const NetworkingObjects::NetObjWeakPtr<WorldGrid>& gridToModify);
2025-09-28 11:59:08 +03:00
void invalidate_cache_at_component(CanvasComponentContainer::ObjInfo* objToCheck);
void preupdate_component(CanvasComponentContainer::ObjInfo* objToCheck);
2025-12-31 11:42:16 +03:00
void send_transforms_for(const std::vector<CanvasComponentContainer::ObjInfo*>& objsToSendTransformsFor);
2025-07-06 20:43:53 +03:00
private:
2025-12-31 11:42:16 +03:00
void process_transform_message(const std::vector<std::pair<NetworkingObjects::NetObjID, CoordSpaceHelper>>& transforms);
2025-12-16 12:54:12 +03:00
void drag_drop_update();
void add_file_to_canvas_by_path_execute(const std::filesystem::path& filePath, Vector2f dropPos);
void check_updateable_components();
void update_downloading_dropped_files();
std::optional<std::chrono::steady_clock::time_point> badFrametimeTimePoint;
std::optional<std::chrono::steady_clock::time_point> unorderedObjectsExistTimePoint;
2025-12-01 17:33:14 +03:00
bool selection_action_menu(Vector2f popupPos);
void rebuild_cache();
std::atomic<bool> addFileInNextFrame = false;
2025-11-21 10:03:11 +03:00
std::pair<std::filesystem::path, Vector2f> addFileInfo;
float drag_point_radius();
2025-07-06 20:43:53 +03:00
void draw_drag_circle(SkCanvas* canvas, const Vector2f& pos, const SkColor4f& c, const DrawData& drawData, float radiusMultiplier = 1.0f);
2025-08-02 12:31:16 +03:00
SkPaint select_tool_line_paint();
bool is_actual_selection_tool(DrawingProgramToolType typeToCheck);
bool is_selection_allowing_tool(DrawingProgramToolType typeToCheck);
2025-08-02 12:31:16 +03:00
DrawingProgramSelection selection;
std::unique_ptr<DrawingProgramToolBase> toolToSwitchToAfterUpdate;
std::unordered_set<CanvasComponentContainer::ObjInfo*> updateableComponents;
2026-01-07 10:34:51 +03:00
void tool_temporary_switch_update();
enum class TemporaryMoveToolSwitch {
NONE,
PAN,
ZOOM
};
2025-07-06 20:43:53 +03:00
bool temporaryEraser = false;
2026-01-07 10:34:51 +03:00
TemporaryMoveToolSwitch tempMoveToolSwitch = TemporaryMoveToolSwitch::NONE;
DrawingProgramToolType toolTypeAfterTempMove;
2025-07-06 20:43:53 +03:00
struct GlobalControls {
float relativeWidth = 15.0f;
Vector4f foregroundColor{1.0f, 1.0f, 1.0f, 1.0f};
2025-07-06 20:43:53 +03:00
Vector4f backgroundColor{0.0f, 0.0f, 0.0f, 1.0f};
WorldVec previousMouseWorldPos = {0, 0};
WorldVec currentMouseWorldPos = {0, 0};
bool leftClick = false;
bool leftClickHeld = false;
bool leftClickReleased = false;
2025-09-28 11:59:08 +03:00
bool middleClick = false;
bool middleClickHeld = false;
bool middleClickReleased = false;
2025-07-06 20:43:53 +03:00
bool cursorHoveringOverCanvas = false;
DrawingProgramLayerManager::LayerSelector layerSelector = DrawingProgramLayerManager::LayerSelector::LAYER_BEING_EDITED;
2025-07-06 20:43:53 +03:00
int colorEditing = 0;
} controls;
2025-12-16 12:54:12 +03:00
struct DroppedDownloadingFile {
CanvasComponentContainer::ObjInfo* comp;
2025-12-16 12:54:12 +03:00
Vector2f windowSizeWhenDropped;
std::shared_ptr<FileDownloader::DownloadData> downData;
};
std::vector<DroppedDownloadingFile> droppedDownloadingFiles;
2025-09-28 11:59:08 +03:00
std::unique_ptr<DrawingProgramToolBase> drawTool;
2025-07-06 20:43:53 +03:00
uint32_t nextID = 0;
2025-08-05 12:11:50 +03:00
friend class EyeDropperTool;
2025-07-06 20:43:53 +03:00
friend class RectDrawTool;
friend class EllipseDrawTool;
friend class BrushTool;
friend class EraserTool;
friend class RectSelectTool;
friend class TextBoxTool;
friend class ScreenshotTool;
friend class EditTool;
2025-08-02 20:10:33 +03:00
friend class ImageEditTool;
friend class RectDrawEditTool;
friend class EllipseDrawEditTool;
friend class TextBoxEditTool;
2025-07-20 15:24:44 +03:00
friend class DrawingProgramCache;
2025-07-24 19:35:51 +03:00
friend class DrawingProgramSelection;
2025-08-02 12:31:16 +03:00
friend class LassoSelectTool;
friend class GridEditTool;
friend class GridModifyTool;
2025-09-28 11:59:08 +03:00
friend class ZoomCanvasTool;
2025-09-28 15:00:19 +03:00
friend class PanCanvasTool;
2025-09-28 11:59:08 +03:00
friend class DrawCamera;
friend class DrawingProgramLayerManager;
friend class DrawingProgramLayer;
friend class DrawingProgramLayerFolder;
2025-07-06 20:43:53 +03:00
};