/// <summary>
        ///     Loads all packages.
        /// </summary>
        public static void LoadPackages()
        {
            Packages.Clear();

            if (!Directory.Exists(PackagesConfigurationDirectory))
            {
                Directory.CreateDirectory(PackagesConfigurationDirectory); // Directory not exist. Just create directory...
            }
            else
            {
                var files = Directory.GetFiles(PackagesConfigurationDirectory, "*.json");
                foreach (var fileName in files)
                {
                    JEMAssetBuilderPackage package = null;
                    try
                    {
                        package = JsonConvert.DeserializeObject <JEMAssetBuilderPackage>(File.ReadAllText(fileName));
                    }
                    catch (Exception e)
                    {
                        Debug.LogWarning($"System was unable to parse `{fileName}` in to JEMAssetBuilderPackage class. {e.Message}");
                    }

                    if (package == null)
                    {
                        continue;
                    }

                    Packages.Add(package);
                }
            }
        }
        /// <summary>
        ///     Add the package!
        /// </summary>
        private void AddPackage()
        {
            if (string.IsNullOrEmpty(_packageName) || string.IsNullOrWhiteSpace(_packageName))
            {
                EditorUtility.DisplayDialog("Oops.", "Please, enter the package name.", "Ok");
                return;
            }

            var packageData = JEMAssetBuilderWindow.GetPackage(_packageName);

            if (packageData != null)
            {
                EditorUtility.DisplayDialog("Oops.", $"Package of the name `{_packageName}` already exists.", "Ok");
                return;
            }

            var newPackage = new JEMAssetBuilderPackage
            {
                Name = _packageName
            };

            JEMAssetBuilderWindow.AddPackage(newPackage);

            Close();
        }
        // ERROR:  EndLayoutGroup: BeginLayoutGroup must be called first.
        private void Update()
        {
            if (_wantToExportAll)
            {
                _exportTimeout   = 2; // Skip two frames after export...
                _wantToExportAll = false;
                JEMAssetBuilderExporter.ExportPackages(JEMAssetsBuilderConfiguration.GetDirectory(), Packages.ToArray());
            }

            if (_exportPackageOnce)
            {
                _exportTimeout     = 2; // Skip two frames after export...
                _exportPackageOnce = false;
                ExportAssets(_exportPackage);
                _exportPackage = null;
            }
        }
        /// <summary>
        ///     Adds target package.
        /// </summary>
        /// <exception cref="ArgumentNullException"/>
        public static void AddPackage([NotNull] JEMAssetBuilderPackage package, bool select = true)
        {
            if (package == null)
            {
                throw new ArgumentNullException(nameof(package));
            }
            if (Packages.Contains(package))
            {
                return;
            }

            Packages.Add(package);
            if (select)
            {
                SelectedPackage = package.Name;
            }
        }
        /// <summary>
        ///     Exports assets of target package.
        /// </summary>
        /// <exception cref="ArgumentNullException"/>
        private static void ExportAssets([NotNull] JEMAssetBuilderPackage package)
        {
            if (package == null)
            {
                throw new ArgumentNullException(nameof(package));
            }
            if (package.Assets.Count == 0)
            {
                EditorUtility.DisplayDialog("Oops.", "Can't export empty package..", "Ok");
            }
            else
            {
                // Before export make sure that all packages are saved, we do not want to lose any data...
                SavePackages();

                // Export!
                JEMAssetBuilderExporter.ExportPackages(JEMAssetsBuilderConfiguration.GetDirectory(), new[] { package });
            }
        }
        /// <summary>
        ///     Removes target package.
        /// </summary>
        /// <exception cref="ArgumentNullException"/>
        public static void RemovePackage([NotNull] JEMAssetBuilderPackage package)
        {
            if (package == null)
            {
                throw new ArgumentNullException(nameof(package));
            }
            if (!Packages.Contains(package))
            {
                return;
            }

            var configurationFile = package.GetConfigurationFile();

            if (File.Exists(configurationFile))
            {
                File.Delete(configurationFile);
            }

            Packages.Remove(package);
        }
        /// <summary>
        ///     Adds currently selected assets to target package.
        /// </summary>
        /// <exception cref="ArgumentNullException"/>
        private static void AddSelectedAssets([NotNull] JEMAssetBuilderPackage package)
        {
            if (package == null)
            {
                throw new ArgumentNullException(nameof(package));
            }
            if (Selection.objects.Length == 0)
            {
                EditorUtility.DisplayDialog("Oops.", "To add new assets in to package, first you need to select the assets. (lul)", "Ok!");
                return;
            }

            foreach (var obj in Selection.objects)
            {
                if (package.Exist(obj))
                {
                    continue;
                }

                package.AddAsset(obj);
            }
        }
