Selaa lähdekoodia

Drag and drop improvements

Josh Engebretson 10 vuotta sitten
vanhempi
sitoutus
995deb9b50

+ 57 - 37
Script/AtomicEditor/ui/HierarchyFrame.ts

@@ -48,7 +48,7 @@ class HierarchyFrame extends Atomic.UIWidget {
         var node = ev.node;
 
         if (this.filterNode(node))
-          return;
+            return;
 
         if (!node.parent || node.scene != this.scene)
             return;
@@ -66,7 +66,7 @@ class HierarchyFrame extends Atomic.UIWidget {
         var node = ev.node;
 
         if (this.filterNode(node))
-          return;
+            return;
 
         delete this.nodeIDToItemID[node.id];
 
@@ -104,45 +104,16 @@ class HierarchyFrame extends Atomic.UIWidget {
 
     handleWidgetEvent(data: Atomic.UIWidgetEvent): boolean {
 
-        if (data.type == Atomic.UI_EVENT_TYPE_CLICK) {
-
-            var id = data.target.id;
-
-            if (this.menu.handlePopupMenu(data.target, data.refid))
-                return true;
-
-            if (id == "create popup") {
-
-                if (data.refid == "create_node") {
+        if (data.type == Atomic.UI_EVENT_TYPE_POINTER_DOWN) {
 
-                    var selectedId = Number(this.hierList.rootList.selectedItemID);
-                    var node = this.scene.getNode(selectedId);
-                    node.createChild("Node");
+            if (data.target == this.hierList.rootList) {
 
-                }
-
-            }
-
-            // create
-            if (id == "menu create") {
-
-                var src = MenuItemSources.getMenuItemSource("hierarchy create items");
-                var menu = new Atomic.UIMenuWindow(data.target, "create popup");
-                menu.show(src);
-                return true;
-
-            }
-
-
-            if (id == "hierList_") {
-
-                var list = <Atomic.UISelectList> data.target;
-
-                var selectedId = Number(list.selectedItemID);
-                var node = this.scene.getNode(selectedId);
+                var node = this.scene.getNode(Number(data.refid));
 
                 if (node) {
 
+                    console.log("Pointer Down: ", node.name);
+
                     // set the widget's drag object
                     var dragObject = new Atomic.UIDragObject(node, node.name.length ? "Node: " + node.name : "Node: (Anonymous)");
                     this.hierList.rootList.dragObject = dragObject;
@@ -151,6 +122,9 @@ class HierarchyFrame extends Atomic.UIWidget {
                     this.subscribeToEvent(dragObject, "DragEnded", (ev: Atomic.DragEndedEvent) => {
 
                         var dragNode = <Atomic.Node> ev.dragObject.object;
+
+                        console.log("drop hover id: ", this.hierList.hoverItemID);
+
                         var dropNode: Atomic.Node = this.scene.getNode(Number(this.hierList.hoverItemID));
 
                         if (!dropNode) {
@@ -180,6 +154,52 @@ class HierarchyFrame extends Atomic.UIWidget {
 
                     });
 
+                }
+
+            }
+
+        }
+
+        if (data.type == Atomic.UI_EVENT_TYPE_CLICK) {
+
+            var id = data.target.id;
+
+            if (this.menu.handlePopupMenu(data.target, data.refid))
+                return true;
+
+            if (id == "create popup") {
+
+                if (data.refid == "create_node") {
+
+                    var selectedId = Number(this.hierList.rootList.selectedItemID);
+                    var node = this.scene.getNode(selectedId);
+                    node.createChild("Node");
+
+                }
+
+            }
+
+            // create
+            if (id == "menu create") {
+
+                var src = MenuItemSources.getMenuItemSource("hierarchy create items");
+                var menu = new Atomic.UIMenuWindow(data.target, "create popup");
+                menu.show(src);
+                return true;
+
+            }
+
+
+            if (id == "hierList_") {
+
+                var list = <Atomic.UISelectList> data.target;
+
+                var selectedId = Number(list.selectedItemID);
+                var node = this.scene.getNode(selectedId);
+
+                if (node) {
+
+
                     this.sendEvent("EditorActiveNodeChange", { node: node });
 
                 }
@@ -205,7 +225,7 @@ class HierarchyFrame extends Atomic.UIWidget {
     recursiveAddNode(parentID: number, node: Atomic.Node): number {
 
         if (this.filterNode(node))
-          return;
+            return;
 
         var name = node.name;
 

+ 17 - 17
Source/Atomic/UI/UIDragDrop.cpp

@@ -63,12 +63,12 @@ UIDragDrop::~UIDragDrop()
 void UIDragDrop::DragEnd()
 {
     SharedPtr<UIDragObject> dragObject = dragObject_;
-    SharedPtr<UIWidget> currentTargetWidget = currentTargetWidget_;
+    WeakPtr<UIWidget> currentTargetWidget = currentTargetWidget_;
 
     // clean up
     currentTargetWidget_ = 0;
     dragObject_ = 0;
-    dragSelectObject_ = 0;
+    dragSourceWidget_ = 0;
     dragLayout_->SetVisibility(UI_WIDGET_VISIBILITY_GONE);
 
     if (currentTargetWidget.Null())
@@ -107,8 +107,7 @@ void UIDragDrop::HandleMouseDown(StringHash eventType, VariantMap& eventData)
         UIWidget* widget = (UIWidget*) tbw->GetDelegate();
 
         currentTargetWidget_ = widget;
-
-        dragSelectObject_ = widget->GetDragObject();
+        dragSourceWidget_ = widget;
 
     }
 
@@ -118,10 +117,12 @@ void UIDragDrop::HandleMouseUp(StringHash eventType, VariantMap& eventData)
 {
     using namespace MouseButtonUp;
 
-    dragSelectObject_ = 0;
-
     if (dragObject_.Null())
+    {
+        dragSourceWidget_ = 0;
+        currentTargetWidget_ = 0;
         return;
+    }
 
     if (!(eventData[P_BUTTON].GetInt() ==  MOUSEB_LEFT))
         return;
@@ -134,21 +135,20 @@ void UIDragDrop::HandleMouseMove(StringHash eventType, VariantMap& eventData)
 {
     Input* input = GetSubsystem<Input>();
 
-    if (!input->IsMouseVisible())
-    {
-        dragObject_ = 0;
-        dragSelectObject_ = 0;
+    if (dragObject_.Null() && dragSourceWidget_.Null())
         return;
-    }
 
-    if (dragSelectObject_.NotNull())
+    if (dragObject_.Null())
     {
-        dragObject_ = dragSelectObject_;
-        dragSelectObject_ = 0;
-    }
+        dragObject_ = dragSourceWidget_->GetDragObject();
 
-    if (dragObject_.Null())
-        return;
+        if (dragObject_.Null())
+        {
+            dragSourceWidget_ = 0;
+            return;
+        }
+
+    }
 
     // initialize if necessary
     if (dragLayout_->GetVisibility() == UI_WIDGET_VISIBILITY_GONE)

+ 3 - 2
Source/Atomic/UI/UIDragDrop.h

@@ -40,11 +40,12 @@ private:
     SharedPtr<UIImageWidget> dragImage_;
     SharedPtr<UITextField> dragText_;
 
-    SharedPtr<UIWidget> currentTargetWidget_;
+    WeakPtr<UIWidget> currentTargetWidget_;
+    WeakPtr<UIWidget> dragSourceWidget_;
 
     SharedPtr<UIDragObject> dragObject_;
 
-    SharedPtr<UIDragObject> dragSelectObject_;
+
 
 };
 

+ 23 - 1
Source/Atomic/UI/UIListView.cpp

@@ -226,6 +226,8 @@ ListViewItemWidget::ListViewItemWidget(ListViewItem *item, ListViewItemSource *s
 
     SetSkinBg(TBIDC("TBSelectItem"));
     GetContentRoot()->AddChild(tfield);
+
+    SetID(item->id);
 }
 
 bool ListViewItemWidget::OnEvent(const TBWidgetEvent &ev)
@@ -235,8 +237,28 @@ bool ListViewItemWidget::OnEvent(const TBWidgetEvent &ev)
         return false;
     }
 
+    if (ev.type == EVENT_TYPE_POINTER_DOWN)
+    {
+        TBWidget* parent = GetParent();
+
+        while (parent)
+        {
+            if (parent->IsOfType<TBSelectList>())
+            {
+                TBWidgetEvent nev = ev;
+                nev.ref_id = item_->id;
+                parent->InvokeEvent(nev);
+                break;
+            }
+
+            parent = parent->GetParent();
+        }
+
+        return true;
+    }
+
     // get clicks this way, not sure we want to
-    if (ev.type == EVENT_TYPE_CLICK && ev.target->GetID() == item_->id)
+    if (ev.type == EVENT_TYPE_CLICK &&  ev.target == expandBox_ && ev.target->GetID() == item_->id)
     {
         item_->SetExpanded(!item_->GetExpanded());
 

+ 7 - 16
Source/Atomic/UI/UIWidget.cpp

@@ -580,26 +580,17 @@ bool UIWidget::OnEvent(const tb::TBWidgetEvent &ev)
     }
     else if (ev.type == EVENT_TYPE_POINTER_DOWN)
     {
-        /*
-        if (ev.target)
+        if (!ev.target || ui->IsWidgetWrapped(ev.target))
         {
-            TBWidget* tbwidget = ev.target;
-
-            while (tbwidget && !ui->IsWidgetWrapped(tbwidget))
-                tbwidget = tbwidget->GetParent();
-
-            if (tbwidget)
-            {
-                VariantMap eventData;
-                ConvertEvent(this, ui->WrapWidget(tbwidget), ev, eventData);
-                SendEvent(E_WIDGETEVENT, eventData);
+            VariantMap eventData;
+            ConvertEvent(this, ui->WrapWidget(ev.target), ev, eventData);
+            SendEvent(E_WIDGETEVENT, eventData);
 
-                if (eventData[WidgetEvent::P_HANDLED].GetBool())
-                    return true;
+            if (eventData[WidgetEvent::P_HANDLED].GetBool())
+                return true;
 
-            }
         }
-        */
+
     }
     else if (ev.type == EVENT_TYPE_TAB_CHANGED)
     {