Exemplo n.º 1
0
        public async Task ExecuteSelectFile(FileModel model)
        {
            SelectedIndex = 0;
            if (model == null)
            {
                return;
            }

            if (State is DockState.AutoHidden or DockState.Hidden)
            {
                return;
            }

            PE_SelectedItem = model;
            if (!_settingsManager.ShowFilePreview)
            {
                return;
            }

            PE_MeshPreviewVisible = false;
            IsAudioPreviewVisible = false;
            IsImagePreviewVisible = false;
            IsVideoPreviewVisible = false;

            // check additional changes
            if (model.IsDirectory)
            {
                return;
            }

            if (PE_SelectedItem == null)
            {
                return;
            }
            // string.Equals(model.GetExtension(), ERedExtension.bk2.ToString(), StringComparison.OrdinalIgnoreCase) ||
            if (!(
                    string.Equals(model.GetExtension(), ERedExtension.ent.ToString(), StringComparison.OrdinalIgnoreCase) ||
                    string.Equals(model.GetExtension(), ERedExtension.physicalscene.ToString(), StringComparison.OrdinalIgnoreCase) ||
                    string.Equals(model.GetExtension(), ERedExtension.w2mesh.ToString(), StringComparison.OrdinalIgnoreCase) ||
                    string.Equals(model.GetExtension(), ERedExtension.mesh.ToString(), StringComparison.OrdinalIgnoreCase) ||
                    string.Equals(model.GetExtension(), ERedExtension.wem.ToString(), StringComparison.OrdinalIgnoreCase) ||
                    string.Equals(model.GetExtension(), ERedExtension.xbm.ToString(), StringComparison.OrdinalIgnoreCase) ||
                    string.Equals(model.GetExtension(), ERedExtension.envprobe.ToString(), StringComparison.OrdinalIgnoreCase) ||
                    Enum.TryParse <EConvertableOutput>(PE_SelectedItem.GetExtension(), out _) ||
                    Enum.TryParse <EUncookExtension>(PE_SelectedItem.GetExtension(), out _)
                    ))
            {
                return;
            }

            if (PE_SelectedItem != null)
            {
                if (PE_SelectedItem.GetExtension().Length > 0)
                {
                    //if (string.Equals(PE_SelectedItem.GetExtension(), ERedExtension.bk2.ToString(),
                    //   System.StringComparison.OrdinalIgnoreCase))
                    //{
                    //    IsVideoPreviewVisible = true;
                    //    SetExeCommand?.Invoke("test.exe | test2.bk2 /J /I2 /P");
                    //}


                    if (Enum.IsDefined(typeof(EConvertableOutput), PE_SelectedItem.GetExtension()))
                    {
                        PE_MeshPreviewVisible = true;
                        SelectedIndex         = 1;

                        LoadModel(PE_SelectedItem.FullName);
                    }

                    if (string.Equals(PE_SelectedItem.GetExtension(), ERedExtension.mesh.ToString(), StringComparison.OrdinalIgnoreCase) ||
                        string.Equals(PE_SelectedItem.GetExtension(), ERedExtension.w2mesh.ToString(), StringComparison.OrdinalIgnoreCase) ||
                        string.Equals(PE_SelectedItem.GetExtension(), ERedExtension.ent.ToString(), StringComparison.OrdinalIgnoreCase) ||
                        string.Equals(PE_SelectedItem.GetExtension(), ERedExtension.physicalscene.ToString(), StringComparison.OrdinalIgnoreCase))
                    {
                        using (var meshStream = new FileStream(PE_SelectedItem.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                        {
                            meshStream.Seek(0, SeekOrigin.Begin);
                            var outPath = Path.Combine(ISettingsManager.GetTemp_OBJPath(), Path.GetFileName(PE_SelectedItem.FullName));
                            outPath = Path.ChangeExtension(outPath, ".glb");
                            if (_meshTools.ExportMeshPreviewer(meshStream, new FileInfo(outPath)))
                            {
                                LoadModel(outPath);
                                PE_MeshPreviewVisible = true;
                                SelectedIndex         = 1;
                            }
                            meshStream.Dispose();
                            meshStream.Close();
                        }
                    }

                    if (string.Equals(PE_SelectedItem.GetExtension(), ERedExtension.wem.ToString(),
                                      System.StringComparison.OrdinalIgnoreCase))
                    {
                        IsAudioPreviewVisible = true;
                        SelectedIndex         = 2;

                        PreviewAudioCommand.SafeExecute(PE_SelectedItem.FullName);
                    }

                    // textures
                    if (Enum.TryParse <EUncookExtension>(PE_SelectedItem.GetExtension(),
                                                         out _))
                    {
                        var q = await ImageDecoder.RenderToBitmapSource(PE_SelectedItem.FullName);

                        if (q != null)
                        {
                            var g = BitmapFrame.Create(q);
                            LoadImage(g);
                            IsImagePreviewVisible = true;
                            SelectedIndex         = 3;
                        }
                    }

                    // xbm
                    if (string.Equals(PE_SelectedItem.GetExtension(), ERedExtension.xbm.ToString(), StringComparison.OrdinalIgnoreCase) ||
                        string.Equals(PE_SelectedItem.GetExtension(), ERedExtension.mesh.ToString(), StringComparison.OrdinalIgnoreCase) ||
                        string.Equals(PE_SelectedItem.GetExtension(), ERedExtension.envprobe.ToString(), StringComparison.OrdinalIgnoreCase))
                    {
                        // convert xbm to dds stream
                        await using var ddsstream  = new MemoryStream();
                        await using var filestream = new FileStream(PE_SelectedItem.FullName,
                                                                    FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 4096, FileOptions.SequentialScan);
                        if (_modTools.ConvertXbmToDdsStream(filestream, ddsstream, out _))
                        {
                            // try loading it in pfim
                            try
                            {
                                var qa = await ImageDecoder.RenderToBitmapSourceDds(ddsstream);

                                if (qa != null)
                                {
                                    LoadImage(qa);
                                    IsImagePreviewVisible = true;
                                    SelectedIndex         = 3;
                                }
                            }
                            catch (Exception)
                            {
                                throw;
                            }
                        }
                    }
                }
            }
            DecideForMeshPreview();
        }