Added File/Text Drag and Drop from the OS to the widgets

This commit is contained in:
OmniaX-Dev 2026-04-07 04:16:39 +02:00
parent d4b4df1e51
commit c98dd97670
9 changed files with 52 additions and 25 deletions

View file

@ -1,2 +1,3 @@
CompileFlags: CompileFlags:
CompilationDatabase: bin CompilationDatabase: bin
Add: ["--target=x86_64-w64-mingw32"]

View file

@ -1 +1 @@
2050 2052

View file

@ -306,12 +306,13 @@ namespace ogfx
if (!widget->isMouseInside()) return; if (!widget->isMouseInside()) return;
if (Widget::s_dragAndDropData != nullptr) if (Widget::s_dragAndDropData != nullptr)
{ {
widget->__onDragAndDrop(event); auto& const_cast_event = const_cast<Event&>(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(); Widget::clearDragAndDropData();
} }
auto& const_cast_event = const_cast<Event&>(event);
// if (event.__original_signal_id == ostd::BuiltinSignals::TextDragAndDropped)
} }
} }
} }

View file

@ -137,6 +137,8 @@ namespace ogfx
connectSignal(ostd::BuiltinSignals::WindowResized); connectSignal(ostd::BuiltinSignals::WindowResized);
connectSignal(ostd::BuiltinSignals::WindowFocused); connectSignal(ostd::BuiltinSignals::WindowFocused);
connectSignal(ostd::BuiltinSignals::WindowLostFocus); connectSignal(ostd::BuiltinSignals::WindowLostFocus);
connectSignal(ostd::BuiltinSignals::FileDragAndDropped);
connectSignal(ostd::BuiltinSignals::TextDragAndDropped);
__on_window_init(width, height, title); __on_window_init(width, height, title);
setSize(m_windowWidth, m_windowHeight); setSize(m_windowWidth, m_windowHeight);
@ -528,21 +530,21 @@ namespace ogfx
} }
else if (signal.ID == ostd::BuiltinSignals::FileDragAndDropped) else if (signal.ID == ostd::BuiltinSignals::FileDragAndDropped)
{ {
auto& ud = (ogfx::DropEventData&)signal.userData; // auto& ud = (ogfx::DropEventData&)signal.userData;
evt.drop.dropType = ud.dropType; // evt.drop.dropType = ud.dropType;
evt.drop.userObject = ud.userObject; // evt.drop.userObject = ud.userObject;
evt.drop.textOrFilePath = ud.textOrFilePath; // evt.drop.textOrFilePath = ud.textOrFilePath;
evt.__original_signal_id = ostd::BuiltinSignals::FileDragAndDropped; // evt.__original_signal_id = ostd::BuiltinSignals::FileDragAndDropped;
m_rootWidget.__onDragAndDrop(evt); // m_rootWidget.__onMouseReleased(evt);
} }
else if (signal.ID == ostd::BuiltinSignals::TextDragAndDropped) else if (signal.ID == ostd::BuiltinSignals::TextDragAndDropped)
{ {
auto& ud = (ogfx::DropEventData&)signal.userData; // auto& ud = (ogfx::DropEventData&)signal.userData;
evt.drop.dropType = ud.dropType; // evt.drop.dropType = ud.dropType;
evt.drop.userObject = ud.userObject; // evt.drop.userObject = ud.userObject;
evt.drop.textOrFilePath = ud.textOrFilePath; // evt.drop.textOrFilePath = ud.textOrFilePath;
evt.__original_signal_id = ostd::BuiltinSignals::TextDragAndDropped; // evt.__original_signal_id = ostd::BuiltinSignals::TextDragAndDropped;
m_rootWidget.__onDragAndDrop(evt); // m_rootWidget.__onMouseReleased(evt);
} }
else if (signal.ID == ostd::BuiltinSignals::WindowResized) else if (signal.ID == ostd::BuiltinSignals::WindowResized)
{ {

View file

@ -28,6 +28,10 @@ namespace ogfx
{ {
namespace gui 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) Widget::Widget(const ostd::Rectangle& bounds, WindowCore& window) : Rectangle(bounds), m_widgets(window, *this)
{ {
m_window = &window; m_window = &window;
@ -128,6 +132,7 @@ namespace ogfx
{ {
if (name == qualifier) if (name == qualifier)
{ {
if (state == value) return;
state = value; state = value;
reloadTheme(); reloadTheme();
return; return;
@ -207,8 +212,8 @@ namespace ogfx
void Widget::__onDragAndDrop(const Event& event) void Widget::__onDragAndDrop(const Event& event)
{ {
// if (hasChildren()) if (hasChildren())
// m_widgets.onMouseReleased(event); m_widgets.onMouseReleased(event);
if (!event.isHandled()) if (!event.isHandled())
{ {
if (callback_onDragAndDrop) if (callback_onDragAndDrop)

View file

@ -143,7 +143,7 @@ namespace ogfx
return theme.get<T>(key, fallback, getThemeIDList(), getThemeQualifierList()); return theme.get<T>(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 void clearDragAndDropData(void) { s_dragAndDropData = nullptr; }
inline static ostd::BaseObject* getDragAndDropData(void) { return s_dragAndDropData; } inline static ostd::BaseObject* getDragAndDropData(void) { return s_dragAndDropData; }
@ -208,7 +208,9 @@ namespace ogfx
ostd::Rectangle m_padding { 0, 0, 0, 0 }; 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; friend class WidgetManager;
}; };

View file

@ -49,6 +49,10 @@ namespace ostd
void BaseObject::__handle_signal(Signal& signal) void BaseObject::__handle_signal(Signal& signal)
{ {
if (m_signalsEnabled) if (m_signalsEnabled)
{
handleSignal(signal); handleSignal(signal);
if (callback_signal)
callback_signal(signal);
}
} }
} }

View file

@ -22,6 +22,7 @@
#include <cstdint> #include <cstdint>
#include <ostd/string/String.hpp> #include <ostd/string/String.hpp>
#include <functional>
namespace ostd namespace ostd
{ {
@ -29,10 +30,12 @@ namespace ostd
struct Signal; struct Signal;
class BaseObject : public __i_stringeable class BaseObject : public __i_stringeable
{ {
public: using SignalCallback = std::function<void(Signal&)>;
public: public:
BaseObject(const BaseObject& copy); BaseObject(const BaseObject& copy);
inline virtual ~BaseObject(void) = default; inline virtual ~BaseObject(void) = default;
virtual BaseObject& operator=(const BaseObject& copy); 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 uint64_t getID(void) const { return m_uid; }
virtual inline void setID(uint64_t id) { m_uid = id; } virtual inline void setID(uint64_t id) { m_uid = id; }
@ -74,6 +77,7 @@ namespace ostd
bool m_valid; bool m_valid;
String m_typeName; String m_typeName;
bool m_signalsEnabled { true }; bool m_signalsEnabled { true };
SignalCallback callback_signal { nullptr };
inline static uint64_t s_next_oid { 1024 }; inline static uint64_t s_next_oid { 1024 };
static BaseObject s_invalid_obj; static BaseObject s_invalid_obj;

View file

@ -18,6 +18,7 @@
along with OmniaFramework. If not, see <https://www.gnu.org/licenses/>. along with OmniaFramework. If not, see <https://www.gnu.org/licenses/>.
*/ */
#include "gui/Events.hpp"
#include <ogfx/utils/Keycodes.hpp> #include <ogfx/utils/Keycodes.hpp>
#include <ogfx/ogfx.hpp> #include <ogfx/ogfx.hpp>
@ -62,14 +63,21 @@ class Window : public ogfx::gui::Window
m_label2.setPosition(0, 0); m_label2.setPosition(0, 0);
m_label2.setText("Ciccia Bella!"); m_label2.setText("Ciccia Bella!");
m_label2.connectSignal(ostd::BuiltinSignals::FileDragAndDropped);
m_label2.addThemeID("testLabel"); m_label2.addThemeID("testLabel");
m_label2.addThemeID("testLabel2"); 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.enableDragAndDrop();
m_label2.setDragAndDropCallback([&](const ogfx::gui::Event& event) -> void { m_label2.setDragAndDropCallback([&](const ogfx::gui::Event& event) -> void {
std::cout << "DROP\n"; if (event.drop.userObject->getTypeName() == "ogfx::gui::widgets::Label")
if (auto data = ogfx::gui::Widget::getDragAndDropData())
{ {
std::cout << static_cast<ogfx::gui::widgets::Label&>(*data).getText() << "!\n"; std::cout << static_cast<ogfx::gui::widgets::Label&>(*event.drop.userObject).getText() << "!\n";
} }
}); });
m_panel1.addChild(m_label2); m_panel1.addChild(m_label2);