コード例 #1
0
ファイル: PackageViewDialog.cs プロジェクト: undue/duality
        private static System.Collections.IEnumerable PackageOperationThread(ProcessingBigTaskDialog.WorkerInterface workerInterface)
        {
            PackageOperationData data = workerInterface.Data as PackageOperationData;

            workerInterface.Progress = -1.0f;
            if (data.Package.Version != null)
            {
                workerInterface.StateDesc = string.Format("Package '{0}', Version {1}...", data.Package.Id, data.Package.Version);
            }
            else
            {
                workerInterface.StateDesc = string.Format("Package '{0}'...", data.Package.Id);
            }
            yield return(null);

            try
            {
                data.Operation(data);
            }
            catch (Exception e)
            {
                Log.Editor.WriteError("An error occurred while processing Package '{0}', Version {1}: {2}",
                                      data.Package.Id,
                                      data.Package.Version,
                                      Log.Exception(e));
            }

            yield break;
        }
コード例 #2
0
ファイル: PackageViewDialog.cs プロジェクト: undue/duality
        private static System.Collections.IEnumerable PackageUpdateAllThread(ProcessingBigTaskDialog.WorkerInterface workerInterface)
        {
            PackageManager manager = workerInterface.Data as PackageManager;

            workerInterface.Progress  = 0.0f;
            workerInterface.StateDesc = string.Format("Preparing operation...");
            yield return(null);

            PackageInfo[] updatePackages = manager.GetSafeUpdateConfig(manager.LocalPackages).ToArray();
            foreach (PackageInfo package in updatePackages)
            {
                workerInterface.Progress += 1.0f / updatePackages.Length;
                workerInterface.StateDesc = string.Format("Package '{0}'...", package.Id);
                yield return(null);

                try
                {
                    manager.UpdatePackage(package, package.Version);
                }
                catch (Exception e)
                {
                    Log.Editor.WriteError("An error occurred while updating Package '{0}', Version {1}: {2}",
                                          package.Id,
                                          package.Version,
                                          Log.Exception(e));
                }
            }

            workerInterface.Progress = 1.0f;
            yield break;
        }
コード例 #3
0
        private System.Collections.IEnumerable async_PerformBatchAction(ProcessingBigTaskDialog.WorkerInterface state)
        {
            BatchActionTaskData data = state.Data as BatchActionTaskData;

            // Retrieve files to perform action on
            List <string> files = Resource.GetResourceFiles(data.FolderPath);

            state.Progress += 0.05f; yield return(null);

            // Perform action on files
            foreach (string file in files)
            {
                state.StateDesc = file; yield return(null);

                MetaFormatHelper.FilePerformAction(file, data.Action);

                state.Progress += 0.9f / files.Count; yield return(null);
            }

            // Assure reloading the modified resources
            if (PathHelper.IsPathLocatedIn(data.FolderPath, "."))
            {
                string dataPath = PathHelper.MakeFilePathRelative(data.FolderPath);
                ContentProvider.RemoveContentTree(dataPath);
            }
            state.Progress += 0.05f;
        }
コード例 #4
0
        private static IEnumerable SynchronizePackages(ProcessingBigTaskDialog.WorkerInterface workerInterface)
        {
            PackageManager manager = workerInterface.Data as PackageManager;

            // Set the working state and yield, so the UI can update properly in case we're in the main thread
            workerInterface.Progress  = 0.0f;
            workerInterface.StateDesc = GeneralRes.TaskPrepareInfo;
            yield return(null);

            // Retrieve all registered Duality packages and sort them so we don't accidentally install an old dependency
            LocalPackage[] packagesToVerify = manager.LocalSetup.Packages.ToArray();
            manager.OrderByDependencies(packagesToVerify);
            yield return(null);

            // Uninstall all "shadow" Duality packages that are installed, but not registered
            Logs.Editor.Write("Removing unregistered packages...");
            Logs.Editor.PushIndent();
            manager.UninstallNonRegisteredPackages();
            Logs.Editor.PopIndent();
            yield return(null);

            // Iterate over previously reigstered local packages and verify / install them.
            Logs.Editor.Write("Verifying registered packages...");
            Logs.Editor.PushIndent();
            foreach (LocalPackage package in packagesToVerify)
            {
                // Update the task dialog's UI
                if (package.Version != null)
                {
                    workerInterface.StateDesc = string.Format("Package '{0}', Version {1}...", package.Id, package.Version);
                }
                else
                {
                    workerInterface.StateDesc = string.Format("Package '{0}'...", package.Id);
                }
                workerInterface.Progress += 0.5f / packagesToVerify.Length;
                yield return(null);

                // Verify / Install the local package as needed
                try
                {
                    manager.VerifyPackage(package);
                }
                catch (Exception e)
                {
                    Logs.Editor.WriteError("An error occurred verifying Package '{0}', Version {1}: {2}",
                                           package.Id,
                                           package.Version,
                                           LogFormat.Exception(e));
                }
                workerInterface.Progress += 0.5f / packagesToVerify.Length;
                yield return(null);
            }
            Logs.Editor.PopIndent();

            yield break;
        }
