Browse Source

Dragging from resources frame to 3d frame and instantiating node with model

Josh Engebretson 10 years ago
parent
commit
2f952a540e

+ 1 - 1
Data/AtomicEditor/Resources/EditorData/AtomicEditor/typescript/ui/ProjectFrame.ts

@@ -193,7 +193,7 @@ class ProjectFrame extends ScriptWidget {
 
         var button = new Atomic.UIButton();
 
-        button.dragObject = asset;
+        button.dragObject = new Atomic.UIDragObject(asset, asset.name);
 
         var lp = new Atomic.UILayoutParams;
         lp.height = 20;

+ 49 - 20
Source/Atomic/UI/UIDragDrop.cpp

@@ -6,12 +6,15 @@
 #include "../Input/InputEvents.h"
 
 #include "UI.h"
+#include "UIEvents.h"
 #include "UIWidget.h"
+#include "UILayout.h"
 #include "UIFontDescription.h"
 #include "UITextField.h"
 #include "UIImageWidget.h"
 #include "UISelectList.h"
 #include "UIDragDrop.h"
+#include "UIDragObject.h"
 
 using namespace tb;
 
@@ -30,21 +33,17 @@ UIDragDrop::UIDragDrop(Context* context) : Object(context)
 
     dragText_ = new UITextField(context);
     dragText_->SetFontDescription(fd);
-    dragText_->SetText("This is a test!");
     dragText_->SetGravity(WIDGET_GRAVITY_TOP);
 
-    UIPreferredSize* sz = dragText_->GetPreferredSize();
-    dragText_->SetRect(IntRect(0, 0, sz->GetMinWidth(), sz->GetMinHeight()));
+    dragLayout_ = new UILayout(context);
+    dragLayout_->AddChild(dragText_);
 
-    dragWidget_ = new UIWidget(context);
-    dragWidget_->AddChild(dragText_);
-
-    sz = dragWidget_->GetPreferredSize();
-    dragWidget_->SetRect(IntRect(0, 0, sz->GetMinWidth(), sz->GetMinHeight()));
+    dragLayout_->SetLayoutSize(UI_LAYOUT_SIZE_PREFERRED);
+    dragLayout_->SetVisibility(UI_WIDGET_VISIBILITY_GONE);
 
     // put into hierarchy so we aren't pruned
     TBWidget* root = GetSubsystem<UI>()->GetRootWidget();
-    root->AddChild(dragWidget_->GetInternalWidget());
+    root->AddChild(dragLayout_->GetInternalWidget());
 
 }
 
@@ -65,7 +64,6 @@ void UIDragDrop::HandleMouseDown(StringHash eventType, VariantMap& eventData)
     if ((eventData[P_BUTTONS].GetUInt() & MOUSEB_LEFT) && TBWidget::hovered_widget)
     {
         // see if we have a widget
-
         TBWidget* tbw = TBWidget::hovered_widget;
 
         while(tbw && !tbw->GetDelegate())
@@ -85,14 +83,7 @@ void UIDragDrop::HandleMouseDown(StringHash eventType, VariantMap& eventData)
         }
         else
         {
-            SharedPtr<Object> dragObject(widget->GetDragObject());
-
-            dragWidget_->GetInternalWidget()->SetZ(WIDGET_Z_TOP);
-
-            if (dragObject.NotNull())
-                LOGINFOF("DRAG WIDGET: %s Object: %s", widget->GetTypeName().CString(), dragObject->GetTypeName().CString());
-            else
-                LOGINFOF("DRAG WIDGET: %s Object: None", widget->GetTypeName().CString());
+            dragObject_ = widget->GetDragObject();
         }
 
     }
