diff --git a/Dotnet/AppApi/AppApi.cs b/Dotnet/AppApi/AppApi.cs index b9d41267..85e157a4 100644 --- a/Dotnet/AppApi/AppApi.cs +++ b/Dotnet/AppApi/AppApi.cs @@ -6,6 +6,7 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.Diagnostics; using System.Drawing; using System.Globalization; @@ -453,7 +454,11 @@ namespace VRCX MainForm.Instance.BeginInvoke(new MethodInvoker(() => { var image = Image.FromFile(path); - Clipboard.SetImage(image); + // Clipboard.SetImage(image); + var data = new DataObject(); + data.SetData(DataFormats.Bitmap, image); + data.SetFileDropList(new StringCollection { path }); + Clipboard.SetDataObject(data, true); })); } } diff --git a/Dotnet/AppApi/Screenshot.cs b/Dotnet/AppApi/Screenshot.cs index b4d89bf1..727da982 100644 --- a/Dotnet/AppApi/Screenshot.cs +++ b/Dotnet/AppApi/Screenshot.cs @@ -19,11 +19,11 @@ namespace VRCX /// The metadata to add to the screenshot file. /// The ID of the world to associate with the screenshot. /// Whether or not to rename the screenshot file to include the world ID. - public void AddScreenshotMetadata(string path, string metadataString, string worldId, bool changeFilename = false) + public string AddScreenshotMetadata(string path, string metadataString, string worldId, bool changeFilename = false) { var fileName = Path.GetFileNameWithoutExtension(path); if (!File.Exists(path) || !path.EndsWith(".png") || !fileName.StartsWith("VRChat_")) - return; + return string.Empty; if (changeFilename) { @@ -34,6 +34,7 @@ namespace VRCX } ScreenshotHelper.WritePNGDescription(path, metadataString); + return path; } /// diff --git a/html/src/app.js b/html/src/app.js index ac320b9e..a2683852 100644 --- a/html/src/app.js +++ b/html/src/app.js @@ -10155,9 +10155,6 @@ speechSynthesis.getVoices(); database.addGamelogResourceLoadToDatabase(entry); break; case 'screenshot': - if (!this.screenshotHelper) { - break; - } // var entry = { // created_at: gameLog.dt, // type: 'Event', @@ -10167,33 +10164,8 @@ speechSynthesis.getVoices(); // )}` // }; // database.addGamelogEventToDatabase(entry); - var location = API.parseLocation(this.lastLocation.location); - var metadata = { - application: 'VRCX', - version: 1, - author: { - id: API.currentUser.id, - displayName: API.currentUser.displayName - }, - world: { - name: this.lastLocation.name, - id: location.worldId, - instanceId: this.lastLocation.location - }, - players: [] - }; - for (var user of this.lastLocation.playerList.values()) { - metadata.players.push({ - id: user.userId, - displayName: user.displayName - }); - } - AppApi.AddScreenshotMetadata( - gameLog.screenshotPath, - JSON.stringify(metadata), - location.worldId, - this.screenshotHelperModifyFilename - ); + + this.processScreenshot(gameLog.screenshotPath); break; case 'api-request': var bias = Date.parse(gameLog.dt) + 60 * 1000; @@ -15127,6 +15099,11 @@ speechSynthesis.getVoices(); false ); + $app.data.screenshotHelperCopyToClipboard = await configRepository.getBool( + 'VRCX_screenshotHelperCopyToClipboard', + false + ); + $app.data.enableAppLauncher = await configRepository.getBool( 'VRCX_enableAppLauncher', true @@ -22723,6 +22700,46 @@ speechSynthesis.getVoices(); 'VRCX_screenshotHelperModifyFilename', this.screenshotHelperModifyFilename ); + await configRepository.setBool( + 'VRCX_screenshotHelperCopyToClipboard', + this.screenshotHelperCopyToClipboard + ); + }; + + $app.methods.processScreenshot = async function (path) { + var newPath = path; + if (this.screenshotHelper) { + var location = API.parseLocation(this.lastLocation.location); + var metadata = { + application: 'VRCX', + version: 1, + author: { + id: API.currentUser.id, + displayName: API.currentUser.displayName + }, + world: { + name: this.lastLocation.name, + id: location.worldId, + instanceId: this.lastLocation.location + }, + players: [] + }; + for (var user of this.lastLocation.playerList.values()) { + metadata.players.push({ + id: user.userId, + displayName: user.displayName + }); + } + newPath = await AppApi.AddScreenshotMetadata( + path, + JSON.stringify(metadata), + location.worldId, + this.screenshotHelperModifyFilename + ); + } + if (this.screenshotHelperCopyToClipboard) { + await AppApi.CopyImageToClipboard(newPath); + } }; $app.methods.getAndDisplayScreenshot = function ( diff --git a/html/src/localization/en/en.json b/html/src/localization/en/en.json index 52aff269..fa78862f 100644 --- a/html/src/localization/en/en.json +++ b/html/src/localization/en/en.json @@ -425,7 +425,8 @@ "description_tooltip": "Unfortunately, windows doesn't support viewing PNG text chunks(few things do) natively, but you can view it using a command-line tool like exiftool, a png chunk inspector, or a hex editor.", "enable": "Enable", "modify_filename": "Modify Filename", - "modify_filename_tooltip": "Will add the World ID to screenshot filename, in addition to file metadata." + "modify_filename_tooltip": "Will add the World ID to screenshot filename, in addition to file metadata.", + "copy_to_clipboard": "Copy to Clipboard" }, "app_launcher": { "header": "App Launcher", diff --git a/html/src/mixins/tabs/settings.pug b/html/src/mixins/tabs/settings.pug index 08896037..1dee6990 100644 --- a/html/src/mixins/tabs/settings.pug +++ b/html/src/mixins/tabs/settings.pug @@ -445,7 +445,10 @@ mixin settingsTab() span.name {{ $t('view.settings.advanced.advanced.screenshot_helper.modify_filename') }} el-tooltip(placement="top" style="margin-left:5px" :content="$t('view.settings.advanced.advanced.screenshot_helper.modify_filename_tooltip')") i.el-icon-info - el-switch(v-model="screenshotHelperModifyFilename" @change="saveScreenshotHelper") + el-switch(v-model="screenshotHelperModifyFilename" @change="saveScreenshotHelper" :disabled="!screenshotHelper") + div.options-container-item + span.name {{ $t('view.settings.advanced.advanced.screenshot_helper.copy_to_clipboard') }} + el-switch(v-model="screenshotHelperCopyToClipboard" @change="saveScreenshotHelper") //- Advanced | YouTube API div.options-container span.header {{ $t('view.settings.advanced.advanced.youtube_api.header') }}