コード例 #5
0
ファイル: Program.cs プロジェクト: ymoussaba/duality
        private static System.Collections.IEnumerable FirstTimeSetup(ProcessingBigTaskDialog.WorkerInterface workerInterface)
        {
            PackageManager manager = workerInterface.Data as PackageManager;

            workerInterface.Progress  = 0.0f;
            workerInterface.StateDesc = GeneralRes.TaskPrepareInfo;
            yield return(null);

            LocalPackage[] packagesToVerify = manager.LocalPackages.ToArray();
            manager.OrderByDependencies(packagesToVerify);

            foreach (LocalPackage package in packagesToVerify)
            {
                if (package.Version != null)
                {
                    workerInterface.StateDesc = string.Format("Package '{0}', Version {1}...", package.Id, package.Version);
                }
                else
                {
                    workerInterface.StateDesc = string.Format("Package '{0}'...", package.Id);
                }
                workerInterface.Progress += 0.5f / packagesToVerify.Length;
                yield return(null);

                try
                {
                    manager.VerifyPackage(package);
                }
                catch (Exception e)
                {
                    Log.Editor.WriteError("An error occurred verifying Package '{0}', Version {1}: {2}",
                                          package.Id,
                                          package.Version,
                                          Log.Exception(e));
                }
                workerInterface.Progress += 0.5f / packagesToVerify.Length;
                yield return(null);
            }

            yield break;
        }
コード例 #6
0
ファイル: PackageViewDialog.cs プロジェクト: ykafia/duality
        private static System.Collections.IEnumerable PackageUpdateAllThread(ProcessingBigTaskDialog.WorkerInterface workerInterface)
        {
            PackageManager manager = workerInterface.Data as PackageManager;

            workerInterface.Progress  = 0.0f;
            workerInterface.StateDesc = GeneralRes.TaskPrepareInfo;
            yield return(null);

            // Determine which packages need to be updated
            PackageInfo[] updatePackages = manager.GetUpdatablePackages().ToArray();

            // Sort packages by their dependencies so we don't accidentally install multiple versions
            manager.OrderByDependencies(updatePackages);

            // Start the updating process
            foreach (PackageInfo package in updatePackages)
            {
                workerInterface.Progress += 1.0f / updatePackages.Length;
                workerInterface.StateDesc = string.Format("Package '{0}'...", package.Id);
                yield return(null);

                try
                {
                    manager.UpdatePackage(package.Name);
                }
                catch (Exception e)
                {
                    Log.Editor.WriteError("An error occurred while updating Package '{0}', Version {1}: {2}",
                                          package.Id,
                                          package.Version,
                                          Log.Exception(e));
                    workerInterface.Error = e;
                }
            }

            workerInterface.Progress = 1.0f;
            yield break;
        }
