Ver Fonte

Demonstrate how to bring to front an UI-element.
Close #2251.

Yao Wei Tjong 姚伟忠 há 7 anos atrás
pai
commit
3a76654c44

+ 25 - 40
Source/Samples/37_UIDrag/UIDrag.cpp

@@ -72,53 +72,37 @@ void UIDrag::CreateGUI()
         auto* b = new Button(context_);
         root->AddChild(b);
         // Reference a style from the style sheet loaded earlier:
-        b->SetStyle("Button");
-        b->SetSize(300, 100);
+        b->SetStyleAuto();
+        b->SetMinWidth(250);
         b->SetPosition(IntVector2(50*i, 50*i));
 
+        // Enable the bring-to-front flag and set the initial priority
+        b->SetBringToFront(true);
+        b->SetPriority(i);
+
+        // Set the layout mode to make the child text elements aligned vertically
+        b->SetLayout(LM_VERTICAL, 20, {40, 40, 40, 40});
+        auto dragInfos = {"Num Touch", "Text", "Event Touch"};
+        for (auto name: dragInfos)
+            b->CreateChild<Text>(name)->SetStyleAuto();
+
         if (i % 2 == 0)
             b->AddTag("SomeTag");
 
+        SubscribeToEvent(b, E_CLICK, URHO3D_HANDLER(UIDrag, HandleClick));
         SubscribeToEvent(b, E_DRAGMOVE, URHO3D_HANDLER(UIDrag, HandleDragMove));
         SubscribeToEvent(b, E_DRAGBEGIN, URHO3D_HANDLER(UIDrag, HandleDragBegin));
         SubscribeToEvent(b, E_DRAGCANCEL, URHO3D_HANDLER(UIDrag, HandleDragCancel));
-        SubscribeToEvent(b, E_DRAGEND, URHO3D_HANDLER(UIDrag, HandleDragEnd));
-
-        {
-            auto* t = new Text(context_);
-            b->AddChild(t);
-            t->SetStyle("Text");
-            t->SetHorizontalAlignment(HA_CENTER);
-            t->SetVerticalAlignment(VA_CENTER);
-            t->SetName("Text");
-        }
-
-        {
-            auto* t = new Text(context_);
-            b->AddChild(t);
-            t->SetStyle("Text");
-            t->SetName("Event Touch");
-            t->SetHorizontalAlignment(HA_CENTER);
-            t->SetVerticalAlignment(VA_BOTTOM);
-        }
-
-        {
-            auto* t = new Text(context_);
-            b->AddChild(t);
-            t->SetStyle("Text");
-            t->SetName("Num Touch");
-            t->SetHorizontalAlignment(HA_CENTER);
-            t->SetVerticalAlignment(VA_TOP);
-        }
     }
 
     for (int i = 0; i < 10; i++)
     {
         auto* t = new Text(context_);
         root->AddChild(t);
-        t->SetStyle("Text");
+        t->SetStyleAuto();
         t->SetName("Touch "+ String(i));
         t->SetVisible(false);
+        t->SetPriority(100);     // Make sure it has higher priority than the buttons
     }
 }
 
@@ -146,6 +130,13 @@ void UIDrag::SubscribeToEvents()
     SubscribeToEvent(E_UPDATE, URHO3D_HANDLER(UIDrag, HandleUpdate));
 }
 
+void UIDrag::HandleClick(StringHash eventType, VariantMap& eventData)
+{
+    using namespace Click;
+    auto* element = (Button*)eventData[P_ELEMENT].GetVoidPtr();
+    element->BringToFront();
+}
+
 void UIDrag::HandleDragBegin(StringHash eventType, VariantMap& eventData)
 {
     using namespace DragBegin;
@@ -161,10 +152,10 @@ void UIDrag::HandleDragBegin(StringHash eventType, VariantMap& eventData)
     int buttons = eventData[P_BUTTONS].GetInt();
     element->SetVar("BUTTONS", buttons);
 
-    Text* t = (Text*)element->GetChild(String("Text"));
+    auto* t = element->GetChildStaticCast<Text>("Text", false);
     t->SetText("Drag Begin Buttons: " + String(buttons));
 
-    t = (Text*)element->GetChild(String("Num Touch"));
+    t = element->GetChildStaticCast<Text>("Num Touch", false);
     t->SetText("Number of buttons: " + String(eventData[P_NUMBUTTONS].GetInt()));
 }
 
