From b2fe1ab7ba0d7dd53b4dccfc752c58b33e5bf459 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Sat, 11 Apr 2026 16:36:24 +0300 Subject: [PATCH] Improved custom event code and fixed some warnings --- src/CustomEvents.cpp | 59 +++-------------- src/CustomEvents.hpp | 63 ++++++++++++------- src/DrawingProgram/DrawingProgram.cpp | 40 ++++++------ src/DrawingProgram/DrawingProgram.hpp | 9 +-- .../DrawingProgramSelection.cpp | 43 ++++--------- .../DrawingProgramSelection.hpp | 2 +- src/DrawingProgram/Tools/BrushTool.cpp | 3 - src/DrawingProgram/Tools/BrushTool.hpp | 1 - .../Tools/DrawingProgramToolBase.cpp | 2 +- .../Tools/DrawingProgramToolBase.hpp | 2 +- src/DrawingProgram/Tools/EditTool.cpp | 4 +- src/DrawingProgram/Tools/EditTool.hpp | 2 +- .../Tools/EditTools/BrushEditTool.cpp | 1 + .../Tools/EditTools/BrushEditTool.hpp | 1 - .../EditTools/DrawingProgramEditToolBase.cpp | 2 +- .../EditTools/DrawingProgramEditToolBase.hpp | 2 +- .../Tools/EditTools/EllipseDrawEditTool.cpp | 1 - .../Tools/EditTools/ImageEditTool.cpp | 1 - .../Tools/EditTools/RectDrawEditTool.cpp | 1 - .../Tools/EditTools/TextBoxEditTool.cpp | 7 +-- .../Tools/EditTools/TextBoxEditTool.hpp | 2 +- src/DrawingProgram/Tools/EllipseDrawTool.cpp | 1 - src/DrawingProgram/Tools/EraserTool.cpp | 1 - src/DrawingProgram/Tools/EraserTool.hpp | 1 - src/DrawingProgram/Tools/EyeDropperTool.cpp | 1 - src/DrawingProgram/Tools/GridModifyTool.cpp | 2 - src/DrawingProgram/Tools/LassoSelectTool.cpp | 2 - src/DrawingProgram/Tools/LineDrawTool.cpp | 2 - src/DrawingProgram/Tools/PanCanvasTool.cpp | 1 - src/DrawingProgram/Tools/RectDrawTool.cpp | 1 - src/DrawingProgram/Tools/RectSelectTool.cpp | 1 - src/DrawingProgram/Tools/ScreenshotTool.cpp | 2 - src/DrawingProgram/Tools/TextBoxTool.cpp | 3 - src/DrawingProgram/Tools/ZoomCanvasTool.cpp | 1 - src/GUIHolder.cpp | 2 +- src/GUIHolder.hpp | 2 +- src/GUIStuff/Elements/Element.cpp | 2 +- src/GUIStuff/Elements/Element.hpp | 2 +- src/GUIStuff/Elements/TextBox.decl.hpp | 2 +- src/GUIStuff/Elements/TextBox.impl.hpp | 2 +- src/GUIStuff/GUIManager.cpp | 2 +- src/GUIStuff/GUIManager.hpp | 2 +- src/InputManager.cpp | 44 ++++++++----- src/InputManager.hpp | 9 +-- src/MainProgram.cpp | 14 +++-- src/MainProgram.hpp | 8 ++- src/RichTextUserInput.cpp | 6 +- src/RichTextUserInput.hpp | 2 +- src/Toolbar.cpp | 37 +++++------ src/World.cpp | 9 ++- src/World.hpp | 5 +- src/main.cpp | 16 +++-- 52 files changed, 193 insertions(+), 240 deletions(-) diff --git a/src/CustomEvents.cpp b/src/CustomEvents.cpp index cbc7c7f..7e2d3fe 100644 --- a/src/CustomEvents.cpp +++ b/src/CustomEvents.cpp @@ -5,64 +5,25 @@ namespace CustomEvents { +std::queue eventDataQueue; + bool alreadyInitialized = false; void init() { if(!alreadyInitialized) { - PASTE_EVENT = SDL_RegisterEvents(1); - OPEN_INFINIPAINT_FILE_EVENT = SDL_RegisterEvents(1); + PasteEvent::EVENT_NUM = SDL_RegisterEvents(1); + OpenInfiniPaintFileEvent::EVENT_NUM = SDL_RegisterEvents(1); + AddFileToCanvasEvent::EVENT_NUM = SDL_RegisterEvents(1); alreadyInitialized = true; } } - -// Paste event - -uint32_t PASTE_EVENT; -std::queue pasteEventData; - -bool emit_paste_event(const PasteEventData& pasteData) { - SDL_Event event; - SDL_zero(event); - event.type = PASTE_EVENT; - if(SDL_PushEvent(&event)) { - pasteEventData.push(pasteData); - return true; - } - return false; +void pop_event() { + eventDataQueue.pop(); } -const PasteEventData& get_paste_event_data() { - return pasteEventData.front(); -} - -void pop_paste_event_data() { - pasteEventData.pop(); -} - - -// Open InfiniPaint file event - -uint32_t OPEN_INFINIPAINT_FILE_EVENT; -std::queue openInfiniPaintFileEventData; - -bool emit_open_infinipaint_file_event(const OpenInfiniPaintFileEventData& openData) { - SDL_Event event; - SDL_zero(event); - event.type = OPEN_INFINIPAINT_FILE_EVENT; - if(SDL_PushEvent(&event)) { - openInfiniPaintFileEventData.push(openData); - return true; - } - return false; -} - -const OpenInfiniPaintFileEventData& get_open_infinipaint_file_event_data() { - return openInfiniPaintFileEventData.front(); -} - -void pop_open_infinipaint_file_event_data() { - openInfiniPaintFileEventData.pop(); -} +uint32_t PasteEvent::EVENT_NUM; +uint32_t OpenInfiniPaintFileEvent::EVENT_NUM; +uint32_t AddFileToCanvasEvent::EVENT_NUM; } diff --git a/src/CustomEvents.hpp b/src/CustomEvents.hpp index c8aee0b..a3f948f 100644 --- a/src/CustomEvents.hpp +++ b/src/CustomEvents.hpp @@ -2,33 +2,46 @@ #include #include #include +#include +#include +#include #include "RichText/TextBox.hpp" namespace CustomEvents { void init(); - // Paste event - enum class PasteEventDataType { - TEXT, - IMAGE - }; - struct PasteEventData { - PasteEventDataType type; + extern std::queue eventDataQueue; + + template bool emit_event(const T& data) { + SDL_Event event; + SDL_zero(event); + event.type = T::EVENT_NUM; + if(SDL_PushEvent(&event)) { + eventDataQueue.push(data); + return true; + } + return false; + } + + template const T& get_event() { + return std::any_cast(eventDataQueue.front()); + } + + void pop_event(); + + struct PasteEvent { + static uint32_t EVENT_NUM; + enum class DataType { + TEXT, + IMAGE + } type; std::string data; std::optional richText; std::optional mousePos; }; - bool emit_paste_event(const PasteEventData& pasteData); - const PasteEventData& get_paste_event_data(); - void pop_paste_event_data(); - - extern uint32_t PASTE_EVENT; - - - // Open InfiniPaint file event - - struct OpenInfiniPaintFileEventData { + struct OpenInfiniPaintFileEvent { + static uint32_t EVENT_NUM; bool isClient; std::optional filePathSource; std::string netSource; @@ -36,9 +49,15 @@ namespace CustomEvents { std::string_view fileDataBuffer; }; - bool emit_open_infinipaint_file_event(const OpenInfiniPaintFileEventData& openData); - const OpenInfiniPaintFileEventData& get_open_infinipaint_file_event_data(); - void pop_open_infinipaint_file_event_data(); - - extern uint32_t OPEN_INFINIPAINT_FILE_EVENT; + struct AddFileToCanvasEvent { + static uint32_t EVENT_NUM; + enum class Type { + BUFFER, + PATH + } type; + std::string name; + std::string buffer; + std::filesystem::path filePath; + Vector2f pos; + }; } diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index ae5d778..525e303 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -58,16 +58,19 @@ void DrawingProgram::on_tab_out() { controls.middleClickHeld = false; } -void DrawingProgram::input_paste_callback(const CustomEvents::PasteEventData& paste) { - drawTool->input_paste_callback(paste); +void DrawingProgram::input_paste_callback(const CustomEvents::PasteEvent& paste) { + if(paste.type == CustomEvents::PasteEvent::DataType::IMAGE) + selection.paste_image_process_event(paste); + else + drawTool->input_paste_callback(paste); } void DrawingProgram::input_drop_file_callback(const InputManager::DropCallbackArgs& drop) { if(std::filesystem::is_regular_file(drop.data)) { #ifdef __EMSCRIPTEN_ - add_file_to_canvas_by_path(drop.data, world.main.input.mouse.pos, true); + add_file_to_canvas_by_path(drop.data, world.main.input.mouse.pos); #else - add_file_to_canvas_by_path(drop.data, drop.pos, true); + add_file_to_canvas_by_path(drop.data, drop.pos); #endif } } @@ -422,7 +425,10 @@ void DrawingProgram::popup_menu_action_button(const char* id, const char* text, .drawType = GUIStuff::SelectableButton::DrawType::TRANSPARENT_ALL, .wide = true, .centered = false, - .onClick = onClick + .onClick = [&, onClick] { + onClick(); + clear_right_click_popup(); + } }); } @@ -442,7 +448,9 @@ void DrawingProgram::selection_action_menu(Vector2f popupPos) { }); popup_menu_action_button("Paste Image", "Paste Image", [&, popupPos] { selection.deselect_all(); - selection.paste_image(popupPos * world.main.g.final_gui_scale()); + world.main.input.call_paste(CustomEvents::PasteEvent::DataType::IMAGE, { + .pastePosition = popupPos * world.main.g.final_gui_scale() + }); }); if(selection.is_something_selected()) { popup_menu_action_button("Copy", "Copy", [&] { @@ -463,8 +471,8 @@ void DrawingProgram::selection_action_menu(Vector2f popupPos) { }); } }, LayoutElement::Callbacks{ - .mouseButton = [&](LayoutElement*, const InputManager::MouseButtonCallbackArgs& button) { - if(button.down && button.button != InputManager::MouseButton::RIGHT) + .mouseButton = [&](LayoutElement* l, const InputManager::MouseButtonCallbackArgs& button) { + if(button.down && button.button != InputManager::MouseButton::RIGHT && !l->mouseHovering) clear_right_click_popup(); } }); @@ -510,11 +518,6 @@ void DrawingProgram::modify_grid(const NetworkingObjects::NetObjWeakPtrtool_update(); @@ -652,16 +655,11 @@ void DrawingProgram::update_downloading_dropped_files() { }); } -void DrawingProgram::add_file_to_canvas_by_path(const std::filesystem::path& filePath, Vector2f dropPos, bool addInSameThread) { - if(addInSameThread) - add_file_to_canvas_by_path_execute(filePath, dropPos); - else if(!addFileInNextFrame) { - addFileInfo = {filePath, dropPos}; - addFileInNextFrame = true; - } +void DrawingProgram::input_add_file_to_canvas_callback(const CustomEvents::AddFileToCanvasEvent& addFile) { + add_file_to_canvas_by_path(addFile.filePath, addFile.pos); } -void DrawingProgram::add_file_to_canvas_by_path_execute(const std::filesystem::path& filePath, Vector2f dropPos) { +void DrawingProgram::add_file_to_canvas_by_path(const std::filesystem::path& filePath, Vector2f dropPos) { if(layerMan.is_a_layer_being_edited()) { NetworkingObjects::NetObjTemporaryPtr imageTempPtr = world.rMan.add_resource_file(filePath); if(imageTempPtr) { diff --git a/src/DrawingProgram/DrawingProgram.hpp b/src/DrawingProgram/DrawingProgram.hpp index 2bb34c7..a0b7670 100644 --- a/src/DrawingProgram/DrawingProgram.hpp +++ b/src/DrawingProgram/DrawingProgram.hpp @@ -36,7 +36,7 @@ class DrawingProgram { void read_components_client(cereal::PortableBinaryInputArchive& a); void init_server_callbacks(); void init_client_callbacks(); - void add_file_to_canvas_by_path(const std::filesystem::path& filePath, Vector2f dropPos, bool addInSameThread); + void add_file_to_canvas_by_path(const std::filesystem::path& filePath, Vector2f dropPos); CanvasComponentContainer::ObjInfo* add_file_to_canvas_by_data(const std::string& fileName, std::string_view fileBuffer, Vector2f dropPos); void get_used_resources(std::unordered_set& resourceSet); @@ -59,7 +59,8 @@ class DrawingProgram { void send_transforms_for(const std::vector& objsToSendTransformsFor); void on_tab_out(); - void input_paste_callback(const CustomEvents::PasteEventData& paste); + void input_add_file_to_canvas_callback(const CustomEvents::AddFileToCanvasEvent& addFile); + void input_paste_callback(const CustomEvents::PasteEvent& paste); void input_drop_text_callback(const InputManager::DropCallbackArgs& drop); void input_drop_file_callback(const InputManager::DropCallbackArgs& drop); void input_text_key_callback(const InputManager::KeyCallbackArgs& key); @@ -80,7 +81,6 @@ class DrawingProgram { void process_transform_message(const std::vector>& transforms); 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(); @@ -88,9 +88,6 @@ class DrawingProgram { void popup_menu_action_button(const char* id, const char* text, const std::function& onClick); void rebuild_cache(); - std::atomic addFileInNextFrame = false; - std::pair addFileInfo; - float drag_point_radius(); void draw_drag_circle(SkCanvas* canvas, const Vector2f& pos, const SkColor4f& c, const DrawData& drawData, float radiusMultiplier = 1.0f); SkPaint select_tool_line_paint(const DrawData& drawData); diff --git a/src/DrawingProgram/DrawingProgramSelection.cpp b/src/DrawingProgram/DrawingProgramSelection.cpp index 6232bd8..4a0aa4a 100644 --- a/src/DrawingProgram/DrawingProgramSelection.cpp +++ b/src/DrawingProgram/DrawingProgramSelection.cpp @@ -5,7 +5,6 @@ #include "../InputManager.hpp" #include #include -#include #ifdef USE_SKIA_BACKEND_GRAPHITE #include @@ -423,7 +422,9 @@ void DrawingProgramSelection::input_key_callback_display_selection(const InputMa case InputManager::KEY_PASTE_IMAGE: { if(key.down && !key.repeat) { deselect_all(); - paste_image(drawP.world.main.input.mouse.pos); + drawP.world.main.input.call_paste(CustomEvents::PasteEvent::DataType::IMAGE, { + .pastePosition = drawP.world.main.input.mouse.pos + }); drawP.world.main.g.gui.set_to_layout(); } break; @@ -689,39 +690,19 @@ void DrawingProgramSelection::paste_clipboard(Vector2f pasteScreenPos) { } } -void DrawingProgramSelection::paste_image(Vector2f pasteScreenPos) { +void DrawingProgramSelection::paste_image_process_event(const CustomEvents::PasteEvent& paste) { check_add_stroke_color_change_undo(); if(drawP.layerMan.is_a_layer_being_edited()) { - #ifdef __EMSCRIPTEN__ - struct PasteData { - std::weak_ptr w; - Vector2f screenPos; - }; - static PasteData pasteData; - pasteData.screenPos = pasteScreenPos; - pasteData.w = make_weak_ptr(drawP.world.main.world); - emscripten_browser_clipboard::paste_async_image([](std::string_view pasteData, void* callbackData){ - PasteData* p = (PasteData*)callbackData; - std::shared_ptr wLock = p->w.lock(); - if(wLock) - wLock->drawProg.add_file_to_canvas_by_data("Image from clipboard", pasteData, p->screenPos); - else - Logger::get().log("INFO", "Loading image to canvas that has been destroyed"); - }, &pasteData); - #else - if(!drawP.is_selection_allowing_tool(drawP.drawTool->get_type())) - drawP.switch_to_tool(DrawingProgramToolType::EDIT); + if(!drawP.is_selection_allowing_tool(drawP.drawTool->get_type())) + drawP.switch_to_tool(DrawingProgramToolType::EDIT); - std::vector compSetInserted; - drawP.world.main.input.get_clipboard_image_data_SDL([&](std::string_view pasteData) { - compSetInserted.emplace_back(drawP.add_file_to_canvas_by_data("Image from clipboard", pasteData, pasteScreenPos)); - }); - if(!compSetInserted.empty() && compSetInserted.back() != nullptr) { - drawP.drawCache.erase_component(compSetInserted.back()); - set_to_selection(compSetInserted); - } - #endif + std::vector compSetInserted; + compSetInserted.emplace_back(drawP.add_file_to_canvas_by_data("Image from clipboard", paste.data, paste.mousePos.value())); + if(compSetInserted.back() != nullptr) { + drawP.drawCache.erase_component(compSetInserted.back()); + set_to_selection(compSetInserted); + } } } diff --git a/src/DrawingProgram/DrawingProgramSelection.hpp b/src/DrawingProgram/DrawingProgramSelection.hpp index 019c4c8..859c7df 100644 --- a/src/DrawingProgram/DrawingProgramSelection.hpp +++ b/src/DrawingProgram/DrawingProgramSelection.hpp @@ -22,7 +22,7 @@ class DrawingProgramSelection { void sort_selection(); void deselect_all(); void paste_clipboard(Vector2f pasteScreenPos); - void paste_image(Vector2f pasteScreenPos); + void paste_image_process_event(const CustomEvents::PasteEvent& paste); std::unordered_set get_selection_as_set(); void push_selection_to_front(); void push_selection_to_back(); diff --git a/src/DrawingProgram/Tools/BrushTool.cpp b/src/DrawingProgram/Tools/BrushTool.cpp index 0076f85..56ac31b 100644 --- a/src/DrawingProgram/Tools/BrushTool.cpp +++ b/src/DrawingProgram/Tools/BrushTool.cpp @@ -6,9 +6,7 @@ #include "DrawingProgramToolBase.hpp" #include "../../CanvasComponents/BrushStrokeCanvasComponent.hpp" #include "Helpers/NetworkingObjects/NetObjTemporaryPtr.decl.hpp" -#include "Helpers/NetworkingObjects/NetObjWeakPtr.hpp" #include "../../CanvasComponents/CanvasComponentContainer.hpp" -#include #include "../../GUIStuff/ElementHelpers/TextLabelHelpers.hpp" #include "../../GUIStuff/ElementHelpers/CheckBoxHelpers.hpp" @@ -176,7 +174,6 @@ void BrushTool::gui_toolbox() { using namespace GUIStuff; using namespace ElementHelpers; - Toolbar& t = drawP.world.main.toolbar; auto& gui = drawP.world.main.g.gui; gui.new_id("brush tool", [&] { diff --git a/src/DrawingProgram/Tools/BrushTool.hpp b/src/DrawingProgram/Tools/BrushTool.hpp index b4512ca..2b411e0 100644 --- a/src/DrawingProgram/Tools/BrushTool.hpp +++ b/src/DrawingProgram/Tools/BrushTool.hpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include "../../CanvasComponents/CanvasComponentContainer.hpp" #include diff --git a/src/DrawingProgram/Tools/DrawingProgramToolBase.cpp b/src/DrawingProgram/Tools/DrawingProgramToolBase.cpp index 6dd5081..88c1933 100644 --- a/src/DrawingProgram/Tools/DrawingProgramToolBase.cpp +++ b/src/DrawingProgram/Tools/DrawingProgramToolBase.cpp @@ -55,7 +55,7 @@ std::unique_ptr DrawingProgramToolBase::allocate_tool_ty return nullptr; } -void DrawingProgramToolBase::input_paste_callback(const CustomEvents::PasteEventData& paste) {} +void DrawingProgramToolBase::input_paste_callback(const CustomEvents::PasteEvent& paste) {} void DrawingProgramToolBase::input_text_key_callback(const InputManager::KeyCallbackArgs& key) {} void DrawingProgramToolBase::input_text_callback(const InputManager::TextCallbackArgs& text) {} void DrawingProgramToolBase::input_key_callback(const InputManager::KeyCallbackArgs& key) {} diff --git a/src/DrawingProgram/Tools/DrawingProgramToolBase.hpp b/src/DrawingProgram/Tools/DrawingProgramToolBase.hpp index 48c0db3..1b896ec 100644 --- a/src/DrawingProgram/Tools/DrawingProgramToolBase.hpp +++ b/src/DrawingProgram/Tools/DrawingProgramToolBase.hpp @@ -36,7 +36,7 @@ class DrawingProgramToolBase { virtual void draw(SkCanvas* canvas, const DrawData& drawData) = 0; virtual void switch_tool(DrawingProgramToolType newTool) = 0; virtual bool prevent_undo_or_redo() = 0; - virtual void input_paste_callback(const CustomEvents::PasteEventData& paste); + virtual void input_paste_callback(const CustomEvents::PasteEvent& paste); virtual void input_text_key_callback(const InputManager::KeyCallbackArgs& key); virtual void input_text_callback(const InputManager::TextCallbackArgs& text); virtual void input_key_callback(const InputManager::KeyCallbackArgs& key); diff --git a/src/DrawingProgram/Tools/EditTool.cpp b/src/DrawingProgram/Tools/EditTool.cpp index 87d17b8..9f5f229 100644 --- a/src/DrawingProgram/Tools/EditTool.cpp +++ b/src/DrawingProgram/Tools/EditTool.cpp @@ -1,5 +1,4 @@ #include "EditTool.hpp" -#include #include "../DrawingProgram.hpp" #include "../../MainProgram.hpp" #include "../../DrawData.hpp" @@ -29,7 +28,6 @@ void EditTool::gui_toolbox() { using namespace GUIStuff; using namespace ElementHelpers; - Toolbar& t = drawP.world.main.toolbar; auto& gui = drawP.world.main.g.gui; if(objInfoBeingEdited) @@ -46,7 +44,7 @@ void EditTool::erase_component(CanvasComponentContainer::ObjInfo* erasedComp) { switch_tool(get_type()); } -void EditTool::input_paste_callback(const CustomEvents::PasteEventData& paste) { +void EditTool::input_paste_callback(const CustomEvents::PasteEvent& paste) { if(objInfoBeingEdited) compEditTool->input_paste_callback(paste); } diff --git a/src/DrawingProgram/Tools/EditTool.hpp b/src/DrawingProgram/Tools/EditTool.hpp index 0f40581..4188760 100644 --- a/src/DrawingProgram/Tools/EditTool.hpp +++ b/src/DrawingProgram/Tools/EditTool.hpp @@ -26,7 +26,7 @@ class EditTool : public DrawingProgramToolBase { virtual void switch_tool(DrawingProgramToolType newTool) override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual bool prevent_undo_or_redo() override; - virtual void input_paste_callback(const CustomEvents::PasteEventData& paste) override; + virtual void input_paste_callback(const CustomEvents::PasteEvent& paste) override; virtual void input_text_key_callback(const InputManager::KeyCallbackArgs& key) override; virtual void input_text_callback(const InputManager::TextCallbackArgs& text) override; virtual void input_key_callback(const InputManager::KeyCallbackArgs& key) override; diff --git a/src/DrawingProgram/Tools/EditTools/BrushEditTool.cpp b/src/DrawingProgram/Tools/EditTools/BrushEditTool.cpp index 940e73a..d5c8847 100644 --- a/src/DrawingProgram/Tools/EditTools/BrushEditTool.cpp +++ b/src/DrawingProgram/Tools/EditTools/BrushEditTool.cpp @@ -3,6 +3,7 @@ #include "../../../World.hpp" #include "../../../MainProgram.hpp" #include "../EditTool.hpp" +#include "../../../CanvasComponents/BrushStrokeCanvasComponent.hpp" #include "../../../GUIStuff/ElementHelpers/TextLabelHelpers.hpp" #include "../../../GUIStuff/ElementHelpers/LayoutHelpers.hpp" diff --git a/src/DrawingProgram/Tools/EditTools/BrushEditTool.hpp b/src/DrawingProgram/Tools/EditTools/BrushEditTool.hpp index 4bd6ee1..00dd7e6 100644 --- a/src/DrawingProgram/Tools/EditTools/BrushEditTool.hpp +++ b/src/DrawingProgram/Tools/EditTools/BrushEditTool.hpp @@ -1,6 +1,5 @@ #pragma once #include "DrawingProgramEditToolBase.hpp" -#include "../../../CanvasComponents/BrushStrokeCanvasComponent.hpp" #include #include diff --git a/src/DrawingProgram/Tools/EditTools/DrawingProgramEditToolBase.cpp b/src/DrawingProgram/Tools/EditTools/DrawingProgramEditToolBase.cpp index 8901e67..b0e8946 100644 --- a/src/DrawingProgram/Tools/EditTools/DrawingProgramEditToolBase.cpp +++ b/src/DrawingProgram/Tools/EditTools/DrawingProgramEditToolBase.cpp @@ -11,7 +11,7 @@ void DrawingProgramEditToolBase::right_click_popup_gui(Vector2f popupPos) { t.paint_popup(popupPos); } -void DrawingProgramEditToolBase::input_paste_callback(const CustomEvents::PasteEventData& paste) {} +void DrawingProgramEditToolBase::input_paste_callback(const CustomEvents::PasteEvent& paste) {} void DrawingProgramEditToolBase::input_text_key_callback(const InputManager::KeyCallbackArgs& key) {} void DrawingProgramEditToolBase::input_text_callback(const InputManager::TextCallbackArgs& text) {} void DrawingProgramEditToolBase::input_key_callback(const InputManager::KeyCallbackArgs& key) {} diff --git a/src/DrawingProgram/Tools/EditTools/DrawingProgramEditToolBase.hpp b/src/DrawingProgram/Tools/EditTools/DrawingProgramEditToolBase.hpp index a72efe0..ee65f2c 100644 --- a/src/DrawingProgram/Tools/EditTools/DrawingProgramEditToolBase.hpp +++ b/src/DrawingProgram/Tools/EditTools/DrawingProgramEditToolBase.hpp @@ -14,7 +14,7 @@ class DrawingProgramEditToolBase { virtual bool edit_update() = 0; virtual void edit_gui() = 0; virtual void right_click_popup_gui(Vector2f popupPos); - virtual void input_paste_callback(const CustomEvents::PasteEventData& paste); + virtual void input_paste_callback(const CustomEvents::PasteEvent& paste); virtual void input_text_key_callback(const InputManager::KeyCallbackArgs& key); virtual void input_text_callback(const InputManager::TextCallbackArgs& text); virtual void input_key_callback(const InputManager::KeyCallbackArgs& key); diff --git a/src/DrawingProgram/Tools/EditTools/EllipseDrawEditTool.cpp b/src/DrawingProgram/Tools/EditTools/EllipseDrawEditTool.cpp index 3e10af7..da113ec 100644 --- a/src/DrawingProgram/Tools/EditTools/EllipseDrawEditTool.cpp +++ b/src/DrawingProgram/Tools/EditTools/EllipseDrawEditTool.cpp @@ -4,7 +4,6 @@ #include "../../../MainProgram.hpp" #include "../../../DrawData.hpp" #include -#include #include "../EditTool.hpp" #include "../../../GUIStuff/ElementHelpers/TextLabelHelpers.hpp" diff --git a/src/DrawingProgram/Tools/EditTools/ImageEditTool.cpp b/src/DrawingProgram/Tools/EditTools/ImageEditTool.cpp index 0cb6d6d..317acaa 100644 --- a/src/DrawingProgram/Tools/EditTools/ImageEditTool.cpp +++ b/src/DrawingProgram/Tools/EditTools/ImageEditTool.cpp @@ -8,7 +8,6 @@ #include "../EditTool.hpp" #include "DrawingProgramEditToolBase.hpp" #include "Eigen/Geometry" -#include #include "../../../GUIStuff/ElementHelpers/TextLabelHelpers.hpp" #include "../../../GUIStuff/ElementHelpers/ButtonHelpers.hpp" diff --git a/src/DrawingProgram/Tools/EditTools/RectDrawEditTool.cpp b/src/DrawingProgram/Tools/EditTools/RectDrawEditTool.cpp index 622f13d..0dc3f34 100644 --- a/src/DrawingProgram/Tools/EditTools/RectDrawEditTool.cpp +++ b/src/DrawingProgram/Tools/EditTools/RectDrawEditTool.cpp @@ -2,7 +2,6 @@ #include "../../DrawingProgram.hpp" #include "../../../World.hpp" #include "../../../MainProgram.hpp" -#include #include "../EditTool.hpp" #include "../../../GUIStuff/ElementHelpers/NumberSliderHelpers.hpp" diff --git a/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.cpp b/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.cpp index 63dcaf0..6222cc4 100644 --- a/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.cpp +++ b/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.cpp @@ -2,7 +2,6 @@ #include "../../DrawingProgram.hpp" #include "../../../MainProgram.hpp" #include "../../../DrawData.hpp" -#include "Helpers/ConvertVec.hpp" #include "Helpers/SCollision.hpp" #include #include @@ -204,7 +203,7 @@ void TextBoxEditTool::edit_gui() { }); } -void TextBoxEditTool::input_paste_callback(const CustomEvents::PasteEventData& paste) { +void TextBoxEditTool::input_paste_callback(const CustomEvents::PasteEvent& paste) { if(textboxID.has_value() && textboxID.value() == drawP.world.main.input.text.current_textbox_editing_id()) { auto& a = static_cast(comp->obj->get_comp()); if(userInput->input_paste_callback(paste)) { @@ -289,10 +288,10 @@ void TextBoxEditTool::right_click_popup_gui(Vector2f popupPos) { text_label_light(gui, "Text menu"); InputManager& input = drawP.world.main.input; drawP.popup_menu_action_button("Paste", "Paste", [&] { - drawP.world.main.input.call_paste(CustomEvents::PasteEventDataType::TEXT, { .allowRichText = true }); + drawP.world.main.input.call_paste(CustomEvents::PasteEvent::DataType::TEXT, { .allowRichText = true }); }); drawP.popup_menu_action_button("Paste without formatting", "Paste without formatting", [&] { - drawP.world.main.input.call_paste(CustomEvents::PasteEventDataType::TEXT, { .allowRichText = false }); + drawP.world.main.input.call_paste(CustomEvents::PasteEvent::DataType::TEXT, { .allowRichText = false }); }); if(a.cursor->selectionBeginPos != a.cursor->selectionEndPos) { drawP.popup_menu_action_button("Copy", "Copy", [&] { diff --git a/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.hpp b/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.hpp index dc712c8..325abce 100644 --- a/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.hpp +++ b/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.hpp @@ -17,7 +17,7 @@ class TextBoxEditTool : public DrawingProgramEditToolBase { virtual void edit_gui() override; virtual void right_click_popup_gui(Vector2f popupPos) override; - virtual void input_paste_callback(const CustomEvents::PasteEventData& paste) override; + virtual void input_paste_callback(const CustomEvents::PasteEvent& paste) override; virtual void input_text_key_callback(const InputManager::KeyCallbackArgs& key) override; virtual void input_text_callback(const InputManager::TextCallbackArgs& text) override; virtual void input_mouse_button_on_canvas_callback(const InputManager::MouseButtonCallbackArgs& button, bool isDraggingPoint) override; diff --git a/src/DrawingProgram/Tools/EllipseDrawTool.cpp b/src/DrawingProgram/Tools/EllipseDrawTool.cpp index b65105f..b242c39 100644 --- a/src/DrawingProgram/Tools/EllipseDrawTool.cpp +++ b/src/DrawingProgram/Tools/EllipseDrawTool.cpp @@ -24,7 +24,6 @@ void EllipseDrawTool::gui_toolbox() { using namespace GUIStuff; using namespace ElementHelpers; - Toolbar& t = drawP.world.main.toolbar; auto& gui = drawP.world.main.g.gui; auto& toolConfig = drawP.world.main.toolConfig; auto& fillStrokeMode = toolConfig.ellipseDraw.fillStrokeMode; diff --git a/src/DrawingProgram/Tools/EraserTool.cpp b/src/DrawingProgram/Tools/EraserTool.cpp index b1e7a29..d75b497 100644 --- a/src/DrawingProgram/Tools/EraserTool.cpp +++ b/src/DrawingProgram/Tools/EraserTool.cpp @@ -20,7 +20,6 @@ void EraserTool::gui_toolbox() { using namespace GUIStuff; using namespace ElementHelpers; - Toolbar& t = drawP.world.main.toolbar; auto& gui = drawP.world.main.g.gui; gui.new_id("eraser tool", [&] { text_label_centered(gui, "Eraser"); diff --git a/src/DrawingProgram/Tools/EraserTool.hpp b/src/DrawingProgram/Tools/EraserTool.hpp index 98f945a..a8f3de9 100644 --- a/src/DrawingProgram/Tools/EraserTool.hpp +++ b/src/DrawingProgram/Tools/EraserTool.hpp @@ -2,7 +2,6 @@ #include #include "../../DrawData.hpp" #include "DrawingProgramToolBase.hpp" -#include "../DrawingProgramCache.hpp" class DrawingProgram; diff --git a/src/DrawingProgram/Tools/EyeDropperTool.cpp b/src/DrawingProgram/Tools/EyeDropperTool.cpp index f29304b..8f4ebbe 100644 --- a/src/DrawingProgram/Tools/EyeDropperTool.cpp +++ b/src/DrawingProgram/Tools/EyeDropperTool.cpp @@ -30,7 +30,6 @@ void EyeDropperTool::gui_toolbox() { using namespace GUIStuff; using namespace ElementHelpers; - Toolbar& t = drawP.world.main.toolbar; auto& gui = drawP.world.main.g.gui; auto& selectingStrokeColor = drawP.world.main.toolConfig.eyeDropper.selectingStrokeColor; gui.new_id("Color select tool", [&] { diff --git a/src/DrawingProgram/Tools/GridModifyTool.cpp b/src/DrawingProgram/Tools/GridModifyTool.cpp index 25150bd..f76416e 100644 --- a/src/DrawingProgram/Tools/GridModifyTool.cpp +++ b/src/DrawingProgram/Tools/GridModifyTool.cpp @@ -2,11 +2,9 @@ #include "../DrawingProgram.hpp" #include "../../MainProgram.hpp" #include "../../DrawData.hpp" -#include "Helpers/Networking/NetLibrary.hpp" #include "Helpers/NetworkingObjects/NetObjTemporaryPtr.decl.hpp" #include #include -#include #include "../../GUIStuff/ElementHelpers/TextLabelHelpers.hpp" #include "../../GUIStuff/ElementHelpers/LayoutHelpers.hpp" diff --git a/src/DrawingProgram/Tools/LassoSelectTool.cpp b/src/DrawingProgram/Tools/LassoSelectTool.cpp index d1f5c90..dcadf60 100644 --- a/src/DrawingProgram/Tools/LassoSelectTool.cpp +++ b/src/DrawingProgram/Tools/LassoSelectTool.cpp @@ -7,7 +7,6 @@ #include "Helpers/SCollision.hpp" #include "../../CoordSpaceHelper.hpp" #include -#include "../../DrawCollision.hpp" #include #include @@ -41,7 +40,6 @@ DrawingProgramToolType LassoSelectTool::get_type() { } void LassoSelectTool::gui_toolbox() { - auto& t = drawP.world.main.toolbar; auto& gui = drawP.world.main.g.gui; gui.new_id("lasso select tool", [&] { GUIStuff::ElementHelpers::text_label_centered(gui, "Lasso Select"); diff --git a/src/DrawingProgram/Tools/LineDrawTool.cpp b/src/DrawingProgram/Tools/LineDrawTool.cpp index fe91c28..6ed82bf 100644 --- a/src/DrawingProgram/Tools/LineDrawTool.cpp +++ b/src/DrawingProgram/Tools/LineDrawTool.cpp @@ -6,7 +6,6 @@ #include "../../CanvasComponents/BrushStrokeCanvasComponent.hpp" #include "../../CanvasComponents/CanvasComponentContainer.hpp" #include "Helpers/MathExtras.hpp" -#include #include "../../GUIStuff/ElementHelpers/TextLabelHelpers.hpp" #include "../../GUIStuff/ElementHelpers/CheckBoxHelpers.hpp" @@ -22,7 +21,6 @@ DrawingProgramToolType LineDrawTool::get_type() { void LineDrawTool::gui_toolbox() { using namespace GUIStuff; using namespace ElementHelpers; - Toolbar& t = drawP.world.main.toolbar; auto& gui = drawP.world.main.g.gui; auto& toolConfig = drawP.world.main.toolConfig; gui.new_id("rect draw tool", [&] { diff --git a/src/DrawingProgram/Tools/PanCanvasTool.cpp b/src/DrawingProgram/Tools/PanCanvasTool.cpp index 54563fd..02fb69a 100644 --- a/src/DrawingProgram/Tools/PanCanvasTool.cpp +++ b/src/DrawingProgram/Tools/PanCanvasTool.cpp @@ -17,7 +17,6 @@ DrawingProgramToolType PanCanvasTool::get_type() { } void PanCanvasTool::gui_toolbox() { - Toolbar& t = drawP.world.main.toolbar; auto& gui = drawP.world.main.g.gui; gui.new_id("Pan canvas tool", [&] { GUIStuff::ElementHelpers::text_label_centered(gui, "Pan tool"); diff --git a/src/DrawingProgram/Tools/RectDrawTool.cpp b/src/DrawingProgram/Tools/RectDrawTool.cpp index f2b959a..1b8d67e 100644 --- a/src/DrawingProgram/Tools/RectDrawTool.cpp +++ b/src/DrawingProgram/Tools/RectDrawTool.cpp @@ -22,7 +22,6 @@ void RectDrawTool::gui_toolbox() { using namespace GUIStuff; using namespace ElementHelpers; - Toolbar& t = drawP.world.main.toolbar; auto& gui = drawP.world.main.g.gui; auto& toolConfig = drawP.world.main.toolConfig; auto& fillStrokeMode = toolConfig.rectDraw.fillStrokeMode; diff --git a/src/DrawingProgram/Tools/RectSelectTool.cpp b/src/DrawingProgram/Tools/RectSelectTool.cpp index 85c0176..9cd0b7b 100644 --- a/src/DrawingProgram/Tools/RectSelectTool.cpp +++ b/src/DrawingProgram/Tools/RectSelectTool.cpp @@ -19,7 +19,6 @@ DrawingProgramToolType RectSelectTool::get_type() { } void RectSelectTool::gui_toolbox() { - auto& t = drawP.world.main.toolbar; auto& gui = drawP.world.main.g.gui; gui.new_id("rectangle select tool", [&] { GUIStuff::ElementHelpers::text_label_centered(gui, "Rectangle Select"); diff --git a/src/DrawingProgram/Tools/ScreenshotTool.cpp b/src/DrawingProgram/Tools/ScreenshotTool.cpp index c38d12a..628d936 100644 --- a/src/DrawingProgram/Tools/ScreenshotTool.cpp +++ b/src/DrawingProgram/Tools/ScreenshotTool.cpp @@ -17,9 +17,7 @@ #include #include #include -#include #include -#include "../../FileHelpers.hpp" #include #ifdef USE_SKIA_BACKEND_GRAPHITE #include diff --git a/src/DrawingProgram/Tools/TextBoxTool.cpp b/src/DrawingProgram/Tools/TextBoxTool.cpp index c718e43..bd0815b 100644 --- a/src/DrawingProgram/Tools/TextBoxTool.cpp +++ b/src/DrawingProgram/Tools/TextBoxTool.cpp @@ -1,10 +1,8 @@ #include "TextBoxTool.hpp" -#include #include "../DrawingProgram.hpp" #include "../../MainProgram.hpp" #include "../../DrawData.hpp" #include "Helpers/MathExtras.hpp" -#include "Helpers/SCollision.hpp" #include #include #include "../../CanvasComponents/TextBoxCanvasComponent.hpp" @@ -22,7 +20,6 @@ DrawingProgramToolType TextBoxTool::get_type() { } void TextBoxTool::gui_toolbox() { - Toolbar& t = drawP.world.main.toolbar; auto& gui = drawP.world.main.g.gui; gui.new_id("textbox tool", [&] { GUIStuff::ElementHelpers::text_label_centered(gui, "Place textbox"); diff --git a/src/DrawingProgram/Tools/ZoomCanvasTool.cpp b/src/DrawingProgram/Tools/ZoomCanvasTool.cpp index 05c2d51..d8f013e 100644 --- a/src/DrawingProgram/Tools/ZoomCanvasTool.cpp +++ b/src/DrawingProgram/Tools/ZoomCanvasTool.cpp @@ -17,7 +17,6 @@ DrawingProgramToolType ZoomCanvasTool::get_type() { } void ZoomCanvasTool::gui_toolbox() { - Toolbar& t = drawP.world.main.toolbar; auto& gui = drawP.world.main.g.gui; gui.new_id("Zoom canvas tool", [&] { GUIStuff::ElementHelpers::text_label_centered(gui, "Zoom tool"); diff --git a/src/GUIHolder.cpp b/src/GUIHolder.cpp index 1f31f40..b562492 100644 --- a/src/GUIHolder.cpp +++ b/src/GUIHolder.cpp @@ -128,7 +128,7 @@ void GUIHolder::draw(SkCanvas* canvas, bool skiaAA) { gui.draw(canvas, skiaAA); } -void GUIHolder::input_paste_callback(const CustomEvents::PasteEventData& paste) { +void GUIHolder::input_paste_callback(const CustomEvents::PasteEvent& paste) { gui.input_paste_callback(paste); } diff --git a/src/GUIHolder.hpp b/src/GUIHolder.hpp index a40c0fe..7ce9548 100644 --- a/src/GUIHolder.hpp +++ b/src/GUIHolder.hpp @@ -21,7 +21,7 @@ class GUIHolder { void delete_cache_surface(); void draw(SkCanvas* canvas, bool skiaAA); - void input_paste_callback(const CustomEvents::PasteEventData& paste); + void input_paste_callback(const CustomEvents::PasteEvent& paste); void input_text_key_callback(const InputManager::KeyCallbackArgs& key); void input_text_callback(const InputManager::TextCallbackArgs& text); void input_key_callback(const InputManager::KeyCallbackArgs& key); diff --git a/src/GUIStuff/Elements/Element.cpp b/src/GUIStuff/Elements/Element.cpp index ff94cb2..c6bfc06 100644 --- a/src/GUIStuff/Elements/Element.cpp +++ b/src/GUIStuff/Elements/Element.cpp @@ -8,7 +8,7 @@ namespace GUIStuff { void Element::update() {} void Element::deselect() {} - void Element::input_paste_callback(const CustomEvents::PasteEventData& paste) { } + void Element::input_paste_callback(const CustomEvents::PasteEvent& paste) { } void Element::input_text_key_callback(const InputManager::KeyCallbackArgs& key) { } void Element::input_text_callback(const InputManager::TextCallbackArgs& text) { } void Element::input_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button) { } diff --git a/src/GUIStuff/Elements/Element.hpp b/src/GUIStuff/Elements/Element.hpp index dc506eb..4fbc431 100644 --- a/src/GUIStuff/Elements/Element.hpp +++ b/src/GUIStuff/Elements/Element.hpp @@ -25,7 +25,7 @@ namespace GUIStuff { virtual void update(); virtual void deselect(); - virtual void input_paste_callback(const CustomEvents::PasteEventData& paste); + virtual void input_paste_callback(const CustomEvents::PasteEvent& paste); virtual void input_text_key_callback(const InputManager::KeyCallbackArgs& key); virtual void input_text_callback(const InputManager::TextCallbackArgs& text); virtual void input_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button); diff --git a/src/GUIStuff/Elements/TextBox.decl.hpp b/src/GUIStuff/Elements/TextBox.decl.hpp index f0ae563..45f2981 100644 --- a/src/GUIStuff/Elements/TextBox.decl.hpp +++ b/src/GUIStuff/Elements/TextBox.decl.hpp @@ -41,7 +41,7 @@ template class TextBox : public Element { virtual void update() override; virtual void deselect() override; virtual void clay_draw(SkCanvas* canvas, UpdateInputData& io, Clay_RenderCommand* command, bool skiaAA) override; - virtual void input_paste_callback(const CustomEvents::PasteEventData& paste) override; + virtual void input_paste_callback(const CustomEvents::PasteEvent& paste) override; virtual void input_text_key_callback(const InputManager::KeyCallbackArgs& key) override; virtual void input_text_callback(const InputManager::TextCallbackArgs& text) override; virtual void input_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button) override; diff --git a/src/GUIStuff/Elements/TextBox.impl.hpp b/src/GUIStuff/Elements/TextBox.impl.hpp index 88e9862..c914e71 100644 --- a/src/GUIStuff/Elements/TextBox.impl.hpp +++ b/src/GUIStuff/Elements/TextBox.impl.hpp @@ -92,7 +92,7 @@ template bool TextBox::is_selected() const { return edit.has_value(); } -template void TextBox::input_paste_callback(const CustomEvents::PasteEventData& paste) { +template void TextBox::input_paste_callback(const CustomEvents::PasteEvent& paste) { if(is_selected() && edit.value().userInput.input_paste_callback(paste)) after_text_input_callback(); } diff --git a/src/GUIStuff/GUIManager.cpp b/src/GUIStuff/GUIManager.cpp index 09e65ea..d6847a2 100644 --- a/src/GUIStuff/GUIManager.cpp +++ b/src/GUIStuff/GUIManager.cpp @@ -495,7 +495,7 @@ void GUIManager::deselect_all() { e->elem->deselect(); } -void GUIManager::input_paste_callback(const CustomEvents::PasteEventData& paste) { +void GUIManager::input_paste_callback(const CustomEvents::PasteEvent& paste) { for(ElementContainer* e : orderedElements) e->elem->input_paste_callback(paste); } diff --git a/src/GUIStuff/GUIManager.hpp b/src/GUIStuff/GUIManager.hpp index 27c54a2..d4d93ba 100644 --- a/src/GUIStuff/GUIManager.hpp +++ b/src/GUIStuff/GUIManager.hpp @@ -90,7 +90,7 @@ class GUIManager { DefaultStringArena strArena; - void input_paste_callback(const CustomEvents::PasteEventData& paste); + void input_paste_callback(const CustomEvents::PasteEvent& paste); void input_text_key_callback(const InputManager::KeyCallbackArgs& key); void input_text_callback(const InputManager::TextCallbackArgs& text); void input_key_callback(const InputManager::KeyCallbackArgs& key); diff --git a/src/InputManager.cpp b/src/InputManager.cpp index e2afb73..c778c7b 100644 --- a/src/InputManager.cpp +++ b/src/InputManager.cpp @@ -362,16 +362,6 @@ uint32_t InputManager::make_generic_key_mod(SDL_Keymod m) { return toRet; } -void InputManager::backend_open_infinipaint_file_event() { - main.input_open_infinipaint_file_callback(CustomEvents::get_open_infinipaint_file_event_data()); - CustomEvents::pop_open_infinipaint_file_event_data(); -} - -void InputManager::backend_paste_event() { - main.input_paste_callback(CustomEvents::get_paste_event_data()); - CustomEvents::pop_paste_event_data(); -} - void InputManager::backend_input_text_event(const std::string& str) { main.input_text_callback(TextCallbackArgs{ .str = str }); } @@ -934,7 +924,7 @@ void InputManager::backend_key_down_update(const SDL_KeyboardEvent& e) { set_key_down(e, f->second, acceptingTextInput); } -void InputManager::call_paste(CustomEvents::PasteEventDataType type, const InputManagerCallPasteInfo& info) { +void InputManager::call_paste(CustomEvents::PasteEvent::DataType type, const InputManagerCallPasteInfo& info) { // Workaround for not being able to copy richtext to system clipboard, this should at least work within the application itself #ifdef __EMSCRIPTEN__ if(type == PasteDataType::TEXT) { @@ -944,25 +934,49 @@ void InputManager::call_paste(CustomEvents::PasteEventDataType type, const Input inMan->process_text_paste(pData); }, this); } + else { + struct PasteData { + std::optional pos; + InputManager* t; + }; + static PasteData pasteData; + pasteData.pos = info.pastePosition; + pasteData.t = this; + emscripten_browser_clipboard::paste_async_image([](std::string_view pasteData, void* callbackData){ + PasteData* p = (PasteData*)callbackData; + p->t->process_image_paste(pasteData, p->pos); + }, &pasteData); + } #else switch(type) { - case CustomEvents::PasteEventDataType::TEXT: + case CustomEvents::PasteEvent::DataType::TEXT: process_text_paste(get_clipboard_str_SDL(), info.allowRichText); break; - case CustomEvents::PasteEventDataType::IMAGE: + case CustomEvents::PasteEvent::DataType::IMAGE: + get_clipboard_image_data_SDL([&](std::string_view pasteData) { + process_image_paste(pasteData, info.pastePosition); + }); break; } #endif } void InputManager::process_text_paste(const std::string& pasteStr, bool allowRichText) { - CustomEvents::emit_paste_event({ - .type = CustomEvents::PasteEventDataType::TEXT, + CustomEvents::emit_event({ + .type = CustomEvents::PasteEvent::DataType::TEXT, .data = pasteStr, .richText = allowRichText && lastCopiedRichText.has_value() && lastCopiedRichText.value().get_plain_text() == remove_carriage_returns_from_str(pasteStr) ? lastCopiedRichText : std::nullopt }); } +void InputManager::process_image_paste(std::string_view pasteData, const std::optional& pastePos) { + CustomEvents::emit_event({ + .type = CustomEvents::PasteEvent::DataType::IMAGE, + .data = std::string(pasteData), + .mousePos = pastePos + }); +} + bool InputManager::ctrl_or_meta_held() { return key(KEY_GENERIC_LCTRL).held || key(KEY_GENERIC_LMETA).held; } diff --git a/src/InputManager.hpp b/src/InputManager.hpp index eaeda74..c0c433d 100644 --- a/src/InputManager.hpp +++ b/src/InputManager.hpp @@ -4,15 +4,11 @@ #include #include #include -#include "RichText/TextStyleModifier.hpp" #include "RichText/TextBox.hpp" -#include "TimePoint.hpp" #include #include #include -#include #include -#include "UndoManager.hpp" #include #include @@ -260,8 +256,6 @@ struct InputManager { void touch_finger_do_mouse_up(const SDL_TouchFingerEvent& f); void touch_finger_do_mouse_motion(const SDL_TouchFingerEvent& f); - void backend_open_infinipaint_file_event(); - void backend_paste_event(); void backend_input_text_event(const std::string& str); void backend_drop_file_event(const SDL_DropEvent& e); void backend_drop_text_event(const SDL_DropEvent& e); @@ -288,8 +282,9 @@ struct InputManager { std::string get_clipboard_str_SDL(); void get_clipboard_image_data_SDL(const std::function& callback); - void call_paste(CustomEvents::PasteEventDataType type, const InputManagerCallPasteInfo& info = {}); + void call_paste(CustomEvents::PasteEvent::DataType type, const InputManagerCallPasteInfo& info = {}); void process_text_paste(const std::string& pasteStr, bool allowRichText); + void process_image_paste(std::string_view pasteData, const std::optional& pastePos); std::optional lastCopiedRichText; diff --git a/src/MainProgram.cpp b/src/MainProgram.cpp index 4ae4e49..8707bef 100755 --- a/src/MainProgram.cpp +++ b/src/MainProgram.cpp @@ -267,7 +267,7 @@ sk_sp MainProgram::create_native_surface(Vector2i resolution, bool is return nullptr; } -void MainProgram::create_new_tab(const CustomEvents::OpenInfiniPaintFileEventData& openFile) { +void MainProgram::create_new_tab(const CustomEvents::OpenInfiniPaintFileEvent& openFile) { std::shared_ptr newWorld; try { newWorld = std::make_shared(*this, openFile); @@ -295,12 +295,18 @@ void MainProgram::post_callback() { g.post_callback(); } -void MainProgram::input_open_infinipaint_file_callback(const CustomEvents::OpenInfiniPaintFileEventData& openFile) { +void MainProgram::input_add_file_to_canvas_callback(const CustomEvents::AddFileToCanvasEvent& addFile) { + if(world) + world->input_add_file_to_canvas_callback(addFile); + post_callback(); +} + +void MainProgram::input_open_infinipaint_file_callback(const CustomEvents::OpenInfiniPaintFileEvent& openFile) { create_new_tab(openFile); post_callback(); } -void MainProgram::input_paste_callback(const CustomEvents::PasteEventData& paste) { +void MainProgram::input_paste_callback(const CustomEvents::PasteEvent& paste) { g.input_paste_callback(paste); if(world) world->input_paste_callback(paste); @@ -330,7 +336,7 @@ void MainProgram::input_drop_file_callback(const InputManager::DropCallbackArgs& if(std::filesystem::is_regular_file(drop.data)) { std::filesystem::path droppedFilePath(drop.data); if(droppedFilePath.has_extension() && droppedFilePath.extension().string() == std::string("." + World::FILE_EXTENSION)) { - CustomEvents::emit_open_infinipaint_file_event({ + CustomEvents::emit_event({ .isClient = false, .filePathSource = droppedFilePath }); diff --git a/src/MainProgram.hpp b/src/MainProgram.hpp index 5993dae..c5393e9 100644 --- a/src/MainProgram.hpp +++ b/src/MainProgram.hpp @@ -119,8 +119,10 @@ class MainProgram { GlobalConfig conf; std::optional keybindWaiting; - void input_open_infinipaint_file_callback(const CustomEvents::OpenInfiniPaintFileEventData& openFile); - void input_paste_callback(const CustomEvents::PasteEventData& paste); + void input_add_file_to_canvas_callback(const CustomEvents::AddFileToCanvasEvent& addFile); + void input_open_infinipaint_file_callback(const CustomEvents::OpenInfiniPaintFileEvent& openFile); + void input_paste_callback(const CustomEvents::PasteEvent& paste); + bool input_keybind_callback(const Vector2ui32& newKey); void input_drop_file_callback(const InputManager::DropCallbackArgs& drop); void input_drop_text_callback(const InputManager::DropCallbackArgs& drop); @@ -141,7 +143,7 @@ class MainProgram { void input_window_resize_callback(const InputManager::WindowResizeCallbackArgs& w); void input_window_scale_callback(const InputManager::WindowScaleCallbackArgs& w); - void create_new_tab(const CustomEvents::OpenInfiniPaintFileEventData& openFile); + void create_new_tab(const CustomEvents::OpenInfiniPaintFileEvent& openFile); void set_tab_to_close(World* world); void switch_to_tab(size_t wIndex); diff --git a/src/RichTextUserInput.cpp b/src/RichTextUserInput.cpp index 559d76c..74c34bb 100644 --- a/src/RichTextUserInput.cpp +++ b/src/RichTextUserInput.cpp @@ -14,8 +14,8 @@ RichTextUserInput::RichTextUserInput(const std::shared_ptr& i modMap(initModMap) {} -bool RichTextUserInput::input_paste_callback(const CustomEvents::PasteEventData& paste) { - if(paste.type == CustomEvents::PasteEventDataType::TEXT) { +bool RichTextUserInput::input_paste_callback(const CustomEvents::PasteEvent& paste) { + if(paste.type == CustomEvents::PasteEvent::DataType::TEXT) { do_textbox_operation_with_undo([&]() { if(paste.richText.has_value()) textBox->process_rich_text_input(*cursor, paste.richText.value()); @@ -104,7 +104,7 @@ RichTextUserInput::Changes RichTextUserInput::input_key_callback(InputManager& i toRet.textEdited = true; break; case InputManager::KEY_TEXT_PASTE: - input.call_paste(CustomEvents::PasteEventDataType::TEXT); + input.call_paste(CustomEvents::PasteEvent::DataType::TEXT); break; case InputManager::KEY_TEXT_SELECTALL: textBox->process_key_input(*cursor, RichText::TextBox::InputKey::SELECT_ALL, input.ctrl_or_meta_held(), input.key(InputManager::KEY_GENERIC_LSHIFT).held, modMapOpt); diff --git a/src/RichTextUserInput.hpp b/src/RichTextUserInput.hpp index af78fd2..0706e1d 100644 --- a/src/RichTextUserInput.hpp +++ b/src/RichTextUserInput.hpp @@ -12,7 +12,7 @@ class RichTextUserInput { bool cursorChanged = false; }; Changes input_key_callback(InputManager& input, const InputManager::KeyCallbackArgs& key); - bool input_paste_callback(const CustomEvents::PasteEventData& paste); + bool input_paste_callback(const CustomEvents::PasteEvent& paste); void add_text_to_textbox(const std::string& inputText); void do_textbox_operation_with_undo(const std::function& func); void add_textbox_undo(const RichText::TextBox::Cursor& prevCursor, const RichText::TextData& prevRichText); diff --git a/src/Toolbar.cpp b/src/Toolbar.cpp index 8b35e62..e29c00a 100644 --- a/src/Toolbar.cpp +++ b/src/Toolbar.cpp @@ -619,7 +619,7 @@ void Toolbar::top_toolbar() { }); }; menu_popup_text_button("new file local", "New File", [&] { - CustomEvents::emit_open_infinipaint_file_event({ + CustomEvents::emit_event({ .isClient = false }); }); @@ -630,24 +630,23 @@ void Toolbar::top_toolbar() { menu_popup_text_button("screenshot", "Screenshot", [&] { main.world->drawProg.switch_to_tool(DrawingProgramToolType::SCREENSHOT); }); menu_popup_text_button("add image or file to canvas", "Add Image/File to Canvas", [&] { #ifdef __EMSCRIPTEN__ - static std::weak_ptr worldWeakPtr; - worldWeakPtr = make_weak_ptr(main.world); emscripten_browser_file::upload("*", [](std::string const& fileName, std::string const& mimeType, std::string_view buffer, void* callbackData) { if(!buffer.empty()) { - auto world = ((std::weak_ptr*)callbackData)->lock(); - if(world) - world->drawProg.add_file_to_canvas_by_data(fileName, buffer, world->main.window.size.cast() / 2.0f); - else - Logger::get().log("INFO", "Loading image to canvas that has been destroyed"); + auto& main = *static_cast(callbackData); + CustomEvents::emit_event({ + .type = CustomEvents::AddFileToCanvasEvent::Type::BUFFER, + .name = fileName, + .buffer = std::string(buffer) + }); } - }, &worldWeakPtr); + }, &main); #else - open_file_selector("Open File", {{"Any File", "*"}}, [w = make_weak_ptr(main.world)](const std::filesystem::path& p, const auto& e) { - auto wLock = w.lock(); - if(wLock) - wLock->drawProg.add_file_to_canvas_by_path(p, wLock->main.window.size.cast() / 2.0f, false); - else - Logger::get().log("INFO", "Loading image to canvas that has been destroyed"); + open_file_selector("Open File", {{"Any File", "*"}}, [&](const std::filesystem::path& p, const auto& e) { + CustomEvents::emit_event({ + .type = CustomEvents::AddFileToCanvasEvent::Type::PATH, + .filePath = p, + .pos = main.window.size.cast() / 2.0f + }); }); #endif }); @@ -1492,8 +1491,6 @@ void Toolbar::performance_metrics() { void Toolbar::player_list() { auto& gui = main.g.gui; - auto& io = gui.io; - center_obstructing_window_gui("player client list", CLAY_SIZING_FIT(500), CLAY_SIZING_FIT(0), [&] { gui.new_id("client list", [&] { @@ -1564,7 +1561,7 @@ void Toolbar::open_world_file(bool isClient, const std::string& netSource, const }, &uploadData); #else open_file_selector("Open", {{"InfiniPaint Canvas", World::FILE_EXTENSION}, {"Any File", "*"}}, [&, isClient = isClient, netSource = netSource, serverLocalID2 = serverLocalID2](const std::filesystem::path& p, const auto& e) { - CustomEvents::emit_open_infinipaint_file_event({ + CustomEvents::emit_event({ .isClient = isClient, .filePathSource = p, .netSource = netSource, @@ -1600,7 +1597,6 @@ void Toolbar::center_obstructing_window_gui(const char* id, Clay_SizingAxis x, C void Toolbar::text_button_wide(const char* id, const char* str, const std::function& onClick) { auto& gui = main.g.gui; - auto& io = gui.io; text_button(gui, id, str, { .wide = true, @@ -1610,7 +1606,6 @@ void Toolbar::text_button_wide(const char* id, const char* str, const std::funct void Toolbar::options_menu() { auto& gui = main.g.gui; - auto& io = gui.io; switch(optionsMenuType) { case HOST_MENU: { @@ -1641,7 +1636,7 @@ void Toolbar::options_menu() { else if(serverToConnectTo.substr(0, NetLibrary::GLOBALID_LEN) == NetLibrary::get_global_id()) Logger::get().log("USERINFO", "Connect issue: Can't connect to your own address"); else { - CustomEvents::emit_open_infinipaint_file_event({ + CustomEvents::emit_event({ .isClient = true, .netSource = serverToConnectTo }); diff --git a/src/World.cpp b/src/World.cpp index 8331046..324d318 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -38,7 +38,7 @@ #include #endif -World::World(MainProgram& initMain, const CustomEvents::OpenInfiniPaintFileEventData& worldInfo): +World::World(MainProgram& initMain, const CustomEvents::OpenInfiniPaintFileEvent& worldInfo): netObjMan(!worldInfo.isClient), main(initMain), undo(*this), @@ -250,7 +250,12 @@ void World::on_tab_out() { rMan.clear_display_cache(); } -void World::input_paste_callback(const CustomEvents::PasteEventData& paste) { +void World::input_add_file_to_canvas_callback(const CustomEvents::AddFileToCanvasEvent& addFile) { + if(!clientStillConnecting) + drawProg.input_add_file_to_canvas_callback(addFile); +} + +void World::input_paste_callback(const CustomEvents::PasteEvent& paste) { if(!clientStillConnecting) drawProg.input_paste_callback(paste); } diff --git a/src/World.hpp b/src/World.hpp index 797689b..71bef60 100644 --- a/src/World.hpp +++ b/src/World.hpp @@ -25,7 +25,7 @@ class World { static constexpr std::string FILE_EXTENSION = "infpnt"; static constexpr size_t CHAT_SIZE = 10; - World(MainProgram& initMain, const CustomEvents::OpenInfiniPaintFileEventData& worldInfo); + World(MainProgram& initMain, const CustomEvents::OpenInfiniPaintFileEvent& worldInfo); // NOTE: Keep at the very beginning so that it's destroyed last NetworkingObjects::NetObjManager netObjMan; @@ -89,7 +89,8 @@ class World { std::shared_ptr netServer; std::shared_ptr netClient; - void input_paste_callback(const CustomEvents::PasteEventData& paste); + void input_add_file_to_canvas_callback(const CustomEvents::AddFileToCanvasEvent& addFile); + void input_paste_callback(const CustomEvents::PasteEvent& paste); void input_drop_file_callback(const InputManager::DropCallbackArgs& drop); void input_drop_text_callback(const InputManager::DropCallbackArgs& drop); void input_text_key_callback(const InputManager::KeyCallbackArgs& key); diff --git a/src/main.cpp b/src/main.cpp index c332059..c13dec4 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -794,10 +794,18 @@ SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) { case SDL_EVENT_SCREEN_KEYBOARD_HIDDEN: break; default: { - if(event->type == CustomEvents::PASTE_EVENT) - mS.m->input.backend_paste_event(); - else if(event->type == CustomEvents::OPEN_INFINIPAINT_FILE_EVENT) - mS.m->input.backend_open_infinipaint_file_event(); + if(event->type == CustomEvents::PasteEvent::EVENT_NUM) { + mS.m->input_paste_callback(CustomEvents::get_event()); + CustomEvents::pop_event(); + } + else if(event->type == CustomEvents::OpenInfiniPaintFileEvent::EVENT_NUM) { + mS.m->input_open_infinipaint_file_callback(CustomEvents::get_event()); + CustomEvents::pop_event(); + } + else if(event->type == CustomEvents::AddFileToCanvasEvent::EVENT_NUM) { + mS.m->input_add_file_to_canvas_callback(CustomEvents::get_event()); + CustomEvents::pop_event(); + } break; } }