@@ -101,22 +92,60 @@ void UIDragDrop::HandleMouseDown(StringHash eventType, VariantMap& eventData)
 
 void UIDragDrop::HandleMouseUp(StringHash eventType, VariantMap& eventData)
 {
+    using namespace MouseButtonUp;
+
+    if (dragObject_.Null())
+        return;
+
+    Input* input = GetSubsystem<Input>();
+
+    if (!input->IsMouseVisible())
+        return;
+
+    if ((eventData[P_BUTTON].GetInt() ==  MOUSEB_LEFT) &&
+            TBWidget::hovered_widget && TBWidget::hovered_widget->GetDelegate())
+    {
+        UIWidget* widget = (UIWidget*) TBWidget::hovered_widget->GetDelegate();
+
+        VariantMap dropData;
+        dropData[DragEnded::P_TARGET] = widget;
+        dropData[DragEnded::P_DRAGOBJECT] = dragObject_;
+        SendEvent(E_DRAGENDED, dropData);
+    }
+
+    // clean up
+    dragObject_ = 0;
+    dragLayout_->SetVisibility(UI_WIDGET_VISIBILITY_GONE);
 
 }
 
 void UIDragDrop::HandleMouseMove(StringHash eventType, VariantMap& eventData)
 {
-    using namespace MouseMove;
+    if (dragObject_.Null())
+        return;
 
     Input* input = GetSubsystem<Input>();
 
     if (!input->IsMouseVisible())
         return;
 
+    // initialize if necessary
+    if (dragLayout_->GetVisibility() == UI_WIDGET_VISIBILITY_GONE)
+    {
+        dragLayout_->GetInternalWidget()->SetZ(WIDGET_Z_TOP);
+        dragLayout_->SetVisibility(UI_WIDGET_VISIBILITY_VISIBLE);
+        dragText_->SetText(dragObject_->GetText());
+
+        UIPreferredSize* sz = dragLayout_->GetPreferredSize();
+        dragLayout_->SetRect(IntRect(0, 0, sz->GetMinWidth(), sz->GetMinHeight()));
+    }
+
+    using namespace MouseMove;
+
     int x = eventData[P_X].GetInt();
     int y = eventData[P_Y].GetInt();
 
-    dragWidget_->SetPosition(x, y - 20);
+    dragLayout_->SetPosition(x, y - 20);
 
 }
 

+ 5 - 4
Source/Atomic/UI/UIDragDrop.h

@@ -7,11 +7,12 @@ namespace Atomic
 {
 
 class UIWidget;
+class UILayout;
 class UIImageWidget;
 class UITextField;
+class UIDragObject;
 
-/// UIDragDrop subsystem,
-
+/// UIDragDrop subsystem
 class UIDragDrop : public Object
 {
 
@@ -28,11 +29,11 @@ private:
     void HandleMouseUp(StringHash eventType, VariantMap& eventData);
     void HandleMouseMove(StringHash eventType, VariantMap& eventData);
 
-    SharedPtr<UIWidget> dragWidget_;
+    SharedPtr<UILayout> dragLayout_;
     SharedPtr<UIImageWidget> dragImage_;
     SharedPtr<UITextField> dragText_;
 
-    SharedPtr<Object> dragObject_;
+    SharedPtr<UIDragObject> dragObject_;
 
 };
 

+ 21 - 0
Source/Atomic/UI/UIDragObject.cpp

@@ -0,0 +1,21 @@
+
+#include "UIDragObject.h"
+
+namespace Atomic
+{
+
+UIDragObject::UIDragObject(Context* context, Object* object, const String &text, const String &icon) : Object(context),
+    text_(text),
+    icon_(icon),
+    object_(object)
+{
+
+}
+
+UIDragObject::~UIDragObject()
+{
+
+}
+
+
+}

+ 37 - 0
Source/Atomic/UI/UIDragObject.h

@@ -0,0 +1,37 @@
+
+#pragma once
+
+#include <Atomic/Core/Object.h>
+
+namespace Atomic
+{
+
+
+class UIDragObject : public Object
+{
+
+    OBJECT(UIDragObject);
+
+public:
+    /// Construct.
+    UIDragObject(Context* context, Object* object = NULL, const String& text = String::EMPTY, const String& icon = String::EMPTY);
+    virtual ~UIDragObject();
+
+    const String& GetText() { return text_; }
+    const String& GetIcon() { return icon_; }
+    Object* GetObject() { return object_; }
+
+    void SetText(const String& text) { text_ = text; }
+    void SetIcon(const String& icon) { icon_ = icon; }
+    void SetObject(Object* object) { object_ = object; }
+
+private:
+
+    String text_;
+    String icon_;
+    SharedPtr<Object> object_;
+
+};
+
+
+}

+ 6 - 349
Source/Atomic/UI/UIEvents.h

@@ -58,360 +58,17 @@ EVENT(E_WIDGETDELETED, WidgetDeleted)
     PARAM(P_WIDGET, Widget);             // UIWidget pointer
 }
 
