Browse Source

Merge pull request #538 from AtomicGameEngine/JME-ATOMIC-LISTVIEW

UI updates
JoshEngebretson 10 years ago
parent
commit
80ac3dc89d

+ 7 - 0
Script/AtomicEditor/ui/frames/HierarchyFrame.ts

@@ -49,6 +49,13 @@ class HierarchyFrame extends Atomic.UIWidget {
 
 
         // handle dropping on hierarchy, moving node, dropping prefabs, etc
         // handle dropping on hierarchy, moving node, dropping prefabs, etc
         this.subscribeToEvent(this.hierList.rootList, "DragEnded", (data) => this.handleDragEnded(data));
         this.subscribeToEvent(this.hierList.rootList, "DragEnded", (data) => this.handleDragEnded(data));
+        // on mouse up clear the list's drag object
+        this.subscribeToEvent("MouseButtonUp", () => {
+
+          this.hierList.rootList.dragObject = null;
+
+        });
+
 
 
         this.subscribeToEvent(EditorEvents.SceneClosed, (ev: EditorEvents.SceneClosedEvent) => {
         this.subscribeToEvent(EditorEvents.SceneClosed, (ev: EditorEvents.SceneClosedEvent) => {
 
 

+ 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;
 
 

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

@@ -252,8 +252,7 @@ ListViewItemWidget::ListViewItemWidget(ListViewItem *item, ListViewItemSource *s
     SetLayoutDistribution(LAYOUT_DISTRIBUTION_GRAVITY);
     SetLayoutDistribution(LAYOUT_DISTRIBUTION_GRAVITY);
     SetLayoutDistributionPosition(LAYOUT_DISTRIBUTION_POSITION_LEFT_TOP);
     SetLayoutDistributionPosition(LAYOUT_DISTRIBUTION_POSITION_LEFT_TOP);
     SetPaintOverflowFadeout(false);
     SetPaintOverflowFadeout(false);
-    SetCapturing(false);
-
+    
     item_->widget_ = this;
     item_->widget_ = this;
 
 
     for (int i = 0; i < item->depth_; i++)
     for (int i = 0; i < item->depth_; i++)

+ 7 - 0
Source/Atomic/UI/UISelectList.cpp

@@ -238,6 +238,13 @@ bool UISelectList::OnEvent(const tb::TBWidgetEvent &ev)
     {
     {
         GetTBSelectList()->SetFocus(WIDGET_FOCUS_REASON_POINTER);
         GetTBSelectList()->SetFocus(WIDGET_FOCUS_REASON_POINTER);
     }
     }
+    if (ev.type == EVENT_TYPE_POINTER_MOVE)
+    {
+        UIDragDrop* dragDrop = GetSubsystem<UIDragDrop>();
+        //if return true, then scroll event will be controlled by that widget itself
+        if (dragDrop->GetDraggingObject())
+            return true;
+    }
     return UIWidget::OnEvent(ev);
     return UIWidget::OnEvent(ev);
 }
 }
 
 

+ 1 - 5
Source/AtomicEditor/Editors/ResourceEditor.cpp

@@ -61,10 +61,6 @@ public:
 
 
     bool OnEvent(const TBWidgetEvent &ev)
     bool OnEvent(const TBWidgetEvent &ev)
     {
     {
-        // Don't process pointer down, we only respond to click events
-        if (ev.type == EVENT_TYPE_POINTER_DOWN)
-            return true;
-
         if (ev.type == EVENT_TYPE_CLICK)
         if (ev.type == EVENT_TYPE_CLICK)
         {
         {
             if (ev.target->GetID() == TBIDC("unsaved_modifications_dialog"))
             if (ev.target->GetID() == TBIDC("unsaved_modifications_dialog"))
@@ -74,7 +70,7 @@ public:
                     container_->OnEvent(ev);
                     container_->OnEvent(ev);
                     editor_->Close(container_->GetNumPages()>1);
                     editor_->Close(container_->GetNumPages()>1);
                 }
                 }
-                else if (ev.ref_id == TBIDC("cancel"))
+                else if (ev.ref_id == TBIDC("TBMessageWindow.cancel"))
                 {
                 {
                     editor_->SendEvent(E_EDITORRESOURCECLOSECANCELED);
                     editor_->SendEvent(E_EDITORRESOURCECLOSECANCELED);
                     SetFocus(WIDGET_FOCUS_REASON_UNKNOWN);
                     SetFocus(WIDGET_FOCUS_REASON_UNKNOWN);

+ 51 - 17
Source/ThirdParty/TurboBadger/tb_widgets.cpp

@@ -1336,15 +1336,35 @@ void TBWidget::InvokePointerDown(int x, int y, int click_count, MODIFIER_KEYS mo
             focus_target = focus_target->m_parent;
             focus_target = focus_target->m_parent;
         }
         }
     }
     }
-    if (down_widget)
+    //save x and y to restore it later
+    int ox = x;
+    int oy = y;
+    //check only for captured_widget
+    if (captured_widget)
+    {
+        captured_widget->SetTouchId(touchId);
+        //converts x, y
+        captured_widget->ConvertFromRoot(x, y);
+        pointer_move_widget_x = pointer_down_widget_x = x;
+        pointer_move_widget_y = pointer_down_widget_y = y;
+        TBWidgetEvent ev(EVENT_TYPE_POINTER_DOWN, x, y, touch, modifierkeys);
+        ev.count = click_count;
+        captured_widget->InvokeEvent(ev);
+    }
+    //restore x and y coords, to use with down_widget
+    x = ox;
+    y = oy;
+    //if down_widget is captured and it's not a captured_widget 
+    //then send an event, otherwise don't send it because POINTER_DOWN event will be sent twice
+    if (down_widget && down_widget != captured_widget)
     {
     {
+        //the same things that's done with captured_widget
         down_widget->Invalidate();
         down_widget->Invalidate();
         down_widget->InvalidateSkinStates();
         down_widget->InvalidateSkinStates();
         down_widget->OnCaptureChanged(true);
         down_widget->OnCaptureChanged(true);
         down_widget->SetTouchId(touchId);
         down_widget->SetTouchId(touchId);
+        //convert x, y
         down_widget->ConvertFromRoot(x, y);
         down_widget->ConvertFromRoot(x, y);
-        pointer_move_widget_x = pointer_down_widget_x = x;
-        pointer_move_widget_y = pointer_down_widget_y = y;
         TBWidgetEvent ev(EVENT_TYPE_POINTER_DOWN, x, y, touch, modifierkeys);
         TBWidgetEvent ev(EVENT_TYPE_POINTER_DOWN, x, y, touch, modifierkeys);
         ev.count = click_count;
         ev.count = click_count;
         down_widget->InvokeEvent(ev);
         down_widget->InvokeEvent(ev);
@@ -1353,30 +1373,44 @@ void TBWidget::InvokePointerDown(int x, int y, int click_count, MODIFIER_KEYS mo
 
 
 void TBWidget::InvokePointerUp(int x, int y, MODIFIER_KEYS modifierkeys, bool touch, int touchId)
 void TBWidget::InvokePointerUp(int x, int y, MODIFIER_KEYS modifierkeys, bool touch, int touchId)
 {
 {
+    //get down_widget before making handling captured_widget event to make sure that down_widget won't be changed
     TBWidget* down_widget = GetWidgetAt(x, y, true);
     TBWidget* down_widget = GetWidgetAt(x, y, true);
-    if ((down_widget && down_widget->touchId_ == touchId) || captured_widget)
+    //save x and y to restore it later
+    int ox = x;
+    int oy = y;
+    //save old_capture for later check, because captured_widget can be nullptr after releasing capture
+    TBWidget *old_capture = captured_widget;
+    if (captured_widget && captured_widget->touchId_ == touchId)
     {
     {
+        captured_widget->ConvertFromRoot(x, y);
         TBWidgetEvent ev_up(EVENT_TYPE_POINTER_UP, x, y, touch, modifierkeys);
         TBWidgetEvent ev_up(EVENT_TYPE_POINTER_UP, x, y, touch, modifierkeys);
         TBWidgetEvent ev_click(EVENT_TYPE_CLICK, x, y, touch, modifierkeys);
         TBWidgetEvent ev_click(EVENT_TYPE_CLICK, x, y, touch, modifierkeys);
-        down_widget->Invalidate();
-        down_widget->InvalidateSkinStates();
-        down_widget->OnCaptureChanged(false);
+        captured_widget->OnCaptureChanged(false);
+        captured_widget->InvokeEvent(ev_up);
+        if (!cancel_click && captured_widget->GetHitStatus(x, y))
+        {
+            captured_widget->InvokeEvent(ev_click);
+        }
+        captured_widget->ReleaseCapture();
+    }
+    //restore x and y coords, to use with down_widget
+    x = ox;
+    y = oy;
+    //make sure that down_widget is not captured_widget to don't sent event twice
+    if (down_widget && down_widget->touchId_ == touchId && old_capture != down_widget)
+    {
         down_widget->ConvertFromRoot(x, y);
         down_widget->ConvertFromRoot(x, y);
+        TBWidgetEvent ev_up(EVENT_TYPE_POINTER_UP, x, y, touch, modifierkeys);
+        TBWidgetEvent ev_click(EVENT_TYPE_CLICK, x, y, touch, modifierkeys);
+        down_widget->OnCaptureChanged(false);
         down_widget->InvokeEvent(ev_up);
         down_widget->InvokeEvent(ev_up);
         if (!cancel_click && down_widget->GetHitStatus(x, y))
         if (!cancel_click && down_widget->GetHitStatus(x, y))
         {
         {
             down_widget->InvokeEvent(ev_click);
             down_widget->InvokeEvent(ev_click);
         }
         }
-        if (captured_widget)
-        {
-            captured_widget->ConvertFromRoot(x, y);
-            if (!cancel_click && captured_widget->GetHitStatus(x, y))
-            {
-                captured_widget->InvokeEvent(ev_click);
-            }
-            captured_widget->InvokeEvent(ev_up);
-            captured_widget->ReleaseCapture();
-        }
+        //ReleaseCapture
+        down_widget->Invalidate();
+        down_widget->InvalidateSkinStates();
     }
     }
 }
 }