diff --git a/ScreenToGif/App.xaml.cs b/ScreenToGif/App.xaml.cs index 1d6a459f..184fb2f0 100644 --- a/ScreenToGif/App.xaml.cs +++ b/ScreenToGif/App.xaml.cs @@ -14,6 +14,7 @@ using System.Windows.Markup; using System.Windows.Media; using System.Windows.Threading; +using Microsoft.Win32; using ScreenToGif.Controls; using ScreenToGif.Model; using ScreenToGif.Settings; @@ -62,6 +63,9 @@ private void App_Startup(object sender, StartupEventArgs e) LocalizationHelper.SelectCulture(UserSettings.All.LanguageCode); ThemeHelper.SelectTheme(UserSettings.All.MainTheme); + //Listen to changes in theme. + SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged; + #region Download mode if (Argument.IsInDownloadMode) @@ -327,8 +331,16 @@ private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEven } } + private void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e) + { + if (e.Category == UserPreferenceCategory.General) + ThemeHelper.SelectTheme(UserSettings.All.MainTheme); + } + private void App_Exit(object sender, ExitEventArgs e) { + SystemEvents.UserPreferenceChanged -= SystemEvents_UserPreferenceChanged; + try { MutexList.RemoveAll(); diff --git a/ScreenToGif/Cloud/Imgur/Imgur.cs b/ScreenToGif/Cloud/Imgur/Imgur.cs index 493d65dc..95a2f63e 100644 --- a/ScreenToGif/Cloud/Imgur/Imgur.cs +++ b/ScreenToGif/Cloud/Imgur/Imgur.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; @@ -34,7 +34,7 @@ public async Task UploadFileAsync(UploadPreset preset, string path, Can if (imgurPreset.UploadToAlbum) { - var album = string.IsNullOrWhiteSpace(imgurPreset.SelectedAlbum) || imgurPreset.SelectedAlbum == "♥♦♣♠" ? + var album = string.IsNullOrWhiteSpace(imgurPreset.SelectedAlbum) || imgurPreset.SelectedAlbum == "♥♦♣♠" ? await AskForAlbum(imgurPreset) : imgurPreset.SelectedAlbum; if (!string.IsNullOrEmpty(album)) @@ -45,19 +45,19 @@ public async Task UploadFileAsync(UploadPreset preset, string path, Can { headers.Add("Authorization", "Client-ID " + Secret.ImgurId); } - + if (cancellationToken.IsCancellationRequested) return null; return await Upload(imgurPreset, path, args, headers); } - + public static string GetAuthorizationAdress() { var args = new Dictionary { - {"client_id", Secret.ImgurId}, + {"client_id", Secret.ImgurId}, {"response_type", "pin"} }; @@ -165,24 +165,33 @@ private async Task Upload(ImgurPreset preset, string path, Dictionary /// Indicates when the user is mouse-clicking. /// - internal bool RecordClicked = false; + internal MouseButtonType RecordClicked = MouseButtonType.None; /// /// Deals with all screen capture methods. diff --git a/ScreenToGif/Model/ApplicationViewModel.cs b/ScreenToGif/Model/ApplicationViewModel.cs index bbb5fe8c..32adff73 100644 --- a/ScreenToGif/Model/ApplicationViewModel.cs +++ b/ScreenToGif/Model/ApplicationViewModel.cs @@ -1031,6 +1031,8 @@ internal bool InstallUpdate(bool wasPromptedManually = false) //TODO: Check if Windows is not turning off. + var runAfterwards = false; + //Prompt if: //Not configured to download the update automatically OR //Configured to download but set to prompt anyway OR @@ -1042,6 +1044,8 @@ internal bool InstallUpdate(bool wasPromptedManually = false) if (!result.HasValue || !result.Value) return false; + + runAfterwards = download.RunAfterwards; } //Only try to install if the update was downloaded. @@ -1055,12 +1059,15 @@ internal bool InstallUpdate(bool wasPromptedManually = false) return true; } + //Detect installed components. var files = Directory.EnumerateFiles(AppDomain.CurrentDomain.BaseDirectory).ToList(); var isInstaller = files.Any(x => x.ToLowerInvariant().EndsWith("screentogif.visualelementsmanifest.xml")); var hasSharpDx = files.Any(x => x.ToLowerInvariant().EndsWith("sharpdx.dll")); var hasGifski = files.Any(x => x.ToLowerInvariant().EndsWith("gifski.dll")); - var hasMenuShortcut = File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Microsoft", "Windows", "Start Menu", "Programs", "ScreenToGif.lnk")); - var hasDesktopShortcut = File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Desktop", "ScreenToGif.lnk")); + var hasDesktopShortcut = File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "ScreenToGif.lnk")) || + File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory), "ScreenToGif.lnk")); + var hasMenuShortcut = File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Microsoft", "Windows", "Start Menu", "Programs", "ScreenToGif.lnk")) || + File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Microsoft", "Windows", "Start Menu", "Programs", "ScreenToGif.lnk")); //MsiExec does not like relative paths. var isRelative = !string.IsNullOrWhiteSpace(Global.UpdateAvailable.InstallerPath) && !Path.IsPathRooted(Global.UpdateAvailable.InstallerPath); @@ -1068,14 +1075,14 @@ internal bool InstallUpdate(bool wasPromptedManually = false) //msiexec /i PATH INSTALLDIR="" INSTALLAUTOMATICALLY=yes INSTALLPORTABLE=No ADDLOCAL=Binary //msiexec /a PATH TARGETDIR="" INSTALLAUTOMATICALLY=yes INSTALLPORTABLE=yes ADDLOCAL=Binary - + var startInfo = new ProcessStartInfo { FileName = "msiexec", Arguments = $" {(isInstaller ? "/i" : "/a")} \"{nonRoot}\"" + $" {(isInstaller ? "INSTALLDIR" : "TARGETDIR")}=\"{AppDomain.CurrentDomain.BaseDirectory}\" INSTALLAUTOMATICALLY=yes INSTALLPORTABLE={(isInstaller ? "no" : "yes")}" + $" ADDLOCAL=Binary{(isInstaller ? ",Auxiliar" : "")}{(hasSharpDx ? ",SharpDX" : "")}{(hasGifski ? ",Gifski" : "")}" + - $" {(wasPromptedManually ? "RUNAFTER=yes" : "")}" + + $" {(wasPromptedManually && runAfterwards ? "RUNAFTER=yes" : "")}" + (isInstaller ? $" INSTALLDESKTOPSHORTCUT={(hasDesktopShortcut ? "yes" : "no")} INSTALLSHORTCUT={(hasMenuShortcut ? "yes" : "no")}" : ""), Verb = UserSettings.All.ForceUpdateAsAdmin ? "runas" : "" }; diff --git a/ScreenToGif/Model/FrameInfo.cs b/ScreenToGif/Model/FrameInfo.cs index e136a8f5..c070c902 100644 --- a/ScreenToGif/Model/FrameInfo.cs +++ b/ScreenToGif/Model/FrameInfo.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Drawing; using System.Runtime.Serialization; using System.Windows; @@ -45,11 +45,11 @@ public FrameInfo(string path, int delay, List keyList) : this( /// /// Initialises a FrameInfo instance. /// - /// True if the user clicked with the mouse. + /// Type of mouse button clicked with the mouse. /// The list of pressed keys. - public FrameInfo(bool clicked, List keyList) + public FrameInfo(MouseButtonType button, List keyList) { - WasClicked = clicked; + ButtonClicked = button; KeyList = keyList != null ? new List(keyList) : new List(); } @@ -58,12 +58,12 @@ public FrameInfo(bool clicked, List keyList) /// /// The Bitmap. /// The delay. - /// True if the user clicked with the mouse. + /// Type of mouse button the user clicked with the mouse. /// The list of pressed keys. /// The index of the frame. - public FrameInfo(string path, int delay, bool clicked, List keyList = null, int index = 0) : this(path, delay) + public FrameInfo(string path, int delay, MouseButtonType button, List keyList = null, int index = 0) : this(path, delay) { - WasClicked = clicked; + ButtonClicked = button; KeyList = keyList != null ? new List(keyList) : new List(); Index = index; } @@ -74,15 +74,15 @@ public FrameInfo(string path, int delay, bool clicked, List ke /// The Bitmap. /// The delay. /// Cursor X position. - /// Cursor Y positiob - /// True if the user clicked with the mouse. + /// Cursor Y position + /// Type of mouse button user clicked with the mouse. /// The list of pressed keys. /// The index of the frame. - public FrameInfo(string path, int delay, int cursorX, int cursorY, bool clicked, List keyList = null, int index = 0) : this(path, delay) + public FrameInfo(string path, int delay, int cursorX, int cursorY, MouseButtonType button, List keyList = null, int index = 0) : this(path, delay) { CursorX = cursorX; CursorY = cursorY; - WasClicked = clicked; + ButtonClicked = button; KeyList = keyList != null ? new List(keyList) : new List(); Index = index; } @@ -128,9 +128,15 @@ public FrameInfo(string path, int delay, int cursorX, int cursorY, bool clicked, public int CursorY { get; set; } = int.MinValue; /// - /// True if was clicked. + /// Type of the button that was clicked. /// - [DataMember(EmitDefaultValue = false, Name = "Clicked")] + [DataMember(EmitDefaultValue = false, Name = "ButtonClicked")] + public MouseButtonType ButtonClicked { get; set; } + + /// + /// If the button was clicked (legacy projects) + /// + [DataMember(Name = "Clicked")] public bool WasClicked { get; set; } /// @@ -190,6 +196,20 @@ public FrameInfo(string path, int delay, int cursorX, int cursorY, bool clicked, [IgnoreDataMember] public Image Image { get; set; } + + /// + /// This works as a migration method for mouse clicks. Before storing the button + /// type only bool was stored to mark the clicks. During opening old project it will + /// be converted to Left mouse button click loosing some info unfortunately. + /// + /// + [OnDeserialized] + void MigrateData(StreamingContext context) + { + if (ButtonClicked == MouseButtonType.None) + ButtonClicked = WasClicked ? MouseButtonType.Left : MouseButtonType.None; + } + #endregion } } \ No newline at end of file diff --git a/ScreenToGif/Model/MouseClicksModel.cs b/ScreenToGif/Model/MouseClicksModel.cs index 2e28ef08..5a6135bb 100644 --- a/ScreenToGif/Model/MouseClicksModel.cs +++ b/ScreenToGif/Model/MouseClicksModel.cs @@ -6,7 +6,9 @@ namespace ScreenToGif.Model { public class MouseClicksModel : DefaultTaskModel { - private Color _foregroundColor; + private Color _leftButtonForegroundColor; + private Color _rightButtonForegroundColor; + private Color _middleButtonForegroundColor; private double _width; private double _height; @@ -15,10 +17,22 @@ public MouseClicksModel() TaskType = TaskTypeEnum.MouseClicks; } - public Color ForegroundColor + public Color LeftButtonForegroundColor { - get => _foregroundColor; - set => SetProperty(ref _foregroundColor, value); + get => _leftButtonForegroundColor; + set => SetProperty(ref _leftButtonForegroundColor, value); + } + + public Color RightButtonForegroundColor + { + get => _rightButtonForegroundColor; + set => SetProperty(ref _rightButtonForegroundColor, value); + } + + public Color MiddleButtonForegroundColor + { + get => _middleButtonForegroundColor; + set => SetProperty(ref _middleButtonForegroundColor, value); } public double Width @@ -35,14 +49,19 @@ public double Height public override string ToString() { - return $"{LocalizationHelper.Get("S.Caption.Color")} #{ForegroundColor.A:X2}{ForegroundColor.R:X2}{ForegroundColor.G:X2}{ForegroundColor.B:X2}, {LocalizationHelper.Get("S.FreeDrawing.Width")} {Width}, {LocalizationHelper.Get("S.FreeDrawing.Height")} {Height}"; + return $"{LocalizationHelper.Get("S.MouseClicks.Color.Left")} #{LeftButtonForegroundColor.A:X2}{LeftButtonForegroundColor.R:X2}{LeftButtonForegroundColor.G:X2}{LeftButtonForegroundColor.B:X2}, "+ + $"{LocalizationHelper.Get("S.MouseClicks.Color.Middle")} #{MiddleButtonForegroundColor.A:X2}{MiddleButtonForegroundColor.R:X2}{MiddleButtonForegroundColor.G:X2}{MiddleButtonForegroundColor.B:X2}, "+ + $"{LocalizationHelper.Get("S.MouseClicks.Color.Right")} #{RightButtonForegroundColor.A:X2}{RightButtonForegroundColor.R:X2}{RightButtonForegroundColor.G:X2}{RightButtonForegroundColor.B:X2}, "+ + $"{LocalizationHelper.Get("S.FreeDrawing.Width")} {Width}, {LocalizationHelper.Get("S.FreeDrawing.Height")} {Height}"; } public static MouseClicksModel Default() { return new MouseClicksModel { - ForegroundColor = Color.FromArgb(120, 255, 255, 0), + LeftButtonForegroundColor = Color.FromArgb(120, 255, 255, 0), + RightButtonForegroundColor = Color.FromArgb(120, 255, 0, 0), + MiddleButtonForegroundColor = Color.FromArgb(120, 0, 255,255), Height = 12, Width = 12 }; @@ -52,7 +71,9 @@ public static MouseClicksModel FromSettings() { return new MouseClicksModel { - ForegroundColor = UserSettings.All.MouseClicksColor, + LeftButtonForegroundColor = UserSettings.All.LeftMouseButtonClicksColor, + MiddleButtonForegroundColor = UserSettings.All.MiddleMouseButtonClicksColor, + RightButtonForegroundColor = UserSettings.All.RightMouseButtonClicksColor, Height = UserSettings.All.MouseClicksHeight, Width = UserSettings.All.MouseClicksWidth }; diff --git a/ScreenToGif/Properties/AssemblyInfo.cs b/ScreenToGif/Properties/AssemblyInfo.cs index 876fc1fb..4201155a 100644 --- a/ScreenToGif/Properties/AssemblyInfo.cs +++ b/ScreenToGif/Properties/AssemblyInfo.cs @@ -50,5 +50,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.30.0.0")] -[assembly: AssemblyFileVersion("2.30.0.0")] +[assembly: AssemblyVersion("2.31.0.0")] +[assembly: AssemblyFileVersion("2.31.0.0")] diff --git a/ScreenToGif/Readme.md b/ScreenToGif/Readme.md index 7773f972..63a1a16e 100644 --- a/ScreenToGif/Readme.md +++ b/ScreenToGif/Readme.md @@ -4,17 +4,14 @@ This is the current project of ScreenToGif. _VS 2019 and .Net 4.8 or newer required._ -## What's new? (Version 2.30) +## What's new? (Version 2.31) -• Added presets for exporting Mp4 and Mov for Twitter. -• Improved performance in previewing animations (thanks to @mabakay). +• Added option for theme to follow the system's one (thanks to @pawlos). ### Fixed: -♦ #873 - The multi-frame selection was getting lost after removing all previous/next frames (thanks to @pawlos). -♦ #883 - Cancelling the media insertion by pressing the cancel button was causing a crash (thanks to @pawlos). -♦ #885 - The button to open the file after encoding was not appearing. -♦ #887 - The Caption was not being rendered correctly. +♦ The updater now waits for files being blocked by other processes before continuing. +♦ Imgur upload was not working properly unless sending in authenticated mode and selecting an album. ### Known Bugs: diff --git a/ScreenToGif/Resources/Localization/StringResources.de.xaml b/ScreenToGif/Resources/Localization/StringResources.de.xaml index d2e4af69..29eb2774 100644 --- a/ScreenToGif/Resources/Localization/StringResources.de.xaml +++ b/ScreenToGif/Resources/Localization/StringResources.de.xaml @@ -44,9 +44,9 @@ Die App wird bereits ausgeführt ScreenToGif wird bereits ausgeführt, aber anscheinend ist kein Fenster geöffnet. Bitte überprüfen Sie den Infobereich der Taskleiste, dort muss ein ScreenToGif-Symbol vorhanden sein. - Speichern der Einstellungen + Einstellungen speichern Möchten Sie versuchen, es erneut zu speichern? - Es sieht so aus, als ob ScreenToGif nicht genug Rechte hat, um die Einstellungen auf der Festplatte zu speichern. Möchten Sie es noch einmal versuchen, aber diesmal mit administrativen Rechten? + Scheinbar verfügt ScreenToGif nicht über genügend Rechte, um die Einstellungen auf der Festplatte zu speichern. Möchten Sie versuchen mit Administratorrechten erneut zu speichern? ScreenToGif wird beendet Möchten Sie das Programm wirklich beenden? @@ -55,9 +55,9 @@ Grafikkarte wechseln Umschalten auf die richtige Grafikkarte, um den ausgewählten Bildschirm zu erfassen - Aufgrund einer Einschränkung in DirectX muss ScreenToGif auf der gleichen Grafikkarte laufen wie der zu erfassende Bildschirm. - Wechseln Sie die für ScreenToGif eingestellte Grafikkarte, indem Sie Windows-Einstellungen > System > Anzeige > Grafikeinstellungen öffnen oder auf den folgenden Link klicken. - Schalten Sie die Grafikkarte für ScreenToGif um, indem Sie die Grafikeinstellungen Ihrer Grafikkarte öffnen. + Aufgrund einer Einschränkung in DirectX muss ScreenToGif die gleiche Grafikkarte verwenden wie der zu erfassende Bildschirm. + Wechseln Sie die für ScreenToGif eingestellte Grafikkarte, indem Sie Windows-Einstellungen ➜ „System” ➜ „Anzeige” ➜ „”Grafikeinstellungen” öffnen, oder indem Sie auf den nachfolgenden Link klicken. + Wechseln Sie die Grafikkarte für ScreenToGif, indem Sie die Grafikeinstellungen Ihrer Grafikkarte öffnen. Windows-Einstellungen öffnen @@ -66,26 +66,26 @@ Neue Bildschirmaufnahme Neue Webcam-Aufnahme - Neue Zeichenbrettaufnahme + Neue Handzeichnung Beenden Neue Bildschirmaufnahme Neue Webcam-Aufnahme - Neue Zeichenbrettaufnahme + Neue Handzeichnung Neue Animation Bildschirmaufnahme einfügen Webcam-Aufnahme einfügen - Zeichenbrettaufnahme einfügen + Handzeichnung einfügen Mediendateien einfügen (Bilder und Videos) Speichern unter … Dateien öffnen (Bilder, Videos und Projekte) Kürzlich erstellte Projekte öffnen Aktuelles Projekt verwerfen - Framedauer überschreiben - Framedauer erhöhen/verringern - Framedauer skalieren - Zoom auf 100 % setzen + Frame-Dauer überschreiben + Frame-Dauer erhöhen/verringern + Frame-Dauer skalieren + Zoom auf 100% setzen Fenstergröße an Framegröße anpassen Grafik an vorhandene Fenstergröße anpassen Ersten Frame auswählen @@ -93,7 +93,7 @@ Animation abspielen Nächsten Frame auswählen Letzten Frame auswählen - Rückgängig + Widerrufen Wiederherstellen Alle Änderungen im Projekt rückgängig machen Ausgewählte Frames kopieren und in Zwischenablage speichern @@ -101,7 +101,7 @@ Frames aus Zwischenablage hinzufügen Alle ausgewählten Frames löschen Alle vorherigen Frames löschen - Alle darauffolgenden Frames löschen + Alle nachfolgenden Frames löschen Duplikate entfernen Bildwiederholrate reduzieren Animation rückwärts abspielen @@ -138,16 +138,16 @@ Ausgewähltes Element bearbeiten Ausgewähltes Element speichern Ausgewähltes Element entfernen - Historie ansehen + Verlauf anzeigen - ScreenToGif - Start + ScreenToGif • Start Rekorder Startet die Bildschirmaufnahme, mit dem Sie Ihren Bildschirm aufnehmen können. Webcam Startet die Webcam-Aufnahme, um Videos Ihrer Webcam aufzeichnen zu können. - Zeichenbrett - Startet die Zeichenbrett-Aufzeichnung, um Ihre Zeichnungen aufnehmen zu können. + Handzeichnung + Startet die Aufzeichnung, um Ihre Handzeichnungen aufnehmen zu können. Editor Öffnet den Editor, mit dem Sie Ihre Aufnahmen bearbeiten können. Einstellungen @@ -155,8 +155,8 @@ Lädt die neueste Version von ScreenToGif herunter. - ScreenToGif - Aktualisierung - Eine neue Version ist verfügbar! + ScreenToGif • Aktualisierungen + Ein neue Version ist verfügbar Neue Version! Neue Version {0} kann heruntergeladen werden! Für weitere Details bitte hier klicken. Version @@ -175,12 +175,12 @@ Sie müssen warten, bis alle Codierungen abgeschlossen sind, bevor Sie die Aktualisierung durchführen. - ScreenToGif - Downloader + ScreenToGif • Downloader Downloader {0} von {1} - ScreenToGif - Einstellungen + ScreenToGif • Einstellungen Allgemein Rekorder Editor @@ -189,7 +189,7 @@ Sprache Temporäre Dateien Extras - Cloud + Cloud-Speicher Spenden Über Sonstiges @@ -199,7 +199,7 @@ Um die Bildschirmaufnahme mittels Desktop Duplication API durchzuführen, müssen Sie zuerst SharpDx-Bibliotheken herunterladen. - Programmstart + Starten der Anwendung Manuell starten Die App wird nur dann ausgeführt, wenn Sie diese manuell starten. Zusammen mit Windows starten @@ -213,9 +213,9 @@ (Programmsymbol bleibt sichtbar, solange diese Option aktiv ist) Starten mit: Auswahlfenster - Bildschirmaufnahme + Bildschirm aufnehmen Webcam-Aufnahme - Zeichenbrettaufnahme + Handzeichnung aufnehmen Editor (Bestimmt, wie das Programm startet. Wenn minimiert, wird das Programmsymbol im Infobereich sichtbar) Programmlayout @@ -267,13 +267,13 @@ Benutzerinteraktion Einzelbilder (Frames) werden jedes Mal erfasst, wenn Sie etwas anklicken oder eingeben. pro Sekunde - Die Einzelbilder (Frames) werden auf der Grundlage „pro Sekunde” erfasst, wobei der auf dem Rekorderbildschirm eingestellte Nennwert der Bildwiederholrate zugrunde gelegt wird. + Die Einzelbilder (Frames) werden auf der Grundlage „pro Sekunde” erfasst, wobei der Nennwert der auf dem Rekorderbildschirm eingestellten Einzelbildrate angegeben wird. pro Minute Die Einzelbilder (Frames) werden auf der Grundlage „pro Minute” (Zeitraffer) erfasst, wobei der auf dem Rekorderbildschirm eingestellte Nennwert der Bildwiederholrate zugrunde gelegt wird. pro Stunde Die Einzelbilder (Frames) werden auf der Grundlage „pro Stunde” (Zeitraffer) erfasst, wobei der auf dem Rekorderbildschirm eingestellte Nennwert der Bildwiederholrate zugrunde gelegt wird. - Wiedergabeverzögerung (in ms): - (Jedes aufgenommene Einzelbild [Frame] wird auf diese Verzögerung festgelegt) + Wiedergabeverzögerung: + ([ms] Jedes aufgenommene Einzelbild (Frame) wird auf diese Verzögerung festgelegt) Jedes Einzelbild (Frame) wird in einem Intervall von {0} aufgenommen. Aufnahmemodus @@ -300,7 +300,7 @@ (Konstante Verzögerung, die sich auch nicht mit der Aufzeichnungsverzögerung ändert) Nur aufzeichnen, wenn sich etwas ändert (Ein Einzelbild wird nur dann aufgenommen, wenn sich innerhalb des Aufnahmebereichs etwas verändert hat) - Erfassungsleistung bei einer Remote-Desktop-Verbindung verbessern + Verbessert die Erfassungsleistung bei einer Remote-Desktop-Verbindung. (Deaktiviert die mehrschichtige Fenstererfassung) Speicherbereinigung während der Aufnahme erzwingen (Reduziert die Speichernutzung während der Aufnahme, verringert aber die Leistung) @@ -329,7 +329,7 @@ Größe des zuletzt verwendeten Aufnahmebereichs speichern Position des zuletzt verwendeten Aufnahmebereichs speichern Countdown verwenden - (In Sekunden - Wartezeit bevor die Aufnahme gestartet wird) + (Wartezeit (in Sek.) bevor die Aufnahme gestartet wird) Mauszeigerverfolgung aktivieren (Der Aufnahmebereich wird aufgrund der Position des Mauszeigers neu ausgerichtet) (Sicherheitsabstand (in Pixel) bei Bewegungen des Aufnahmebereichs) @@ -362,10 +362,10 @@ Warnung vor dem Schließen des Editors ausgeben (falls Projekt nicht gespeichert) Dreifach-Klick zur Textauswahl aktivieren Textkontur nur nach außen vergrößern - Frame verwerfen, wenn nötig - (Frame überspringen, wenn die Vorschau ihn nicht rechtzeitig anzeigen kann) - Frame überspringen, wenn die Vorschau ihn nicht rechtzeitig anzeigen kann. - Verlauf der Widerrufen-/Wiederholenschritte begrenzen + Einzelbilder verwerfen (falls erforderlich) + (Frames überspringen, wenn der Vorschaumodus nicht in der Lage ist, sie rechtzeitig anzuzeigen) + Frame überspringen, wenn der Vorschaumodus nicht in der Lage ist, ihn rechtzeitig anzuzeigen. + Begrenzt den Verlauf der Widerrufen-/Wiederherstellungsschritte (Ältere Aktionen werden entfernt, wenn das Limit erreicht ist) (Maximale Anzahl der gespeicherten Aktionen) @@ -386,8 +386,8 @@ (Startet die Bildschirmaufnahme) Webcam-Aufnahme: (Startet die Webcam-Aufnahme) - Zeichenbrettaufnahme: - (Startet Zeichenbrettaufnahme, mit dem Sie Ihre Zeichnungen aufnehmen können) + Handzeichnung aufnehmen: + (Startet die Aufzeichnung, mit dem Sie Ihre Handzeichnungen aufnehmen können) Editor: (Öffnet ein neues Editorfenster) Einstellungen: @@ -396,7 +396,7 @@ (Schließt alle Fenster und entfernt das Programmsymbol aus dem Infobereich der Taskleiste) Rekorder Start/Pause: - (Startet oder pausiert Aufnahme. Es wird auch dazu verwendet, Momentaufnahmen zu machen, wenn der Schnappschussmodus aktiviert wurde) + (Startet oder pausiert Aufnahme. Es wird auch dazu verwendet, Momentaufnahmen zu erstellen, sobald der Schnappschussmodus aktiviert wurde) Stopp: (Stoppt die Aufnahme und öffnet den Editor) Verwerfen: @@ -452,8 +452,8 @@ Konfigurationsdatei löschen Ordner öffnen, in dem Einstellungen gespeichert sind. Halten Sie die Strg-Taste während des Klicks gedrückt, falls möglich. • Reihenfolge für das Laden der Programmeinstellungen: Standard ➜ AppData ➜ Lokal • Gibt es keine Konfigurationsdatei im lokalen Programmordner, so wird im Ordner „AppData” gesucht. • Standard wird verwendet, falls keine Dateien mit Programmeinstellungen vorhanden sind. • Gibt es keine lokalen Einstellungen, so werden alle Einstellungen im Ordner „AppData” gespeichert. - Beim Schließen der App alle Dateien aus dem Cache löschen - Vor dem Löschen aller Dateien aus dem Cache nachfragen + Alle Dateien aus dem Zwischenspeicher löschen, sobald die Anwendung geschlossen wird. + Nachfragen, bevor alle Dateien aus dem Zwischenspeicher gelöscht werden Alte Projekte automatisch entfernen Beim Öffnen des Editors werden alle Projekte gelöscht, die älter sind als der festgelegte Zeitraum. (in Tagen. Jedes Projekt älter als diese Angabe wird beim Öffnen des Editors gelöscht) @@ -497,38 +497,38 @@ Beschreibung: Modus: Anonym - Authentifiziert + Bestätigt Autorisierung Token abrufen OAuth-Token hier einfügen Benutzername: Passwort: - Autorisieren + Bestätigen Benutzername und Passwort werden nicht gespeichert. Optionen Direkte Links verwenden Album Sie müssen dieser Voreinstellung einen eindeutigen Namen geben. - Der Name wird bereits von einer anderen Upload-Voreinstellung verwendet. - Im authentifizierten Modus müssen Sie den Authentifizierungsvorgang abschließen. + Dieser Name wird bereits von einer anderen Upload-Voreinstellung verwendet. + Im Authentifizierungsmodus müssen Sie den Authentifizierungsvorgang abschließen. Sie müssen Ihren Benutzernamen und Ihr Passwort angeben, um diese App zu autorisieren. - Es war nicht möglich, das Autorisierungstoken zu erhalten. + Das Abrufen des Autorisierungs-Tokens ist fehlgeschlagen. Um diese App zu autorisieren, müssen Sie das Autorisierungstoken bereitstellen. - Autorisierung fehlgeschlagen. Prüfen Sie, ob alles richtig ist und versuchen Sie es in ein paar Sekunden erneut. - Laden der Albumliste fehlgeschlagen. + Autorisierung fehlgeschlagen. Prüfen Sie alle Einstellungen und versuchen Sie es in ein paar Sekunden erneut. + Laden der Albenliste fehlgeschlagen. Autorisierung abgeschlossen. Nicht autorisiert - Zugriffsberechtigung abgelaufen in {0}. + Zugriffsberechtigung endet in {0}. Zugriffsberechtigung gültig bis {0}. - Links mit der GIFV-Erweiterung anstelle von GIF holen + Links mit der GIFV-Erweiterung anstelle von GIF abrufen GIF-Dateien in ausgewähltes Album hochladen Album: Vor dem Hochladen fragen - Albumliste neu laden. + Albenliste neu laden. Standardeinstellungen - Mich bitten, die Details des Uploads auszufüllen + Nachfragen, die Details des Uploads auszufüllen. URL-Typ: @@ -536,25 +536,25 @@ Sie können ein Album auswählen: - Upload-Details (optional) - Upload-Details + Details hochladen (optional) + Details hochladen Titel: Beschreibung: - Tags: - Tags durch ein Semikolon trennen ( ; ) + Schlagwörter: + Schlagwörter durch Semikolon ( ; ) trennen Nur bei Zugriff über direkte Verbindung anzeigen - Upload-Verlauf + Verlauf der hochgeladenen Daten Datum Voreinstellung Erfolgreich? - Verlaufseintrag löschen. + Element des Verlaufs löschen. Link: - Geringere Qualität: + Geringe Qualität: Link löschen: - Sind Sie sicher, dass Sie den Verlaufseintrag löschen wollen? - Diese Aktion kann nicht rückgängig gemacht werden. Möchten Sie den ausgewählten Verlaufseintrag löschen? + Möchten Sie den Eintrag im Verlauf wirklich löschen? + Diese Aktion kann nicht widerrufen werden. Möchten Sie den ausgewählten Eintrag im Verlauf wirklich löschen? Externe Anwendungen @@ -577,12 +577,12 @@ FFmpeg-Lizenz Gifski-Lizenz SharpDx-Lizenz - Fehlende Schreibberechtigung im Ordner - Es ist nicht möglich, den Download in dem Ordner zu speichern, da keine Schreibrechte vorhanden sind. Möchten Sie den Downloader mit Administratorrechten starten, um den Download zu beenden? + Ordner ist schreibgeschützt + Es ist nicht möglich, die heruntergeladenen Daten im Ordner zu speichern, da die entsprechenden Schreibrechte fehlen. Möchten Sie das Herunterladen mit Administratorrechten starten, um den Download zu beenden? Spenden - In US $ spenden + In US-$ spenden In € spenden Öffnet PayPal-Webseite. Gewählte Währung: US-Dollar Öffnet PayPal-Webseite. Gewählte Währung: Euro @@ -672,7 +672,7 @@ Gesamtzahl der Einzelbilder: Manuell aufgenommen: Die Aufnahme wurde angehalten. - Ihr Computer unterstützt keinen genauen Aufnahmemodus. Das bedeutet, dass die Zielbildrate möglicherweise nie erreicht wird. + Ihr Computer unterstützt keinen genauen Aufnahmemodus, was bedeutet, dass die Zielbildrate möglicherweise nie erreicht werden kann. Bildschirmaufnahme fehlgeschlagen Bildschirmaufnahme fehlgeschlagen. Aufnahmemethode lieferte nach fünf Versuchen keine Frames. @@ -692,7 +692,7 @@ Grafikkarte: {0} Auflösung: {0} x {1} Native Auflösung: {0} x {1} - dpi: {0} ({1:0.##}%) + DPI: {0} ({1:0.##}%) Ziehen, um das Auswahlfenster zu verschieben. Übernehmen Wiederholen @@ -711,15 +711,15 @@ Diese Aktion verwirft die Aufnahme und entfernt alle Einzelbilder (Frames). Dieser Vorgang kann nicht widerrufen werden. - ScreenToGif - Webcam-Rekorder + ScreenToGif • Webcam-Aufzeichnung Kein Videogerät gefunden Videogeräte suchen Skalierung: {0:0.##} x Videogröße ändern - ScreenToGif - Zeichenbrett-Rekorder - Aufnahme + ScreenToGif • Handzeichnungs-Aufnahme + Automatisch aufzeichnen Ermöglicht Aufnahme während des Zeichnens Strg [Halten] @@ -749,29 +749,31 @@ Voreinstellung - Codieren + Umwandeln Name Beschreibung Sonstiges - Automatisch speichern, wenn eine Option geändert wird - Alle Änderungen an diesen Voreinstellungen (Codierungs- und Exporteinstellungen) müssen manuell durch Drücken der Schaltfläche „Speichern” gespeichert werden. - Alle Änderungen an diesen Voreinstellungen (Codierungs- und Exporteinstellungen) werden automatisch gespeichert. + Automatisch speichern, sobald eine Option geändert wurde. + Alle Änderungen an diesen Voreinstellungen (Umwandlungs- und Exporteinstellungen) müssen manuell durch Drücken der Schaltfläche „Speichern” gespeichert werden. + Alle Änderungen an diesen Voreinstellungen (Umwandlungs- und Exporteinstellungen) werden automatisch gespeichert. Einige der Eigenschaften der Standardvoreinstellung sind schreibgeschützt. - Vergeben Sie einige Parameter für diese Voreinstellung. + Bitte Namen für diese Voreinstellung eingeben. Eine Voreinstellung mit diesem Namen existiert bereits. Automatisch speichern - Änderungen an dieser Voreinstellung werden automatisch gespeichert. + Änderungen dieser Voreinstellung werden automatisch gespeichert. Standard ({0}) - Standard für den Codierer + Standard für die Umwandlung + Für Twitter ({0}) + Respektiert die Twitter-Upload-Grenzen (außer Größe und Auflösung). HEVC ({0}) - High Efficiency Video Coding + Hocheffiziente Video-Kompression. VP8 ({0}) - Älterer und besser bekannter Codec + Älterer und weit verbreiteter Codec. Animation Video - Bild + Grafik Projekt Hohe Qualität @@ -780,31 +782,31 @@ Unterstützt das Speichern der Animation mit einem transparenten Hintergrund. Hohe Qualität • Grafiken Besser für Aufnahmen mit weniger Farben. - FFmpeg - Höhere Qualität - Höhere Bildqualität, aber mit größerer Dateigröße. - FFmpeg - Lower quality + FFmpeg • Höhere Qualität + Höhere Bildqualität, aber auch größerer Dateigröße. + FFmpeg • Geringere Qualität Geringere Bildqualität, aber mit kleinerer Dateigröße. - Gifski - Höhere Qualität - Höhere Bildqualität, aber mit größerer Dateigröße. - Gifski - Geringere Qualität + Gifski • Höhere Qualität + Höhere Bildqualität, aber auch größerer Dateigröße. + Gifski • Geringere Qualität Geringere Bildqualität, aber mit kleinerer Dateigröße. - Gifski - Geringere Qualität und schnellere Codierung - Noch niedrigere Bildqualität, mit einer schnelleren Codierung, aber mit einer kleineren Dateigröße. - System - Geringe Qualität - Geringe Qualität, aber schnellere Codierung. + Gifski • Geringere Qualität und schnellere Erstellung + Noch geringere Bildqualität, mit einer schnelleren Umwandlung, aber mit einer kleineren Dateigröße. + System • Geringe Qualität + Geringe Qualität, aber schnellere Umwandlung. - FFmpeg - Hohe Qualität - Hohe Bildqualität und kleine Dateigröße, aber langsamere Codierung. - FFmpeg - Geringere Qualität - Geringere Bildqualität, kleine Dateigröße und schnellere Codierung. + FFmpeg • Hohe Qualität + Hohe Bildqualität und kleine Dateigröße, aber langsamere Umwandlung. + FFmpeg • Geringere Qualität + Geringere Bildqualität, kleine Dateigröße und schnellere Umwandlung. Hohe Qualität - Hohe Bildqualität und kleine Dateigröße. + Hohe Bildqualität und geringe Dateigröße. Frames hinzufügen - Beide Seiten sollten die gleiche Größe haben. In diesem Fenster können Sie das Bild und den Arbeitsbereich neu positionieren und in der Größe verändern. Klicken Sie zum Auswählen und Ändern der Größe. + Beide Seiten müssen gleiche Höhe/Breite haben. Dieses Fenster erlaubt es Ihnen, den Arbeitsbereich und die Grafik neu zu positionieren und dessen Größe ändern. Klicken Sie zum Auswählen und Ändern der Größe. Arbeitsbereichgröße: - Bild in den Arbeitsbereich einpassen + Grafik in den Arbeitsbereich einpassen Ändert die Größe des Arbeitsbereichs so, dass beide Bilder hineinpassen (von der linken oberen Ecke aus). Unterschiedliche Framegrößen. Passen Sie Framegrößen an, bevor Sie Bildsequenzen hinzufügen. Neue Frames @@ -836,12 +838,12 @@ Dauer: Beim Import der Video-Datei ist ein Fehler aufgetreten. Vorschau fehlgeschlagen. Versuchen Sie andere Multimedia-Anwendung oder schauen Sie nach, ob die Datei nicht beschädigt ist. Falls Sie MediaPlayer verwenden, schauen Sie nach, ob er aktiviert wurde und benötigte Codecs installiert sind. - Zeitüberschreitung bei Erstellen von Framevorschau. + Zeitüberschreitung bei Erstellen von Frame-Vorschau. Keine Frames ausgewählt. Codieren - Wird codiert … + Wird umgewandelt … Wird gestartet Beendet @@ -884,7 +886,7 @@ Link kopieren - ScreenToGif - Befehlsausgabe + ScreenToGif • Befehlsausgabe Befehlsausgabe @@ -892,7 +894,7 @@ Alle Benachrichtigungen verwerfen - ScreenToGif - Editor + ScreenToGif • Editor Datei Start Wiedergabe @@ -909,14 +911,14 @@ Frames werden vorbereitet - Öffnen fehlgeschlagen - Mehrere Dateien können nicht gleichzeitig geöffnet werden. Wählen Sie nur eine Datei aus. + Öffnen fehlgeschlagen - Mehrere Dateien können nicht gleichzeitig importiert werden. Wählen Sie nur eine Datei aus. Öffnen fehlgeschlagen - Mehrere Projektdateien können nicht gleichzeitig geöffnet werden. Wählen Sie nur eine Projektdatei aus. Mediendatei (Bild/Video) öffnen Mediendatei (Bild/Video) oder Projektdatei öffnen Alle unterstützten Dateien - Bild + Grafik Video Animierte PNG-Datei @@ -929,9 +931,9 @@ MP4-Video WebM-Video - BMP-Bild - JPEG-Bild - PNG-Bild (alle ausgewählten Grafiken) + BMP-Grafik + JPEG-Grafik + PNG-Grafik (alle ausgewählten Grafiken) Zip-Datei (alle ausgewählten Grafiken) ScreenToGif-Projekt @@ -939,7 +941,7 @@ PSD-Datei (Photoshop) - Gehen Sie zu Datei > Neu, um neue Aufnahme zu starten + Öffnen Sie das Menü „Datei” ➜ „Neu”, um neue Aufnahme zu starten Fügen Sie Grafiken, Videos oder Projekte durch Ziehen und Ablegen hinzu Vielen Dank, dass Sie mein Programm verwenden! Je kleiner die Bildwiederholrate, die Anzahl der Farben und die Anzahl der Änderungen zwischen den Frames, desto kleiner die Dateigröße @@ -948,16 +950,16 @@ Möchten Sie den neuen Rekorder ausprobieren? Gehen Sie zu „Einstellungen” ➜ „Rekorder”, um ihn zu aktivieren. - Bildschirm Aufnahme + Bildschirm aufzeichnen Webcam Aufnahme - Zeichenbrett Aufnahme + Handzeichnung aufnehmen Neue Animation Neu Bildschirm Aufnahme Webcam Aufnahme - Zeichenbrett Aufnahme + Handzeichnung aufnehmen Mediendatei Hinzufügen @@ -1005,7 +1007,7 @@ Option Endlosschleife - Wird nur während der Wiedergabe verwendet. Falls Sie die Einstellungen für Wiederholungen für GIF- und APNG-Export ändern möchten, beachten Sie bitte die Option "Speichern unter" bei einigen Codierern. + Wird nur während der Wiedergabe verwendet. Falls Sie die Einstellungen für Wiederholungen für GIF- und APNG-Export ändern möchten, beachten Sie bitte die Option „Speichern unter” bei einigen Umwandlungen. Frames @@ -1023,7 +1025,7 @@ Nach rechts verschieben - Framedauer + Frame-Dauer Überschreiben Erhöhen oder verringern Prozentual skalieren @@ -1063,9 +1065,9 @@ Frame-Anzahl: Gesamtdauer: Abmessungen: - Durchschnittliche Framedauer: + Durchschnittliche Frame-Dauer: Aktuelle Zeit: - Wird anhand des gerade angezeigten Frames berechnet. + Wird anhand des aktuell angezeigten Frames berechnet. Frame-dpi und Skalierung: Aktueller Frame @@ -1138,7 +1140,7 @@ Überlagerung wird angewendet Titelbild wird hinzugefügt Drehen wird angewendet - Framedauer wird geändert + Frame-Dauer wird geändert Übergang wird angewendet Speichern wird vorbereitet Laden abbrechen und Projekt verwerfen. @@ -1157,14 +1159,14 @@ Ausgewählte Frames entfernen Neue Bildschirmaufnahme Neue Webcam-Aufnahme - Neue Zeichenbrettaufnahme + Neue Handzeichnung Neue Animation Neu von Mediendatei oder Projekt Neue Bildschirmaufnahme erstellt. Neue Webcam-Aufnahme erstellt. - Neue Zeichenbrettaufnahme erstellt. + Neue Handzeichnung erstellt. Neue Animation erstellt. Rückgängig-Aktion ausgeführt. Zurücksetzen-Aktion ausgeführt. @@ -1227,9 +1229,9 @@ Aktuelle Vorgaben - dpi + DPI Neue Vorgabe - dpi: + DPI: Seitenverhältnis beibehalten Einstellungen Qualität skalieren: @@ -1304,13 +1306,13 @@ Strg-, Alt-, Umschalt- und Windows-Taste ignorieren Zusätzliche Tastenkombinationen außer Strg+C werden ignoriert. Von der Software simulierte Tastenanschläge ignorieren - Zeichnen Sie nur Tastatureingaben des Benutzers auf. + Nur Tastatureingaben des Benutzers aufzeichnen. Dauer der Anzeige der Tastatureingaben verlängern Anzeige der Tastatureingaben früher beginnen Um (ms): Keine Tastatureingaben in Ihrer Aufnahme - ScreenToGif - Tastatureingaben-Editor - Framenummer + ScreenToGif • Tastatureingaben-Editor + Frame-Nummer Tastatureingabe erkannt Tastatureingabe entfernen Tastatureingabe hinzufügen: @@ -1415,7 +1417,7 @@ Ausrichtung: - Framedauer + Frame-Dauer Modus: Überschreiben (ms) Erhöhen oder verringern (ms) @@ -1443,13 +1445,13 @@ Dateityp Das Format der Ausgabedatei. - Die Exportvoreinstellung, die alle aktuell angezeigten Einstellungen enthält. Verwalten Sie Ihre Exportvoreinstellungen über die Schaltflächen unten. - Animiertes Bild + Die Exportvoreinstellung, die alle aktuell angezeigten Einstellungen enthält. Verwalten Sie Ihre Exportvoreinstellungen über die nachfolgenden Schaltflächen. + Animierte Grafik Video Frames - Sonstiges + Weitere - APNG + aPNG Animated Portable Network Graphics GIF Graphics Interchange Format @@ -1482,42 +1484,42 @@ Voreinstellungen: Standard - Eine neue Exportvoreinstellung hinzufügen. - Die aktuellen Einstellungen in dieser Exportvoreinstellung speichern. - Die grundlegenden Einstellungen der Exportvoreinstellung bearbeiten. - Die aktuell ausgewählte Exportvoreinstellung entfernen. - Die Einstellungen dieser Exportvoreinstellung auf die Standardwerte zurücksetzen. + Neue Exportvoreinstellung hinzufügen. + Aktuellen Einstellungen in dieser Exportvoreinstellung speichern. + Allgemeinen Einstellungen der Exportvoreinstellung bearbeiten. + Aktuell ausgewählte Exportvoreinstellung entfernen. + Einstellungen dieser Exportvoreinstellung auf die Standardwerte zurücksetzen. Voreinstellung löschen - Sind Sie sicher, dass Sie die Voreinstellung löschen wollen? - Diese Aktion kann nicht rückgängig gemacht werden. Möchten Sie die ausgewählte Voreinstellung löschen? + Möchten Sie die Voreinstellung wirklich löschen? + Diese Aktion kann nicht widerrufen werden. Möchten Sie die ausgewählte Voreinstellung wirklich löschen? Voreinstellung zurücksetzen - Sind Sie sicher, dass Sie die Voreinstellung zurücksetzen wollen? - Diese Aktion kann nicht rückgängig gemacht werden. Möchten Sie die ausgewählte Voreinstellung auf die Standardeinstellungen zurücksetzen? + Möchten Sie die Voreinstellung wirklich zurücksetzen? + Diese Aktion kann nicht widerrufen werden. Möchten Sie die ausgewählte Voreinstellung wirklich auf die Standardeinstellungen zurücksetzen? - Codieren - Codierer und Quantisierer - Codierer, der für die Erzeugung der Ausgabedatei verantwortlich ist. + Umwandeln + Umwandeln und Quantisierung + Umwandlung, die für die Erzeugung der Ausgabedatei verantwortlich ist. ScreenToGif - Integrierte Codierung. + Integrierte Umwandlung. System - Vom System zur Verfügung gestellter Codierer. + Vom System zur Verfügung gestellte Umwandlung. FFmpeg - Externer Codierer, hergestellt von FFmpeg.org. + Externe Umwandlung, bereitgestellt von FFmpeg.org. Gifski - Externer Codierer, hergestellt von Gif.ski. - Codierer-Optionen + Externe Umwandlung, bereitgestellt von Gif.ski. + Umwandlungs-Optionen Erweiterten Modus aktivieren. - Geben Sie die Parameter zur Steuerung des Codierers manuell ein. + Parameter zur Steuerung der Umwandlung manuell eingeben Parameter: - Liste der Parameter, die an FFmpeg übergeben werden. Spezielle Parameter: {I} ist der Eingabepfad (die Frames). {O} ist der Ausgabepfad (die exportierte Datei). {W} ist die Breite des Frames. {H} ist die Höhe des Frames. - Um mit 2-Pass zu codieren, fügen Sie einfach '-pass 2' hinzu. + Liste der Parameter, die an FFmpeg übergeben werden. Spezielle Parameter: {I} entspricht dem Eingabepfad (der Frames). {O}entspricht dem Ausgabepfad (die exportierte Datei). {W} entspricht der Breite des Rahmens. {H} entspricht der Höhe des Rahmens. + Um mit 2-Durchgängen umzuwandeln, fügen Sie einfach „-pass 2” hinzu. Vorschau - Vorschau der Parameterliste, die an FFmpeg übergeben wird. + Vorschau der Parameterliste, die an FFmpeg übergeben werden. Codec-Dokumente Format-Dokumente Filter-Dokumente @@ -1542,10 +1544,10 @@ Maximale Anzahl von Farben (für jeden Frame) Allgemeine Farbtabelle verwenden Kann die Qualität und/oder Größe der GIF-Animation verringern. - Am besten - Am schnellsten - Ein noch schnelleres Codierungsverfahren verwenden. - Kann die Qualität des GIFs verringern. + Beste + Schnellste + Ein noch schnelleres Umwandlungsverfahren verwenden. + Kann die Qualität der GIF-Dateien verringern. Wiederholung: Wiederholtes GIF Endlosschleife @@ -1556,32 +1558,32 @@ Wenn eine Farbe ausgewählt wird, wird sie in transparent umgewandelt und wird in der erstellten GIF-Datei als transparent dargestellt. Wenn keine Farbe ausgewählt ist, werden alle transparenten Farben (Alpha = 0 %) normal transparent angezeigt. Unveränderte Pixel erkennen Durch die Analyse und Erkennung unveränderter Pixel zwischen den Einzelbildern wird es möglich sein, nur die notwendigen Teile in der GIF-Datei zu speichern. - Diese Pixel durch einen Chroma-Key ersetzen + Ersetzt diese Pixel durch einen Chroma-Key. Wiederholte/unveränderte Pixel werden durch diesen Chroma-Key ersetzt, wodurch es möglich ist, weniger Farben pro Einzelbild zu verwenden. Chroma-Key: Schwankung: - Bayer-Scala: + Bayer Scale: - APNG-Einstellungen - Prognose: + aPNG-Einstellungen + Vorausberechnung: Keine Sub Oben Durchschnitt Gemischt - Wiederholtes APNG + aPNG-Schleife. Unveränderte Pixel erkennen - Unveränderte Pixel transparent kennzeichnen + Unveränderte Pixel transparenten darstellen. Voreinstellung: Keine Standard - Bild + Grafik Foto Zeichnung - Icon + Symbol Text Verlustfreien Modus verwenden @@ -1589,9 +1591,9 @@ Modus: Normal Erweitert - Methode zum Konfigurieren der Codierungsparameter: Normal: Standard-UI-Steuerelemente verwenden. Erweitert: Textfeld verwenden, um die Parameter einzugeben. + Methode zum Konfigurieren der Umwandlungsparameter: Normal: Standard-UI-Steuerelemente verwenden. Erweitert: Textfeld verwenden, um die Parameter einzugeben. Codec: - Der Video-Codierer, der für die Umwandlung der rohen Pixel in die Ausgabedatei verantwortlich ist. + Die Video-Umwandlung, die für die Umwandlung der unbearbeiteten Pixel in die Ausgabedatei verantwortlich ist. Voreinstellung: Keine Sehr langsam @@ -1602,7 +1604,7 @@ Schneller Sehr schnell Superschnell - Ultraschnell + Am schnellsten Qualität Ausgewogen Geschwindigkeit @@ -1612,28 +1614,28 @@ Hohe Leistung Hohe Qualität Bluray Disk - Niedrige Latenzzeit - Niedrige Latenzzeit (hohe Leistung) - Niedrige Latenzzeit (hohe Qualität) - Codierungsgeschwindigkeit zu Kompressionsverhältnis, langsamere Voreinstellungen können eine bessere Kompression ergeben (Qualität pro Dateigröße). + Geringe Latenzzeit + Geringe Latenzzeit (Hohe Leistung) + Geringe Latenzzeit (Hohe Qualität) + Umwandlungsgeschwindigkeit zu Kompressionsverhältnis, langsamere Voreinstellungen können eine bessere Kompression ergeben (Qualität pro Dateigröße). Hardwarebeschleunigung: Aus - An - Automatische Auswahl - Steuert die Verwendung von dedizierter Hardware (Videografik). Aus: Verwendet keine dedizierte Hardware. Ein: Verwendet dedizierte Hardware und ermöglicht die Auswahl spezieller Codierungen. Auto: Verwendet dedizierte Hardware und wählt automatisch den richtigen Codierer, wenn möglich. + Ein + Automatisch auswählen + Steuert die Verwendung von dedizierter Hardware (Videografik). Aus: Verwendet keine dedizierte Hardware. Ein: Verwendet dedizierte Hardware und ermöglicht die Auswahl spezieller Umwandlungsmethoden. Auto: Verwendet dedizierte Hardware und wählt automatisch die richtige Umwandlungsmethode, wenn möglich. Pixelformat: Automatisch Vsync: - Video-Sync-Methode. Auto: Wählt zwischen 1 und 2 je nach Muxer-(Format-)Fähigkeiten. Passthrough: Jedes Bild wird mit seinen Zeitstempeln an die Codierung weitergegeben. Konstant: Frames werden dupliziert und verworfen, um genau die gewünschte konstante Framerate zu erreichen. Variabel: Frames werden mit ihrem Zeitstempel durchgereicht oder verworfen, um zu verhindern, dass 2 Frames den gleichen Zeitstempel haben. Verwerfen: Wie Passthrough, aber alle Zeitstempel werden zerstört, sodass der Codierer neue Zeitstempel basierend auf der Framerate generiert. - Passthrough - Konstante Framerate - Variable Framerate + Video-Sync-Methode. Auto: Wählt zwischen 1 und 2 je nach Muxer-(Format-)Fähigkeiten. Durchleiten: Jeder Grafik wird mit seinen Zeitstempeln an die Umwandlung weitergegeben. Konstant: Frames werden dupliziert und verworfen, um genau die gewünschte konstante Framerate zu erreichen. Variabel: Frames werden mit ihrem Zeitstempel durchgeleitet oder verworfen, um zu verhindern, dass 2 Frames den gleichen Zeitstempel erhalten. Verwerfen: Wie „Durchleiten”, aber alle Zeitstempel werden entfernt, so dass bei der Umwandlung neue Zeitstempel, basierend auf der Framerate, erstellt werden. + Durchleiten + Konstante Bildwiederholrate + Variable Bildwiederholrate Verwerfen - Framerate: + Bildwiederholrate: Film Benutzerdefiniert - Pass: - Konstanter Ratenfaktor. Einstellung der Qualitäts- und Ratenkontrolle. Leer lassen, wenn Sie diese Eigenschaft nicht einstellen möchten. + Übergeben: + Konstanter Ratenfaktor. Einstellung der Qualitäts- und Ratenkontrolle. Leer lassen, wenn Sie diese Eigenschaft nicht verwenden möchten. Qualitätsstufe: Kleinere Werte bedeuten bessere Qualität. Bitrate: @@ -1642,27 +1644,27 @@ Konstant Variabel Minimale Bitrate: - Minimale Bitratentoleranz. Am nützlichsten bei Verwendung des CBR-Modus. Lassen Sie es leer oder setzen Sie es auf Null, wenn Sie diese Eigenschaft nicht einstellen möchten. + Minimale Bitratentoleranz. Am nützlichsten bei Verwendung des CBR-Modus. Leer lassen oder auf Null setzen , wenn Sie diese Eigenschaft nicht verwenden möchten. Maximale Bitrate: - Maximale Bitratentoleranz. Erfordert auch die Einstellung der Puffergröße. Lassen Sie es leer oder setzen Sie es auf Null, wenn Sie diese Eigenschaft nicht einstellen möchten. + Maximale Bitratentoleranz. Erfordert außerdem die Einstellung der Puffergröße. Leer lassen oder auf Null setzen wenn Sie diese Eigenschaft nicht verwenden möchten. Puffergröße: - Ratensteuerungs-Puffergröße. Lassen Sie es leer oder setzen Sie es auf Null, wenn Sie diese Eigenschaft nicht einstellen möchten. + Ratensteuerungs-Puffergröße Leer lassen oder auf Null setzen wenn Sie diese Eigenschaft nicht verwenden möchten. - Grafiken komprimieren - Exportiert die Bilder in einen komprimierten Ordner. + Grafiken als Zip-Datei speichern + Exportiert die Aufnahmen in einen komprimierten Ordner. - Grafiken komprimieren - Bildmaterial mit Hilfe des RLE-Algorithmus komprimieren. - Zeitachsendaten speichern - Exportiert zusätzlich Zeitachsen der Frames. + Grafik komprimieren. + Komprimiert die Grafikdaten mit dem RLE-Algorithmus. + Daten der Zeitleiste speichern + Exportiert zusätzlich Zeitdaten der Frames. - Speichern-Einstellungen + Exporteinstellungen Teilweise exportieren Datei in ausgewählten Ordner speichern - Überschreiben (falls sie bereits existiert) + Überschreiben (falls bereits vorhanden) Auch als Projekt speichern (gleicher Ordner, gleicher Dateiname) Datei hochladen (experimentelle Option) In Zwischenablage kopieren @@ -1678,24 +1680,24 @@ Befehle eingeben, die nach dem Codieren ausgeführt werden sollen. Falls mehrere Befehle ausgeführt werden sollen, bitte einen Befehl pro Zeile eingeben. Makros: {p} = Dateiausgabepfad {f} = Ordnerausgabepfad {u} = URL der hochgeladenen Datei - Teilweiser Export + Teilweise exportieren Modus: - Die Methode für den Teilexport auswählen. + Methode für den Teilexport auswählen. Ausdruck Exportiert Teile der Animation basierend auf einem einfachen Ausdruck. - Framebereich - Exportiert nur einen Teil der Animation innerhalb des Framebereichs. - Zeitrahmen - Exportiert nur einen Teil der Animation innerhalb des Zeitrahmens. + Frame-Bereich + Exportiert nur einen Teil der Animation innerhalb des Frame-Bereichs. + Zeitbereich + Exportiert nur einen Teil der Animation innerhalb des Zeitbereichs. Auswahl - Exportiert nur die in der Zeitleiste ausgewählten Bilder. - Kein Frame ausgewählt. - 1 Frame ausgewählt. - {0} Frames ausgewählt. + Exportiert nur die in der Zeitleiste ausgewählten Einzelbilder. + Keine Einzelbilder ausgewählt + 1 Einzelbild ausgewählt + {0} Einzelbilder ausgewählt Von: Bis: Ausdruck: - Geben Sie durch ein Komma getrennte Framenummern oder durch ein Minuszeichen getrennte Framesequenzen ein: 1, 3, 4, 6 - 9 + Geben Sie durch ein Komma getrennte Einzelbildnummern oder durch ein Minuszeichen getrennte Einzelbildfolgen ein: 1, 3, 4, 6 - 9 Speicherort und Dateiname @@ -1703,7 +1705,7 @@ Ausgabeordner auswählen Ordner auswählen Dateiformat - Dateiname. Datum-/Zeitangabe zwischen '?' einfügen + Dateiname. Datum-/Zeitangabe zwischen „?” einfügen Animation Dateinummer erhöhen Dateinummer verringern @@ -1712,14 +1714,14 @@ Bitte Speicherort auswählen (Ordner, Zwischenablage oder Hochladen). - Sie haben die Dateierweiterung nicht ausgewählt. + Dateierweiterung muss ausgewählt werden Wenn Sie den erweiterten Modus auswählen, müssen Sie die Parameter in das Parameterfeld eingeben. Die speziellen Parameter {I} (Eingang) und/oder {O} (Ausgang) fehlen im Parameterfeld. Um einen Befehl auszuführen, bitte diesen in das Eingabefeld eintragen. - Sie müssen mindestens einen Frame auswählen, wenn Sie die Möglichkeit haben, nur ausgewählte Frames zu exportieren. + Es muss mindestens ein Einzelbild ausgewählt werden, wenn Sie die Option „nur ausgewählte Bilder exportieren” nutzen möchten. Der Ausdruck zum teilweisen Exportieren des Projekts ist ungültig. - Kein Upload-Service ausgewählt. Bitte ein Upload-Ziel bestimmen. - Sie können den gewählten Dienst nicht verwenden, weil er nicht autorisiert wurde. Gehen Sie zu „Einstellungen” ➜ „Cloud”, um dieses Programm zu autorisieren. + Kein Upload-Dienst ausgewählt. Bitte ein Upload-Ziel bestimmen. + Sie können den gewählten Dienst nicht verwenden, weil er nicht autorisiert wurde. Gehen Sie zu „Einstellungen” ➜ „Cloud-Dienste”, um dieses Programm zu autorisieren. Option "Link kopieren" kann nicht ausgeführt werden, weil „Datei hochladen” nicht gewählt wurde. Ausgabeordner wählen. Ausgabeordner existiert nicht. @@ -1727,26 +1729,26 @@ Dateinamen eingeben. Name der Ausgabedatei beinhaltet mindestens ein ungültiges Zeichen. Bitte wählen Sie einen gültigen Dateinamen aus. Dateiname ist bereits vorhanden. Aktivieren Sie das Kontrollkästchen "Datei immer überschreiben" oder benennen Sie die Datei um. - Es gibt bereits ein Projekt mit demselben Dateinamen. Stellen Sie das Überschreiben ein oder wählen Sie einen anderen Dateinamen oder Ordner. + Es besteht bereits ein Projekt mit demselben Dateinamen. Wählen Sie „Überschreiben” oder legen Sie einen anderen Dateinamen oder Ordner fest. Vorgang wurde abgebrochen. - Upload - Wählen Sie die Upload-Voreinstellung aus, die Details über den für das Hochladen verwendeten Dienst enthält. + Hochladen + Wählen Sie die Voreinstellung für das Hochladen aus, die Deteils über den für das Hochladen verwendeten Dienst enthält. Dieser Upload-Dienst unterliegt Einschränkungen. Neue Upload-Voreinstellung hinzufügen. - Upload-Voreinstellungen bearbeiten. - Upload-Verlauf für diese Voreinstellung anzeigen. + Voreinstellung für das Hochladen bearbeiten. + Verlauf der hochgeladenen Daten mit dieser Voreinstellung anzeigen. Aktuell ausgewählte Upload-Voreinstellung entfernen. - Eine Upload-Voreinstellung auswählen - Eine aus dieser Liste auswählen. - Keine Upload-Voreinstellung für dieses Format verfügbar - Fügen Sie eine Voreinstellung hinzu, indem Sie die Schaltfläche unten verwenden. + Upload-Voreinstellung wählen + Aus dieser Liste auswählen + Keine Voreinstellung für das Hochladen für dieses Format verfügbar + Voreinstellung durch Drücken der nachfolgenden Schaltfläche unten hinzufügen. - Löschen der Upload-Voreinstellung - Sind Sie sicher, dass Sie die Upload-Voreinstellung löschen wollen? - Diese Aktion kann nicht rückgängig gemacht werden. Möchten Sie die ausgewählte Upload-Voreinstellung löschen? + Voreinstellung für das Hochladen werden gelöscht + Möchten Sie die Voreinstellung für das Hochladen wirklich löschen? + Diese Aktion kann nicht widerrufen werden. Möchten Sie die ausgewählte Upload-Voreinstellung wirklich löschen? Frames exportieren @@ -1754,8 +1756,8 @@ Diese Aktion wird {0} Frames direkt in den gewählten Ordner exportieren. - Kommando-Vorschau - Kommando + Befehlsvorschau + Befehl Eingabepfad Ausgabepfad @@ -1778,8 +1780,8 @@ Anhänge (optional, maximal 20 MB) Datei(en) anhängen Anhänge entfernen - Ich verstehe Englisch - und Portugiesisch (brasilianisch und europäisch). + Bitte schreiben Sie mir in Englisch + oder Portugiesisch (Brasilianisch und Europäisch). Folgende Informationen (und Anhänge) werden verschickt. @@ -1833,12 +1835,12 @@ Links Rechts Zentrieren - Justieren + Blocksatz Keine Unterstreichen Durchstreichen - Überstreichen + Überstrichen Grundlinie diff --git a/ScreenToGif/Resources/Localization/StringResources.en.xaml b/ScreenToGif/Resources/Localization/StringResources.en.xaml index 63feaf16..61435881 100644 --- a/ScreenToGif/Resources/Localization/StringResources.en.xaml +++ b/ScreenToGif/Resources/Localization/StringResources.en.xaml @@ -225,6 +225,7 @@ Medium Dark Very Dark + Follow system Custom Example colors. System tray icon @@ -1348,6 +1349,9 @@ Mouse Clicks + Left button color: + Middle button color: + Right button color: There's no detected mouse clicks on your project. diff --git a/ScreenToGif/Resources/Localization/StringResources.nl.xaml b/ScreenToGif/Resources/Localization/StringResources.nl.xaml index 20e67826..17551b8f 100644 --- a/ScreenToGif/Resources/Localization/StringResources.nl.xaml +++ b/ScreenToGif/Resources/Localization/StringResources.nl.xaml @@ -765,6 +765,8 @@ Wijzigingen in deze voorinstelling worden automatisch opgeslagen. Standaard ({0}) Standaardinstelling voor de encoder. + Voor Twitter ({0}) + Respecteert de uploadlimieten van Twitter (behalve grootte en resolutie). HEVC ({0}) High Efficiency Video Coding. VP8 ({0}) diff --git a/ScreenToGif/Resources/Localization/StringResources.pl.xaml b/ScreenToGif/Resources/Localization/StringResources.pl.xaml index 7ddefc42..18cc2382 100644 --- a/ScreenToGif/Resources/Localization/StringResources.pl.xaml +++ b/ScreenToGif/Resources/Localization/StringResources.pl.xaml @@ -199,6 +199,7 @@ Średni Ciemny Bardzo ciemny + Jak systemowy Niestandardowy... @@ -1151,6 +1152,9 @@ Kliknięcia myszy + Kolor dla lewego przycisku: + Kolor dla środkowego przycisku: + Kolor dla prawego przycisku: Nie wykryto kliknięć myszy w Twoim projekcie. diff --git a/ScreenToGif/Resources/Localization/StringResources.pt.xaml b/ScreenToGif/Resources/Localization/StringResources.pt.xaml index 49c12e20..478abdd8 100644 --- a/ScreenToGif/Resources/Localization/StringResources.pt.xaml +++ b/ScreenToGif/Resources/Localization/StringResources.pt.xaml @@ -225,6 +225,7 @@ Médio Escuro Muito escuro + Mesmo do sistema Personalizado Cores de exemplo. Ícone da bandeja do sistema @@ -1348,6 +1349,9 @@ Cliques do Mouse + Cor do botão esquerdo: + Cor do botão do meio: + Cor do botão direito: Não há cliques de mouse detectados no seu projeto. diff --git a/ScreenToGif/Resources/Localization/StringResources.ru.xaml b/ScreenToGif/Resources/Localization/StringResources.ru.xaml index 90689875..51ad632d 100644 --- a/ScreenToGif/Resources/Localization/StringResources.ru.xaml +++ b/ScreenToGif/Resources/Localization/StringResources.ru.xaml @@ -765,6 +765,8 @@ Изменения в этом пресете сохраняются автоматически. По умолчанию ({0}) Пресет по умолчанию для кодеровщика. + Для Twitter ({0}) + Соблюдает ограничения Twitter (кроме размера и разрешения). HEVC ({0}) High Efficiency Video Coding. VP8 ({0}) diff --git a/ScreenToGif/Resources/Settings.xaml b/ScreenToGif/Resources/Settings.xaml index 92816264..bdf6529f 100644 --- a/ScreenToGif/Resources/Settings.xaml +++ b/ScreenToGif/Resources/Settings.xaml @@ -141,7 +141,7 @@ - + @@ -337,7 +337,9 @@ Horizontal - #78FFFF00 + #78FFFF00 + #7800FFFF + #78FF0000 12 12 diff --git a/ScreenToGif/ScreenToGif.csproj b/ScreenToGif/ScreenToGif.csproj index 810fabc6..22e25430 100644 --- a/ScreenToGif/ScreenToGif.csproj +++ b/ScreenToGif/ScreenToGif.csproj @@ -409,6 +409,7 @@ + @@ -548,6 +549,7 @@ + diff --git a/ScreenToGif/Settings/Migrations.cs b/ScreenToGif/Settings/Migrations.cs index 282fc272..69386f35 100644 --- a/ScreenToGif/Settings/Migrations.cs +++ b/ScreenToGif/Settings/Migrations.cs @@ -17,6 +17,13 @@ internal static bool Migrate(List properties, string version) case "2.28.1": case "2.28.2": Migration2_28_0To2_29_0.Up(properties); + goto case "2.29"; + + case "2.29": //To 2.31 + case "2.29.1": + case "2.30": + case "2.30.1": + Migration2_29_0To2_31_0.Up(properties); goto default; default: diff --git a/ScreenToGif/Settings/Migrations/Migration2_29_0To2_31_0.cs b/ScreenToGif/Settings/Migrations/Migration2_29_0To2_31_0.cs new file mode 100644 index 00000000..a9cbca88 --- /dev/null +++ b/ScreenToGif/Settings/Migrations/Migration2_29_0To2_31_0.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; +using System.Linq; + +namespace ScreenToGif.Settings.Migrations +{ + internal class Migration2_29_0To2_31_0 + { + internal static bool Up(List properties) + { + //Rename properties. + var mouseClickColor = properties.FirstOrDefault(f => f.Key == "MouseClicksColor"); + + if (mouseClickColor != null) + mouseClickColor.Key = "LeftMouseButtonClicksColor"; + + var tasks = properties.FirstOrDefault(f => f.Key == "AutomatedTasksList"); + + if (tasks != null) + { + foreach (var child in tasks.Children) + { + if (child.Type == "MouseClicksModel") + { + foreach (var attribute in child.Attributes) + { + if (attribute.Key == "ForegroundColor") + { + attribute.Key = "LeftButtonForegroundColor"; + break; + } + } + } + } + } + + return true; + } + } +} \ No newline at end of file diff --git a/ScreenToGif/Settings/UserSettings.cs b/ScreenToGif/Settings/UserSettings.cs index 906bb2d0..ab3ecafa 100644 --- a/ScreenToGif/Settings/UserSettings.cs +++ b/ScreenToGif/Settings/UserSettings.cs @@ -203,6 +203,8 @@ private static object ParseProperty(Property property) return Convert.ToBoolean(property.Value); case "Int32": return Convert.ToInt32(property.Value, CultureInfo.InvariantCulture); + case "Int64": + return Convert.ToInt64(property.Value, CultureInfo.InvariantCulture); case "Double": return Convert.ToDouble(property.Value, CultureInfo.InvariantCulture); case "Decimal": @@ -377,6 +379,14 @@ private static object DeserializeProperty(Property property) continue; } + if (info.PropertyType == typeof(TimeSpan?)) + { + if (TimeSpan.TryParse(att.Value, out var timeValue)) + info.SetValue(instance, timeValue, null); + + continue; + } + if (att.Type.StartsWith("Nullable")) { LogWriter.Log("Property not identified.", att, property); @@ -431,7 +441,15 @@ private static object DeserializeProperty(Property property) continue; } + + if (info.PropertyType == typeof(TimeSpan?)) + { + if (TimeSpan.TryParse(child.Value, out var timeValue)) + info.SetValue(instance, timeValue, null); + continue; + } + if (child.Type.StartsWith("Nullable")) { LogWriter.Log("Property not identified in children.", child, property); @@ -2470,7 +2488,19 @@ public Orientation ProgressOrientation #region Editor • Mouse Clicks - public Color MouseClicksColor + public Color LeftMouseButtonClicksColor + { + get => (Color)GetValue(); + set => SetValue(value); + } + + public Color RightMouseButtonClicksColor + { + get => (Color)GetValue(); + set => SetValue(value); + } + + public Color MiddleMouseButtonClicksColor { get => (Color)GetValue(); set => SetValue(value); diff --git a/ScreenToGif/UserControls/ExportPanel.xaml.cs b/ScreenToGif/UserControls/ExportPanel.xaml.cs index 4556ef26..45842cd3 100644 --- a/ScreenToGif/UserControls/ExportPanel.xaml.cs +++ b/ScreenToGif/UserControls/ExportPanel.xaml.cs @@ -663,11 +663,6 @@ private bool IsExpressionValid(string expression) return true; } - public void InitialFocus() - { - FilenameTextBox.Focus(); - } - public async Task IsValid() { #region Validate preset specific properties @@ -804,6 +799,8 @@ public ExportPreset GetPreset() private void Panel_Loaded(object sender, RoutedEventArgs e) { + PresetComboBox.Focus(); + //If a default file type was not selected, it picks 'Gif' as default. if (!(TypeComboBox.SelectedValue is Export type)) TypeComboBox.SelectedValue = type = Export.Gif; @@ -830,6 +827,8 @@ private void PresetComboBox_SelectionChanged(object sender, SelectionChangedEven if (!(PresetComboBox.SelectedItem is ExportPreset selected)) return; + var firstLoad = CurrentPreset == null; + //Hide all other grids. foreach (var grid in EncoderGrid.Children.OfType()) grid.Visibility = Visibility.Collapsed; @@ -882,7 +881,7 @@ private void PresetComboBox_SelectionChanged(object sender, SelectionChangedEven break; } - return; + break; } case Export.Gif: { @@ -905,7 +904,7 @@ private void PresetComboBox_SelectionChanged(object sender, SelectionChangedEven break; } - return; + break; } case Export.Webp: FfmpegWebpOptionsGrid.Visibility = Visibility.Visible; @@ -936,6 +935,17 @@ private void PresetComboBox_SelectionChanged(object sender, SelectionChangedEven EmbeddedPsdOptionsGrid.Visibility = Visibility.Visible; break; } + + if (firstLoad) + { + Dispatcher.InvokeAsync(() => + { + if (CurrentPreset.PickLocation) + FilenameTextBox.Focus(); + else if (CurrentPreset.UploadFile) + UploadPresetComboBox.Focus(); + }, DispatcherPriority.Loaded); + } } private void AddPreset_Click(object sender, RoutedEventArgs e) diff --git a/ScreenToGif/UserControls/MouseClicksPanel.xaml b/ScreenToGif/UserControls/MouseClicksPanel.xaml index 2d28de48..bd702bb9 100644 --- a/ScreenToGif/UserControls/MouseClicksPanel.xaml +++ b/ScreenToGif/UserControls/MouseClicksPanel.xaml @@ -1,4 +1,4 @@ - + + @@ -25,15 +27,21 @@ - - + + + + + + + + - - + - - + diff --git a/ScreenToGif/Util/ActionStack.cs b/ScreenToGif/Util/ActionStack.cs index 65c22536..a575dc34 100644 --- a/ScreenToGif/Util/ActionStack.cs +++ b/ScreenToGif/Util/ActionStack.cs @@ -71,7 +71,7 @@ public static void SaveState(EditAction action, List frames, List frames, List frames, List frames, List frames, List Undo(List current, bool pushToRedo = tr //Copy to a folder. File.Copy(frame.Path, savedFrame); - savedFrames.Add(new FrameInfo(savedFrame, frame.Delay, frame.CursorX, frame.CursorY, frame.WasClicked, frame.KeyList, frame.Index)); + savedFrames.Add(new FrameInfo(savedFrame, frame.Delay, frame.CursorX, frame.CursorY, frame.ButtonClicked, frame.KeyList, frame.Index)); } redoStateChange.Frames = savedFrames; @@ -310,7 +310,7 @@ public static List Undo(List current, bool pushToRedo = tr //Copy to a folder. File.Copy(frame.Path, savedFrame); - savedFrames2.Add(new FrameInfo(savedFrame, frame.Delay, frame.CursorX, frame.CursorY, frame.WasClicked, frame.KeyList, frame.Index)); + savedFrames2.Add(new FrameInfo(savedFrame, frame.Delay, frame.CursorX, frame.CursorY, frame.ButtonClicked, frame.KeyList, frame.Index)); } redoStateChange.Frames = savedFrames2; @@ -373,14 +373,14 @@ public static List Undo(List current, bool pushToRedo = tr //Copy to a folder. File.Copy(frame.Path, savedFrame); - savedFrames3.Add(new FrameInfo(savedFrame, frame.Delay, frame.CursorX, frame.CursorY, frame.WasClicked, frame.KeyList, frame.Index)); + savedFrames3.Add(new FrameInfo(savedFrame, frame.Delay, frame.CursorX, frame.CursorY, frame.ButtonClicked, frame.KeyList, frame.Index)); } //Saves the altered frames, without saving the images. foreach (var position in latestUndo.Indexes2) { var frame = current[position]; - savedFrames3.Add(new FrameInfo(frame.Path, frame.Delay, frame.CursorX, frame.CursorY, frame.WasClicked, frame.KeyList, frame.Index)); + savedFrames3.Add(new FrameInfo(frame.Path, frame.Delay, frame.CursorX, frame.CursorY, frame.ButtonClicked, frame.KeyList, frame.Index)); } redoStateChange.Frames = savedFrames3; @@ -418,7 +418,7 @@ public static List Undo(List current, bool pushToRedo = tr File.Copy(frame.Path, file); //Add to list. - current.Insert(index, new FrameInfo(file, frame.Delay, frame.CursorX, frame.CursorY, frame.WasClicked, frame.KeyList, frame.Index)); + current.Insert(index, new FrameInfo(file, frame.Delay, frame.CursorX, frame.CursorY, frame.ButtonClicked, frame.KeyList, frame.Index)); currentIndex++; } @@ -442,7 +442,7 @@ public static List Undo(List current, bool pushToRedo = tr //Get the current frame before or after returning the properties values? var currentFrame = current[latestUndo.Indexes[alteredIndex2]]; - current[latestUndo.Indexes[alteredIndex2]] = new FrameInfo(currentFrame.Path, frame.Delay, frame.CursorX, frame.CursorY, frame.WasClicked, frame.KeyList, frame.Index); //Image location stays the same. + current[latestUndo.Indexes[alteredIndex2]] = new FrameInfo(currentFrame.Path, frame.Delay, frame.CursorX, frame.CursorY, frame.ButtonClicked, frame.KeyList, frame.Index); //Image location stays the same. //Copy file to folder. File.Copy(frame.Path, currentFrame.Path, true); @@ -466,7 +466,7 @@ public static List Undo(List current, bool pushToRedo = tr var alteredIndex = 0; foreach (var frame in latestUndo.Frames) { - current[latestUndo.Indexes[alteredIndex]] = new FrameInfo(frame.Path, frame.Delay, frame.CursorX, frame.CursorY, frame.WasClicked, frame.KeyList, frame.Index); + current[latestUndo.Indexes[alteredIndex]] = new FrameInfo(frame.Path, frame.Delay, frame.CursorX, frame.CursorY, frame.ButtonClicked, frame.KeyList, frame.Index); alteredIndex++; } @@ -536,7 +536,7 @@ public static List Undo(List current, bool pushToRedo = tr File.Copy(frame.Path, file); //Add to list. - current.Insert(index, new FrameInfo(file, frame.Delay, frame.CursorX, frame.CursorY, frame.WasClicked, frame.KeyList, frame.Index)); + current.Insert(index, new FrameInfo(file, frame.Delay, frame.CursorX, frame.CursorY, frame.ButtonClicked, frame.KeyList, frame.Index)); currentIndex2++; } @@ -551,7 +551,7 @@ public static List Undo(List current, bool pushToRedo = tr var alteredIndex3 = 0; foreach (var frame in latestUndo.Frames.Skip(latestUndo.Indexes.Count)) { - current[latestUndo.Indexes2[alteredIndex3]] = new FrameInfo(frame.Path, frame.Delay, frame.CursorX, frame.CursorY, frame.WasClicked, frame.KeyList, frame.Index); + current[latestUndo.Indexes2[alteredIndex3]] = new FrameInfo(frame.Path, frame.Delay, frame.CursorX, frame.CursorY, frame.ButtonClicked, frame.KeyList, frame.Index); alteredIndex3++; } @@ -610,7 +610,7 @@ public static List Redo(List current) //Copy to a folder. File.Copy(frame.Path, savedFrame); - savedFrames.Add(new FrameInfo(savedFrame, frame.Delay, frame.CursorX, frame.CursorY, frame.WasClicked, frame.KeyList, frame.Index)); + savedFrames.Add(new FrameInfo(savedFrame, frame.Delay, frame.CursorX, frame.CursorY, frame.ButtonClicked, frame.KeyList, frame.Index)); } undoStateChange.Frames = savedFrames; @@ -637,7 +637,7 @@ public static List Redo(List current) //Copy to a folder. File.Copy(frame.Path, savedFrame); - savedFrames2.Add(new FrameInfo(savedFrame, frame.Delay, frame.CursorX, frame.CursorY, frame.WasClicked, frame.KeyList, frame.Index)); + savedFrames2.Add(new FrameInfo(savedFrame, frame.Delay, frame.CursorX, frame.CursorY, frame.ButtonClicked, frame.KeyList, frame.Index)); } undoStateChange.Frames = savedFrames2; @@ -702,14 +702,14 @@ public static List Redo(List current) //Copy to a folder. File.Copy(frame.Path, savedFrame); - savedFrames3.Add(new FrameInfo(savedFrame, frame.Delay, frame.CursorX, frame.CursorY, frame.WasClicked, frame.KeyList, frame.Index)); + savedFrames3.Add(new FrameInfo(savedFrame, frame.Delay, frame.CursorX, frame.CursorY, frame.ButtonClicked, frame.KeyList, frame.Index)); } //Saves the altered frames, without saving the images. foreach (var position in latestRedo.Indexes2) { var frame = current[position]; - savedFrames3.Add(new FrameInfo(frame.Path, frame.Delay, frame.CursorX, frame.CursorY, frame.WasClicked, frame.KeyList, frame.Index)); + savedFrames3.Add(new FrameInfo(frame.Path, frame.Delay, frame.CursorX, frame.CursorY, frame.ButtonClicked, frame.KeyList, frame.Index)); } undoStateChange.Frames = savedFrames3; @@ -746,7 +746,7 @@ public static List Redo(List current) File.Copy(frame.Path, file); //Add to list. - current.Insert(index, new FrameInfo(file, frame.Delay, frame.CursorX, frame.CursorY, frame.WasClicked, frame.KeyList, frame.Index)); + current.Insert(index, new FrameInfo(file, frame.Delay, frame.CursorX, frame.CursorY, frame.ButtonClicked, frame.KeyList, frame.Index)); currentIndex++; } @@ -790,7 +790,7 @@ public static List Redo(List current) var alteredIndex = 0; foreach (var frame in latestRedo.Frames) { - current[latestRedo.Indexes[alteredIndex]] = new FrameInfo(frame.Path, frame.Delay, frame.CursorX, frame.CursorY, frame.WasClicked, frame.KeyList, frame.Index); + current[latestRedo.Indexes[alteredIndex]] = new FrameInfo(frame.Path, frame.Delay, frame.CursorX, frame.CursorY, frame.ButtonClicked, frame.KeyList, frame.Index); alteredIndex++; } @@ -861,7 +861,7 @@ public static List Redo(List current) File.Copy(frame.Path, file); //Add to list. - current.Insert(index, new FrameInfo(file, frame.Delay, frame.CursorX, frame.CursorY, frame.WasClicked, frame.KeyList, frame.Index)); + current.Insert(index, new FrameInfo(file, frame.Delay, frame.CursorX, frame.CursorY, frame.ButtonClicked, frame.KeyList, frame.Index)); currentIndex2++; } @@ -876,7 +876,7 @@ public static List Redo(List current) var alteredIndex3 = 0; foreach (var frame in latestRedo.Frames.Skip(latestRedo.Indexes.Count)) { - current[latestRedo.Indexes2[alteredIndex3]] = new FrameInfo(frame.Path, frame.Delay, frame.CursorX, frame.CursorY, frame.WasClicked, frame.KeyList, frame.Index); + current[latestRedo.Indexes2[alteredIndex3]] = new FrameInfo(frame.Path, frame.Delay, frame.CursorX, frame.CursorY, frame.ButtonClicked, frame.KeyList, frame.Index); alteredIndex3++; } diff --git a/ScreenToGif/Util/ClipBoard.cs b/ScreenToGif/Util/ClipBoard.cs index cbf0009c..fd3b3180 100644 --- a/ScreenToGif/Util/ClipBoard.cs +++ b/ScreenToGif/Util/ClipBoard.cs @@ -41,7 +41,7 @@ public static bool Copy(List target) File.Copy(frameInfo.Path, filename, true); //Create the new object and add to the list. - newList.Add(new FrameInfo(filename, frameInfo.Delay, frameInfo.CursorX, frameInfo.CursorY, frameInfo.WasClicked, frameInfo.KeyList, frameInfo.Index)); + newList.Add(new FrameInfo(filename, frameInfo.Delay, frameInfo.CursorX, frameInfo.CursorY, frameInfo.ButtonClicked, frameInfo.KeyList, frameInfo.Index)); } //Adds the current copied list to the clipboard. @@ -78,7 +78,7 @@ public static bool Cut(List target) File.Delete(frameInfo.Path); //Create the new object and add to the list. - newList.Add(new FrameInfo(filename, frameInfo.Delay, frameInfo.CursorX, frameInfo.CursorY, frameInfo.WasClicked, frameInfo.KeyList, frameInfo.Index)); + newList.Add(new FrameInfo(filename, frameInfo.Delay, frameInfo.CursorX, frameInfo.CursorY, frameInfo.ButtonClicked, frameInfo.KeyList, frameInfo.Index)); } //Adds the current cut list to the clipboard. @@ -112,7 +112,7 @@ public static List Paste(string location, int index, int pasteIndex) File.Copy(frameInfo.Path, filename, true); //Create the new object and add to the list. - newList.Add(new FrameInfo(filename, frameInfo.Delay, frameInfo.CursorX, frameInfo.CursorY, frameInfo.WasClicked, frameInfo.KeyList, frameInfo.Index)); + newList.Add(new FrameInfo(filename, frameInfo.Delay, frameInfo.CursorX, frameInfo.CursorY, frameInfo.ButtonClicked, frameInfo.KeyList, frameInfo.Index)); } return newList; diff --git a/ScreenToGif/Util/Enums.cs b/ScreenToGif/Util/Enums.cs index 151b2d17..6af74f15 100644 --- a/ScreenToGif/Util/Enums.cs +++ b/ScreenToGif/Util/Enums.cs @@ -13,6 +13,7 @@ public enum AppTheme Medium, Dark, VeryDark, + FollowSystem } /// diff --git a/ScreenToGif/Util/MouseButtonType.cs b/ScreenToGif/Util/MouseButtonType.cs new file mode 100644 index 00000000..864ef7e2 --- /dev/null +++ b/ScreenToGif/Util/MouseButtonType.cs @@ -0,0 +1,10 @@ +namespace ScreenToGif.Util +{ + public enum MouseButtonType + { + None, + Left, + Middle, + Right + } +} diff --git a/ScreenToGif/Util/Other.cs b/ScreenToGif/Util/Other.cs index 857aefdf..7baa9665 100644 --- a/ScreenToGif/Util/Other.cs +++ b/ScreenToGif/Util/Other.cs @@ -364,7 +364,7 @@ public static void CopyPropertiesTo(this T source, TU dest) public static List CopyList(this List target) { - return new List(target.Select(s => new FrameInfo(s.Path, s.Delay, s.CursorX, s.CursorY, s.WasClicked, + return new List(target.Select(s => new FrameInfo(s.Path, s.Delay, s.CursorX, s.CursorY, s.ButtonClicked, s.KeyList != null ? new List(s.KeyList.Select(y => new SimpleKeyGesture(y.Key, y.Modifiers, y.IsUppercase, y.IsInjected))) : null, s.Index))); } @@ -414,7 +414,7 @@ public static List Yoyo(List list) File.Copy(frame.Path, newPath); - list.Add(new FrameInfo(newPath, frame.Delay, frame.CursorX, frame.CursorY, frame.WasClicked, frame.KeyList, frame.Index)); + list.Add(new FrameInfo(newPath, frame.Delay, frame.CursorX, frame.CursorY, frame.ButtonClicked, frame.KeyList, frame.Index)); } return list; diff --git a/ScreenToGif/Util/ThemeHelper.cs b/ScreenToGif/Util/ThemeHelper.cs index 67a0150f..fe872bdb 100644 --- a/ScreenToGif/Util/ThemeHelper.cs +++ b/ScreenToGif/Util/ThemeHelper.cs @@ -1,5 +1,7 @@ +using System; using System.Linq; using System.Windows; +using Microsoft.Win32; using ScreenToGif.Settings; namespace ScreenToGif.Util @@ -11,6 +13,9 @@ internal static class ThemeHelper { public static void SelectTheme(AppTheme theme = AppTheme.Light) { + if (theme == AppTheme.FollowSystem) + theme = IsSystemUsingDarkTheme() ? AppTheme.Dark : AppTheme.Light; + //Checks if the theme is already the current in use. var last = Application.Current.Resources.MergedDictionaries.LastOrDefault(l => l.Source != null && l.Source.ToString().Contains("Colors/")); @@ -38,6 +43,25 @@ public static void SelectTheme(AppTheme theme = AppTheme.Light) RefreshNotificationIcon(); } + private static bool IsSystemUsingDarkTheme() + { + try + { + using (var sub = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32) + .OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize")) + { + if (sub?.GetValue("AppsUseLightTheme") is int key) + return key == 0; + } + } + catch (Exception e) + { + LogWriter.Log(e, "Not possible to get system's theme setting."); + } + + return false; + } + private static void RefreshNotificationIcon() { if (App.NotifyIcon == null) diff --git a/ScreenToGif/Util/WebHelper.cs b/ScreenToGif/Util/WebHelper.cs index 1c36365b..a5faaea9 100644 --- a/ScreenToGif/Util/WebHelper.cs +++ b/ScreenToGif/Util/WebHelper.cs @@ -142,7 +142,9 @@ internal static async Task SendFile2(string url, Stream data, string fil private static Stream GetMultipartStream(string border, Dictionary args, string filename, Stream data, string streamName = "file") { var stream = new MemoryStream(); - stream.WriteStringUtf8("Content-Type: text/plain; charset=utf-8"); + + if (args.Any(w => !string.IsNullOrEmpty(w.Key) && !string.IsNullOrEmpty(w.Value))) + stream.WriteStringUtf8("Content-Type: text/plain; charset=utf-8"); foreach (var content in args.Where(w => !string.IsNullOrEmpty(w.Key) && !string.IsNullOrEmpty(w.Value))) stream.WriteStringUtf8($"--{border}\r\nContent-Disposition: form-data; name=\"{content.Key}\"\r\n\r\n{content.Value}\r\n"); diff --git a/ScreenToGif/Windows/Editor.xaml b/ScreenToGif/Windows/Editor.xaml index 5f0c498a..27eb4b46 100644 --- a/ScreenToGif/Windows/Editor.xaml +++ b/ScreenToGif/Windows/Editor.xaml @@ -2970,6 +2970,8 @@ + + @@ -3004,19 +3006,26 @@ --> - - + + - - + + + + + + + - - + -