Esempio n. 1
0
        public static List <ModProjectData> LoadAll(DOS2DEModuleData Data, bool clearExisting = false)
        {
            var newMods = LoadModProjects(Data, clearExisting);

            LoadManagedProjects(Data, newMods, clearExisting);
            LoadSourceControlData(Data, newMods);
            return(newMods);
        }
        public LocaleEditorWindow(DOS2DEModuleData data)
        {
            ModuleData = data;

            Init();

            this.WhenActivated((d) =>
            {
                KeyDown += LocaleEditorWindow_KeyDown;

                disposables = d;

                KeyActionsGrid = this.FindResource("KeyActionsGrid");

                ViewModel.OnViewLoaded(this, ModuleData, disposables);

                this.ClipboardUpdateCommand = ViewModel.OnClipboardChangedCommand;

                ViewModel.PopoutContentCommand = ReactiveCommand.Create(() => PopoutContentWindow(ViewModel.SelectedEntry), ViewModel.CanExecutePopoutContentCommand).DisposeWith(d);

                //this.OneWayBind(this.ViewModel, vm => vm.SelectedEntryHtmlContent, view => view.EntryContentPreviewHtmlPanel.Text).DisposeWith(d);

                //this.OneWayBind(this.ViewModel, vm => vm.RemoveSelectedMissingEntriesCommand, view => view.ConfirmRemovedEntriesButton.Command).DisposeWith(d);
                //this.OneWayBind(this.ViewModel, vm => vm.CloseMissingEntriesCommand, view => view.CancelRemovedEntriesButton.Command).DisposeWith(d);
                //this.OneWayBind(this.ViewModel, vm => vm.CopySimpleMissingEntriesCommand, view => view.CopySimpleMissingEntriesButton.Command).DisposeWith(d);
                //this.OneWayBind(this.ViewModel, vm => vm.CopyAllMissingEntriesCommand, view => view.CopyAllDataMissingEntriesButton.Command).DisposeWith(d);

                //this.OneWayBind(this.ViewModel, vm => vm.MissingEntries, view => view.RemovedEntriesListView.ItemsSource).DisposeWith(d);
                //this.OneWayBind(this.ViewModel, vm => vm.MissingEntriesViewVisible, view => view.RemovedEntriesGrid.Visibility).DisposeWith(d);

                //this.OneWayBind(this.ViewModel, vm => vm.SaveCurrentCommand, view => view.SaveButton.Command).DisposeWith(d);
                //this.OneWayBind(this.ViewModel, vm => vm.SaveAllCommand, view => view.SaveAllButton.Command).DisposeWith(d);
                //this.OneWayBind(this.ViewModel, vm => vm.AddFileCommand, view => view.AddFileButton.Command).DisposeWith(d);
                //this.OneWayBind(this.ViewModel, vm => vm.ImportFileCommand, view => view.ImportFileButton.Command).DisposeWith(d);

                CreateButtonBinding("RemoveSelectedMissingEntriesCommand", ConfirmRemovedEntriesButton);
                CreateButtonBinding("CloseMissingEntriesCommand", CancelRemovedEntriesButton);
                CreateButtonBinding("CopySimpleMissingEntriesCommand", CopySimpleMissingEntriesButton);
                CreateButtonBinding("CopyAllMissingEntriesCommand", CopyAllDataMissingEntriesButton);

                CreateBinding("MissingEntries", RemovedEntriesListView, ListView.ItemsSourceProperty);
                CreateBinding("MissingEntriesViewVisible", RemovedEntriesGrid, Grid.VisibilityProperty);

                CreateButtonBinding("SaveCurrentCommand", SaveButton);
                CreateButtonBinding("SaveAllCommand", SaveAllButton);
                CreateButtonBinding("AddFileCommand", AddFileButton);
                CreateButtonBinding("ImportFileCommand", ImportFileButton);

                var res = this.TryFindResource("EntryContentPreview");
                if (res != null && res is HtmlPanel entryContentPreviewHtmlPanel)
                {
                    CreateBinding("SelectedEntryHtmlContent", entryContentPreviewHtmlPanel, HtmlPanel.TextProperty);
                }

                Log.Here().Important("Activated LocaleEditorWindow");
            });
        }