@@ -178,7 +169,7 @@ void UIDrag::HandleDragMove(StringHash eventType, VariantMap& eventData)
     int Y = eventData[P_Y].GetInt() + d.y_;
     int BUTTONS = element->GetVar("BUTTONS").GetInt();
 
-    Text* t = (Text*)element->GetChild(String("Event Touch"));
+    auto* t = element->GetChildStaticCast<Text>("Event Touch", false);
     t->SetText("Drag Move Buttons: " + String(buttons));
 
     if (buttons == BUTTONS)
@@ -193,12 +184,6 @@ void UIDrag::HandleDragCancel(StringHash eventType, VariantMap& eventData)
     element->SetPosition(P);
 }
 
-void UIDrag::HandleDragEnd(StringHash eventType, VariantMap& eventData)
-{
-    using namespace DragBegin;
-    auto* element = (Button*)eventData[P_ELEMENT].GetVoidPtr();
-}
-
 void UIDrag::HandleUpdate(StringHash eventType, VariantMap& eventData)
 {
     auto* ui = GetSubsystem<UI>();

+ 1 - 3
Source/Samples/37_UIDrag/UIDrag.h

@@ -66,10 +66,8 @@ private:
     void SubscribeToEvents();
 
     void HandleUpdate(StringHash eventType, VariantMap& eventData);
+    void HandleClick(StringHash eventType, VariantMap& eventData);
     void HandleDragBegin(StringHash eventType, VariantMap& eventData);
     void HandleDragMove(StringHash eventType, VariantMap& eventData);
     void HandleDragCancel(StringHash eventType, VariantMap& eventData);
-    void HandleDragEnd(StringHash eventType, VariantMap& eventData);
-    void HandleTextFinished(StringHash eventType, VariantMap& eventData);
-    void HandleLineEditDragBegin(StringHash eventType, VariantMap& eventData);
 };

+ 25 - 32
bin/Data/LuaScripts/37_UIDrag.lua

@@ -53,47 +53,38 @@ function CreateGUI()
     for i=0, 9, 1 do
         local b = Button:new()
         ui.root:AddChild(b)
-        -- Reference a style from the style sheet loaded earlier:
-        b:SetStyle("Button")
-        b:SetMinSize(IntVector2(300, 100))
+        b:SetStyleAuto()
+        b.minWidth = 250
         b:SetPosition(IntVector2(50*i, 50*i))
 
+        -- Enable the bring-to-front flag and set the initial priority
+        b.bringToFront = true;
+        b.priority = i;
+
+        -- Set the layout mode to make the child text elements aligned vertically
+        b:SetLayout(LM_VERTICAL, 20, IntRect(40, 40, 40, 40));
+        local dragInfos = {"Num Touch", "Text", "Event Touch"};
+        for j=1, table.getn(dragInfos) do
+            b:CreateChild("Text", dragInfos[j]):SetStyleAuto();
+        end
+
         if i % 2 == 0 then
              b:AddTag("SomeTag")
         end
 
+        SubscribeToEvent(b, "Click", "HandleClick")
         SubscribeToEvent(b, "DragMove", "HandleDragMove")
         SubscribeToEvent(b, "DragBegin", "HandleDragBegin")
         SubscribeToEvent(b, "DragCancel", "HandleDragCancel")
-
-        local t = Text:new()
-        b:AddChild(t)
-        t:SetStyle("Text")
-        t:SetHorizontalAlignment(HA_CENTER)
-        t:SetVerticalAlignment(VA_CENTER)
-        t:SetName("Text")
-
-        t = Text:new()
-        b:AddChild(t)
-        t:SetStyle("Text")
-        t:SetName("Event Touch")
-        t:SetHorizontalAlignment(HA_CENTER)
-        t:SetVerticalAlignment(VA_BOTTOM)
-
-        t = Text:new()
-        b:AddChild(t)
-        t:SetStyle("Text")
-        t:SetName("Num Touch")
-        t:SetHorizontalAlignment(HA_CENTER)
-        t:SetVerticalAlignment(VA_TOP)
     end
 
     for i = 0, 9, 1 do
         local t = Text:new()
         ui.root:AddChild(t)
-        t:SetStyle("Text")
+        t:SetStyleAuto()
         t:SetName("Touch " .. i)
-        t:SetVisible(false)
+        t.visible = false
+        t.priority = 100    -- Make sure it has higher priority than the buttons
     end
 end
 
@@ -102,6 +93,11 @@ function SubscribeToEvents()
     SubscribeToEvent("Update", "HandleUpdate")
 end
 
