From c98dd97670579c5451c6fa392b67149510ded3ad Mon Sep 17 00:00:00 2001 From: OmniaX-Dev Date: Tue, 7 Apr 2026 04:16:39 +0200 Subject: [PATCH] Added File/Text Drag and Drop from the OS to the widgets --- .clangd | 3 ++- other/build.nr | 2 +- src/ogfx/gui/WidgetManager.cpp | 9 +++++---- src/ogfx/gui/Window.cpp | 26 ++++++++++++++------------ src/ogfx/gui/widgets/Widget.cpp | 9 +++++++-- src/ogfx/gui/widgets/Widget.hpp | 6 ++++-- src/ostd/data/BaseObject.cpp | 4 ++++ src/ostd/data/BaseObject.hpp | 4 ++++ src/test/GuiTest.cpp | 14 +++++++++++--- 9 files changed, 52 insertions(+), 25 deletions(-) diff --git a/.clangd b/.clangd index 122ab09..32169b9 100644 --- a/.clangd +++ b/.clangd @@ -1,2 +1,3 @@ CompileFlags: - CompilationDatabase: bin \ No newline at end of file + CompilationDatabase: bin + Add: ["--target=x86_64-w64-mingw32"] \ No newline at end of file diff --git a/other/build.nr b/other/build.nr index 6310783..366c7bb 100644 --- a/other/build.nr +++ b/other/build.nr @@ -1 +1 @@ -2050 +2052 diff --git a/src/ogfx/gui/WidgetManager.cpp b/src/ogfx/gui/WidgetManager.cpp index f224167..c69fe83 100644 --- a/src/ogfx/gui/WidgetManager.cpp +++ b/src/ogfx/gui/WidgetManager.cpp @@ -306,12 +306,13 @@ namespace ogfx if (!widget->isMouseInside()) return; if (Widget::s_dragAndDropData != nullptr) { - widget->__onDragAndDrop(event); + auto& const_cast_event = const_cast(event); + const_cast_event.drop.textOrFilePath = ""; + const_cast_event.drop.dropType = DropEventData::eDropType::InApp; + const_cast_event.drop.userObject = Widget::s_dragAndDropData; + widget->__onDragAndDrop(const_cast_event); Widget::clearDragAndDropData(); } - - auto& const_cast_event = const_cast(event); - // if (event.__original_signal_id == ostd::BuiltinSignals::TextDragAndDropped) } } } diff --git a/src/ogfx/gui/Window.cpp b/src/ogfx/gui/Window.cpp index e65c8c6..8965a65 100644 --- a/src/ogfx/gui/Window.cpp +++ b/src/ogfx/gui/Window.cpp @@ -137,6 +137,8 @@ namespace ogfx connectSignal(ostd::BuiltinSignals::WindowResized); connectSignal(ostd::BuiltinSignals::WindowFocused); connectSignal(ostd::BuiltinSignals::WindowLostFocus); + connectSignal(ostd::BuiltinSignals::FileDragAndDropped); + connectSignal(ostd::BuiltinSignals::TextDragAndDropped); __on_window_init(width, height, title); setSize(m_windowWidth, m_windowHeight); @@ -528,21 +530,21 @@ namespace ogfx } else if (signal.ID == ostd::BuiltinSignals::FileDragAndDropped) { - auto& ud = (ogfx::DropEventData&)signal.userData; - evt.drop.dropType = ud.dropType; - evt.drop.userObject = ud.userObject; - evt.drop.textOrFilePath = ud.textOrFilePath; - evt.__original_signal_id = ostd::BuiltinSignals::FileDragAndDropped; - m_rootWidget.__onDragAndDrop(evt); + // auto& ud = (ogfx::DropEventData&)signal.userData; + // evt.drop.dropType = ud.dropType; + // evt.drop.userObject = ud.userObject; + // evt.drop.textOrFilePath = ud.textOrFilePath; + // evt.__original_signal_id = ostd::BuiltinSignals::FileDragAndDropped; + // m_rootWidget.__onMouseReleased(evt); } else if (signal.ID == ostd::BuiltinSignals::TextDragAndDropped) { - auto& ud = (ogfx::DropEventData&)signal.userData; - evt.drop.dropType = ud.dropType; - evt.drop.userObject = ud.userObject; - evt.drop.textOrFilePath = ud.textOrFilePath; - evt.__original_signal_id = ostd::BuiltinSignals::TextDragAndDropped; - m_rootWidget.__onDragAndDrop(evt); + // auto& ud = (ogfx::DropEventData&)signal.userData; + // evt.drop.dropType = ud.dropType; + // evt.drop.userObject = ud.userObject; + // evt.drop.textOrFilePath = ud.textOrFilePath; + // evt.__original_signal_id = ostd::BuiltinSignals::TextDragAndDropped; + // m_rootWidget.__onMouseReleased(evt); } else if (signal.ID == ostd::BuiltinSignals::WindowResized) { diff --git a/src/ogfx/gui/widgets/Widget.cpp b/src/ogfx/gui/widgets/Widget.cpp index 4c4ec3c..adae7ed 100644 --- a/src/ogfx/gui/widgets/Widget.cpp +++ b/src/ogfx/gui/widgets/Widget.cpp @@ -28,6 +28,10 @@ namespace ogfx { namespace gui { + + ostd::BaseObject* Widget::s_dragAndDropData { nullptr }; + bool Widget::s_hasDragAndDropData { false }; + Widget::Widget(const ostd::Rectangle& bounds, WindowCore& window) : Rectangle(bounds), m_widgets(window, *this) { m_window = &window; @@ -128,6 +132,7 @@ namespace ogfx { if (name == qualifier) { + if (state == value) return; state = value; reloadTheme(); return; @@ -207,8 +212,8 @@ namespace ogfx void Widget::__onDragAndDrop(const Event& event) { - // if (hasChildren()) - // m_widgets.onMouseReleased(event); + if (hasChildren()) + m_widgets.onMouseReleased(event); if (!event.isHandled()) { if (callback_onDragAndDrop) diff --git a/src/ogfx/gui/widgets/Widget.hpp b/src/ogfx/gui/widgets/Widget.hpp index b18a9a3..e79d80f 100644 --- a/src/ogfx/gui/widgets/Widget.hpp +++ b/src/ogfx/gui/widgets/Widget.hpp @@ -143,7 +143,7 @@ namespace ogfx return theme.get(key, fallback, getThemeIDList(), getThemeQualifierList()); } - inline static void setDragAndDropData(ostd::BaseObject& data) { s_dragAndDropData = &data; } + inline static void setDragAndDropData(ostd::BaseObject& data) { s_dragAndDropData = &data; s_hasDragAndDropData = true; } inline static void clearDragAndDropData(void) { s_dragAndDropData = nullptr; } inline static ostd::BaseObject* getDragAndDropData(void) { return s_dragAndDropData; } @@ -208,7 +208,9 @@ namespace ogfx ostd::Rectangle m_padding { 0, 0, 0, 0 }; - inline static ostd::BaseObject* s_dragAndDropData { nullptr }; + public: + static ostd::BaseObject* s_dragAndDropData; + static bool s_hasDragAndDropData; friend class WidgetManager; }; diff --git a/src/ostd/data/BaseObject.cpp b/src/ostd/data/BaseObject.cpp index 8a8cf76..66be66e 100755 --- a/src/ostd/data/BaseObject.cpp +++ b/src/ostd/data/BaseObject.cpp @@ -49,6 +49,10 @@ namespace ostd void BaseObject::__handle_signal(Signal& signal) { if (m_signalsEnabled) + { handleSignal(signal); + if (callback_signal) + callback_signal(signal); + } } } diff --git a/src/ostd/data/BaseObject.hpp b/src/ostd/data/BaseObject.hpp index c58f095..b32cc16 100755 --- a/src/ostd/data/BaseObject.hpp +++ b/src/ostd/data/BaseObject.hpp @@ -22,6 +22,7 @@ #include #include +#include namespace ostd { @@ -29,10 +30,12 @@ namespace ostd struct Signal; class BaseObject : public __i_stringeable { + public: using SignalCallback = std::function; public: BaseObject(const BaseObject& copy); inline virtual ~BaseObject(void) = default; virtual BaseObject& operator=(const BaseObject& copy); + inline void setSignalCallback(SignalCallback callback) { callback_signal = callback; } virtual inline uint64_t getID(void) const { return m_uid; } virtual inline void setID(uint64_t id) { m_uid = id; } @@ -74,6 +77,7 @@ namespace ostd bool m_valid; String m_typeName; bool m_signalsEnabled { true }; + SignalCallback callback_signal { nullptr }; inline static uint64_t s_next_oid { 1024 }; static BaseObject s_invalid_obj; diff --git a/src/test/GuiTest.cpp b/src/test/GuiTest.cpp index 6652919..b14f683 100644 --- a/src/test/GuiTest.cpp +++ b/src/test/GuiTest.cpp @@ -18,6 +18,7 @@ along with OmniaFramework. If not, see . */ +#include "gui/Events.hpp" #include #include @@ -62,14 +63,21 @@ class Window : public ogfx::gui::Window m_label2.setPosition(0, 0); m_label2.setText("Ciccia Bella!"); + m_label2.connectSignal(ostd::BuiltinSignals::FileDragAndDropped); m_label2.addThemeID("testLabel"); m_label2.addThemeID("testLabel2"); + m_label2.setSignalCallback([&](ostd::Signal& signal){ + if (signal.ID == ostd::BuiltinSignals::FileDragAndDropped) + { + auto& data = (ogfx::DropEventData&)signal.userData; + std::cout << data.textOrFilePath << "\n"; + } + }); m_label2.enableDragAndDrop(); m_label2.setDragAndDropCallback([&](const ogfx::gui::Event& event) -> void { - std::cout << "DROP\n"; - if (auto data = ogfx::gui::Widget::getDragAndDropData()) + if (event.drop.userObject->getTypeName() == "ogfx::gui::widgets::Label") { - std::cout << static_cast(*data).getText() << "!\n"; + std::cout << static_cast(*event.drop.userObject).getText() << "!\n"; } }); m_panel1.addChild(m_label2);