Esempio n. 3
0
        public static bool SaveManagedProjects(DOS2DEModuleData Data)
        {
            Log.Here().Important("Saving Managed Projects data to {0}", Data.Settings.AddedProjectsFile);

            if (Data.ManagedProjectsData != null && Data.ManagedProjectsData.SavedProjects.Count > 0 && Data.Settings != null && FileCommands.IsValidPath(Data.Settings.AddedProjectsFile))
            {
                //Data.ManagedProjectsData.Projects.Clear();
                //Data.ManagedProjectsData.Projects.AddRange(Data.ManagedProjects.Select(m => m.ProjectAppData).ToList());
                string json = JsonInterface.SerializeObject(Data.ManagedProjectsData);
                return(FileCommands.WriteToFile(Data.Settings.AddedProjectsFile, json));
            }

            return(false);
        }
Esempio n. 4
0
        public static async Task <bool> LoadSourceControlDataAsync(DOS2DEModuleData Data, IEnumerable <ModProjectData> modProjects)
        {
            try
            {
                if (Directory.Exists(Data.Settings.GitRootDirectory))
                {
                    int totalSuccess = 0;

                    var sourceFiles = new List <SourceControlData>();

                    var folders = Directory.EnumerateDirectories(Data.Settings.GitRootDirectory);
                    foreach (var folder in folders)
                    {
                        var sourceFile = Path.Combine(folder, "SourceControlGenerator.json");
                        if (File.Exists(sourceFile))
                        {
                            sourceFiles.Add(await SourceControlData.FromPathAsync(sourceFile));
                        }
                    }

                    foreach (var project in modProjects)
                    {
                        var sourceControlData = sourceFiles.FirstOrDefault(x => x.ProjectUUID == project.UUID || x.ProjectUUID == project.ProjectInfo.UUID);
                        if (sourceControlData != null)
                        {
                            project.GitData      = sourceControlData;
                            project.GitGenerated = true;
                            var gitDirectory = Path.Combine(Path.GetDirectoryName(sourceControlData.SourceFile), ".git");
                            if (Directory.Exists(gitDirectory))
                            {
                                var lastModifiedDate = File.GetLastWriteTime(gitDirectory);
                                if (lastModifiedDate != null && project.ModuleInfo.ModifiedDate.Ticks < lastModifiedDate.Ticks)
                                {
                                    project.ModuleInfo.ModifiedDate = lastModifiedDate;
                                }
                            }
                            totalSuccess += 1;
                        }
                    }

                    return(totalSuccess > 0);
                }
            }
            catch (Exception ex)
            {
                Log.Here().Error("Error loading source control data:");
                Log.Here().Error(ex.ToString());
            }
            return(false);
        }
Esempio n. 5
0
        public static async Task <List <ModProjectData> > LoadAllAsync(DOS2DEModuleData Data, bool clearExisting = false, bool continueOnCaptureContext = true)
        {
            Log.Here().Activity("Loading all mod projects data.");
            var newMods = await LoadModProjectsAsync(Data, clearExisting);

            Log.Here().Activity("Loading all managed projects data.");
            await LoadManagedProjectsAsync(Data, newMods, clearExisting);

            Log.Here().Activity("Loading all source control data.");
            await LoadSourceControlDataAsync(Data, newMods);

            Log.Here().Activity("Loading complete!");
            return(newMods);
        }
        public DOS2DEProjectsView()
        {
            InitializeComponent();

            _instance = this;

            if (DesignerProperties.GetIsInDesignMode(this))
            {
                ViewModel = new DOS2DEModuleData();
                ViewModel.AvailableProjectsVisible = true;
                ViewModel.LoadPanelVisibility      = Visibility.Collapsed;
            }

            Init();
        }
Esempio n. 7
0
        public static async Task <bool> RefreshAvailableProjects(DOS2DEModuleData Data)
        {
            //await new SynchronizationContextRemover();
            var newMods = await LoadModProjectsAsync(Data, true);

            if (Thread.CurrentThread.IsBackground)
            {
                await Observable.Start(() =>
                {
                    Data.ModProjects.AddRange(newMods);
                    return(Unit.Default);
                }, RxApp.MainThreadScheduler);
            }
            else
            {
                Data.ModProjects.AddRange(newMods);
            }

            await LoadManagedProjectsAsync(Data, newMods, true);

            return(true);
        }