Example #8
0
        /// <summary>
        ///     Exports directly target array of objects.
        /// </summary>
        /// <exception cref="ArgumentNullException"/>
        /// <exception cref="InvalidOperationException"/>
        public static void ExportDirectly([NotNull] string filePath, [NotNull] Object[] objects)
        {
            if (filePath == null)
            {
                throw new ArgumentNullException(nameof(filePath));
            }
            if (objects == null)
            {
                throw new ArgumentNullException(nameof(objects));
            }
            if (objects.Length == 0)
            {
                return;
            }
            if (string.IsNullOrEmpty(filePath))
            {
                return;
            }

            // Try to load configuration first
            JEMAssetsBuilderConfiguration.Load();

            // Create package from received data
            var package = new JEMAssetBuilderPackage
            {
                Name = Path.GetFileName(filePath).Remove(Path.GetFileName(filePath).Length - JEMAssetsBuilderConfiguration.GetExtension().Length,
                                                         JEMAssetsBuilderConfiguration.GetExtension().Length)
            };

            // Write objects to new package
            foreach (var obj in objects)
            {
                package.AddAsset(obj);
            }

            // Export package.
            ExportPackages(Path.GetDirectoryName(filePath) ?? throw new InvalidOperationException(), new[] { package });
        }
        private void OnGUI()
        {
            if (_exportTimeout > 0)
            {
                _exportTimeout--;
                return;
            }

            EditorGUILayout.BeginHorizontal();
            {
                const float packagesWidth = 200;
                EditorGUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.Width(packagesWidth));
                {
                    _packagesScroll.value = EditorGUILayout.BeginScrollView(_packagesScroll.value, EditorStyles.helpBox, GUILayout.Width(packagesWidth));
                    if (Packages.Count == 0)
                    {
                        EditorGUILayout.HelpBox("No packages found :/", MessageType.Info, true);
                    }
                    else
                    {
                        GUILayout.Label("Packages:", EditorStyles.boldLabel);
                        for (var index = 0; index < Packages.Count; index++)
                        {
                            var package = Packages[index];
                            EditorGUILayout.BeginHorizontal(EditorStyles.helpBox, GUILayout.Width(packagesWidth - 8));
                            GUILayout.Box(package.Name, EditorStyles.helpBox);
                            if (SelectedPackage == package.Name)
                            {
                                GUI.enabled = false;
                                GUI.color   = new Color(0.3f, 1.0f, 0.3f, 1.0f);
                                GUILayout.Button("Selected", GUILayout.Width(65));
                                GUI.enabled = true;
                            }
                            else
                            {
                                if (GUILayout.Button("Select", GUILayout.Width(65)))
                                {
                                    SelectedPackage = package.Name;
                                }
                            }

                            GUI.color = Color.white;
                            EditorGUILayout.EndHorizontal();
                        }

                        GUI.color = Color.white;
                    }
                    EditorGUILayout.EndScrollView();

                    GUILayout.FlexibleSpace();
                    GUILayout.Label("Packages Options", EditorStyles.boldLabel);
                    if (GUILayout.Button("Add New", GUILayout.Height(22)))
                    {
                        JEMAssetBuilderAddPackageWindow.ShowWindow();
                    }

                    if (GUILayout.Button("Save All", GUILayout.Height(22)))
                    {
                        SavePackages();
                    }

                    if (GUILayout.Button("Reload All", GUILayout.Height(22)))
                    {
                        LoadPackages();
                    }

                    if (GUILayout.Button("Export All", GUILayout.Height(22)))
                    {
                        _wantToExportAll = true;
                    }
                }
                EditorGUILayout.EndVertical();

                EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                {
                    if (string.IsNullOrEmpty(SelectedPackage))
                    {
                        EditorGUILayout.HelpBox("No package selected.", MessageType.Info, true);
                    }
                    else
                    {
                        var package = GetPackage(SelectedPackage);
                        if (package == null)
                        {
                            Debug.LogWarning(
                                $"JEMAssetBuilderWindow: Selected package detected ({SelectedPackage}) but we was unable to resolve it's data :/ ");
                            SelectedPackage = string.Empty;
                        }
                        else
                        {
                            EditorGUILayout.BeginHorizontal();
                            {
                                EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                                if (package.Assets.Count == 0)
                                {
                                    EditorGUILayout.HelpBox("The package is empty.", MessageType.Info, true);
                                }
                                else
                                {
                                    var allAssets = 0;
                                    _assetsScroll.value = EditorGUILayout.BeginScrollView(_assetsScroll.value);
                                    GUILayout.Label("Assets:", EditorStyles.boldLabel);
                                    for (var index = 0; index < package.Assets.Count; index++)
                                    {
                                        var asset           = package.Assets[index];
                                        var assetPath       = AssetDatabase.GUIDToAssetPath(asset.Guid);
                                        var assetName       = Path.GetFileName(assetPath);
                                        var assetDependence = AssetDatabase.GetDependencies(assetPath);

                                        GUI.color = index % 2 == 0 ? Color.white : new Color(0.8f, 0.8f, 0.8f, 1f);
                                        if (!asset.Include)
                                        {
                                            GUI.color = GUI.color / 1.2f;
                                        }
                                        EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                                        var drawAsset = new SavedBool($"{nameof(JEMAssetBuilderWindow)}.Package.{package.Name}.Asset.{asset.Guid}", false);
                                        if (!asset.Include)
                                        {
                                            assetName = " (Not Included) " + assetName;
                                        }

                                        var indexCopy = index;
                                        drawAsset.value = EditorGUILayout.BeginFoldoutHeaderGroup(drawAsset.value, assetName, menuAction:
                                                                                                  rect =>
                                        {
                                            var menu = new GenericMenu();
                                            menu.AddItem(new GUIContent("Remove"), false, () =>
                                            {
                                                package.Assets.RemoveAt(indexCopy);
                                                indexCopy--;
                                            });
                                            menu.DropDown(rect);
                                        });

                                        if (drawAsset.value)
                                        {
                                            EditorGUI.indentLevel++;
                                            EditorGUIUtility.labelWidth += 50f;
                                            asset.Include = EditorGUILayout.Toggle("Include", asset.Include);
                                            EditorGUILayout.LabelField("Full path", assetPath);
                                            EditorGUILayout.LabelField("Dependences (Amount)", assetDependence.Length.ToString());
                                            if (assetDependence.Length != 1) // do not draw if the only dependence in array is this asset
                                            {
                                                var drawDependence = new SavedBool($"{nameof(JEMAssetBuilderWindow)}.Package.{package.Name}.Asset.{asset.Guid}.Dependence", false);
                                                drawDependence.value = EditorGUILayout.Foldout(drawDependence.value, "Dependences");
                                                if (drawDependence.value)
                                                {
                                                    EditorGUI.indentLevel++;
                                                    foreach (var d in assetDependence)
                                                    {
                                                        if (assetPath.Equals(d))
                                                        {
                                                            continue;                      // nope
                                                        }
                                                        EditorGUILayout.LabelField(" ", d);
                                                    }

                                                    EditorGUI.indentLevel--;
                                                }
                                            }
                                            EditorGUIUtility.labelWidth -= 50f;
                                            EditorGUI.indentLevel--;
                                        }
                                        EditorGUILayout.EndFoldoutHeaderGroup();
                                        EditorGUILayout.EndVertical();
                                        GUI.color = Color.white;

                                        if (asset.Include)
                                        {
                                            allAssets += assetDependence.Length;
                                        }
                                    }
                                    GUI.color = Color.white;
                                    EditorGUILayout.EndScrollView();

                                    EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                                    GUILayout.Label("Info", EditorStyles.boldLabel);

                                    EditorGUILayout.HelpBox($"Total amount of assets to build: {allAssets}", MessageType.Info, true);
                                    EditorGUILayout.HelpBox("Package Path: " + package.GetFile(), MessageType.Info, true);
                                    EditorGUILayout.EndVertical();
                                }

                                EditorGUILayout.EndVertical();

                                EditorGUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.Width(packagesWidth));
                                GUILayout.Label("Selected Package", EditorStyles.boldLabel);
                                if (GUILayout.Button("Add Selected Assets", GUILayout.Height(60)))
                                {
                                    AddSelectedAssets(package);
                                }

                                GUILayout.FlexibleSpace();
                                GUILayout.Label("Danger Zone", EditorStyles.boldLabel);
                                if (GUILayout.Button("Export Assets", GUILayout.Height(22)))
                                {
                                    _exportPackage     = package;
                                    _exportPackageOnce = true;
                                }

                                if (GUILayout.Button("Delete Package", GUILayout.Height(22)))
                                {
                                    var confirm = EditorUtility.DisplayDialog("Delete?", $"Are you sure you want to remove package `{package.Name}`?", "Yes", "No");
                                    if (confirm)
                                    {
                                        RemovePackage(package);
                                    }
                                }

                                EditorGUILayout.EndVertical();
                            }
                            EditorGUILayout.EndHorizontal();
                        }
                    }
                }
                EditorGUILayout.EndVertical();
            }
            EditorGUILayout.EndHorizontal();
        }