Browse Source

Adding UISelectDropdown, android sdk target querying

Josh Engebretson 10 years ago
parent
commit
961eb5c33e

+ 36 - 0
Script/AtomicEditor/ui/modal/build/platforms/AndroidSettingsWidget.ts

@@ -7,6 +7,8 @@ class AndroidSettingsWidget extends Atomic.UIWidget {
 
         this.load("AtomicEditor/editor/ui/buildsettings_android.tb.txt");
 
+        this.sdkTargetSelect = <Atomic.UISelectDropdown>this.getWidget("sdk_target_select");
+
         this.refreshWidgets();
 
         this.subscribeToEvent(this, "WidgetEvent", (ev) => this.handleWidgetEvent(ev));
@@ -37,6 +39,10 @@ class AndroidSettingsWidget extends Atomic.UIWidget {
 
                 return true;
 
+            } else if (ev.target.id == "refresh_sdk_targets") {
+
+                this.refreshAndroidTargets();
+
             }
 
         }
@@ -44,6 +50,33 @@ class AndroidSettingsWidget extends Atomic.UIWidget {
         return false;
     }
 
+    refreshAndroidTargets() {
+
+        var platform = <ToolCore.PlatformAndroid>ToolCore.toolSystem.getPlatformByName("ANDROID");
+
+        platform.refreshAndroidTargets();
+
+        this.subscribeToEvent(platform, "AndroidTargetsRefreshed", (ev) => {
+
+          this.sdkTargetSource.clear();
+
+          var targets:string[] = platform.androidTargets;
+
+          for (var i in targets) {
+
+              this.sdkTargetSource.addItem(new Atomic.UISelectItem(targets[i]));
+          }
+
+          this.sdkTargetSelect.source = this.sdkTargetSource;
+
+          // force a refresh
+          this.sdkTargetSelect.value = -1;
+          this.sdkTargetSelect.value = 0;
+
+        });
+
+    }
+
     refreshWidgets() {
 
         var sdkPathEdit = <Atomic.UIEditField>this.getWidget("sdk_path");
@@ -70,6 +103,9 @@ class AndroidSettingsWidget extends Atomic.UIWidget {
 
     }
 
+    sdkTargetSource:Atomic.UISelectItemSource = new Atomic.UISelectItemSource();
+    sdkTargetSelect:Atomic.UISelectDropdown;
+
 }
 
 export = AndroidSettingsWidget;

+ 1 - 1
Script/Packages/Atomic/UI.json

@@ -9,7 +9,7 @@
 								"UISelectList", "UIListView", "UIMessageWindow", "UILayoutParams", "UIFontDescription",
 								"UISkinImage", "UITabContainer", "UISceneView", "UIPreferredSize", "UIDragObject",
 								"UIContainer", "UISection", "UIInlineSelect", "UITextureWidget",