-EVENT(E_POPUPMENUSELECT, PopupMenuSelect)
-{
-    PARAM(P_BUTTON, Button);             // UIButton that created popup
-    PARAM(P_REFID, RefID);             // string tbid
-}
-
-
-/// Mouse click in the UI.
-EVENT(E_UIMOUSECLICK, UIMouseClick)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_X, X);                          // int
-    PARAM(P_Y, Y);                          // int
-    PARAM(P_BUTTON, Button);                // int
-    PARAM(P_BUTTONS, Buttons);              // int
-    PARAM(P_QUALIFIERS, Qualifiers);        // int
-}
-
-/// Mouse click end in the UI.
-EVENT(E_UIMOUSECLICKEND, UIMouseClickEnd)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_BEGINELEMENT, BeginElement);    // UIElement pointer
-    PARAM(P_X, X);                          // int
-    PARAM(P_Y, Y);                          // int
-    PARAM(P_BUTTON, Button);                // int
-    PARAM(P_BUTTONS, Buttons);              // int
-    PARAM(P_QUALIFIERS, Qualifiers);        // int
-}
-
-/// Mouse double click in the UI.
-EVENT(E_UIMOUSEDOUBLECLICK, UIMouseDoubleClick)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_X, X);                          // int
-    PARAM(P_Y, Y);                          // int
-    PARAM(P_BUTTON, Button);                // int
-    PARAM(P_BUTTONS, Buttons);              // int
-    PARAM(P_QUALIFIERS, Qualifiers);        // int
-}
-
-/// Drag and drop test.
-EVENT(E_DRAGDROPTEST, DragDropTest)
-{
-    PARAM(P_SOURCE, Source);                // UIElement pointer
-    PARAM(P_TARGET, Target);                // UIElement pointer
-    PARAM(P_ACCEPT, Accept);                // bool
-};
-
-/// Drag and drop finish.
-EVENT(E_DRAGDROPFINISH, DragDropFinish)
-{
-    PARAM(P_SOURCE, Source);                // UIElement pointer
-    PARAM(P_TARGET, Target);                // UIElement pointer
-    PARAM(P_ACCEPT, Accept);                // bool
-};
-
-/// Focus element changed.
-EVENT(E_FOCUSCHANGED, FocusChanged)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_CLICKEDELEMENT, ClickedElement); // UIElement pointer
-}
-
-/// UI element name changed.
-EVENT(E_NAMECHANGED, NameChanged)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-}
-
-/// UI element resized.
-EVENT(E_RESIZED, Resized)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_WIDTH, Width);                  // int
-    PARAM(P_HEIGHT, Height);                // int
-}
-
-/// UI element positioned.
-EVENT(E_POSITIONED, Positioned)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_X, X);                          // int
-    PARAM(P_Y, Y);                          // int
-}
-
-/// UI element visibility changed.
-EVENT(E_VISIBLECHANGED, VisibleChanged)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_VISIBLE, Visible);              // bool
-}
-
-/// UI element focused.
-EVENT(E_FOCUSED, Focused)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_BYKEY, ByKey);                  // bool
-}
-
-/// UI element defocused.
-EVENT(E_DEFOCUSED, Defocused)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-}
-
-/// UI element layout updated.
-EVENT(E_LAYOUTUPDATED, LayoutUpdated)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-}
-
-/// UI button pressed.
-EVENT(E_PRESSED, Pressed)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-}
-
-/// UI button was pressed, then released.
-EVENT(E_RELEASED, Released)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-}
-
-/// UI checkbox toggled.
-EVENT(E_TOGGLED, Toggled)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_STATE, State);                  // bool
-}
-
-/// UI slider value changed
-EVENT(E_SLIDERCHANGED, SliderChanged)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_VALUE, Value);                  // float
-}
-
-/// UI slider being paged.
-EVENT(E_SLIDERPAGED, SliderPaged)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_OFFSET, Offset);                // int
-    PARAM(P_PRESSED, Pressed);              // bool
-}
-
-/// UI scrollbar value changed.
-EVENT(E_SCROLLBARCHANGED, ScrollBarChanged)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_VALUE, Value);                  // float
-}
-
-/// UI scrollview position changed.
-EVENT(E_VIEWCHANGED, ViewChanged)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_X, X);                          // int
-    PARAM(P_Y, Y);                          // int
-}
-
-/// UI modal changed (currently only Window has modal flag).
-EVENT(E_MODALCHANGED, ModalChanged)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_MODAL, Modal);                  // bool
-}
-
-/// Text entry into a LineEdit. The char can be modified in the event data.
-EVENT(E_TEXTENTRY, CharEntry)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_TEXT, Text);                    // String
-    PARAM(P_BUTTONS, Buttons);              // int
-    PARAM(P_QUALIFIERS, Qualifiers);        // int
-}
-
-/// Editable text changed
-EVENT(E_TEXTCHANGED, TextChanged)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_TEXT, Text);                    // String
-}
-
-/// Text editing finished (enter pressed on a LineEdit)
-EVENT(E_TEXTFINISHED, TextFinished)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_TEXT, Text);                    // String
-    PARAM(P_VALUE, Value);                 // Float
-}
-
-/// Menu selected.
-EVENT(E_MENUSELECTED, MenuSelected)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-}
-
-/// Listview or DropDownList item selected.
-EVENT(E_ITEMSELECTED, ItemSelected)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_SELECTION, Selection);          // int
-}
-
-/// Listview item deselected.
-EVENT(E_ITEMDESELECTED, ItemDeselected)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_SELECTION, Selection);          // int
-}
-
-/// Listview selection change finished.
-EVENT(E_SELECTIONCHANGED, SelectionChanged)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-}
-
-/// Listview item clicked. If this is a left-click, also ItemSelected event will be sent. If this is a right-click, only this event is sent.
-EVENT(E_ITEMCLICKED, ItemClicked)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_ITEM, Item);                    // UIElement pointer
-    PARAM(P_SELECTION, Selection);          // int
-    PARAM(P_BUTTON, Button);                // int
-    PARAM(P_BUTTONS, Buttons);              // int
-    PARAM(P_QUALIFIERS, Qualifiers);        // int
-}
-
-/// Listview item double clicked.
-EVENT(E_ITEMDOUBLECLICKED, ItemDoubleClicked)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_ITEM, Item);                    // UIElement pointer
-    PARAM(P_SELECTION, Selection);          // int
-    PARAM(P_BUTTON, Button);                // int
-    PARAM(P_BUTTONS, Buttons);              // int
-    PARAM(P_QUALIFIERS, Qualifiers);        // int
-}
-
-/// LineEdit or ListView unhandled key pressed.
-EVENT(E_UNHANDLEDKEY, UnhandledKey)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_KEY, Key);                      // int
-    PARAM(P_BUTTONS, Buttons);              // int
-    PARAM(P_QUALIFIERS, Qualifiers);        // int
-}
-
-/// Fileselector choice.
-EVENT(E_FILESELECTED, FileSelected)
-{
-    PARAM(P_FILENAME, FileName);            // String
-    PARAM(P_FILTER, Filter);                // String
-    PARAM(P_OK, Ok);                        // bool
-}
-
-/// MessageBox acknowlegement.
-EVENT(E_MESSAGEACK, MessageACK)
-{
-    PARAM(P_OK, Ok);                        // bool
-}
-
-/// A child element has been added to an element. Sent by the UI root element, or element-event-sender if set.
-EVENT(E_ELEMENTADDED, ElementAdded)
-{
-    PARAM(P_ROOT, Root);                    // UIElement pointer
-    PARAM(P_PARENT, Parent);                // UIElement pointer
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-}
-
-/// A child element is about to be removed from an element. Sent by the UI root element, or element-event-sender if set.
-EVENT(E_ELEMENTREMOVED, ElementRemoved)
-{
-    PARAM(P_ROOT, Root);                    // UIElement pointer
-    PARAM(P_PARENT, Parent);                // UIElement pointer
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-}
-
-/// Hovering on an UI element has started
-EVENT(E_HOVERBEGIN, HoverBegin)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_X, X);                          // int
-    PARAM(P_Y, Y);                          // int
-    PARAM(P_ELEMENTX, ElementX);            // int
-    PARAM(P_ELEMENTY, ElementY);            // int
-}
-
-/// Hovering on an UI element has ended
-EVENT(E_HOVEREND, HoverEnd)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-}
-
-/// Drag behavior of a UI Element has started
-EVENT(E_DRAGBEGIN, DragBegin)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_X, X);                          // int
-    PARAM(P_Y, Y);                          // int
-    PARAM(P_ELEMENTX, ElementX);            // int
-    PARAM(P_ELEMENTY, ElementY);            // int
-    PARAM(P_BUTTONS, Buttons);              // int
-    PARAM(P_NUMBUTTONS, NumButtons);        // int
-}
-
-/// Drag behavior of a UI Element when the input device has moved
-EVENT(E_DRAGMOVE, DragMove)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_X, X);                          // int
-    PARAM(P_Y, Y);                          // int
-    PARAM(P_DX, DX);                        // int
-    PARAM(P_DY, DY);                        // int
-    PARAM(P_ELEMENTX, ElementX);            // int
-    PARAM(P_ELEMENTY, ElementY);            // int
-    PARAM(P_BUTTONS, Buttons);              // int
-    PARAM(P_NUMBUTTONS, NumButtons);        // int
-}
-
-/// Drag behavior of a UI Element has finished
-EVENT(E_DRAGEND, DragEnd)
+EVENT(E_DRAGENDED, DragEnded)
 {
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_X, X);                          // int
-    PARAM(P_Y, Y);                          // int
-    PARAM(P_ELEMENTX, ElementX);            // int
-    PARAM(P_ELEMENTY, ElementY);            // int
-    PARAM(P_BUTTONS, Buttons);              // int
-    PARAM(P_NUMBUTTONS, NumButtons);        // int
+    PARAM(P_TARGET, Target);             // UIWidget pointer
+    PARAM(P_DRAGOBJECT, DragObject);     // UIDragObject pointer
 }
 