Esempio n. 8
0
        public static async Task <bool> RefreshManagedProjects(DOS2DEModuleData Data)
        {
            if (Data.ManagedProjects != null && Data.ManagedProjects.Count > 0)
            {
                if (Data.Settings != null && !String.IsNullOrEmpty(Data.Settings.DOS2DEDataDirectory))
                {
                    if (Directory.Exists(Data.Settings.DOS2DEDataDirectory))
                    {
                        string projectsPath = Path.Combine(Data.Settings.DOS2DEDataDirectory, "Projects");
                        string modsPath     = Path.Combine(Data.Settings.DOS2DEDataDirectory, "Mods");

                        if (Directory.Exists(modsPath))
                        {
                            Log.Here().Activity("Reloading DOS2 project data from mods directory at: {0}.", modsPath);

                            foreach (var project in Data.ManagedProjects)
                            {
                                var modData = Data.ModProjects.Items.FirstOrDefault(p => p.ProjectName == project.ProjectName && p.UUID == project.UUID);
                                if (modData != null)
                                {
                                    Log.Here().Activity($"Reloading data for project {project.ProjectName}.");
                                    await modData.ReloadDataAsync();
                                }
                            }
                        }
                    }
                    else
                    {
                        Log.Here().Error("Loading available projects failed. DOS2 data directory not found at {0}", Data.Settings.DOS2DEDataDirectory);
                    }
                }

                //Reload settings like if a git project actually exists
                await LoadSourceControlDataAsync(Data, Data.ModProjects.Items);
            }

            return(true);
        }
Esempio n. 9
0
        public static bool LoadSourceControlData(DOS2DEModuleData Data, IEnumerable <ModProjectData> modProjects)
        {
            if (Directory.Exists(Data.Settings.GitRootDirectory))
            {
                int totalSuccess = 0;
                var projectFiles = Directory.EnumerateFiles(Data.Settings.GitRootDirectory, DirectoryEnumerationOptions.Files | DirectoryEnumerationOptions.Recursive, new DirectoryEnumerationFilters
                {
                    InclusionFilter = (f) =>
                    {
                        return(f.FileName.Equals("SourceControlGenerator.json", StringComparison.OrdinalIgnoreCase));
                    }
                }).Select(x => SourceControlData.FromPath(x));

                foreach (var project in modProjects)
                {
                    var sourceControlData = projectFiles.FirstOrDefault(x => x.ProjectUUID == project.UUID);
                    if (sourceControlData != null)
                    {
                        project.GitData      = sourceControlData;
                        project.GitGenerated = true;
                        var gitDirectory = Path.Combine(Path.GetDirectoryName(sourceControlData.SourceFile), ".git");
                        if (Directory.Exists(gitDirectory))
                        {
                            var lastModifiedDate = File.GetLastWriteTime(gitDirectory);
                            if (lastModifiedDate != null && project.ModuleInfo.ModifiedDate.Ticks < lastModifiedDate.Ticks)
                            {
                                project.ModuleInfo.ModifiedDate = lastModifiedDate;
                            }
                        }
                        totalSuccess += 1;
                    }
                }

                return(totalSuccess > 0);
            }
            return(false);
        }
Esempio n. 10
0
 public static void SetData(DOS2DEModuleData moduleData)
 {
     MainData = moduleData;
 }