-								"UIScrollContainer", "UISeparator", "UIDimmer"],
+								"UIScrollContainer", "UISeparator", "UIDimmer", "UISelectDropdown"],
 	"overloads" : {
 	},
 	"typescript_decl" : {

+ 4 - 2
Script/Packages/ToolCore/ToolCore.json

@@ -1,8 +1,10 @@
 {
 	"name" : "ToolCore",
 	"sources" : ["Source/ToolCore", "Source/ToolCore/Project", "Source/ToolCore/Platform", "Source/ToolCore/Command",
-							 "Source/ToolCore/Import", "Source/ToolCore/Assets", "Source/ToolCore/License", "Source/ToolCore/Build"],
-	"classes" : ["ToolEnvironment", "ToolSystem", "ToolPrefs", "Project", "ProjectFile", "Platform", "PlatformMac", "PlatformWeb",
+							 "Source/ToolCore/Import", "Source/ToolCore/Assets", "Source/ToolCore/License", "Source/ToolCore/Build",
+						 	 "Source/ToolCore/Subprocess"],
+	"classes" : ["ToolEnvironment", "ToolSystem", "ToolPrefs", "SubprocessSystem", "Subprocess",
+								"Project", "ProjectFile", "Platform", "PlatformMac", "PlatformWeb",
 							 "PlatformWindows", "PlatformAndroid", "PlatformIOS", "Command", "PlayCmd", "OpenAssetImporter",
 							 "Asset", "AssetDatabase", "AssetImporter", "AudioImporter", "ModelImporter", "MaterialImporter", "AnimationImportInfo",
 							 "PrefabImporter", "JavascriptImporter", "TextureImporter", "SpriterImporter", "PEXImporter", "LicenseSystem",

+ 9 - 0
Source/Atomic/UI/UI.cpp

@@ -57,6 +57,7 @@ using namespace tb;
 #include "UIScrollContainer.h"
 #include "UISeparator.h"
 #include "UIDimmer.h"
+#include "UISelectDropdown.h"
 
 #include "SystemUI/SystemUI.h"
 #include "SystemUI/SystemUIEvents.h"
@@ -576,6 +577,14 @@ UIWidget* UI::WrapWidget(tb::TBWidget* widget)
         return container;
     }
 
+    if (widget->IsOfType<TBSelectDropdown>())
+    {
+        UISelectDropdown* select = new UISelectDropdown(context_, false);
+        select->SetWidget(widget);
+        widgetWrap_[widget] = select;
+        return select;
+    }
+
     if (widget->IsOfType<TBButton>())
     {
         // don't wrap the close button of a TBWindow.close

+ 45 - 0
Source/Atomic/UI/UISelectDropdown.cpp

@@ -0,0 +1,45 @@
+
+#include <TurboBadger/tb_widgets.h>
+#include <TurboBadger/tb_widgets_common.h>
+#include <TurboBadger/tb_select.h>
+
+
+#include "UI.h"
+#include "UIEvents.h"
+#include "UISelectDropdown.h"
+
+using namespace tb;
+
+namespace Atomic
+{
+
+UISelectDropdown::UISelectDropdown(Context* context, bool createWidget) : UIButton(context, false)
+{
+    if (createWidget)
+    {
+        widget_ = new TBSelectDropdown();
+        widget_->SetDelegate(this);
+        GetSubsystem<UI>()->WrapWidget(this, widget_);
+    }
+}
+
+UISelectDropdown::~UISelectDropdown()
+{
+
+}
+
+void UISelectDropdown::SetSource(UISelectItemSource* source)
+{
+    if (!widget_)
+        return;
+
+    ((TBSelectDropdown*)widget_)->SetSource(source ? source->GetTBItemSource() : NULL);
+
+}
+
+bool UISelectDropdown::OnEvent(const tb::TBWidgetEvent &ev)
+{
+    return UIButton::OnEvent(ev);
+}
+
+}

+ 29 - 0
Source/Atomic/UI/UISelectDropdown.h

@@ -0,0 +1,29 @@
+
+#pragma once
+
+#include "UISelectItem.h"
+#include "UIButton.h"
+
+namespace Atomic
+{
+
+class UISelectDropdown : public UIButton
+{
+    OBJECT(UISelectDropdown)
+
+public:
+
+    UISelectDropdown(Context* context, bool createWidget = true);
+    virtual ~UISelectDropdown();
+
+    void SetSource(UISelectItemSource* source);
+
+protected:
+
+    virtual bool OnEvent(const tb::TBWidgetEvent &ev);
+
+private:
+
+};
+
+}

+ 1 - 0
Source/AtomicJS/Javascript/JSUI.cpp

@@ -59,6 +59,7 @@ JSUI::JSUI(Context* context) : Object(context),
     uiTypes_["UIScrollContainer"] = true;
     uiTypes_["UISeparator"] = true;
     uiTypes_["UIDimmer"] = true;
+    uiTypes_["UISelectDropdown"] = true;
 
 }
 

+ 69 - 1
Source/ToolCore/Platform/PlatformAndroid.cpp

@@ -1,7 +1,10 @@
 
+#include <Atomic/IO/MemoryBuffer.h>
 #include <Atomic/IO/FileSystem.h>
 
 #include "../ToolEnvironment.h"
+#include "../Subprocess/SubprocessSystem.h"
+
 #include "PlatformAndroid.h"
 
 namespace ToolCore
@@ -24,9 +27,74 @@ BuildBase* PlatformAndroid::NewBuild(Project *project)
 
 void PlatformAndroid::PrependAndroidCommandArgs(Vector<String> args)
 {
+#ifdef ATOMIC_PLATFORM_WINDOWS
     // android is a batch file on windows, so have to run with cmd /c
     args.Push("/c");
     args.Push("\"" + GetAndroidCommand() + "\"");
+#endif
+
+}
+
+void PlatformAndroid::HandleRefreshAndroidTargetsEvent(StringHash eventType, VariantMap& eventData)
+{
+    if (eventType == E_SUBPROCESSOUTPUT)
+    {
+        targetOutput_ += eventData[SubprocessOutput::P_TEXT].GetString();
+    }
+    else if (eventType == E_SUBPROCESSCOMPLETE)
+    {
+        refreshAndroidTargetsProcess_ = 0;
+
+        androidTargets_.Clear();
+
+        MemoryBuffer reader(targetOutput_.CString(), targetOutput_.Length() + 1);
+
+        while (!reader.IsEof())
+        {
+            String line = reader.ReadLine();
+            if (line.StartsWith("id:"))
+            {
+                //id: 33 or "Google Inc.:Google APIs (x86 System Image):19"
+                Vector<String> elements = line.Split('\"');
+                if (elements.Size() == 2)
+                {
+                    String api = elements[1];
+
+                    androidTargets_.Push(api);
+                }
+            }
+        }
+
+        SendEvent(E_ANDROIDTARGETSREFRESHED);
+    }
+
+}
+
+void PlatformAndroid::RefreshAndroidTargets()
+{
+    if (refreshAndroidTargetsProcess_.NotNull())
+        return;
+
+    SubprocessSystem* subs = GetSubsystem<SubprocessSystem>();
+
+    String androidCommand = GetAndroidCommand();
+
+    Vector<String> args;
+    PrependAndroidCommandArgs(args);
+    args.Push("list");
+    args.Push("targets");
+
+    targetOutput_.Clear();
+    refreshAndroidTargetsProcess_ = subs->Launch(androidCommand, args);
+
+    if (refreshAndroidTargetsProcess_.NotNull())
+    {
+
+        SubscribeToEvent(refreshAndroidTargetsProcess_, E_SUBPROCESSCOMPLETE, HANDLER(PlatformAndroid, HandleRefreshAndroidTargetsEvent));
+        SubscribeToEvent(refreshAndroidTargetsProcess_, E_SUBPROCESSOUTPUT, HANDLER(PlatformAndroid, HandleRefreshAndroidTargetsEvent));
+
+
+    }
 
 }
 
@@ -41,7 +109,7 @@ String PlatformAndroid::GetAndroidCommand() const
 
 #ifdef ATOMIC_PLATFORM_OSX
     //Vector<String> args = String("list targets").Split(' ');
-    androidCommand += "tools/android";
+    androidCommand += "/tools/android";
 #else
 
     // android is a batch file on windows, so have to run with cmd /c

+ 21 - 0
Source/ToolCore/Platform/PlatformAndroid.h

@@ -2,14 +2,25 @@
 #pragma once
 
 #include "Platform.h"
+#include "../Subprocess/Subprocess.h"
 
 namespace ToolCore
 {
 
+EVENT(E_ANDROIDTARGETSREFRESHED, AndroidTargetsRefreshed)
+{
+
+}
+
 class PlatformAndroid : public Platform
 {
     OBJECT(PlatformAndroid);
 
+    struct AndroidTarget
+    {
+        unsigned id;
+    };
+
 public:
 
     PlatformAndroid(Context* context);
@@ -20,10 +31,20 @@ public:
 
     String GetAndroidCommand() const;
 
+    void RefreshAndroidTargets();
+    const Vector<String>& GetAndroidTargets() { return androidTargets_; }
+
     BuildBase* NewBuild(Project* project);
 
 private:
 
+    void HandleRefreshAndroidTargetsEvent(StringHash eventType, VariantMap& eventData);
+
+    SharedPtr<Subprocess> refreshAndroidTargetsProcess_;
+    String targetOutput_;
+
+    Vector<String> androidTargets_;
+
     void PrependAndroidCommandArgs(Vector<String> args);
 
 };

+ 2 - 0
Source/ToolCore/ToolSystem.cpp

@@ -13,6 +13,7 @@
 #include "Net/CurlManager.h"
 #include "License/LicenseSystem.h"
 #include "Build/BuildSystem.h"
+#include "Subprocess/SubprocessSystem.h"
 
 
 #include "ToolSystem.h"
@@ -32,6 +33,7 @@ ToolSystem::ToolSystem(Context* context) : Object(context),
     context_->RegisterSubsystem(new CurlManager(context_));
     context_->RegisterSubsystem(new LicenseSystem(context_));
     context_->RegisterSubsystem(new BuildSystem(context_));
+    context_->RegisterSubsystem(new SubprocessSystem(context_));
 
     // platform registration
     RegisterPlatform(new PlatformMac(context));