-/// Drag of a UI Element was canceled by pressing ESC
-EVENT(E_DRAGCANCEL, DragCancel)
-{
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_X, X);                          // int
-    PARAM(P_Y, Y);                          // int
-    PARAM(P_ELEMENTX, ElementX);            // int
-    PARAM(P_ELEMENTY, ElementY);            // int
-    PARAM(P_BUTTONS, Buttons);              // int
-    PARAM(P_NUMBUTTONS, NumButtons);        // int
-}
 
-/// A file was drag-dropped into the application window. Includes also coordinates and UI element if applicable
-EVENT(E_UIDROPFILE, UIDropFile)
+EVENT(E_POPUPMENUSELECT, PopupMenuSelect)
 {
-    PARAM(P_FILENAME, FileName);            // String
-    PARAM(P_ELEMENT, Element);              // UIElement pointer
-    PARAM(P_X, X);                          // int
-    PARAM(P_Y, Y);                          // int
-    PARAM(P_ELEMENTX, ElementX);            // int (only if element is non-null)
-    PARAM(P_ELEMENTY, ElementY);            // int (only if element is non-null)
+    PARAM(P_BUTTON, Button);             // UIButton that created popup
+    PARAM(P_REFID, RefID);             // string tbid
 }
 
 }

+ 1 - 1
Source/Atomic/UI/UILayout.cpp

