From a5af18b50a0a7b79f3886938b5a633254c18c598 Mon Sep 17 00:00:00 2001 From: Kiokuu <78288562+Kiokuu@users.noreply.github.com> Date: Sat, 21 Dec 2024 23:55:48 +0000 Subject: [PATCH] Refactored FilePicker --- Dotnet/AppApi/Folders.cs | 44 +++++++++++++++++ Dotnet/AppApi/RegistryPlayerPrefs.cs | 41 +++------------- Dotnet/AppApi/Screenshot.cs | 48 ------------------- html/src/app.js | 10 ++++ html/src/classes/vrcRegistry.js | 9 +++- .../src/mixins/dialogs/screenshotMetadata.pug | 2 +- html/src/mixins/dialogs/settings.pug | 2 +- 7 files changed, 71 insertions(+), 85 deletions(-) diff --git a/Dotnet/AppApi/Folders.cs b/Dotnet/AppApi/Folders.cs index ac30f5e3a..8d17e6db9 100644 --- a/Dotnet/AppApi/Folders.cs +++ b/Dotnet/AppApi/Folders.cs @@ -326,6 +326,50 @@ public async Task OpenFolderSelectorDialog(string defaultPath = "") return await tcs.Task; } + /// + /// Opens a folder dialog to select a file and pass the path back to the JS side. + /// + /// The default path for the file picker. + public async Task OpenFileSelectorDialog(string defaultPath = "", string defaultExt = "", string defaultFilter = "All files (*.*)|*.*") + { + var tcs = new TaskCompletionSource(); + var staThread = new Thread(() => + { + try + { + using (var openFileDialog = new System.Windows.Forms.OpenFileDialog()) + { + if (Directory.Exists(defaultPath)) + { + openFileDialog.InitialDirectory = defaultPath; + } + + openFileDialog.DefaultExt = defaultExt; + openFileDialog.Filter = defaultFilter; + + var dialogResult = openFileDialog.ShowDialog(MainForm.nativeWindow); + if (dialogResult == DialogResult.OK && !string.IsNullOrEmpty(openFileDialog.FileName)) + { + tcs.SetResult(openFileDialog.FileName); + } + else + { + tcs.SetResult(""); + } + } + } + catch (Exception ex) + { + tcs.SetException(ex); + } + }); + + staThread.SetApartmentState(ApartmentState.STA); + staThread.Start(); + + return await tcs.Task; + } + private static readonly Regex _folderRegex = new Regex(string.Format(@"([{0}]*\.+$)|([{0}]+)", Regex.Escape(new string(Path.GetInvalidPathChars())))); diff --git a/Dotnet/AppApi/RegistryPlayerPrefs.cs b/Dotnet/AppApi/RegistryPlayerPrefs.cs index 7d421284d..7eed5505c 100644 --- a/Dotnet/AppApi/RegistryPlayerPrefs.cs +++ b/Dotnet/AppApi/RegistryPlayerPrefs.cs @@ -272,43 +272,16 @@ public void DeleteVRChatRegistryFolder() } } - /// - /// Opens a file dialog to select a VRChat registry backup JSON file. - /// - public void OpenVrcRegJsonFileDialog() - { - if (dialogOpen) return; - dialogOpen = true; - var thread = new Thread(() => + public string ReadVrcRegJsonFile(string filepath) + { + if (!File.Exists(filepath)) { - using (var openFileDialog = new System.Windows.Forms.OpenFileDialog()) - { - openFileDialog.DefaultExt = ".json"; - openFileDialog.Filter = "JSON Files (*.json)|*.json"; - openFileDialog.FilterIndex = 1; - openFileDialog.RestoreDirectory = true; - - if (openFileDialog.ShowDialog() != DialogResult.OK) - { - dialogOpen = false; - return; - } - - dialogOpen = false; - - var path = openFileDialog.FileName; - if (string.IsNullOrEmpty(path)) - return; - - // return file contents - var json = File.ReadAllText(path); - ExecuteAppFunction("restoreVrcRegistryFromFile", json); - } - }); + return ""; + } - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); + var json = File.ReadAllText(filepath); + return json; } } } \ No newline at end of file diff --git a/Dotnet/AppApi/Screenshot.cs b/Dotnet/AppApi/Screenshot.cs index 2bb48447f..84b52fd3c 100644 --- a/Dotnet/AppApi/Screenshot.cs +++ b/Dotnet/AppApi/Screenshot.cs @@ -12,8 +12,6 @@ namespace VRCX { public partial class AppApi { - private static bool dialogOpen; - /// /// Adds metadata to a PNG screenshot file and optionally renames the file to include the specified world ID. /// @@ -39,51 +37,6 @@ public string AddScreenshotMetadata(string path, string metadataString, string w return path; } - /// - /// Opens a file dialog to select a PNG screenshot file. - /// The resulting file path is passed to . - /// - public void OpenScreenshotFileDialog() - { - if (dialogOpen) return; - dialogOpen = true; - - var thread = new Thread(() => - { - using (var openFileDialog = new OpenFileDialog()) - { - openFileDialog.DefaultExt = ".png"; - openFileDialog.Filter = "PNG Files (*.png)|*.png"; - openFileDialog.FilterIndex = 1; - openFileDialog.RestoreDirectory = true; - - var initialPath = GetVRChatPhotosLocation(); - if (Directory.Exists(initialPath)) - { - openFileDialog.InitialDirectory = initialPath; - } - - if (openFileDialog.ShowDialog() != DialogResult.OK) - { - dialogOpen = false; - return; - } - - dialogOpen = false; - - var path = openFileDialog.FileName; - if (string.IsNullOrEmpty(path)) - return; - - ExecuteAppFunction("screenshotMetadataResetSearch", null); - ExecuteAppFunction("getAndDisplayScreenshot", path); - } - }); - - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - } - public string GetExtraScreenshotData(string path, bool carouselCache) { var fileName = Path.GetFileNameWithoutExtension(path); @@ -131,7 +84,6 @@ public string GetScreenshotMetadata(string path) if (string.IsNullOrEmpty(path)) return null; - var metadata = ScreenshotHelper.GetScreenshotMetadata(path); if (metadata == null) diff --git a/html/src/app.js b/html/src/app.js index ff2770bba..8bbc58789 100644 --- a/html/src/app.js +++ b/html/src/app.js @@ -16344,6 +16344,16 @@ speechSynthesis.getVoices(); } }; + $app.methods.getAndDisplayScreenshotFromFile = async function () { + var filePath = await AppApi.OpenFileSelectorDialog(await AppApi.GetVRChatPhotosLocation(), ".png", "PNG Files (*.png)|*.png"); + if (filePath === "") { + return; + } + + this.screenshotMetadataResetSearch(); + this.getAndDisplayScreenshot(filePath); + }; + $app.methods.getAndDisplayScreenshot = function ( path, needsCarouselFiles = true diff --git a/html/src/classes/vrcRegistry.js b/html/src/classes/vrcRegistry.js index b49653359..41d1ef34a 100644 --- a/html/src/classes/vrcRegistry.js +++ b/html/src/classes/vrcRegistry.js @@ -133,7 +133,14 @@ export default class extends baseClass { this.downloadAndSaveJson(row.name, row.data); }, - restoreVrcRegistryFromFile(json) { + async restoreVrcRegistryFromFile() { + var filePath = await AppApi.OpenFileSelectorDialog(null, ".json", "JSON Files (*.json)|*.json"); + if (filePath === "") { + return; + } + + var json = await AppApi.ReadVrcRegJsonFile(filePath); + try { var data = JSON.parse(json); if (!data || typeof data !== 'object') { diff --git a/html/src/mixins/dialogs/screenshotMetadata.pug b/html/src/mixins/dialogs/screenshotMetadata.pug index 744d83b32..5a2f73660 100644 --- a/html/src/mixins/dialogs/screenshotMetadata.pug +++ b/html/src/mixins/dialogs/screenshotMetadata.pug @@ -4,7 +4,7 @@ mixin screenshotMetadata() span(style="margin-left:5px;color:#909399;font-family:monospace") {{ $t('dialog.screenshot_metadata.drag') }} br br - el-button(size="small" icon="el-icon-folder-opened" @click="AppApi.OpenScreenshotFileDialog()") {{ $t('dialog.screenshot_metadata.browse') }} + el-button(size="small" icon="el-icon-folder-opened" @click="getAndDisplayScreenshotFromFile()") {{ $t('dialog.screenshot_metadata.browse') }} el-button(size="small" icon="el-icon-picture-outline" @click="getAndDisplayLastScreenshot()") {{ $t('dialog.screenshot_metadata.last_screenshot') }} el-button(size="small" icon="el-icon-copy-document" @click="copyImageToClipboard(screenshotMetadataDialog.metadata.filePath)") {{ $t('dialog.screenshot_metadata.copy_image') }} el-button(size="small" icon="el-icon-folder" @click="openImageFolder(screenshotMetadataDialog.metadata.filePath)") {{ $t('dialog.screenshot_metadata.open_folder') }} diff --git a/html/src/mixins/dialogs/settings.pug b/html/src/mixins/dialogs/settings.pug index 40a222b64..122bae216 100644 --- a/html/src/mixins/dialogs/settings.pug +++ b/html/src/mixins/dialogs/settings.pug @@ -174,7 +174,7 @@ mixin settings() el-button(type="danger" @click="deleteVrcRegistry" size="small") {{ $t('dialog.registry_backup.reset') }} div el-button(@click="promptVrcRegistryBackupName" size="small") {{ $t('dialog.registry_backup.backup') }} - el-button(@click="AppApi.OpenVrcRegJsonFileDialog()" size="small") {{ $t('dialog.registry_backup.restore_from_file') }} + el-button(@click="restoreVrcRegistryFromFile" size="small") {{ $t('dialog.registry_backup.restore_from_file') }} //- dialog: Enable primary password