コード例 #7
0
        private static System.Collections.IEnumerable async_RenameContentRefs(ProcessingBigTaskDialog.WorkerInterface state)
        {
            var renameData   = state.Data as List <ResourceRenamedEventArgs>;
            int totalCounter = 0;
            int fileCounter  = 0;

            // Rename in static application data
            state.StateDesc = "DualityApp Data"; yield return(null);

            DualityApp.LoadAppData();
            DualityApp.LoadUserData();
            state.Progress += 0.04f; yield return(null);

            totalCounter   += async_RenameContentRefs_Perform(DualityApp.AppData, renameData);
            totalCounter   += async_RenameContentRefs_Perform(DualityApp.UserData, renameData);
            state.Progress += 0.02f; yield return(null);

            DualityApp.SaveAppData();
            DualityApp.SaveUserData();
            state.Progress += 0.04f; yield return(null);

            // Special case: Current Scene in sandbox mode
            if (Sandbox.IsActive)
            {
                // Because changes we'll do will be discarded when leaving the sandbox we'll need to
                // do it the hard way - manually load an save the file.
                state.StateDesc = "Current Scene"; yield return(null);

                Scene curScene = Resource.Load <Scene>(Scene.CurrentPath, null, false);
                fileCounter   = async_RenameContentRefs_Perform(curScene, renameData);
                totalCounter += fileCounter;
                if (fileCounter > 0)
                {
                    curScene.Save(Scene.CurrentPath, false);
                }
            }
            // Special case: Current Scene NOT in sandbox mode, but still unsaved
            else if (Scene.Current.IsRuntimeResource)
            {
                state.StateDesc = "Current Scene"; yield return(null);

                fileCounter = async_RenameContentRefs_Perform(Scene.Current, renameData);
                if (fileCounter > 0)
                {
                    DualityEditorApp.NotifyObjPropChanged(null, new ObjectSelection(Scene.Current.AllObjects));
                }
                totalCounter += fileCounter;
            }

            // Rename in actual content
            var             targetResTypes = renameData.Any(e => e.IsDirectory) ? null : renameData.Select(e => e.ContentType).ToArray();
            var             loadedContent  = ContentProvider.GetLoadedContent <Resource>();
            var             reloadContent  = new List <IContentRef>();
            List <string>   resFiles       = Resource.GetResourceFiles();
            List <Resource> modifiedRes    = new List <Resource>();

            foreach (string file in resFiles)
            {
                // Early-out, if this kind of Resource isn't able to reference the renamed Resource
                if (targetResTypes != null)
                {
                    Type resType = Resource.GetTypeByFileName(file);

                    if (resType == null)
                    {
                        Log.Editor.WriteWarning("Could not determine Resource type for File '{0}' using file name only. Skipping it during rename.", file);
                        continue;
                    }

                    bool canReferenceRes = false;
                    foreach (Type targetType in targetResTypes)
                    {
                        if (ReflectionHelper.CanReferenceResource(resType, targetType))
                        {
                            canReferenceRes = true;
                            break;
                        }
                    }
                    if (!canReferenceRes)
                    {
                        state.Progress += 0.9f / resFiles.Count;
                        continue;
                    }
                }

                // Set displayed name
                state.StateDesc = file; yield return(null);

                // Wasn't loaded before? Unload it later to keep the memory footprint small.
                bool wasLoaded = loadedContent.Any(r => r.Path == file);
                // Keep in mind that this operation is performed while Duality content was
                // in an inconsistent state. Loading Resources now may lead to wrong data.
                // Because the ContentRefs might be wrong right now.

                if (wasLoaded)
                {
                    // Retrieve already loaded content
                    IContentRef cr = ContentProvider.RequestContent(file);
                    state.Progress += 0.45f / resFiles.Count; yield return(null);

                    // Perform rename and flag unsaved / modified
                    fileCounter = async_RenameContentRefs_Perform(cr.Res, renameData);
                    if (fileCounter > 0)
                    {
                        modifiedRes.Add(cr.Res);
                    }
                }
                else
                {
                    // Load content without initializing it
                    Resource res = Resource.Load <Resource>(file, null, false);
                    state.Progress += 0.45f / resFiles.Count; yield return(null);

                    // Perform rename and save it without making it globally available
                    fileCounter = async_RenameContentRefs_Perform(res, renameData);
                    if (fileCounter > 0)
                    {
                        res.Save(null, false);
                    }
                }

                totalCounter   += fileCounter;
                state.Progress += 0.45f / resFiles.Count; yield return(null);
            }

            // Notify the editor about modified Resources
            if (modifiedRes.Count > 0)
            {
                DualityEditorApp.NotifyObjPropChanged(null, new ObjectSelection(modifiedRes));
            }
        }