@@ -62,7 +62,7 @@ void UILayout::SetLayoutDistributionPosition(/*LAYOUT_DISTRIBUTION_POSITION*/ un
 
 }
 
-void UILayout::SetLayoutSize(unsigned size)
+void UILayout::SetLayoutSize(UI_LAYOUT_SIZE size)
 {
     if (!widget_)
         return;

+ 20 - 1
Source/Atomic/UI/UILayout.h

@@ -1,11 +1,30 @@
 
 #pragma once
 
+#include <ThirdParty/TurboBadger/tb_layout.h>
+
 #include "UIWidget.h"
 
 namespace Atomic
 {
 
+/// Specifies which height widgets in a AXIS_X layout should have,
+///	or which width widgets in a AXIS_Y layout should have.
+///	No matter what, it will still prioritize minimum and maximum for each widget.
+enum UI_LAYOUT_SIZE
+{
+    /// Sizes depend on the gravity for each widget. (If the widget pulls
+    /// towards both directions, it should grow to all available space)
+    UI_LAYOUT_SIZE_GRAVITY = tb::LAYOUT_SIZE_GRAVITY,
+
+    /// Size will be the preferred so each widget may be sized differently.
+    UI_LAYOUT_SIZE_PREFERRED = tb::LAYOUT_SIZE_PREFERRED,
+
+    /// Size should grow to all available space
+    UI_LAYOUT_SIZE_AVAILABLE = tb::LAYOUT_SIZE_AVAILABLE
+};
+
+
 class UILayoutParams : public Object
 {
     OBJECT(UILayoutParams)
@@ -38,7 +57,7 @@ public:
     void SetSpacing(int spacing);
 
     void SetAxis(/* AXIS */ unsigned axis);
-    void SetLayoutSize(/* LAYOUT_SIZE */ unsigned size);
+    void SetLayoutSize(UI_LAYOUT_SIZE size);
 
     void SetLayoutPosition(/*LAYOUT_POSITION*/ unsigned position);
     void SetLayoutDistribution(/* LAYOUT_DISTRIBUTION */ unsigned distribution);

+ 9 - 1
Source/Atomic/UI/UIWidget.cpp

@@ -375,7 +375,7 @@ void UIWidget::SetFocus()
     widget_->SetFocus(WIDGET_FOCUS_REASON_UNKNOWN);
 }
 
-void UIWidget::SetVisibility(/*WIDGET_VISIBILITY*/ unsigned visibility)
+void UIWidget::SetVisibility(UI_WIDGET_VISIBILITY visibility)
 {
 
     if (!widget_)
@@ -385,6 +385,14 @@ void UIWidget::SetVisibility(/*WIDGET_VISIBILITY*/ unsigned visibility)
 
 }
 
+UI_WIDGET_VISIBILITY UIWidget::GetVisibility()
+{
+    if (!widget_)
+        return UI_WIDGET_VISIBILITY_GONE;
+
+    return (UI_WIDGET_VISIBILITY) widget_->GetVisibility();
+}
+
 UIWidget* UIWidget::GetFirstChild()
 {
     if (!widget_)

+ 17 - 4
Source/Atomic/UI/UIWidget.h

@@ -6,10 +6,22 @@
 #include "../Core/Object.h"
 
 #include "UIPreferredSize.h"
+#include "UIDragObject.h"
 
 namespace Atomic
 {
 
+/// Defines widget visibility, used with UIWidget::SetVisibility.
+enum UI_WIDGET_VISIBILITY
+{
+    /// Visible (default)
+    UI_WIDGET_VISIBILITY_VISIBLE = tb:: WIDGET_VISIBILITY_VISIBLE,
+    /// Invisible, but layouted. Interaction disabled.
+    UI_WIDGET_VISIBILITY_INVISIBLE = tb::WIDGET_VISIBILITY_INVISIBLE,
+    /// Invisible and no layout. Interaction disabled.
+    UI_WIDGET_VISIBILITY_GONE = tb::WIDGET_VISIBILITY_GONE
+};
+
 class UILayoutParams;
 class UIFontDescription;
 
@@ -61,7 +73,8 @@ public:
     void SetState(/*WIDGET_STATE*/ unsigned state, bool on);
     bool GetState(/*WIDGET_STATE*/ unsigned state);
 
-    void SetVisibility(/*WIDGET_VISIBILITY*/ unsigned visibility);
+    void SetVisibility(UI_WIDGET_VISIBILITY visibility);
+    UI_WIDGET_VISIBILITY GetVisibility();
 
     void SetStateRaw(/*WIDGET_STATE*/ unsigned state);
     /*WIDGET_STATE*/ unsigned GetStateRaw();
@@ -69,8 +82,8 @@ public:
     void Invalidate();
     void Die();
 
-    void SetDragObject(Object* object) { dragObject_ = object; }
-    Object* GetDragObject() { return dragObject_; }
+    void SetDragObject(UIDragObject* object) { dragObject_ = object; }
+    UIDragObject* GetDragObject() { return dragObject_; }
 
     UIWidget* GetFirstChild();
     UIWidget* GetNext();
@@ -99,7 +112,7 @@ protected:
 
     SharedPtr<UIPreferredSize> preferredSize_;
 
-    SharedPtr<Object> dragObject_;
+    SharedPtr<UIDragObject> dragObject_;
 
 };
 

+ 57 - 4
Source/AtomicEditorWork/Editors/SceneEditor3D/SceneView3D.cpp

@@ -14,21 +14,29 @@
 #include <Atomic/Graphics/DebugRenderer.h>
 #include <Atomic/Graphics/Viewport.h>
 #include <Atomic/Graphics/Octree.h>
+#include <Atomic/Graphics/Material.h>
+
 #include <Atomic/Atomic3D/Terrain.h>
+#include <Atomic/Atomic3D/Model.h>
 
 #include <Atomic/Input/Input.h>
 
 #include <Atomic/IO/FileSystem.h>
 #include <Atomic/Resource/ResourceCache.h>
-
 #include <Atomic/Physics/PhysicsWorld.h>
+#include <Atomic/UI/UI.h>
+#include <Atomic/UI/UIEvents.h>
+
+#include <ToolCore/Assets/Asset.h>
+#include <ToolCore/Assets/AssetDatabase.h>
 
 #include "AEEditor.h"
 #include "AEEvents.h"
 
 #include "SceneView3D.h"
 #include "SceneEditor3D.h"
-#include <Atomic/UI/UI.h>
+
+using namespace ToolCore;
 
 namespace AtomicEditor
 {
@@ -80,6 +88,7 @@ SceneView3D ::SceneView3D(Context* context, SceneEditor3D *sceneEditor) :
     SubscribeToEvent(E_UPDATE, HANDLER(SceneView3D, HandleUpdate));
     SubscribeToEvent(E_EDITORACTIVENODECHANGE, HANDLER(SceneView3D, HandleEditorActiveNodeChange));
     SubscribeToEvent(E_POSTRENDERUPDATE, HANDLER(SceneView3D, HandlePostRenderUpdate));
+    SubscribeToEvent(E_DRAGENDED, HANDLER(SceneView3D, HandleDragEnded));
 
     // TODO: generate this event properly
     VariantMap eventData;
@@ -103,7 +112,7 @@ void SceneView3D::Enable()
 
     enabled_ = true;
 
-    SetVisibility(WIDGET_VISIBILITY_VISIBLE);
+    SetVisibility(UI_WIDGET_VISIBILITY_VISIBLE);
 }
 
 void SceneView3D::Disable()
@@ -113,7 +122,7 @@ void SceneView3D::Disable()
 
     enabled_ = false;
 
-    SetVisibility(WIDGET_VISIBILITY_INVISIBLE);
+    SetVisibility(UI_WIDGET_VISIBILITY_INVISIBLE);
 
 }
 
@@ -343,6 +352,50 @@ void SceneView3D::HandleEditorActiveNodeChange(StringHash eventType, VariantMap&
     SelectNode(node);
 }
 
+void SceneView3D::HandleDragEnded(StringHash eventType, VariantMap& eventData)
+{
+    using namespace DragEnded;
+
+    UIWidget* widget = static_cast<UIWidget*>(eventData[P_TARGET].GetPtr());
+
+    if (widget != this)
+        return;
+
+    UIDragObject* dragObject = static_cast<UIDragObject*>(eventData[P_DRAGOBJECT].GetPtr());
+
+    Object* object = dragObject->GetObject();
+
+    if (object->GetType() == Asset::GetTypeStatic())
+    {
+        Asset* asset = (Asset*) object;
+
+        ResourceCache* cache = GetSubsystem<ResourceCache>();
+
+        Model* model = cache->GetResource<Model>(asset->GetGUID());
+
+        Node* node = scene_->CreateChild(asset->GetName());
+        StaticModel* mc = node->CreateComponent<StaticModel>();
+        mc->SetModel(model);
+
+        Material* material1 = cache->GetResource<Material>("Materials/AlphaMaterial.xml");
+        Material* material2 = cache->GetResource<Material>("Materials/BedMaterial.xml");
+
+        if (mc->GetNumGeometries() > 1)
+        {
+            mc->SetMaterial(0, material1);
+            mc->SetMaterial(1, material2);
+        }
+        else
+        {
+            mc->SetMaterial(0, material2);
+        }
+
+
+        LOGINFOF("Dropped %s : %s on SceneView3D", asset->GetPath().CString(), asset->GetGUID().CString());
+    }
+
+}
+
 
 
 }

+ 2 - 1
Source/AtomicEditorWork/Editors/SceneEditor3D/SceneView3D.h

@@ -51,8 +51,9 @@ private:
 
     bool MouseInView();
 
+    void HandleDragEnded(StringHash eventType, VariantMap& eventData);
     void HandleUpdate(StringHash eventType, VariantMap& eventData);
-    void HandlePostRenderUpdate(StringHash eventType, VariantMap& eventData);
+    void HandlePostRenderUpdate(StringHash eventType, VariantMap& eventData);    
     void HandleEditorActiveNodeChange(StringHash eventType, VariantMap& eventData);
 
     void DrawNodeDebug(Node* node, DebugRenderer* debug, bool drawNode = true);

+ 1 - 1
Source/AtomicJS/Packages/Atomic/UI.json

@@ -7,7 +7,7 @@
 								"UISelectItem", "UISelectItemSource", "UIMenuWindow", "UIEditField",
 								"UIImageWidget", "UIClickLabel", "UICheckBox", "UIMenuItem", "UIMenuItemSource",
 								"UISelectList", "UIListView", "UIMessageWindow", "UILayoutParams", "UIFontDescription",
-								"UISkinImage", "UITabContainer", "UISceneView"],
+								"UISkinImage", "UITabContainer", "UISceneView", "UIPreferredSize", "UIDragObject"],
 	"overloads" : {
 	}
 }

+ 5 - 0
Source/ToolCore/Assets/AssetDatabase.cpp

@@ -5,6 +5,8 @@
 #include <Atomic/IO/File.h>
 #include <Atomic/IO/FileSystem.h>
 
+#include <Atomic/Resource/ResourceCache.h>
+
 #include "../ToolEvents.h"
 #include "../ToolSystem.h"
 #include "../Project/Project.h"
@@ -198,6 +200,9 @@ void AssetDatabase::HandleProjectLoaded(StringHash eventType, VariantMap& eventD
 {
     project_ = GetSubsystem<ToolSystem>()->GetProject();
 
+    ResourceCache* cache = GetSubsystem<ResourceCache>();
+    cache->AddResourceDir(GetCachePath());
+
     Scan();
 }