private static void BuildAndUploadKit()
        {
            EditorApplication.update -= BuildAndUploadKit;

            List <BuildTarget> targets            = SettingsManager.SelectedBuildTargets;
            string             item_type_singular = "kit";
            string             itemRootName       = Path.GetFileName(kitRoot.ToLower());
            string             item_id            = _selected_kit.kit_data.kit_id;

            LoginManager.BuildAndUploadAltVRItem(targets, item_type_singular, itemRootName, item_id);

            // Reload kit data (and update display)
            LoadSingleKit(item_id);
            _selected_kit = _known_kits[item_id];

            LoginManager window = GetWindow <LoginManager>();

            window.ShowNotification(new GUIContent("Kit upload finished"), 5.0f);
        }
        private static void BuildAndUploadTemplate()
        {
            EditorApplication.update -= BuildAndUploadTemplate;

            List <BuildTarget> targets            = SettingsManager.SelectedBuildTargets;
            string             item_type_singular = "space_template";
            string             itemRootName       = templateScene.ToLower();
            string             item_id            = _selected_template.template_data.space_template_id;

            LoginManager.BuildAndUploadAltVRItem(targets, item_type_singular, itemRootName, item_id);

            // Reload kit data (and update display)
            LoadSingleTemplate(item_id);
            _selected_template = _known_templates[item_id];

            LoginManager window = GetWindow <LoginManager>();

            window.ShowNotification(new GUIContent("Template upload finished"), 5.0f);
        }
        public static void ManageItem(AltspaceListItem item, Action showSelection_fn, Action <string> updateItem_fn, string missingString)
        {
            void BuildItem(AltspaceListItem subItem)
            {
                string       state  = subItem.buildAssetBundle(SettingsManager.SelectedBuildTargets) ? "finished" : "canceled";
                LoginManager window = EditorWindow.GetWindow <LoginManager>();

                window.ShowNotification(new GUIContent(subItem.friendlyName.Capitalize() + " build " + state), 5.0f);
            }

            void BuildAndUploadItem(AltspaceListItem subItem, Action <string> updategui_fn)
            {
                LoginManager.BuildAndUploadAltVRItem(SettingsManager.SelectedBuildTargets, subItem);

                updategui_fn(subItem.id);

                LoginManager window = EditorWindow.GetWindow <LoginManager>();

                window.ShowNotification(new GUIContent(subItem.friendlyName.Capitalize() + " upload finished"), 5.0f);
            }

            void UploadFlatItem(AltspaceListItem subItem, Action <string> updategui_fn)
            {
                LoginManager.ManageAltVRItem(subItem);

                updategui_fn(subItem.id);

                LoginManager window = EditorWindow.GetWindow <LoginManager>();

                window.ShowNotification(new GUIContent(subItem.friendlyName.Capitalize() + " upload finished"), 5.0f);
            }

            if (WebClient.IsAuthenticated)
            {
                if (GUILayout.Button("Select " + item.friendlyName.Capitalize()))
                {
                    showSelection_fn();
                }
            }
            else
            {
                EditorGUILayout.LabelField("Offline mode", new GUIStyle()
                {
                    fontStyle = FontStyle.Bold,
                    alignment = TextAnchor.MiddleCenter
                });
            }

            EditorGUILayout.Space(10);

            item.showSelf();

            EditorGUILayout.BeginHorizontal();

            if (!item.isSet)
            {
                GUILayout.Label(missingString, new GUIStyle()
                {
                    fontStyle = FontStyle.Bold,
                    alignment = TextAnchor.MiddleCenter
                });
            }
            else if (item.exists)
            {
                if (item.isAssetBundleItem)
                {
                    if (GUILayout.Button("Build"))
                    {
                        EditorApplication.delayCall += () => BuildItem(item);
                    }

                    if (item.isSelected)
                    {
                        if (GUILayout.Button("Build & Upload"))
                        {
                            EditorApplication.delayCall += () => BuildAndUploadItem(item, updateItem_fn);
                        }
                    }
                }
                else
                {
                    if (GUILayout.Button("Upload"))
                    {
                        EditorApplication.delayCall += () => UploadFlatItem(item, updateItem_fn);
                    }
                }
            }

            EditorGUILayout.EndHorizontal();
        }