Esempio n. 11
0
        public static List <ModProjectData> LoadModProjects(DOS2DEModuleData Data, bool clearExisting = false)
        {
            if (clearExisting)
            {
                Data.ModProjects.Clear();
                Log.Here().Important("Cleared mod project data.");
            }

            List <ModProjectData> newItems = new List <ModProjectData>();

            if (Data.Settings != null && !String.IsNullOrEmpty(Data.Settings.DOS2DEDataDirectory))
            {
                if (Directory.Exists(Data.Settings.DOS2DEDataDirectory))
                {
                    string projectsPath = Path.Combine(Data.Settings.DOS2DEDataDirectory, "Projects");
                    string modsPath     = Path.Combine(Data.Settings.DOS2DEDataDirectory, "Mods");

                    if (Directory.Exists(modsPath))
                    {
                        Log.Here().Activity("Loading DOS2 projects from mods directory at: {0}", modsPath);

                        DirectoryEnumerationFilters filters = new DirectoryEnumerationFilters()
                        {
                            InclusionFilter = (f) =>
                            {
                                return(!IgnoredFolders.Contains(f.FileName));
                            },
                        };

                        var modFolders = Directory.EnumerateDirectories(modsPath, DirectoryEnumerationOptions.Folders, filters, PathFormat.LongFullPath);

                        if (modFolders != null)
                        {
                            foreach (string modFolder in modFolders)
                            {
                                var modFolderName = Path.GetFileName(modFolder);
                                //Log.Here().Activity("Checking project mod folder: {0}", modFolderName);

                                var metaFilePath = Path.Combine(modFolder, "meta.lsx");
                                if (File.Exists(metaFilePath))
                                {
                                    //Log.Here().Activity("Meta file found for project {0}. Reading file.", modFolderName);

                                    ModProjectData modProjectData = new ModProjectData();
                                    modProjectData.LoadAllData(metaFilePath, projectsPath);

                                    //Log.Here().Activity("Finished reading meta files for mod: {0}", modProjectData.ModuleInfo.Name);

                                    if (!clearExisting)
                                    {
                                        var previous = Data.ModProjects.Items.FirstOrDefault(p => p.FolderName == modProjectData.FolderName);
                                        if (previous != null)
                                        {
                                            if (previous.DataIsNewer(modProjectData))
                                            {
                                                previous.UpdateData(modProjectData);
                                            }
                                        }
                                        else
                                        {
                                            newItems.Add(modProjectData);
                                        }
                                    }
                                    else
                                    {
                                        newItems.Add(modProjectData);
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    Log.Here().Error("Loading available projects failed. DOS2 data directory not found at {0}", Data.Settings.DOS2DEDataDirectory);
                }
            }

            return(newItems);
        }
Esempio n. 12
0
        public static async Task <Unit> LoadManagedProjectsAsync(DOS2DEModuleData Data, List <ModProjectData> modProjects, bool clearExisting = false)
        {
            try
            {
                if (clearExisting)
                {
                    foreach (var mod in Data.ModProjects.Items)
                    {
                        mod.IsManaged = false;
                    }
                }

                string projectsAppDataPath = DefaultPaths.ModuleAddedProjectsFile(Data);

                if (Data.Settings != null && File.Exists(Data.Settings.AddedProjectsFile))
                {
                    projectsAppDataPath = Data.Settings.AddedProjectsFile;
                }

                if (!String.IsNullOrEmpty(projectsAppDataPath) && File.Exists(projectsAppDataPath))
                {
                    try
                    {
                        string contents = await FileCommands.ReadFileAsync(projectsAppDataPath);

                        var settings = new JsonSerializerSettings
                        {
                            NullValueHandling     = NullValueHandling.Ignore,
                            MissingMemberHandling = MissingMemberHandling.Error
                        };

                        if (Thread.CurrentThread.IsBackground)
                        {
                            await Observable.Start(() =>
                            {
                                Data.ManagedProjectsData = JsonConvert.DeserializeObject <ManagedProjectsData>(contents, settings);
                                return(Unit.Default);
                            }, RxApp.MainThreadScheduler);
                        }
                        else
                        {
                            Data.ManagedProjectsData = JsonConvert.DeserializeObject <ManagedProjectsData>(contents, settings);
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.Here().Error("Error deserializing managed projects data at {0}: {1}", projectsAppDataPath, ex.ToString());
                    }
                }

                Debug.WriteLine("Loading managed project data");

                if (Data.ManagedProjectsData == null)
                {
                    if (Thread.CurrentThread.IsBackground)
                    {
                        await Observable.Start(() =>
                        {
                            Data.ManagedProjectsData = new ManagedProjectsData();
                            return(Unit.Default);
                        }, RxApp.MainThreadScheduler);
                    }
                    else
                    {
                        Data.ManagedProjectsData = new ManagedProjectsData();
                    }
                }
                else
                {
                    if (Data.ManagedProjectsData.SortedProjects != null)
                    {
                        if (Thread.CurrentThread.IsBackground)
                        {
                            await Observable.Start(() =>
                            {
                                foreach (var p in Data.ManagedProjectsData.SortedProjects)
                                {
                                    Data.ManagedProjectsData.SavedProjects.AddOrUpdate(p);
                                }
                                return(Unit.Default);
                            }, RxApp.MainThreadScheduler);
                        }
                        else
                        {
                            foreach (var p in Data.ManagedProjectsData.SortedProjects)
                            {
                                Data.ManagedProjectsData.SavedProjects.AddOrUpdate(p);
                            }
                        }
                    }

                    foreach (var m in Data.ManagedProjectsData.SavedProjects.Items)
                    {
                        var modData = modProjects.FirstOrDefault(p => p.UUID == m.UUID);
                        if (modData != null)
                        {
                            modData.IsManaged = true;

                            if (clearExisting)
                            {
                                await modData.ReloadDataAsync();

                                if (!String.IsNullOrWhiteSpace(m.LastBackupUTC))
                                {
                                    DateTime lastBackup;

                                    var success = DateTime.TryParse(m.LastBackupUTC, out lastBackup);
                                    if (success)
                                    {
                                        //Log.Here().Activity($"Successully parsed {modProject.LastBackup} to DateTime.");
                                        modData.LastBackup = lastBackup.ToLocalTime();
                                    }
                                    else
                                    {
                                        Log.Here().Error($"Could not convert {m.LastBackupUTC} to DateTime.");
                                    }
                                }
                            }
                        }
                    }
                    ;
                }
            }
            catch (Exception ex)
            {
                Log.Here().Error("Error loading managed projects:");
                Log.Here().Error(ex.ToString());
            }

            return(Unit.Default);
        }
Esempio n. 13
0
        public static async Task <List <ModProjectData> > LoadModProjectsAsync(DOS2DEModuleData Data, bool clearExisting = false)
        {
            if (clearExisting)
            {
                Log.Here().Important("Clearing mod projects");
                if (Thread.CurrentThread.IsBackground)
                {
                    await Observable.Start(() =>
                    {
                        Data.ModProjects.Clear();
                        return(Unit.Default);
                    }, RxApp.MainThreadScheduler);
                }
                else
                {
                    Data.ModProjects.Clear();
                }
            }

            List <ModProjectData> newItems = new List <ModProjectData>();

            if (Data.Settings != null && !String.IsNullOrEmpty(Data.Settings.DOS2DEDataDirectory))
            {
                if (Directory.Exists(Data.Settings.DOS2DEDataDirectory))
                {
                    string projectsPath = Path.Combine(Data.Settings.DOS2DEDataDirectory, "Projects");
                    string modsPath     = Path.Combine(Data.Settings.DOS2DEDataDirectory, "Mods");

                    if (Directory.Exists(modsPath))
                    {
                        Log.Here().Activity($"Loading DOS2 projects from mods directory at: {modsPath}");

                        //DirectoryInfo modsRoot = new DirectoryInfo(modsPath);
                        //var modFolders = modsRoot.GetDirectories().Where(s => !IgnoredFolders.Contains(s.Name));

                        DirectoryEnumerationFilters filters = new DirectoryEnumerationFilters()
                        {
                            InclusionFilter = (f) =>
                            {
                                return(!IgnoredFolders.Contains(f.FileName));
                            },
                        };

                        //var modFolders = await Observable.Start(() =>
                        //{
                        //	return Directory.EnumerateDirectories(modsPath, DirectoryEnumerationOptions.Folders, filters, PathFormat.LongFullPath);
                        //}, RxApp.TaskpoolScheduler);

                        var modFolders = Directory.EnumerateDirectories(modsPath, DirectoryEnumerationOptions.Folders, filters, PathFormat.LongFullPath);

                        if (modFolders != null)
                        {
                            foreach (string modFolder in modFolders)
                            {
                                try
                                {
                                    var modFolderName = Path.GetFileName(modFolder);
                                    Log.Here().Activity($"Checking project mod folder: {modFolderName}");

                                    var metaFilePath = Path.Combine(modFolder, "meta.lsx");
                                    if (File.Exists(metaFilePath))
                                    {
                                        Log.Here().Activity($"Meta file found for project {modFolderName}. Reading file.");

                                        ModProjectData modProjectData = new ModProjectData();
                                        await modProjectData.LoadAllDataAsync(metaFilePath, projectsPath);

                                        Log.Here().Activity($"Finished reading meta files for mod: {modProjectData.ModuleInfo.Name}");

                                        if (!clearExisting)
                                        {
                                            var previous = Data.ModProjects.Items.FirstOrDefault(p => p.FolderName == modProjectData.FolderName);
                                            if (previous != null)
                                            {
                                                if (previous.DataIsNewer(modProjectData))
                                                {
                                                    if (Thread.CurrentThread.IsBackground)
                                                    {
                                                        await Observable.Start(() =>
                                                        {
                                                            previous.UpdateData(modProjectData);
                                                            return(Unit.Default);
                                                        }, RxApp.MainThreadScheduler);
                                                    }
                                                    else
                                                    {
                                                        previous.UpdateData(modProjectData);
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                newItems.Add(modProjectData);
                                            }
                                        }
                                        else
                                        {
                                            newItems.Add(modProjectData);
                                        }
                                    }
                                }
                                catch (Exception ex)
                                {
                                    Log.Here().Error($"Error parsing mod folder ${modFolder}:");
                                    Log.Here().Error(ex.ToString());
                                }
                            }
                        }
                    }
                }
                else
                {
                    Log.Here().Error("Loading available projects failed. DOS2 data directory not found at {0}", Data.Settings.DOS2DEDataDirectory);
                }
            }

            return(newItems);
        }
 public static string CustomLocaleDirectory(DOS2DEModuleData Data, ModProjectData modProject)
 {
     return(Path.Combine(Data.Settings.GitRootDirectory, modProject.ProjectName, @"LocaleEditor\"));
 }