+function HandleClick(eventType, eventData)
+    local element = eventData["Element"]:GetPtr("UIElement")
+    element:BringToFront()
+end
+
 function HandleDragBegin(eventType, eventData)
     local element = eventData["Element"]:GetPtr("UIElement")
 
@@ -115,11 +111,9 @@ function HandleDragBegin(eventType, eventData)
     local buttons = eventData["Buttons"]:GetInt()
     element:SetVar(VAR_BUTTONS, Variant(buttons))
 
-    local t = tolua.cast(element:GetChild("Text"), 'Text')
-    t:SetText("Drag Begin Buttons: " .. buttons)
+    element:GetChild("Text").text = "Drag Begin Buttons: " .. buttons
 
-    t = tolua.cast(element:GetChild("Num Touch"), 'Text')
-    t:SetText("Number of buttons: " .. eventData["NumButtons"]:GetInt())
+    element:GetChild("Num Touch").text = "Number of buttons: " .. eventData["NumButtons"]:GetInt()
 end
 
 function HandleDragMove(eventType, eventData)
@@ -130,8 +124,7 @@ function HandleDragMove(eventType, eventData)
     local Y = eventData["Y"]:GetInt() + d.y
     local BUTTONS = element:GetVar(VAR_BUTTONS):GetInt()
 
-    local t = tolua.cast(element:GetChild("Event Touch"), 'Text')
-    t:SetText("Drag Move Buttons: " .. buttons)
+    element:GetChild("Event Touch").text = "Drag Move Buttons: " .. buttons
 
     element:SetPosition(IntVector2(X, Y))
 end

+ 21 - 31
bin/Data/Scripts/37_UIDrag.as

@@ -41,53 +41,37 @@ void CreateGUI()
     {
         Button@ b = Button();
         root.AddChild(b);
-        // Reference a style from the style sheet loaded earlier:
-        b.style = "Button";
-        b.size = IntVector2(300, 100);
+        b.SetStyleAuto();
+        b.minWidth = 250;
         b.position = IntVector2(50*i, 50*i);
 
+        // Enable the bring-to-front flag and set the initial priority
+        b.bringToFront = true;
+        b.priority = i;
+
+        // Set the layout mode to make the child text elements aligned vertically
+        b.SetLayout(LM_VERTICAL, 20, IntRect(40, 40, 40, 40));
+        Array<String> dragInfos = {"Num Touch", "Text", "Event Touch"};
+        for (uint j = 0; j < dragInfos.length; ++j)
+            b.CreateChild("Text", dragInfos[j]).SetStyleAuto();
+
         if (i % 2 == 0)
             b.AddTag("SomeTag");
 
+        SubscribeToEvent(b, "Click", "HandleClick");
         SubscribeToEvent(b, "DragMove", "HandleDragMove");
         SubscribeToEvent(b, "DragBegin", "HandleDragBegin");
         SubscribeToEvent(b, "DragCancel", "HandleDragCancel");
-
-        {
-            Text@ t = Text();
-            b.AddChild(t);
-            t.style = "Text";
-            t.horizontalAlignment = HA_CENTER;
-            t.verticalAlignment = VA_CENTER;
-            t.name = "Text";
-        }
-
-        {
-            Text@ t = Text();
-            b.AddChild(t);
-            t.style = "Text";
-            t.name = "Event Touch";
-            t.horizontalAlignment = HA_CENTER;
-            t.verticalAlignment = VA_BOTTOM;
-        }
-
-        {
-            Text@ t = Text();
-            b.AddChild(t);
-            t.style ="Text";
-            t.name = "Num Touch";
-            t.horizontalAlignment = HA_CENTER;
-            t.verticalAlignment = VA_TOP;
-        }
     }
 
     for (int i = 0; i < 10; i++)
     {
         Text@ t = Text();
         root.AddChild(t);
-        t.style = "Text";
+        t.SetStyleAuto();
         t.name = "Touch "+ String(i);
         t.visible = false;
+        t.priority = 100;   // Make sure it has higher priority than the buttons
     }
 }
 
@@ -113,6 +97,12 @@ void SubscribeToEvents()
     SubscribeToEvent("Update", "HandleUpdate");
 }
 
+void HandleClick(StringHash eventType, VariantMap& eventData)
+{
+    Button@ element = eventData["Element"].GetPtr();
+    element.BringToFront();
+}
+
 void HandleDragBegin(StringHash eventType, VariantMap& eventData)
 {
     Button@ element = eventData["Element"].GetPtr();