Browse Source

Process Drag/Drop input events after UI subsystem, update drag drop to look for drag object instead of delegate

Josh Engebretson 10 years ago
parent
commit
c91a76623d
2 changed files with 22 additions and 8 deletions
  1. 3 3
      Source/Atomic/UI/UI.cpp
  2. 19 5
      Source/Atomic/UI/UIDragDrop.cpp

+ 3 - 3
Source/Atomic/UI/UI.cpp

@@ -213,9 +213,6 @@ void UI::Initialize(const String& languageFile)
     rootWidget_->SetSize(width, height);
     rootWidget_->SetSize(width, height);
     rootWidget_->SetVisibilility(tb::WIDGET_VISIBILITY_VISIBLE);
     rootWidget_->SetVisibilility(tb::WIDGET_VISIBILITY_VISIBLE);
 
 
-    // register the UIDragDrop subsystem
-    context_->RegisterSubsystem(new UIDragDrop(context_));
-
     SubscribeToEvent(E_MOUSEBUTTONDOWN, HANDLER(UI, HandleMouseButtonDown));
     SubscribeToEvent(E_MOUSEBUTTONDOWN, HANDLER(UI, HandleMouseButtonDown));
     SubscribeToEvent(E_MOUSEBUTTONUP, HANDLER(UI, HandleMouseButtonUp));
     SubscribeToEvent(E_MOUSEBUTTONUP, HANDLER(UI, HandleMouseButtonUp));
     SubscribeToEvent(E_MOUSEMOVE, HANDLER(UI, HandleMouseMove));
     SubscribeToEvent(E_MOUSEMOVE, HANDLER(UI, HandleMouseMove));
@@ -233,6 +230,9 @@ void UI::Initialize(const String& languageFile)
 
 
     SubscribeToEvent(E_RENDERUPDATE, HANDLER(UI, HandleRenderUpdate));
     SubscribeToEvent(E_RENDERUPDATE, HANDLER(UI, HandleRenderUpdate));
 
 
+    // register the UIDragDrop subsystem (after we have subscribed to events, so it is processed after)
+    context_->RegisterSubsystem(new UIDragDrop(context_));
+
     tb::TBWidgetListener::AddGlobalListener(this);
     tb::TBWidgetListener::AddGlobalListener(this);
 
 
     initialized_ = true;
     initialized_ = true;

+ 19 - 5
Source/Atomic/UI/UIDragDrop.cpp

@@ -116,19 +116,33 @@ void UIDragDrop::HandleMouseDown(StringHash eventType, VariantMap& eventData)
 
 
     if ((eventData[P_BUTTONS].GetUInt() & MOUSEB_LEFT) && TBWidget::hovered_widget)
     if ((eventData[P_BUTTONS].GetUInt() & MOUSEB_LEFT) && TBWidget::hovered_widget)
     {
     {
-        // see if we have a widget
+        // see if we have a widget with a drag object
+
         TBWidget* tbw = TBWidget::hovered_widget;
         TBWidget* tbw = TBWidget::hovered_widget;
+        UIWidget* widget = nullptr;
 
 
-        while(tbw && !tbw->GetDelegate())
+        while(tbw)
         {
         {
+            if (tbw->GetDelegate())
+            {
+                widget = (UIWidget*) tbw->GetDelegate();
+
+                if (widget->GetDragObject())
+                {
+                    // TODO: check if we're in widget bounds
+                    // this is going to need to be updated for drag/drop multiselect
+                    break;
+                }
+
+                widget = nullptr;
+            }
+
             tbw = tbw->GetParent();
             tbw = tbw->GetParent();
         }
         }
 
 
-        if (!tbw)
+        if (!widget)
             return;
             return;
 
 
-        UIWidget* widget = (UIWidget*) tbw->GetDelegate();
-
         currentTargetWidget_ = widget;
         currentTargetWidget_ = widget;
         dragSourceWidget_ = widget;
         dragSourceWidget_ = widget;