diff --git a/Dotnet/AppApi/Folders.cs b/Dotnet/AppApi/Folders.cs
index ac30f5e3..8d17e6db 100644
--- a/Dotnet/AppApi/Folders.cs
+++ b/Dotnet/AppApi/Folders.cs
@@ -326,6 +326,50 @@ namespace VRCX
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 7d421284..7eed5505 100644
--- a/Dotnet/AppApi/RegistryPlayerPrefs.cs
+++ b/Dotnet/AppApi/RegistryPlayerPrefs.cs
@@ -272,43 +272,16 @@ namespace VRCX
}
}
- ///
- /// Opens a file dialog to select a VRChat registry backup JSON file.
- ///
- public void OpenVrcRegJsonFileDialog()
+
+ public string ReadVrcRegJsonFile(string filepath)
{
- if (dialogOpen) return;
- dialogOpen = true;
-
- var thread = new Thread(() =>
+ 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;
+ return "";
+ }
- 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);
- }
- });
-
- 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 2bb48447..84b52fd3 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 @@ namespace VRCX
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 @@ namespace VRCX
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 b8c749a4..40935293 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 b4965335..41d1ef34 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 744d83b3..5a2f7366 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 40a222b6..122bae21 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