From f7f82f11b71912642964b8bcc1129eecb0113fb5 Mon Sep 17 00:00:00 2001 From: Nicke Manarin Date: Mon, 4 Dec 2023 12:36:59 -0300 Subject: [PATCH 1/9] Full frame windows. --- .../Enums/Native/CornerPreferences.cs | 29 ++ .../Enums/Native/DwmWindowAttributes.cs | 17 ++ .../Enums/Native/HitTestTargets.cs | 134 +++++++++ .../Enums/Native/MenuFunctions.cs | 11 + ScreenToGif.Model/Enums/Native/SysCommands.cs | 26 ++ .../Enums/Native/WindowStyles.cs | 8 +- .../Enums/Native/WindowsMessages.cs | 219 ++++++++++++++ ScreenToGif.Native/External/DwmApi.cs | 4 + ScreenToGif.Native/External/User32.cs | 14 +- ScreenToGif.Native/Helpers/Monitor.cs | 22 +- ScreenToGif.Native/Helpers/WindowHelper.cs | 141 +++++++++ ScreenToGif.Native/Helpers/Windows.cs | 4 +- ScreenToGif.Native/Structs/MinMaxInfo.cs | 40 +++ ScreenToGif.Native/Structs/MonitorInfoEx.cs | 12 +- ScreenToGif.Util/VisualHelper.cs | 29 ++ ScreenToGif/Controls/ExWindow.cs | 274 ++++++++++++++++++ ScreenToGif/Themes/Generic.xaml | 189 ++++++++++++ ScreenToGif/Windows/Editor.xaml | 37 +-- ScreenToGif/Windows/Editor.xaml.cs | 2 +- ScreenToGif/Windows/Options.xaml | 35 +-- ScreenToGif/Windows/Options.xaml.cs | 2 +- ScreenToGif/Windows/Other/Startup.xaml | 7 +- 22 files changed, 1192 insertions(+), 64 deletions(-) create mode 100644 ScreenToGif.Model/Enums/Native/CornerPreferences.cs create mode 100644 ScreenToGif.Model/Enums/Native/HitTestTargets.cs create mode 100644 ScreenToGif.Model/Enums/Native/MenuFunctions.cs create mode 100644 ScreenToGif.Model/Enums/Native/SysCommands.cs create mode 100644 ScreenToGif.Model/Enums/Native/WindowsMessages.cs create mode 100644 ScreenToGif.Native/Helpers/WindowHelper.cs create mode 100644 ScreenToGif.Native/Structs/MinMaxInfo.cs create mode 100644 ScreenToGif/Controls/ExWindow.cs diff --git a/ScreenToGif.Model/Enums/Native/CornerPreferences.cs b/ScreenToGif.Model/Enums/Native/CornerPreferences.cs new file mode 100644 index 00000000..8b382696 --- /dev/null +++ b/ScreenToGif.Model/Enums/Native/CornerPreferences.cs @@ -0,0 +1,29 @@ +namespace ScreenToGif.Domain.Enums.Native; + +/// +/// Flags used by the DwmSetWindowAttribute function to specify the rounded corner preference for a window. +/// https://docs.microsoft.com/en-us/windows/win32/api/dwmapi/ne-dwmapi-dwm_window_corner_preference +/// Windows Build 22000 +/// +public enum CornerPreferences +{ + /// + /// Let the system decide when to round window corners. + /// + Default = 0, + + /// + /// Never round window corners. + /// + DoNotRound = 1, + + /// + /// Round the corners, if appropriate. + /// + Round = 2, + + /// + /// Round the corners if appropriate, with a small radius. + /// + RoundSmall = 3 +} \ No newline at end of file diff --git a/ScreenToGif.Model/Enums/Native/DwmWindowAttributes.cs b/ScreenToGif.Model/Enums/Native/DwmWindowAttributes.cs index 74e6e9d4..8d7cc62f 100644 --- a/ScreenToGif.Model/Enums/Native/DwmWindowAttributes.cs +++ b/ScreenToGif.Model/Enums/Native/DwmWindowAttributes.cs @@ -17,5 +17,22 @@ public enum DwmWindowAttributes Cloak, Cloaked, FreezeRepresentation, + PassiveUpdateMode, + UseHostBackdropBrush, + UseImmersiveDarkModeBefore20H1 = 19, //For Windows 10 versions before 2004. + UseImmersiveDarkMode = 20, + WindowCornerPreference = 33, + BorderColor, + CaptionColor, + TextColor, + VisibleFrameBorderThickness, + + /// + /// Retrieves or specifies the system-drawn backdrop material of a window, including behind the non-client area. + /// The pvAttribute parameter points to a value of type SystemBackdropTypes. + /// + SystemBackdropType, + + MicaEffect = 1029, Last } \ No newline at end of file diff --git a/ScreenToGif.Model/Enums/Native/HitTestTargets.cs b/ScreenToGif.Model/Enums/Native/HitTestTargets.cs new file mode 100644 index 00000000..23bb19ba --- /dev/null +++ b/ScreenToGif.Model/Enums/Native/HitTestTargets.cs @@ -0,0 +1,134 @@ +namespace ScreenToGif.Domain.Enums.Native; + +public enum HitTestTargets : int +{ + /// + /// In the border of a window that does not have a sizing border. + /// + Border = 18, + + /// + /// In the lower-horizontal border of a resizable window (the user can click the mouse to resize the window vertically). + /// + Bottom = 15, + + /// + /// In the lower-left corner of a border of a resizable window (the user can click the mouse to resize the window diagonally). + /// + BottomLeft = 16, + + /// + /// In the lower-right corner of a border of a resizable window (the user can click the mouse to resize the window diagonally). + /// + BottomRight = 17, + + /// + /// In a title bar. + /// + Caption = 2, + + /// + /// In a client area. + /// + Client = 1, + + /// + /// In a Close button. + /// + CloseButton = 20, + + /// + /// On the screen background or on a dividing line between windows (same as HTNOWHERE, except that the DefWindowProc function produces a system beep to indicate an error). + /// + Error = -2, + + /// + /// In a size box (same as HTSIZE). + /// + GrowBox = 4, + + /// + /// In a Help button. + /// + Help = 21, + + /// + /// In a horizontal scroll bar. + /// + HorizontalScroll = 6, + + /// + /// In the left border of a resizable window (the user can click the mouse to resize the window horizontally). + /// + Left = 10, + + /// + /// In a menu. + /// + Menu = 5, + + /// + /// In a Maximize button. + /// + MaximizeButton = 9, + + /// + /// In a Minimize button. + /// + MinimizeButton = 8, + + /// + /// On the screen background or on a dividing line between windows. + /// + Nowhere = 0, + + /// + /// In a Minimize button. + /// + Reduce = MinimizeButton, + + /// + /// In the right border of a resizable window (the user can click the mouse to resize the window horizontally). + /// + Right = 11, + + /// + /// In a size box (same as HTGROWBOX). + /// + Size = GrowBox, + + /// + /// In a window menu or in a Close button in a child window. + /// + SysMenu = 3, + + /// + /// In the upper-horizontal border of a window. + /// + Top = 12, + + /// + /// In the upper-left corner of a window border. + /// + TopLeft = 13, + + /// + /// In the upper-right corner of a window border. + /// + TopRight = 14, + + /// + /// In a window currently covered by another window in the same thread (the message will be sent to underlying windows in the same thread until one of them returns a code that is not HTTRANSPARENT). + /// + Transparent = -1, + + /// + /// In the vertical scroll bar. + /// + VerticalScroll = 7, + + /// + /// In a Maximize button. + /// + Zoom = MaximizeButton +} \ No newline at end of file diff --git a/ScreenToGif.Model/Enums/Native/MenuFunctions.cs b/ScreenToGif.Model/Enums/Native/MenuFunctions.cs new file mode 100644 index 00000000..efc7e587 --- /dev/null +++ b/ScreenToGif.Model/Enums/Native/MenuFunctions.cs @@ -0,0 +1,11 @@ +namespace ScreenToGif.Domain.Enums.Native; + +[Flags] +public enum MenuFunctions +{ + ByCommand = 0x00000000, + ByPosition = 0x00000400, + Enabled = 0x00000000, + Grayed = 0x00000001, + Disabled = 0x00000002 +} \ No newline at end of file diff --git a/ScreenToGif.Model/Enums/Native/SysCommands.cs b/ScreenToGif.Model/Enums/Native/SysCommands.cs new file mode 100644 index 00000000..c30c972a --- /dev/null +++ b/ScreenToGif.Model/Enums/Native/SysCommands.cs @@ -0,0 +1,26 @@ +namespace ScreenToGif.Domain.Enums.Native; + +public enum SysCommands : uint +{ + Size = 0xF000, + Move = 0xF010, + Minimize = 0xF020, + Maximize = 0xF030, + NextWindow = 0xF040, + PreviousWindow = 0xF050, + Close = 0xF060, + VScroll = 0xF070, + HScroll = 0xF080, + MouseMenu = 0xF090, + KeyMenu = 0xF100, + Arrange = 0xF110, + Restore = 0xF120, + TaskList = 0xF130, + ScreenSave = 0xF140, + HotKey = 0xF150, + Default = 0xF160, + MonitorPower = 0xF170, + ContextHelp = 0xF180, + Separator = 0xF00F, + IsSecure = 0x0001, +} \ No newline at end of file diff --git a/ScreenToGif.Model/Enums/Native/WindowStyles.cs b/ScreenToGif.Model/Enums/Native/WindowStyles.cs index 15e18451..2345e48d 100644 --- a/ScreenToGif.Model/Enums/Native/WindowStyles.cs +++ b/ScreenToGif.Model/Enums/Native/WindowStyles.cs @@ -17,12 +17,12 @@ public enum WindowStyles : uint Vscroll = 0x200000, Hscroll = 0x100000, Sysmenu = 0x80000, - Thickframe = 0x40000, + ThickFrame = 0x40000, Group = 0x20000, Tabstop = 0x10000, - Minimizebox = 0x20000, - Maximizebox = 0x10000, + MinimizeBox = 0x20000, + MaximizeBox = 0x10000, Tiled = Overlapped, Iconic = Minimize, - Sizebox = Thickframe, + Sizebox = ThickFrame, } \ No newline at end of file diff --git a/ScreenToGif.Model/Enums/Native/WindowsMessages.cs b/ScreenToGif.Model/Enums/Native/WindowsMessages.cs new file mode 100644 index 00000000..5976867f --- /dev/null +++ b/ScreenToGif.Model/Enums/Native/WindowsMessages.cs @@ -0,0 +1,219 @@ +namespace ScreenToGif.Domain.Enums.Native; + +public enum WindowsMessages +{ + Activate = 0x0006, + ActivateApp = 0x001C, + AfxFirst = 0x0360, + AfxLast = 0x037F, + App = 0x8000, + AskCbFormatName = 0x030C, + CancelJournal = 0x004B, + CancelMode = 0x001F, + CaptureChanged = 0x0215, + ChangeCbChain = 0x030D, + ChangeUiState = 0x0127, + Char = 0x0102, + CharToItem = 0x002F, + ChildActivate = 0x0022, + Clear = 0x0303, + Close = 0x0010, + ClipboardUpdate = 0x031D, + Command = 0x0111, + Compacting = 0x0041, + CompareItem = 0x0039, + ContextMenu = 0x007B, + Copy = 0x0301, + CopyData = 0x004A, + Create = 0x0001, + CtlColorBtn = 0x0135, + CtlColorDlg = 0x0136, + CtlColorEdit = 0x0133, + CtlColorListBox = 0x0134, + CtlColorMsgBox = 0x0132, + CtlColorScrollbar = 0x0137, + CtlColorStatic = 0x0138, + Cut = 0x0300, + DeadChar = 0x0103, + DeleteItem = 0x002D, + Destroy = 0x0002, + DestroyClipboard = 0x0307, + DeviceChange = 0x0219, + DevModeChange = 0x001B, + DisplayChange = 0x007E, + DrawClipboard = 0x0308, + DrawItem = 0x002B, + DropFiles = 0x0233, + Enable = 0x000A, + EndSession = 0x0016, + EnterIdle = 0x0121, + EnterMenuLoop = 0x0211, + EnterSizeMove = 0x0231, + EraseBackground = 0x0014, + ExitMenuLoop = 0x0212, + ExitSizeMove = 0x0232, + FontChange = 0x001D, + GetDialogCode = 0x0087, + GetFont = 0x0031, + GetHotkey = 0x0033, + GetIcon = 0x007F, + GetMinMaxInfo = 0x0024, + GetObject = 0x003D, + GetText = 0x000D, + GetTextLenght = 0x000E, + HandheldFirst = 0x0358, + HandheldLast = 0x035F, + Help = 0x0053, + Hotkey = 0x0312, + HorizontalScroll = 0x0114, + HorizontalScrollClipboard = 0x030E, + IconEraseBackground = 0x0027, + ImeChar = 0x0286, + ImeComposition = 0x010F, + ImeCompositionFull = 0x0284, + ImeControl = 0x0283, + ImeEndComposition = 0x010E, + ImeKeyDown = 0x0290, + ImeKeyLast = 0x010F, + ImeKeyUp = 0x0291, + ImeNotify = 0x0282, + ImeRequest = 0x0288, + ImeSelect = 0x0285, + ImeSetContent = 0x0281, + ImeStartComposition = 0x010D, + InitDialog = 0x0110, + InitMenu = 0x0116, + InitMenuPopup = 0x0117, + InputLanguageChange = 0x0051, + InputLanguageChangeRequest = 0x0050, + KeyDown = 0x0100, + KeyFirst = 0x0100, + KeyLast = 0x0108, + KeyUp = 0x0101, + KillFocus = 0x0008, + LeftDoubleClick = 0x0203, + LeftButtonDown = 0x0201, + LeftButtonUp = 0x0202, + MiddleDoubleClick = 0x0209, + MiddleButtonDown = 0x0207, + MiddleButtonUp = 0x0208, + MdiActivate = 0x0222, + MdiCascade = 0x0227, + MdiCreate = 0x0220, + MdiDestroy = 0x0221, + MdiGetActive = 0x0229, + MdiIconmArrange = 0x0228, + MdiMaximize = 0x0225, + MdiNext = 0x0224, + MdiRefreshMenu = 0x0234, + MdiRestore = 0x0223, + MdiSetMenu = 0x0230, + MdiTile = 0x0226, + MeasureItem = 0x002C, + MenuChar = 0x0120, + MenuCommand = 0x0126, + MenuDrag = 0x0123, + MenuGetObject = 0x0124, + MenuRightButtonUp = 0x0122, + MenuSelect = 0x011F, + MouseActivate = 0x0021, + MouseFirst = 0x0200, + MouseHover = 0x02A1, + MouseLast = 0x020D, + MouseLeave = 0x02A3, + MouseMove = 0x0200, + MouseWheel = 0x020A, + MouseHorizontalWheel = 0x020E, + Move = 0x0003, + Moving = 0x0216, + NonClientActivate = 0x0086, + NonClientCalculateSize = 0x0083, + NonClientCreate = 0x0081, + NonClientDestroy = 0x0082, + NonClientHitTest = 0x0084, + NonClientLeftButtonDoubleClick = 0x00A3, + NonClientLeftButtonDown = 0x00A1, + NonClientLeftButtonUp = 0x00A2, + NonClientMiddleButtonDoubleClick = 0x00A9, + NonClientMiddleButtonDown = 0x00A7, + NonClientMiddleButtonUp = 0x00A8, + NonClientMouseHover = 0x02A0, + NonClientMouseLeave = 0x02A2, + NonClientMouseMonve = 0x00A0, + NonClientPaint = 0x0085, + NonClientRightButtonDoubleClick = 0x00A6, + NonClientRightButtonDown = 0x00A4, + NonClientRightButtonUp = 0x00A5, + NonClientXButtonDoubleClick = 0x00AD, + NonClientXButtonDown = 0x00AB, + NonClientXButtonUp = 0x00AC, + NonClientUndocumentedAhDrawCaption = 0x00AE, + NonClientUndocumentedAhDrawFrame = 0x00AF, + NextDialogControl = 0x0028, + NextMenu = 0x0213, + Notify = 0x004E, + NotifyFormat = 0x0055, + Null = 0x0000, + Paint = 0x000F, + PaintClipboard = 0x0309, + PaintIcon = 0x0026, + PaletteChanged = 0x0311, + PaletteIsChanging = 0x0310, + ParentNotify = 0x0210, + Paste = 0x0302, + PenWinFirst = 0x0380, + PenWinLast = 0x038F, + Power = 0x0048, + PowerBroadcast = 0x0218, + Print = 0x0317, + PrintClient = 0x0318, + QueryDragIcon = 0x0037, + QueryEndSession = 0x0011, + QueryNewPalette = 0x030F, + QueryOpen = 0x0013, + QueueSync = 0x0023, + Quit = 0x0012, + RButtonDoubleClick = 0x0206, + RButtonDown = 0x0204, + RButtonUp = 0x0205, + RenderAllFormats = 0x0306, + RenderFormat = 0x0305, + SetCursor = 0x0020, + SetFocus = 0x0007, + SetFont = 0x0030, + SetHotKey = 0x0032, + SetIcon = 0x0080, + SetRedraw = 0x000B, + SetText = 0x000C, + SettingChange = 0x001A, + ShowWindow = 0x0018, + Size = 0x0005, + SizeClipboard = 0x030B, + Sizing = 0x0214, + SpoolerStatus = 0x002A, + StyleChanged = 0x007D, + StyleChanging = 0x007C, + SyncPaint = 0x0088, + SysChar = 0x0106, + SysColorChange = 0x0015, + SysCommand = 0x0112, + SysDeadChar = 0x0107, + SysKeyDown = 0x0104, + SysKeyUp = 0x0105, + TrainingCard = 0x0052, + TimeChange = 0x001E, + Timer = 0x0113, + Undo = 0x0304, + UnInitMenuPopup = 0x0125, + User = 0x0400, + UserChanged = 0x0054, + VKeyToItem = 0x002E, + VerticalScroll = 0x0115, + VerticalScrollClipboard = 0x030A, + WindowPositionChanged = 0x0047, + WindowPositionChanging = 0x0046, + WinIniChange = 0x001A, + XButtonDoubleClick = 0x020D, + XButtonDown = 0x020B, + XButtonUp = 0x020C, +} \ No newline at end of file diff --git a/ScreenToGif.Native/External/DwmApi.cs b/ScreenToGif.Native/External/DwmApi.cs index 9fe41c1c..daeb1059 100644 --- a/ScreenToGif.Native/External/DwmApi.cs +++ b/ScreenToGif.Native/External/DwmApi.cs @@ -1,4 +1,5 @@ using System.Runtime.InteropServices; +using ScreenToGif.Domain.Enums.Native; using ScreenToGif.Domain.Models.Native; using ScreenToGif.Native.Structs; @@ -12,6 +13,9 @@ public static class DwmApi [DllImport(Constants.DwmApi)] public static extern int DwmGetWindowAttribute(IntPtr hwnd, int dwAttribute, out NativeRect pvAttribute, int cbAttribute); + [DllImport(Constants.DwmApi, PreserveSig = true)] + public static extern int DwmSetWindowAttribute(IntPtr hwnd, DwmWindowAttributes attr, ref int attrValue, int attrSize); + [DllImport(Constants.DwmApi, PreserveSig = false)] public static extern void DwmExtendFrameIntoClientArea(IntPtr hwnd, ref Margins margins); diff --git a/ScreenToGif.Native/External/User32.cs b/ScreenToGif.Native/External/User32.cs index 7283914e..094806e0 100644 --- a/ScreenToGif.Native/External/User32.cs +++ b/ScreenToGif.Native/External/User32.cs @@ -108,7 +108,7 @@ public static class User32 [DllImport(Constants.User32, CharSet = CharSet.Auto)] [ResourceExposure(ResourceScope.None)] - internal static extern bool GetMonitorInfo(HandleRef hmonitor, [In, Out] MonitorInfoEx info); + public static extern bool GetMonitorInfo(HandleRef hmonitor, [In, Out] MonitorInfoEx info); [DllImport(Constants.User32, ExactSpelling = true)] [ResourceExposure(ResourceScope.None)] @@ -291,6 +291,12 @@ public static class User32 [DllImport(Constants.User32, EntryPoint = "GetWindowLongPtr")] internal static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, int nIndex); + [DllImport(Constants.User32)] + internal static extern int GetWindowLong(IntPtr hWnd, int nIndex); + + [DllImport(Constants.User32)] + internal static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); + /// /// Retrieves the handle to the ancestor of the specified window. /// @@ -531,5 +537,11 @@ internal static extern IntPtr CreateWindowEx(int dwExStyle, [MarshalAs(Unmanaged [DllImport(Constants.User32, SetLastError = true)] internal static extern bool UnregisterHotKey(IntPtr hWnd, int id); + + [DllImport(Constants.User32, SetLastError = true)] + public static extern bool EnableMenuItem(IntPtr hMenu, SysCommands uIdEnableItem, uint uEnable); + + [DllImport(Constants.User32)] + public static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); } } \ No newline at end of file diff --git a/ScreenToGif.Native/Helpers/Monitor.cs b/ScreenToGif.Native/Helpers/Monitor.cs index 95ed7956..984af4cc 100644 --- a/ScreenToGif.Native/Helpers/Monitor.cs +++ b/ScreenToGif.Native/Helpers/Monitor.cs @@ -16,23 +16,23 @@ private static Monitor ParseMonitor(IntPtr monitorHandle, IntPtr hdc) var info = new MonitorInfoEx(); //TODO: MonitorInfo not getting filled with data. var a = User32.GetMonitorInfo(new HandleRef(null, monitorHandle), info); - var name = new string(info.szDevice).TrimEnd((char)0); + var name = new string(info.Device).TrimEnd((char)0); var monitor = new Monitor { Handle = monitorHandle, Name = name, FriendlyName = name, - NativeBounds = new Rect(info.rcMonitor.Left, info.rcMonitor.Top, - info.rcMonitor.Right - info.rcMonitor.Left, - info.rcMonitor.Bottom - info.rcMonitor.Top), - Bounds = new Rect(info.rcMonitor.Left, info.rcMonitor.Top, - info.rcMonitor.Right - info.rcMonitor.Left, - info.rcMonitor.Bottom - info.rcMonitor.Top), - WorkingArea = new Rect(info.rcWork.Left, info.rcWork.Top, - info.rcWork.Right - info.rcWork.Left, - info.rcWork.Bottom - info.rcWork.Top), - IsPrimary = (info.dwFlags & Constants.MonitorinfoPrimary) != 0 + NativeBounds = new Rect(info.Monitor.Left, info.Monitor.Top, + info.Monitor.Right - info.Monitor.Left, + info.Monitor.Bottom - info.Monitor.Top), + Bounds = new Rect(info.Monitor.Left, info.Monitor.Top, + info.Monitor.Right - info.Monitor.Left, + info.Monitor.Bottom - info.Monitor.Top), + WorkingArea = new Rect(info.Work.Left, info.Work.Top, + info.Work.Right - info.Work.Left, + info.Work.Bottom - info.Work.Top), + IsPrimary = (info.Flags & Constants.MonitorinfoPrimary) != 0 }; #region Extra details diff --git a/ScreenToGif.Native/Helpers/WindowHelper.cs b/ScreenToGif.Native/Helpers/WindowHelper.cs new file mode 100644 index 00000000..26d3061a --- /dev/null +++ b/ScreenToGif.Native/Helpers/WindowHelper.cs @@ -0,0 +1,141 @@ +using ScreenToGif.Domain.Enums.Native; +using ScreenToGif.Native.External; +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Interop; + +namespace ScreenToGif.Native.Helpers; + +public static class WindowHelper +{ + private const int GetWindowsLongStyle = -16; + private const int GetWindowsLongExStyle = -20; + + public static IntPtr GetWindowPtr(this Window window) + { + return new WindowInteropHelper(window).Handle; + } + + public static void DisableMaximize(this Window window) + { + var handle = GetWindowPtr(window); + + User32.SetWindowLong(handle, GetWindowsLongStyle, User32.GetWindowLong(handle, GetWindowsLongStyle) & ~(int)WindowStyles.MaximizeBox); + + UpdateMenuStatus(handle, window.WindowState); + } + + public static void DisableMinimize(this Window window) + { + var handle = GetWindowPtr(window); + + User32.SetWindowLong(handle, GetWindowsLongStyle, User32.GetWindowLong(handle, GetWindowsLongStyle) & ~(int)WindowStyles.MinimizeBox); + + UpdateMenuStatus(handle, window.WindowState); + } + + public static void EnableMaximize(this Window window) + { + var handle = GetWindowPtr(window); + + User32.SetWindowLong(handle, GetWindowsLongStyle, User32.GetWindowLong(handle, GetWindowsLongStyle) & (int)WindowStyles.MaximizeBox); + + UpdateMenuStatus(handle, window.WindowState); + } + + public static void EnableMinimize(this Window window) + { + var handle = GetWindowPtr(window); + + User32.SetWindowLong(handle, GetWindowsLongStyle, User32.GetWindowLong(handle, GetWindowsLongStyle) & (int)WindowStyles.MinimizeBox); + + UpdateMenuStatus(handle, window.WindowState); + } + + public static void SetCornerPreference(this Window window, CornerPreferences preference) + { + var ptr = GetWindowPtr(window); + + var attr = (int)preference; + + DwmApi.DwmSetWindowAttribute(ptr, DwmWindowAttributes.WindowCornerPreference, ref attr, Marshal.SizeOf(typeof(int))); + } + + public static void SetResizeMode(this Window window) + { + var handle = GetWindowPtr(window); + + if (window.ResizeMode is ResizeMode.CanMinimize or ResizeMode.NoResize) + UpdateStyle(handle, WindowStyles.ThickFrame, 0); + else + UpdateStyle(handle, 0, WindowStyles.ThickFrame); + } + + public static void UpdateMenuStatus(this Window window) + { + var handle = GetWindowPtr(window); + var state = window.WindowState; + + UpdateMenuStatus(handle, state); + } + + public static IntPtr NearestMonitorForWindow(IntPtr window) + { + return User32.MonitorFromWindow(window, Constants.MonitorDefaultToNearest); + } + + private static bool UpdateStyle(IntPtr handle, WindowStyles removeStyle, WindowStyles addStyle) + { + var style = User32.GetWindowLong(handle, GetWindowsLongStyle); + + var newStyle = (style & ~((int)removeStyle)) | ((int)addStyle); + + if (style == newStyle) + return false; + + User32.SetWindowLong(handle, GetWindowsLongStyle, newStyle); + return true; + } + + private static void UpdateMenuStatus(IntPtr handle, WindowState state) + { + const uint enabled = (uint)(MenuFunctions.Enabled | MenuFunctions.ByCommand); + const uint disabled = (uint)(MenuFunctions.Grayed | MenuFunctions.Disabled | MenuFunctions.ByCommand); + + var menu = User32.GetSystemMenu(handle, false); + + if (IntPtr.Zero == menu) + return; + + var dwStyle = User32.GetWindowLong(handle, GetWindowsLongStyle); + + var canMinimize = (dwStyle & (int)WindowStyles.MinimizeBox) != 0; + var canMaximize = (dwStyle & (int)WindowStyles.MaximizeBox) != 0; + var canSize = (dwStyle & (int)WindowStyles.ThickFrame) != 0; + + switch (state) + { + case WindowState.Maximized: + User32.EnableMenuItem(menu, SysCommands.Restore, enabled); + User32.EnableMenuItem(menu, SysCommands.Move, disabled); + User32.EnableMenuItem(menu, SysCommands.Size, disabled); + User32.EnableMenuItem(menu, SysCommands.Minimize, canMinimize ? enabled : disabled); + User32.EnableMenuItem(menu, SysCommands.Maximize, disabled); + break; + case WindowState.Minimized: + User32.EnableMenuItem(menu, SysCommands.Restore, enabled); + User32.EnableMenuItem(menu, SysCommands.Move, disabled); + User32.EnableMenuItem(menu, SysCommands.Size, disabled); + User32.EnableMenuItem(menu, SysCommands.Minimize, disabled); + User32.EnableMenuItem(menu, SysCommands.Maximize, canMaximize ? enabled : disabled); + break; + default: + User32.EnableMenuItem(menu, SysCommands.Restore, disabled); + User32.EnableMenuItem(menu, SysCommands.Move, enabled); + User32.EnableMenuItem(menu, SysCommands.Size, canSize ? enabled : disabled); + User32.EnableMenuItem(menu, SysCommands.Minimize, canMinimize ? enabled : disabled); + User32.EnableMenuItem(menu, SysCommands.Maximize, canMaximize ? enabled : disabled); + break; + } + } +} \ No newline at end of file diff --git a/ScreenToGif.Native/Helpers/Windows.cs b/ScreenToGif.Native/Helpers/Windows.cs index 41336c55..cda18626 100644 --- a/ScreenToGif.Native/Helpers/Windows.cs +++ b/ScreenToGif.Native/Helpers/Windows.cs @@ -328,7 +328,7 @@ public static Size ScreenSizeFromWindow(IntPtr handle) var info = new MonitorInfoEx(); User32.GetMonitorInfo(new HandleRef(null, pointer), info); - var rect = info.rcWork.ToRectangle(); + var rect = info.Work.ToRectangle(); Gdi32.DeleteObject(pointer); @@ -342,7 +342,7 @@ internal static Size ScreenSizeFromPoint(int left, int top) var info = new MonitorInfoEx(); User32.GetMonitorInfo(new HandleRef(null, pointer), info); - var rect = info.rcWork.ToRectangle(); + var rect = info.Work.ToRectangle(); return new Size(rect.Width, rect.Height); } diff --git a/ScreenToGif.Native/Structs/MinMaxInfo.cs b/ScreenToGif.Native/Structs/MinMaxInfo.cs new file mode 100644 index 00000000..782b84df --- /dev/null +++ b/ScreenToGif.Native/Structs/MinMaxInfo.cs @@ -0,0 +1,40 @@ +using System.Runtime.InteropServices; + +namespace ScreenToGif.Native.Structs; + +/// +/// Contains information about a window's maximized size and position and its minimum and maximum tracking size. +/// https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-minmaxinfo +/// +[StructLayout(LayoutKind.Sequential)] +public struct MinMaxInfo +{ + /// + /// Reserved, do not use. + /// + public PointW Reserved; + + /// + /// The maximized width (x member) and the maximized height (y member) of the window. + /// For top-level windows, this value is based on the width of the primary monitor. + /// + public PointW MaxSize; + + /// + /// The position of the left side of the maximized window (x member) and the position of the top of the maximized window (y member). + /// For top-level windows, this value is based on the position of the primary monitor. + /// + public PointW MaxPosition; + + /// + /// The minimum tracking width (x member) and the minimum tracking height (y member) of the window. + /// This value can be obtained programmatically from the system metrics SM_CXMINTRACK and SM_CYMINTRACK (see the GetSystemMetrics function). + /// + public PointW MinTrackSize; + + /// + /// The maximum tracking width (x member) and the maximum tracking height (y member) of the window. + /// This value is based on the size of the virtual screen and can be obtained programmatically from the system metrics SM_CXMAXTRACK and SM_CYMAXTRACK (see the GetSystemMetrics function). + /// + public PointW MaxTrackSize; +} \ No newline at end of file diff --git a/ScreenToGif.Native/Structs/MonitorInfoEx.cs b/ScreenToGif.Native/Structs/MonitorInfoEx.cs index 9d46f4a9..2f12041a 100644 --- a/ScreenToGif.Native/Structs/MonitorInfoEx.cs +++ b/ScreenToGif.Native/Structs/MonitorInfoEx.cs @@ -4,7 +4,7 @@ namespace ScreenToGif.Native.Structs; [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 4)] -internal class MonitorInfoEx +public class MonitorInfoEx { /// /// The size, in bytes, of the structure. Set this member to sizeof(MONITORINFOEX) (72) before calling the GetMonitorInfo function. @@ -16,15 +16,15 @@ internal class MonitorInfoEx /// A RECT structure that specifies the display monitor rectangle, expressed in virtual-screen coordinates. /// Note that if the monitor is not the primary display monitor, some of the rectangle's coordinates may be negative values. /// - public NativeRect rcMonitor; + public NativeRect Monitor; /// /// A RECT structure that specifies the work area rectangle of the display monitor that can be used by applications, /// expressed in virtual-screen coordinates. Windows uses this rectangle to maximize an application on the monitor. - /// The rest of the area in rcMonitor contains system windows such as the task bar and side bars. + /// The rest of the area in Monitor contains system windows such as the task bar and side bars. /// Note that if the monitor is not the primary display monitor, some of the rectangle's coordinates may be negative values. /// - public NativeRect rcWork; + public NativeRect Work; /// /// The attributes of the display monitor. @@ -32,12 +32,12 @@ internal class MonitorInfoEx /// This member can be the following value: /// 1 : MONITORINFOF_PRIMARY /// - public int dwFlags = 0; + public int Flags = 0; /// /// A string that specifies the device name of the monitor being used. /// Most applications have no use for a display monitor name, and so can save some bytes by using a MONITORINFO structure. /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] - public char[] szDevice = new char[32]; + public char[] Device = new char[32]; } \ No newline at end of file diff --git a/ScreenToGif.Util/VisualHelper.cs b/ScreenToGif.Util/VisualHelper.cs index a45e42cc..faa83953 100644 --- a/ScreenToGif.Util/VisualHelper.cs +++ b/ScreenToGif.Util/VisualHelper.cs @@ -1,6 +1,7 @@ using System.ComponentModel; using System.IO; using System.Windows; +using System.Windows.Interop; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Threading; @@ -11,6 +12,22 @@ public static class VisualHelper { public static readonly object LockObject = new(); + public static IntPtr GetHandle(this Window window) => new WindowInteropHelper(window).EnsureHandle(); + + public static HwndSource GetHwndSource(this Window window) => HwndSource.FromHwnd(window.GetHandle()); + + /// + /// Gets the scale of the current window. + /// + /// The Window. + /// The scale of the given Window. + public static double GetVisualScale(this Visual window) + { + var source = PresentationSource.FromVisual(window); + + return source?.CompositionTarget != null ? source.CompositionTarget.TransformToDevice.M11 : 1d; + } + public static TP GetParent(DependencyObject child, int i) where TP : DependencyObject { var parent = VisualTreeHelper.GetParent(child); @@ -33,6 +50,18 @@ public static T GetVisualParent(this DependencyObject child) where T : Visual return child as T; } + /// + /// Checks whether the given coordinates are within given element bounds. + /// + /// True if the coordinates are within element bounds. + public static bool HitTestElement(this FrameworkElement element, int x, int y) + { + var scale = element.GetVisualScale(); + var rect = new Rect(element.PointToScreen(new Point()), new Size(element.Width * scale, element.Height * scale)); + + return rect.Contains(x, y); + } + public static TP GetParent(DependencyObject child, Type stopWhen) where TP : Visual { var parent = VisualTreeHelper.GetParent(child); diff --git a/ScreenToGif/Controls/ExWindow.cs b/ScreenToGif/Controls/ExWindow.cs new file mode 100644 index 00000000..c6651e9d --- /dev/null +++ b/ScreenToGif/Controls/ExWindow.cs @@ -0,0 +1,274 @@ +using ScreenToGif.Domain.Enums.Native; +using ScreenToGif.Native.External; +using ScreenToGif.Native.Helpers; +using ScreenToGif.Native.Structs; +using ScreenToGif.Util; +using System; +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Shell; + +namespace ScreenToGif.Controls; + +[TemplatePart(Name = NonClientAreaElementId, Type = typeof(UIElement))] +[TemplatePart(Name = MinimizeButtonId, Type = typeof(Button))] +[TemplatePart(Name = MaximizeButtonId, Type = typeof(Button))] +[TemplatePart(Name = RestoreButtonId, Type = typeof(Button))] +[TemplatePart(Name = CloseButtonId, Type = typeof(Button))] +public class ExWindow : Window +{ + private const string NonClientAreaElementId = "NonClientAreaElement"; + private const string MinimizeButtonId = "MinimizeButton"; + private const string MaximizeButtonId = "MaximizeButton"; + private const string RestoreButtonId = "RestoreButton"; + private const string CloseButtonId = "CloseButton"; + + private UIElement _nonClientAreaElement; + private Button _minimizeButton; + private Button _maximizeButton; + private Button _restoreButton; + private Button _closeButton; + + public static readonly DependencyProperty ExtendIntoTitleBarProperty = DependencyProperty.Register(nameof(ExtendIntoTitleBar), typeof(bool), typeof(ExWindow), new PropertyMetadata(true)); + public static readonly DependencyProperty ShowCustomCaptionButtonsProperty = DependencyProperty.Register(nameof(ShowCustomCaptionButtons), typeof(bool), typeof(ExWindow), new PropertyMetadata(false, ShowCustomCaptionButtons_PropertyChanged)); + public static readonly DependencyPropertyKey WillRenderCustomCaptionButtonsProperty = DependencyProperty.RegisterReadOnly(nameof(WillRenderCustomCaptionButtons), typeof(bool), typeof(ExWindow), new PropertyMetadata(false)); + public static readonly DependencyProperty ShowMinimizeButtonProperty = DependencyProperty.Register(nameof(ShowMinimizeButton), typeof(bool), typeof(ExWindow), new PropertyMetadata(true, ShowMinimizeButton_PropertyChanged)); + public static readonly DependencyProperty ShowMaximizeButtonProperty = DependencyProperty.Register(nameof(ShowMaximizeButton), typeof(bool), typeof(ExWindow), new PropertyMetadata(true, ShowMaximizeButton_PropertyChanged)); + + public bool ExtendIntoTitleBar + { + get => (bool)GetValue(ExtendIntoTitleBarProperty); + set => SetValue(ExtendIntoTitleBarProperty, value); + } + + public bool ShowCustomCaptionButtons + { + get => (bool)GetValue(ShowCustomCaptionButtonsProperty); + set => SetValue(ShowCustomCaptionButtonsProperty, value); + } + + public bool WillRenderCustomCaptionButtons + { + get => (bool)GetValue(WillRenderCustomCaptionButtonsProperty.DependencyProperty); + private set => SetValue(WillRenderCustomCaptionButtonsProperty, value); + } + + public bool ShowMinimizeButton + { + get => (bool)GetValue(ShowMinimizeButtonProperty); + set => SetValue(ShowMinimizeButtonProperty, value); + } + + public bool ShowMaximizeButton + { + get => (bool)GetValue(ShowMaximizeButtonProperty); + set => SetValue(ShowMaximizeButtonProperty, value); + } + + static ExWindow() + { + DefaultStyleKeyProperty.OverrideMetadata(typeof(ExWindow), new FrameworkPropertyMetadata(typeof(ExWindow))); + } + + public ExWindow() + { + WillRenderCustomCaptionButtons = ShowCustomCaptionButtons; + + var chrome = new WindowChrome + { + CaptionHeight = 32, + ResizeBorderThickness = SystemParameters.WindowResizeBorderThickness, + UseAeroCaptionButtons = !WillRenderCustomCaptionButtons, + GlassFrameThickness = new Thickness(0), + NonClientFrameEdges = !WillRenderCustomCaptionButtons || ResizeMode == ResizeMode.NoResize ? NonClientFrameEdges.Right | NonClientFrameEdges.Left : NonClientFrameEdges.None + }; + + WindowChrome.SetWindowChrome(this, chrome); + } + + protected override void OnSourceInitialized(EventArgs e) + { + base.OnSourceInitialized(e); + + this.GetHwndSource()?.AddHook(Window_Hook); + } + + public override void OnApplyTemplate() + { + _nonClientAreaElement = GetTemplateChild(NonClientAreaElementId) as UIElement; + _minimizeButton = GetTemplateChild(MinimizeButtonId) as Button; + _maximizeButton = GetTemplateChild(MaximizeButtonId) as Button; + _restoreButton = GetTemplateChild(RestoreButtonId) as Button; + _closeButton = GetTemplateChild(CloseButtonId) as Button; + + RegisterBaseCommands(); + + base.OnApplyTemplate(); + + this.SetResizeMode(); + } + + protected void RegisterBaseCommands() + { + CommandBindings.Add(new CommandBinding(SystemCommands.MinimizeWindowCommand, (_, _) => SystemCommands.MinimizeWindow(this), (_, args) => args.CanExecute = ShowMinimizeButton)); + CommandBindings.Add(new CommandBinding(SystemCommands.MaximizeWindowCommand, (_, _) => SystemCommands.MaximizeWindow(this), (_, args) => args.CanExecute = ShowMaximizeButton)); + CommandBindings.Add(new CommandBinding(SystemCommands.RestoreWindowCommand, (_, _) => SystemCommands.RestoreWindow(this), (_, args) => args.CanExecute = ShowMaximizeButton)); + CommandBindings.Add(new CommandBinding(SystemCommands.CloseWindowCommand, (_, _) => SystemCommands.CloseWindow(this))); + } + + private nint Window_Hook(nint hwnd, int msg, nint wparam, nint lparam, ref bool handled) + { + switch ((WindowsMessages)msg) + { + case WindowsMessages.NonClientHitTest: + { + try + { + //Works around a Logitech mouse driver bug, code from https://developercommunity.visualstudio.com/content/problem/167357/overflow-exception-in-windowchrome.html + var _ = (int)lparam; //.ToInt32(); + } + catch (OverflowException) + { + handled = true; + } + + if (!ShowCustomCaptionButtons || !ExtendIntoTitleBar || !OperatingSystem.IsWindowsVersionAtLeast(10, 0, 22000) || !ShowMaximizeButton || ResizeMode is ResizeMode.NoResize or ResizeMode.CanMinimize) + return (nint)0;//.Zero; + + var x = ((int)lparam)/*.ToInt32()*/ & 0xffff; + var y = ((int)lparam)/*.ToInt32()*/ >> 16; + + var button = WindowState == WindowState.Maximized ? _restoreButton : _maximizeButton; + + if (button.HitTestElement(x, y)) + { + button.SetCurrentValue(BackgroundProperty, FindResource("Brush.Fill.Subtle.Secondary")); + + handled = true; + return (nint)HitTestTargets.MaximizeButton; //new nint((int)HitTestTargets.MaximizeButton); + } + + button.ClearValue(BackgroundProperty); + + break; + } + + case WindowsMessages.NonClientLeftButtonDown: + { + if (!ShowCustomCaptionButtons || !ExtendIntoTitleBar || !OperatingSystem.IsWindowsVersionAtLeast(10, 0, 22000) || !ShowMaximizeButton || ResizeMode is ResizeMode.NoResize or ResizeMode.CanMinimize) + return (nint)0;//.Zero; + + //This is necessary in order to change the background color for the maximize/restore button, since the HitTest is handled above. + var x = ((int)lparam)/*.ToInt32()*/ & 0xffff; + var y = ((int)lparam)/*.ToInt32()*/ >> 16; + + var button = WindowState == WindowState.Maximized ? _restoreButton : _maximizeButton; + + if (button.HitTestElement(x, y)) + { + button.SetCurrentValue(BackgroundProperty, FindResource("Brush.Fill.Subtle.Tertiary")); + + //Without this, the button click near the bottom border would not work and it would display a ghost button nearby. + handled = true; + } + else + button.ClearValue(BackgroundProperty); + + break; + } + + case WindowsMessages.NonClientLeftButtonUp: + { + if (!ShowCustomCaptionButtons || !ExtendIntoTitleBar || !OperatingSystem.IsWindowsVersionAtLeast(10, 0, 22000) || !ShowMaximizeButton || ResizeMode is ResizeMode.NoResize or ResizeMode.CanMinimize) + return (nint)0;//.Zero; + + //This is necessary in order to change the background color for the maximize/restore button, since the HitTest is handled above. + var x = ((int)lparam)/*.ToInt32()*/ & 0xffff; + var y = ((int)lparam)/*.ToInt32()*/ >> 16; + + var button = WindowState == WindowState.Maximized ? _restoreButton : _maximizeButton; + + if (button.HitTestElement(x, y)) + { + button.SetCurrentValue(BackgroundProperty, FindResource("Brush.Fill.Subtle.Tertiary")); + + //Without this, the button click near the bottom border would not work and it would display a ghost button nearby. + button.Command.Execute(null); + handled = true; + } + else + button.ClearValue(BackgroundProperty); + + break; + } + + case WindowsMessages.GetMinMaxInfo: + { + var info = (MinMaxInfo)Marshal.PtrToStructure(lparam, typeof(MinMaxInfo))!; + var monitor = WindowHelper.NearestMonitorForWindow(hwnd); + + if (monitor != (nint)0) + { + var monitorInfo = new MonitorInfoEx(); + User32.GetMonitorInfo(new HandleRef(this, monitor), monitorInfo); + + var rcWorkArea = monitorInfo.Work; + var rcMonitorArea = monitorInfo.Monitor; + + //TODO: Possible issue with multi monitor setups? + info.MaxPosition.X = Math.Abs(rcWorkArea.Left - rcMonitorArea.Left) - 1; + info.MaxPosition.Y = Math.Abs(rcWorkArea.Top - rcMonitorArea.Top) - 1; + info.MaxSize.X = Math.Abs(rcWorkArea.Right - rcWorkArea.Left + 2); + info.MaxSize.Y = Math.Abs(rcWorkArea.Bottom - rcWorkArea.Top + 2); + } + + Marshal.StructureToPtr(info, lparam, true); + + break; + } + + //case WindowsMessages.WindowPositionChanged: + //{ + // BorderThickness = WindowState == WindowState.Maximized ? new Thickness(0) : new Thickness(1); + // break; + //} + } + + return (nint)0;//.Zero; + } + + private static void ShowCustomCaptionButtons_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not ExWindow window) + return; + + window.WillRenderCustomCaptionButtons = window.ShowCustomCaptionButtons; + + WindowChrome.GetWindowChrome(window).UseAeroCaptionButtons = !window.WillRenderCustomCaptionButtons; + WindowChrome.GetWindowChrome(window).NonClientFrameEdges = !window.WillRenderCustomCaptionButtons ? NonClientFrameEdges.Right | NonClientFrameEdges.Left : NonClientFrameEdges.None; + } + + private static void ShowMinimizeButton_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not ExWindow window) + return; + + if (window.ShowMinimizeButton) + window.EnableMinimize(); + else + window.DisableMinimize(); + } + + private static void ShowMaximizeButton_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not ExWindow window) + return; + + if (window.ShowMaximizeButton) + window.EnableMaximize(); + else + window.DisableMaximize(); + } +} \ No newline at end of file diff --git a/ScreenToGif/Themes/Generic.xaml b/ScreenToGif/Themes/Generic.xaml index f1c658cf..a1ff38c1 100644 --- a/ScreenToGif/Themes/Generic.xaml +++ b/ScreenToGif/Themes/Generic.xaml @@ -3082,4 +3082,193 @@ + + + + + + + + \ No newline at end of file diff --git a/ScreenToGif/Windows/Editor.xaml b/ScreenToGif/Windows/Editor.xaml index 1deb1828..4643adc1 100644 --- a/ScreenToGif/Windows/Editor.xaml +++ b/ScreenToGif/Windows/Editor.xaml @@ -1,20 +1,21 @@ - + @@ -4422,4 +4423,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Editor.xaml.cs b/ScreenToGif/Windows/Editor.xaml.cs index 51fcfb82..f2785850 100644 --- a/ScreenToGif/Windows/Editor.xaml.cs +++ b/ScreenToGif/Windows/Editor.xaml.cs @@ -56,7 +56,7 @@ namespace ScreenToGif.Windows { - public partial class Editor : Window, INotification, IEncoding + public partial class Editor : INotification, IEncoding { #region Properties diff --git a/ScreenToGif/Windows/Options.xaml b/ScreenToGif/Windows/Options.xaml index 807d0714..70e4e102 100644 --- a/ScreenToGif/Windows/Options.xaml +++ b/ScreenToGif/Windows/Options.xaml @@ -1,16 +1,17 @@ - - - + + + @@ -25,13 +26,13 @@ - + - + - + @@ -2020,4 +2021,4 @@ ContentHeight="18" ContentWidth="18" Icon="{StaticResource Vector.Ok}" Click="OkButton_Click"/> - + \ No newline at end of file diff --git a/ScreenToGif/Windows/Options.xaml.cs b/ScreenToGif/Windows/Options.xaml.cs index 5384ebbd..3488b0ac 100644 --- a/ScreenToGif/Windows/Options.xaml.cs +++ b/ScreenToGif/Windows/Options.xaml.cs @@ -33,7 +33,7 @@ namespace ScreenToGif.Windows; -public partial class Options : Window, INotification +public partial class Options : INotification { #region Constants and variables diff --git a/ScreenToGif/Windows/Other/Startup.xaml b/ScreenToGif/Windows/Other/Startup.xaml index 4a477f00..b5def6a9 100644 --- a/ScreenToGif/Windows/Other/Startup.xaml +++ b/ScreenToGif/Windows/Other/Startup.xaml @@ -1,9 +1,10 @@ - @@ -76,4 +77,4 @@ ToolTip="{DynamicResource S.StartUp.Editor.Tooltip}" ToolTipService.Placement="Bottom"/> - \ No newline at end of file + \ No newline at end of file From dc4096a29b7d8963268bfaeb81ef74f3918b833b Mon Sep 17 00:00:00 2001 From: Nicke Manarin Date: Mon, 4 Dec 2023 13:15:42 -0300 Subject: [PATCH 2/9] Upgrade to .NET 8 --- Other/Translator/Translator.csproj | 7 +++---- ScreenToGif.Model/ScreenToGif.Domain.csproj | 6 ++---- ScreenToGif.Native/ScreenToGif.Native.csproj | 6 ++---- ScreenToGif.Test/ScreenToGif.Test.csproj | 13 ++----------- ScreenToGif.Util/ScreenToGif.Util.csproj | 11 ++++------- ScreenToGif.ViewModel/ScreenToGif.ViewModel.csproj | 9 +++------ ScreenToGif/ScreenToGif.csproj | 6 +++--- 7 files changed, 19 insertions(+), 39 deletions(-) diff --git a/Other/Translator/Translator.csproj b/Other/Translator/Translator.csproj index ab198dbf..cb92ead9 100644 --- a/Other/Translator/Translator.csproj +++ b/Other/Translator/Translator.csproj @@ -1,6 +1,6 @@  - net6.0-windows + net8.0-windows WinExe false true @@ -17,11 +17,10 @@ - - all - + + \ No newline at end of file diff --git a/ScreenToGif.Model/ScreenToGif.Domain.csproj b/ScreenToGif.Model/ScreenToGif.Domain.csproj index b073d1c3..ed2a83eb 100644 --- a/ScreenToGif.Model/ScreenToGif.Domain.csproj +++ b/ScreenToGif.Model/ScreenToGif.Domain.csproj @@ -1,7 +1,6 @@ - - net6.0-windows + net8.0-windows enable disable embedded @@ -9,7 +8,6 @@ AnyCPU;ARM64;x64;x86 2.38.1 - true AnyCPU @@ -51,4 +49,4 @@ Off ManagedMinimumRules.ruleset - + \ No newline at end of file diff --git a/ScreenToGif.Native/ScreenToGif.Native.csproj b/ScreenToGif.Native/ScreenToGif.Native.csproj index 75092fbe..81e6e892 100644 --- a/ScreenToGif.Native/ScreenToGif.Native.csproj +++ b/ScreenToGif.Native/ScreenToGif.Native.csproj @@ -1,15 +1,14 @@ - - net6.0-windows + net8.0-windows enable True True embedded AnyCPU;ARM64;x64;x86 2.38.1 + 7.0 - true AnyCPU @@ -51,7 +50,6 @@ Off ManagedMinimumRules.ruleset - diff --git a/ScreenToGif.Test/ScreenToGif.Test.csproj b/ScreenToGif.Test/ScreenToGif.Test.csproj index e0acd1aa..c547cc3f 100644 --- a/ScreenToGif.Test/ScreenToGif.Test.csproj +++ b/ScreenToGif.Test/ScreenToGif.Test.csproj @@ -1,16 +1,11 @@ - - net6.0-windows + net8.0-windows disable - false - embedded - AnyCPU;ARM64;x64;x86 - @@ -23,20 +18,16 @@ all - - - PreserveNewest - - + \ No newline at end of file diff --git a/ScreenToGif.Util/ScreenToGif.Util.csproj b/ScreenToGif.Util/ScreenToGif.Util.csproj index 03a0b645..e6550480 100644 --- a/ScreenToGif.Util/ScreenToGif.Util.csproj +++ b/ScreenToGif.Util/ScreenToGif.Util.csproj @@ -1,20 +1,18 @@ - - net6.0-windows + net8.0-windows enable True embedded AnyCPU;ARM64;x64;x86 2.38.1 + 7.0 - - + - true AnyCPU @@ -64,8 +62,7 @@ ManagedMinimumRules.ruleset $(DefineConstants) - - + \ No newline at end of file diff --git a/ScreenToGif.ViewModel/ScreenToGif.ViewModel.csproj b/ScreenToGif.ViewModel/ScreenToGif.ViewModel.csproj index 07503549..3876c7a4 100644 --- a/ScreenToGif.ViewModel/ScreenToGif.ViewModel.csproj +++ b/ScreenToGif.ViewModel/ScreenToGif.ViewModel.csproj @@ -1,23 +1,20 @@ - - net6.0-windows + net8.0-windows enable disable embedded AnyCPU;ARM64;x64;x86 2.38.1 + 7.0 - - - true AnyCPU @@ -59,4 +56,4 @@ Off ManagedMinimumRules.ruleset - + \ No newline at end of file diff --git a/ScreenToGif/ScreenToGif.csproj b/ScreenToGif/ScreenToGif.csproj index c3dffd63..a23c114a 100644 --- a/ScreenToGif/ScreenToGif.csproj +++ b/ScreenToGif/ScreenToGif.csproj @@ -1,6 +1,6 @@ - net6.0-windows + net8.0-windows WinExe 12.0.51020.0 false @@ -106,11 +106,11 @@ - all - + + From 0637f979826f245f40b9c574f1a714b59dfdda9a Mon Sep 17 00:00:00 2001 From: Nicke Manarin Date: Mon, 4 Dec 2023 14:19:02 -0300 Subject: [PATCH 3/9] Now using extended window in almost all windows --- ScreenToGif/Controls/ExWindow.cs | 30 +++++++------- ScreenToGif/Windows/Editor.xaml | 1 - ScreenToGif/Windows/Options.xaml | 3 +- ScreenToGif/Windows/Other/AutomatedTask.xaml | 33 ++++++++-------- .../Windows/Other/AutomatedTask.xaml.cs | 2 +- ScreenToGif/Windows/Other/CacheDialog.xaml | 15 +++---- ScreenToGif/Windows/Other/CacheDialog.xaml.cs | 2 +- ScreenToGif/Windows/Other/ColorSelector.xaml | 20 +++++----- .../Windows/Other/ColorSelector.xaml.cs | 2 +- .../Windows/Other/CommandPreviewer.xaml | 14 +++---- .../Windows/Other/CommandPreviewer.xaml.cs | 2 +- ScreenToGif/Windows/Other/Dialog.xaml | 14 +++---- ScreenToGif/Windows/Other/Dialog.xaml.cs | 2 +- ScreenToGif/Windows/Other/DownloadDialog.xaml | 16 ++++---- .../Windows/Other/DownloadDialog.xaml.cs | 2 +- ScreenToGif/Windows/Other/Downloader.xaml | 16 ++++---- ScreenToGif/Windows/Other/Downloader.xaml.cs | 2 +- ScreenToGif/Windows/Other/Encoder.xaml | 18 ++++----- ScreenToGif/Windows/Other/Encoder.xaml.cs | 2 +- ScreenToGif/Windows/Other/ErrorDialog.xaml | 14 +++---- ScreenToGif/Windows/Other/ErrorDialog.xaml.cs | 2 +- .../Windows/Other/ExceptionDialog.xaml | 16 ++++---- .../Windows/Other/ExceptionDialog.xaml.cs | 2 +- .../Windows/Other/ExceptionViewer.xaml | 16 ++++---- ScreenToGif/Windows/Other/Feedback.xaml | 18 ++++----- ScreenToGif/Windows/Other/Feedback.xaml.cs | 2 +- .../Windows/Other/FeedbackPreview.xaml | 14 +++---- .../Windows/Other/FeedbackPreview.xaml.cs | 2 +- ScreenToGif/Windows/Other/GoTo.xaml | 18 ++++----- .../Other/GraphicsConfigurationDialog.xaml | 16 ++++---- .../Other/GraphicsConfigurationDialog.xaml.cs | 2 +- ScreenToGif/Windows/Other/Insert.xaml | 22 +++++------ ScreenToGif/Windows/Other/Insert.xaml.cs | 2 +- ScreenToGif/Windows/Other/KeyStrokes.xaml | 14 +++---- ScreenToGif/Windows/Other/KeyStrokes.xaml.cs | 2 +- ScreenToGif/Windows/Other/Localization.xaml | 16 ++++---- .../Windows/Other/Localization.xaml.cs | 2 +- .../Windows/Other/PickAlbumDialog.xaml | 16 ++++---- .../Windows/Other/PickAlbumDialog.xaml.cs | 2 +- ScreenToGif/Windows/Other/Preset.xaml | 24 ++++++------ ScreenToGif/Windows/Other/Preset.xaml.cs | 2 +- ScreenToGif/Windows/Other/Startup.xaml | 14 +++---- ScreenToGif/Windows/Other/TestField.xaml | 4 +- ScreenToGif/Windows/Other/TextDialog.xaml | 14 +++---- ScreenToGif/Windows/Other/TextDialog.xaml.cs | 2 +- ScreenToGif/Windows/Other/Troubleshoot.xaml | 16 ++++---- .../Windows/Other/Troubleshoot.xaml.cs | 2 +- ScreenToGif/Windows/Other/Upload.xaml | 39 ++++++++++--------- ScreenToGif/Windows/Other/Upload.xaml.cs | 2 +- .../Windows/Other/UploadDetailsDialog.xaml | 16 ++++---- .../Windows/Other/UploadDetailsDialog.xaml.cs | 2 +- ScreenToGif/Windows/Other/UploadHistory.xaml | 20 +++++----- .../Windows/Other/UploadHistory.xaml.cs | 7 ++-- ScreenToGif/Windows/Other/VideoSource.xaml | 18 ++++----- ScreenToGif/Windows/Other/VideoSource.xaml.cs | 2 +- 55 files changed, 289 insertions(+), 289 deletions(-) diff --git a/ScreenToGif/Controls/ExWindow.cs b/ScreenToGif/Controls/ExWindow.cs index c6651e9d..15d88acf 100644 --- a/ScreenToGif/Controls/ExWindow.cs +++ b/ScreenToGif/Controls/ExWindow.cs @@ -31,8 +31,8 @@ public class ExWindow : Window private Button _restoreButton; private Button _closeButton; - public static readonly DependencyProperty ExtendIntoTitleBarProperty = DependencyProperty.Register(nameof(ExtendIntoTitleBar), typeof(bool), typeof(ExWindow), new PropertyMetadata(true)); - public static readonly DependencyProperty ShowCustomCaptionButtonsProperty = DependencyProperty.Register(nameof(ShowCustomCaptionButtons), typeof(bool), typeof(ExWindow), new PropertyMetadata(false, ShowCustomCaptionButtons_PropertyChanged)); + public static readonly DependencyProperty ExtendIntoTitleBarProperty = DependencyProperty.Register(nameof(ExtendIntoTitleBar), typeof(bool), typeof(ExWindow), new PropertyMetadata(false)); + public static readonly DependencyProperty ShowCustomCaptionButtonsProperty = DependencyProperty.Register(nameof(ShowCustomCaptionButtons), typeof(bool), typeof(ExWindow), new PropertyMetadata(true, ShowCustomCaptionButtons_PropertyChanged)); public static readonly DependencyPropertyKey WillRenderCustomCaptionButtonsProperty = DependencyProperty.RegisterReadOnly(nameof(WillRenderCustomCaptionButtons), typeof(bool), typeof(ExWindow), new PropertyMetadata(false)); public static readonly DependencyProperty ShowMinimizeButtonProperty = DependencyProperty.Register(nameof(ShowMinimizeButton), typeof(bool), typeof(ExWindow), new PropertyMetadata(true, ShowMinimizeButton_PropertyChanged)); public static readonly DependencyProperty ShowMaximizeButtonProperty = DependencyProperty.Register(nameof(ShowMaximizeButton), typeof(bool), typeof(ExWindow), new PropertyMetadata(true, ShowMaximizeButton_PropertyChanged)); @@ -81,7 +81,7 @@ public ExWindow() CaptionHeight = 32, ResizeBorderThickness = SystemParameters.WindowResizeBorderThickness, UseAeroCaptionButtons = !WillRenderCustomCaptionButtons, - GlassFrameThickness = new Thickness(0), + GlassFrameThickness = new Thickness(-1), NonClientFrameEdges = !WillRenderCustomCaptionButtons || ResizeMode == ResizeMode.NoResize ? NonClientFrameEdges.Right | NonClientFrameEdges.Left : NonClientFrameEdges.None }; @@ -127,7 +127,7 @@ private nint Window_Hook(nint hwnd, int msg, nint wparam, nint lparam, ref bool try { //Works around a Logitech mouse driver bug, code from https://developercommunity.visualstudio.com/content/problem/167357/overflow-exception-in-windowchrome.html - var _ = (int)lparam; //.ToInt32(); + var _ = lparam.ToInt32(); } catch (OverflowException) { @@ -135,10 +135,10 @@ private nint Window_Hook(nint hwnd, int msg, nint wparam, nint lparam, ref bool } if (!ShowCustomCaptionButtons || !ExtendIntoTitleBar || !OperatingSystem.IsWindowsVersionAtLeast(10, 0, 22000) || !ShowMaximizeButton || ResizeMode is ResizeMode.NoResize or ResizeMode.CanMinimize) - return (nint)0;//.Zero; + return nint.Zero; - var x = ((int)lparam)/*.ToInt32()*/ & 0xffff; - var y = ((int)lparam)/*.ToInt32()*/ >> 16; + var x = lparam.ToInt32() & 0xffff; + var y = lparam.ToInt32() >> 16; var button = WindowState == WindowState.Maximized ? _restoreButton : _maximizeButton; @@ -158,11 +158,11 @@ private nint Window_Hook(nint hwnd, int msg, nint wparam, nint lparam, ref bool case WindowsMessages.NonClientLeftButtonDown: { if (!ShowCustomCaptionButtons || !ExtendIntoTitleBar || !OperatingSystem.IsWindowsVersionAtLeast(10, 0, 22000) || !ShowMaximizeButton || ResizeMode is ResizeMode.NoResize or ResizeMode.CanMinimize) - return (nint)0;//.Zero; + return nint.Zero; //This is necessary in order to change the background color for the maximize/restore button, since the HitTest is handled above. - var x = ((int)lparam)/*.ToInt32()*/ & 0xffff; - var y = ((int)lparam)/*.ToInt32()*/ >> 16; + var x = lparam.ToInt32() & 0xffff; + var y = lparam.ToInt32() >> 16; var button = WindowState == WindowState.Maximized ? _restoreButton : _maximizeButton; @@ -182,11 +182,11 @@ private nint Window_Hook(nint hwnd, int msg, nint wparam, nint lparam, ref bool case WindowsMessages.NonClientLeftButtonUp: { if (!ShowCustomCaptionButtons || !ExtendIntoTitleBar || !OperatingSystem.IsWindowsVersionAtLeast(10, 0, 22000) || !ShowMaximizeButton || ResizeMode is ResizeMode.NoResize or ResizeMode.CanMinimize) - return (nint)0;//.Zero; + return nint.Zero; //This is necessary in order to change the background color for the maximize/restore button, since the HitTest is handled above. - var x = ((int)lparam)/*.ToInt32()*/ & 0xffff; - var y = ((int)lparam)/*.ToInt32()*/ >> 16; + var x = lparam.ToInt32() & 0xffff; + var y = lparam.ToInt32() >> 16; var button = WindowState == WindowState.Maximized ? _restoreButton : _maximizeButton; @@ -209,7 +209,7 @@ private nint Window_Hook(nint hwnd, int msg, nint wparam, nint lparam, ref bool var info = (MinMaxInfo)Marshal.PtrToStructure(lparam, typeof(MinMaxInfo))!; var monitor = WindowHelper.NearestMonitorForWindow(hwnd); - if (monitor != (nint)0) + if (monitor != nint.Zero) { var monitorInfo = new MonitorInfoEx(); User32.GetMonitorInfo(new HandleRef(this, monitor), monitorInfo); @@ -236,7 +236,7 @@ private nint Window_Hook(nint hwnd, int msg, nint wparam, nint lparam, ref bool //} } - return (nint)0;//.Zero; + return nint.Zero; } private static void ShowCustomCaptionButtons_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) diff --git a/ScreenToGif/Windows/Editor.xaml b/ScreenToGif/Windows/Editor.xaml index 4643adc1..d8c5fbf5 100644 --- a/ScreenToGif/Windows/Editor.xaml +++ b/ScreenToGif/Windows/Editor.xaml @@ -11,7 +11,6 @@ xmlns:o="clr-namespace:ScreenToGif.UserControls" xmlns:e="clr-namespace:ScreenToGif.Domain.Enums;assembly=ScreenToGif.Domain" x:Name="EditorWindow" Title="{DynamicResource S.Editor.Title}" MinHeight="500" MinWidth="700" - ShowCustomCaptionButtons="True" ExtendIntoTitleBar="False" Background="{DynamicResource Panel.Background.Level3}" UseLayoutRounding="True" Icon="/Resources/Logo.ico" FocusManager.FocusedElement="{Binding RelativeSource={x:Static RelativeSource.Self}, Mode=OneTime}" Loaded="Window_Loaded" Closing="Window_Closing" Activated="Window_Activated" KeyUp="Window_KeyUp" diff --git a/ScreenToGif/Windows/Options.xaml b/ScreenToGif/Windows/Options.xaml index 70e4e102..501a2a23 100644 --- a/ScreenToGif/Windows/Options.xaml +++ b/ScreenToGif/Windows/Options.xaml @@ -6,8 +6,7 @@ xmlns:t="clr-namespace:ScreenToGif.Util.Settings;assembly=ScreenToGif.Util" xmlns:e="clr-namespace:ScreenToGif.Domain.Enums;assembly=ScreenToGif.Domain" Title="{DynamicResource S.Options.Title}" Height="610" Width="800" MinWidth="680" MinHeight="460" - Background="{DynamicResource Panel.Background}" Icon="/Resources/Logo.ico" - ShowCustomCaptionButtons="True" ExtendIntoTitleBar="False" + Icon="/Resources/Logo.ico" ShowCustomCaptionButtons="True" ExtendIntoTitleBar="False" SizeToContent="Width" WindowStartupLocation="CenterScreen" UseLayoutRounding="True" SnapsToDevicePixels="True" Loaded="Window_Loaded" Closing="Window_Closing"> diff --git a/ScreenToGif/Windows/Other/AutomatedTask.xaml b/ScreenToGif/Windows/Other/AutomatedTask.xaml index bce292ca..366c388a 100644 --- a/ScreenToGif/Windows/Other/AutomatedTask.xaml +++ b/ScreenToGif/Windows/Other/AutomatedTask.xaml @@ -1,22 +1,23 @@ - - - + + + - - - + + + - + @@ -110,4 +111,4 @@ Padding="4,0" Margin="5" Click="CancelButton_Click" IsCancel="True"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/AutomatedTask.xaml.cs b/ScreenToGif/Windows/Other/AutomatedTask.xaml.cs index 53ab529a..0e4b5226 100644 --- a/ScreenToGif/Windows/Other/AutomatedTask.xaml.cs +++ b/ScreenToGif/Windows/Other/AutomatedTask.xaml.cs @@ -8,7 +8,7 @@ namespace ScreenToGif.Windows.Other; -public partial class AutomatedTask : Window +public partial class AutomatedTask { public BaseTaskViewModel CurrentTask { get; set; } diff --git a/ScreenToGif/Windows/Other/CacheDialog.xaml b/ScreenToGif/Windows/Other/CacheDialog.xaml index 3258cdb7..7b819925 100644 --- a/ScreenToGif/Windows/Other/CacheDialog.xaml +++ b/ScreenToGif/Windows/Other/CacheDialog.xaml @@ -1,9 +1,10 @@ - + @@ -64,4 +65,4 @@ ContentWidth="18" ContentHeight="18" Padding="5,0" MinWidth="90" Margin="5" IsCancel="True" Click="NoButton_Click"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/CacheDialog.xaml.cs b/ScreenToGif/Windows/Other/CacheDialog.xaml.cs index 0a55eb80..0c249327 100644 --- a/ScreenToGif/Windows/Other/CacheDialog.xaml.cs +++ b/ScreenToGif/Windows/Other/CacheDialog.xaml.cs @@ -5,7 +5,7 @@ namespace ScreenToGif.Windows.Other; -public partial class CacheDialog : Window +public partial class CacheDialog { #region Properties diff --git a/ScreenToGif/Windows/Other/ColorSelector.xaml b/ScreenToGif/Windows/Other/ColorSelector.xaml index 6094cc8c..e3d8257e 100644 --- a/ScreenToGif/Windows/Other/ColorSelector.xaml +++ b/ScreenToGif/Windows/Other/ColorSelector.xaml @@ -1,12 +1,12 @@ - + @@ -245,4 +245,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/ColorSelector.xaml.cs b/ScreenToGif/Windows/Other/ColorSelector.xaml.cs index b94071cb..aa9b862b 100644 --- a/ScreenToGif/Windows/Other/ColorSelector.xaml.cs +++ b/ScreenToGif/Windows/Other/ColorSelector.xaml.cs @@ -13,7 +13,7 @@ namespace ScreenToGif.Windows.Other; -public partial class ColorSelector : Window +public partial class ColorSelector { #region Properties and variables diff --git a/ScreenToGif/Windows/Other/CommandPreviewer.xaml b/ScreenToGif/Windows/Other/CommandPreviewer.xaml index 249cd871..0c2b6c88 100644 --- a/ScreenToGif/Windows/Other/CommandPreviewer.xaml +++ b/ScreenToGif/Windows/Other/CommandPreviewer.xaml @@ -1,9 +1,9 @@ - + @@ -53,4 +53,4 @@ ContentWidth="18" ContentHeight="18" Padding="5,0" MinWidth="90" Margin="5" Click="OkButton_Click" IsCancel="True"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/CommandPreviewer.xaml.cs b/ScreenToGif/Windows/Other/CommandPreviewer.xaml.cs index f1784184..9d13f4f4 100644 --- a/ScreenToGif/Windows/Other/CommandPreviewer.xaml.cs +++ b/ScreenToGif/Windows/Other/CommandPreviewer.xaml.cs @@ -4,7 +4,7 @@ namespace ScreenToGif.Windows.Other; -public partial class CommandPreviewer : Window +public partial class CommandPreviewer { public string Parameters { get; set; } diff --git a/ScreenToGif/Windows/Other/Dialog.xaml b/ScreenToGif/Windows/Other/Dialog.xaml index 1904f8eb..e5322f5b 100644 --- a/ScreenToGif/Windows/Other/Dialog.xaml +++ b/ScreenToGif/Windows/Other/Dialog.xaml @@ -1,9 +1,9 @@ - + @@ -46,4 +46,4 @@ ContentWidth="18" ContentHeight="18" Padding="5,0" MinWidth="90" Margin="5" Click="FalseActionButton_Click"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/Dialog.xaml.cs b/ScreenToGif/Windows/Other/Dialog.xaml.cs index fd9c8829..ea33c62d 100644 --- a/ScreenToGif/Windows/Other/Dialog.xaml.cs +++ b/ScreenToGif/Windows/Other/Dialog.xaml.cs @@ -6,7 +6,7 @@ namespace ScreenToGif.Windows.Other; -public partial class Dialog : Window +public partial class Dialog { public Dialog() { diff --git a/ScreenToGif/Windows/Other/DownloadDialog.xaml b/ScreenToGif/Windows/Other/DownloadDialog.xaml index eea698d1..cedcc346 100644 --- a/ScreenToGif/Windows/Other/DownloadDialog.xaml +++ b/ScreenToGif/Windows/Other/DownloadDialog.xaml @@ -1,10 +1,10 @@ - + @@ -68,4 +68,4 @@ ContentWidth="18" ContentHeight="18" Padding="5,0" MinWidth="90" Margin="5" IsCancel="True" Click="CancelButton_Click"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/DownloadDialog.xaml.cs b/ScreenToGif/Windows/Other/DownloadDialog.xaml.cs index a80fca61..bfb62374 100644 --- a/ScreenToGif/Windows/Other/DownloadDialog.xaml.cs +++ b/ScreenToGif/Windows/Other/DownloadDialog.xaml.cs @@ -14,7 +14,7 @@ namespace ScreenToGif.Windows.Other; -public partial class DownloadDialog : Window +public partial class DownloadDialog { #region Properties diff --git a/ScreenToGif/Windows/Other/Downloader.xaml b/ScreenToGif/Windows/Other/Downloader.xaml index 94af79df..610adeef 100644 --- a/ScreenToGif/Windows/Other/Downloader.xaml +++ b/ScreenToGif/Windows/Other/Downloader.xaml @@ -1,10 +1,10 @@ - + @@ -47,4 +47,4 @@ ContentWidth="18" ContentHeight="18" Padding="5,0" MinWidth="90" Margin="5" IsCancel="True" Click="CancelButton_Click"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/Downloader.xaml.cs b/ScreenToGif/Windows/Other/Downloader.xaml.cs index 4f91d70a..19fd2da3 100644 --- a/ScreenToGif/Windows/Other/Downloader.xaml.cs +++ b/ScreenToGif/Windows/Other/Downloader.xaml.cs @@ -9,7 +9,7 @@ namespace ScreenToGif.Windows.Other; -public partial class Downloader : Window +public partial class Downloader { #region Properties diff --git a/ScreenToGif/Windows/Other/Encoder.xaml b/ScreenToGif/Windows/Other/Encoder.xaml index a50e95c4..374b47c0 100644 --- a/ScreenToGif/Windows/Other/Encoder.xaml +++ b/ScreenToGif/Windows/Other/Encoder.xaml @@ -1,13 +1,13 @@ - + - + - + @@ -53,4 +53,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/Encoder.xaml.cs b/ScreenToGif/Windows/Other/Encoder.xaml.cs index fa76f0f5..e20109d6 100644 --- a/ScreenToGif/Windows/Other/Encoder.xaml.cs +++ b/ScreenToGif/Windows/Other/Encoder.xaml.cs @@ -6,7 +6,7 @@ namespace ScreenToGif.Windows.Other; -public partial class Encoder : Window, IEncoding +public partial class Encoder : IEncoding { #region Variables diff --git a/ScreenToGif/Windows/Other/ErrorDialog.xaml b/ScreenToGif/Windows/Other/ErrorDialog.xaml index c4433177..39a9bedb 100644 --- a/ScreenToGif/Windows/Other/ErrorDialog.xaml +++ b/ScreenToGif/Windows/Other/ErrorDialog.xaml @@ -1,9 +1,9 @@ - + @@ -57,4 +57,4 @@ ContentWidth="18" ContentHeight="18" Padding="5,0" MinWidth="90" Margin="5" Click="SendButton_Click"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/ErrorDialog.xaml.cs b/ScreenToGif/Windows/Other/ErrorDialog.xaml.cs index 408c3835..9bac0e53 100644 --- a/ScreenToGif/Windows/Other/ErrorDialog.xaml.cs +++ b/ScreenToGif/Windows/Other/ErrorDialog.xaml.cs @@ -5,7 +5,7 @@ namespace ScreenToGif.Windows.Other; -public partial class ErrorDialog : Window +public partial class ErrorDialog { public Exception Exception { get; set; } diff --git a/ScreenToGif/Windows/Other/ExceptionDialog.xaml b/ScreenToGif/Windows/Other/ExceptionDialog.xaml index f96fb415..4facd793 100644 --- a/ScreenToGif/Windows/Other/ExceptionDialog.xaml +++ b/ScreenToGif/Windows/Other/ExceptionDialog.xaml @@ -1,10 +1,10 @@ - + @@ -57,4 +57,4 @@ Padding="4,0" MinWidth="90" Margin="5" Click="SendButton_Click"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/ExceptionDialog.xaml.cs b/ScreenToGif/Windows/Other/ExceptionDialog.xaml.cs index e4b4cc1f..97d8c7e0 100644 --- a/ScreenToGif/Windows/Other/ExceptionDialog.xaml.cs +++ b/ScreenToGif/Windows/Other/ExceptionDialog.xaml.cs @@ -6,7 +6,7 @@ namespace ScreenToGif.Windows.Other; -public partial class ExceptionDialog : Window +public partial class ExceptionDialog { #region Properties diff --git a/ScreenToGif/Windows/Other/ExceptionViewer.xaml b/ScreenToGif/Windows/Other/ExceptionViewer.xaml index 958eab08..c82f2f1b 100644 --- a/ScreenToGif/Windows/Other/ExceptionViewer.xaml +++ b/ScreenToGif/Windows/Other/ExceptionViewer.xaml @@ -1,10 +1,10 @@ - + @@ -53,4 +53,4 @@ ContentWidth="20" ContentHeight="20" Padding="5,0" MinWidth="90" Margin="5" IsDefault="True" Click="DoneButton_Click"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/Feedback.xaml b/ScreenToGif/Windows/Other/Feedback.xaml index 3c9d3d78..7aeca4f2 100644 --- a/ScreenToGif/Windows/Other/Feedback.xaml +++ b/ScreenToGif/Windows/Other/Feedback.xaml @@ -1,11 +1,11 @@ - + @@ -183,4 +183,4 @@ ContentWidth="18" ContentHeight="18" Padding="5,0" MinWidth="90" Margin="5" IsCancel="True" Click="CancelButton_Click"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/Feedback.xaml.cs b/ScreenToGif/Windows/Other/Feedback.xaml.cs index 42fd60c4..84492dbc 100644 --- a/ScreenToGif/Windows/Other/Feedback.xaml.cs +++ b/ScreenToGif/Windows/Other/Feedback.xaml.cs @@ -22,7 +22,7 @@ namespace ScreenToGif.Windows.Other; -public partial class Feedback : Window +public partial class Feedback { private ObservableCollection _fileList = new(); diff --git a/ScreenToGif/Windows/Other/FeedbackPreview.xaml b/ScreenToGif/Windows/Other/FeedbackPreview.xaml index 275fe147..9b5ac08d 100644 --- a/ScreenToGif/Windows/Other/FeedbackPreview.xaml +++ b/ScreenToGif/Windows/Other/FeedbackPreview.xaml @@ -1,9 +1,9 @@ - + @@ -25,4 +25,4 @@ ContentWidth="18" ContentHeight="18" Padding="5,0" MinWidth="90" Margin="5" Click="OkButton_Click" IsCancel="True"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/FeedbackPreview.xaml.cs b/ScreenToGif/Windows/Other/FeedbackPreview.xaml.cs index 08a66dae..d484168a 100644 --- a/ScreenToGif/Windows/Other/FeedbackPreview.xaml.cs +++ b/ScreenToGif/Windows/Other/FeedbackPreview.xaml.cs @@ -4,7 +4,7 @@ namespace ScreenToGif.Windows.Other; -public partial class FeedbackPreview : Window +public partial class FeedbackPreview { public string Html { get; set; } diff --git a/ScreenToGif/Windows/Other/GoTo.xaml b/ScreenToGif/Windows/Other/GoTo.xaml index c336d42a..f890af2d 100644 --- a/ScreenToGif/Windows/Other/GoTo.xaml +++ b/ScreenToGif/Windows/Other/GoTo.xaml @@ -1,13 +1,13 @@ - + - + - + @@ -35,4 +35,4 @@ ContentWidth="18" ContentHeight="18" Padding="5,0" MinWidth="90" Margin="5" Command="{StaticResource Command.Cancel}"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/GraphicsConfigurationDialog.xaml b/ScreenToGif/Windows/Other/GraphicsConfigurationDialog.xaml index b8a5a0e3..c4412a50 100644 --- a/ScreenToGif/Windows/Other/GraphicsConfigurationDialog.xaml +++ b/ScreenToGif/Windows/Other/GraphicsConfigurationDialog.xaml @@ -1,10 +1,10 @@ - + @@ -73,4 +73,4 @@ Padding="4,0" MinWidth="90" Margin="5" Click="SendButton_Click"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/GraphicsConfigurationDialog.xaml.cs b/ScreenToGif/Windows/Other/GraphicsConfigurationDialog.xaml.cs index 7907e3bf..94d66e99 100644 --- a/ScreenToGif/Windows/Other/GraphicsConfigurationDialog.xaml.cs +++ b/ScreenToGif/Windows/Other/GraphicsConfigurationDialog.xaml.cs @@ -13,7 +13,7 @@ namespace ScreenToGif.Windows.Other; -public partial class GraphicsConfigurationDialog : Window +public partial class GraphicsConfigurationDialog { #region Properties diff --git a/ScreenToGif/Windows/Other/Insert.xaml b/ScreenToGif/Windows/Other/Insert.xaml index ad7ac506..de6fb53f 100644 --- a/ScreenToGif/Windows/Other/Insert.xaml +++ b/ScreenToGif/Windows/Other/Insert.xaml @@ -1,13 +1,13 @@ - + @@ -249,4 +249,4 @@ ContentWidth="18" ContentHeight="18" Icon="{StaticResource Vector.Cancel}" Click="CancelButton_Click"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/Insert.xaml.cs b/ScreenToGif/Windows/Other/Insert.xaml.cs index 11613a95..aade8dd8 100644 --- a/ScreenToGif/Windows/Other/Insert.xaml.cs +++ b/ScreenToGif/Windows/Other/Insert.xaml.cs @@ -18,7 +18,7 @@ namespace ScreenToGif.Windows.Other; -public partial class Insert : Window +public partial class Insert { #region Variables diff --git a/ScreenToGif/Windows/Other/KeyStrokes.xaml b/ScreenToGif/Windows/Other/KeyStrokes.xaml index ad4c5642..9d6ab468 100644 --- a/ScreenToGif/Windows/Other/KeyStrokes.xaml +++ b/ScreenToGif/Windows/Other/KeyStrokes.xaml @@ -1,9 +1,9 @@ - + @@ -104,4 +104,4 @@ ContentWidth="18" ContentHeight="18" Padding="5,0" MinWidth="90" Margin="5" Click="CancelButton_Click" IsCancel="True"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/KeyStrokes.xaml.cs b/ScreenToGif/Windows/Other/KeyStrokes.xaml.cs index 1aeef6b3..a5564afa 100644 --- a/ScreenToGif/Windows/Other/KeyStrokes.xaml.cs +++ b/ScreenToGif/Windows/Other/KeyStrokes.xaml.cs @@ -8,7 +8,7 @@ namespace ScreenToGif.Windows.Other; -public partial class KeyStrokes : Window +public partial class KeyStrokes { public ObservableCollection InternalList { get; set; } diff --git a/ScreenToGif/Windows/Other/Localization.xaml b/ScreenToGif/Windows/Other/Localization.xaml index f52cdcb5..93c675bd 100644 --- a/ScreenToGif/Windows/Other/Localization.xaml +++ b/ScreenToGif/Windows/Other/Localization.xaml @@ -1,10 +1,10 @@ - + @@ -80,4 +80,4 @@ ContentWidth="18" ContentHeight="18" Padding="5,0" MinWidth="90" Margin="5"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/Localization.xaml.cs b/ScreenToGif/Windows/Other/Localization.xaml.cs index 7843c15d..f3b712b8 100644 --- a/ScreenToGif/Windows/Other/Localization.xaml.cs +++ b/ScreenToGif/Windows/Other/Localization.xaml.cs @@ -19,7 +19,7 @@ namespace ScreenToGif.Windows.Other; -public partial class Localization : Window +public partial class Localization { private IEnumerable _cultures; diff --git a/ScreenToGif/Windows/Other/PickAlbumDialog.xaml b/ScreenToGif/Windows/Other/PickAlbumDialog.xaml index ab53e4af..37cbcd04 100644 --- a/ScreenToGif/Windows/Other/PickAlbumDialog.xaml +++ b/ScreenToGif/Windows/Other/PickAlbumDialog.xaml @@ -1,10 +1,10 @@ - + @@ -51,4 +51,4 @@ ContentWidth="18" ContentHeight="18" Padding="5,0" MinWidth="90" Margin="5" IsCancel="True" Click="FalseActionButton_Click"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/PickAlbumDialog.xaml.cs b/ScreenToGif/Windows/Other/PickAlbumDialog.xaml.cs index 557f51a2..7e5534b8 100644 --- a/ScreenToGif/Windows/Other/PickAlbumDialog.xaml.cs +++ b/ScreenToGif/Windows/Other/PickAlbumDialog.xaml.cs @@ -7,7 +7,7 @@ namespace ScreenToGif.Windows.Other; -public partial class PickAlbumDialog : Window +public partial class PickAlbumDialog { private List AlbumList { get; set; } diff --git a/ScreenToGif/Windows/Other/Preset.xaml b/ScreenToGif/Windows/Other/Preset.xaml index 9094079e..9c784822 100644 --- a/ScreenToGif/Windows/Other/Preset.xaml +++ b/ScreenToGif/Windows/Other/Preset.xaml @@ -1,15 +1,15 @@ - - - + + + - + @@ -114,4 +114,4 @@ ContentWidth="18" ContentHeight="18" Padding="5,0" MinWidth="90" Margin="5" Click="CancelButton_Click" IsCancel="True"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/Preset.xaml.cs b/ScreenToGif/Windows/Other/Preset.xaml.cs index 7f4d124c..d87bf8c4 100644 --- a/ScreenToGif/Windows/Other/Preset.xaml.cs +++ b/ScreenToGif/Windows/Other/Preset.xaml.cs @@ -21,7 +21,7 @@ namespace ScreenToGif.Windows.Other; -public partial class Preset : Window +public partial class Preset { public ExportPreset Current { get; set; } diff --git a/ScreenToGif/Windows/Other/Startup.xaml b/ScreenToGif/Windows/Other/Startup.xaml index b5def6a9..a7f86fdd 100644 --- a/ScreenToGif/Windows/Other/Startup.xaml +++ b/ScreenToGif/Windows/Other/Startup.xaml @@ -1,11 +1,11 @@ + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:n="clr-namespace:ScreenToGif.Controls" + x:Name="StartupWindow" Title="{DynamicResource S.StartUp.Title}" Height="220" Width="500" + MinWidth="500" MinHeight="220" DataContext="{StaticResource AppViewModel}" UseLayoutRounding="True" + Icon="/ScreenToGif;component/Resources/Logo.ico" Initialized="Startup_Initialized" + Loaded="Startup_Loaded" Closing="Startup_Closing"> diff --git a/ScreenToGif/Windows/Other/TestField.xaml b/ScreenToGif/Windows/Other/TestField.xaml index 093bf90c..5a278d8b 100644 --- a/ScreenToGif/Windows/Other/TestField.xaml +++ b/ScreenToGif/Windows/Other/TestField.xaml @@ -1,4 +1,4 @@ - - + diff --git a/ScreenToGif/Windows/Other/TextDialog.xaml b/ScreenToGif/Windows/Other/TextDialog.xaml index 67db4d0f..6b8cbfd1 100644 --- a/ScreenToGif/Windows/Other/TextDialog.xaml +++ b/ScreenToGif/Windows/Other/TextDialog.xaml @@ -1,9 +1,9 @@ - + @@ -38,4 +38,4 @@ ContentWidth="18" ContentHeight="18" Padding="5,0" MinWidth="90" Margin="5" Click="OkButton_Click"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/TextDialog.xaml.cs b/ScreenToGif/Windows/Other/TextDialog.xaml.cs index 4f5b2304..2fec0364 100644 --- a/ScreenToGif/Windows/Other/TextDialog.xaml.cs +++ b/ScreenToGif/Windows/Other/TextDialog.xaml.cs @@ -2,7 +2,7 @@ namespace ScreenToGif.Windows.Other; -public partial class TextDialog : Window +public partial class TextDialog { public string Command { get; set; } public string Output { get; set; } diff --git a/ScreenToGif/Windows/Other/Troubleshoot.xaml b/ScreenToGif/Windows/Other/Troubleshoot.xaml index ee6bce19..38763527 100644 --- a/ScreenToGif/Windows/Other/Troubleshoot.xaml +++ b/ScreenToGif/Windows/Other/Troubleshoot.xaml @@ -1,10 +1,10 @@ - + @@ -74,4 +74,4 @@ ContentWidth="18" ContentHeight="18" Padding="5,0" MinWidth="90" Margin="5" Click="OkButton_Click" IsCancel="True"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/Troubleshoot.xaml.cs b/ScreenToGif/Windows/Other/Troubleshoot.xaml.cs index 07f6d1d0..190fb070 100644 --- a/ScreenToGif/Windows/Other/Troubleshoot.xaml.cs +++ b/ScreenToGif/Windows/Other/Troubleshoot.xaml.cs @@ -13,7 +13,7 @@ namespace ScreenToGif.Windows.Other; -public partial class Troubleshoot : Window +public partial class Troubleshoot { private double _minLeft = SystemParameters.VirtualScreenLeft; private double _minTop = SystemParameters.VirtualScreenTop; diff --git a/ScreenToGif/Windows/Other/Upload.xaml b/ScreenToGif/Windows/Other/Upload.xaml index 0f2fab19..0e276217 100644 --- a/ScreenToGif/Windows/Other/Upload.xaml +++ b/ScreenToGif/Windows/Other/Upload.xaml @@ -1,25 +1,26 @@ - - - + + + - - - + + + - + @@ -122,4 +123,4 @@ Padding="4,0" Margin="5" Click="CancelButton_Click" IsCancel="True"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/Upload.xaml.cs b/ScreenToGif/Windows/Other/Upload.xaml.cs index 0bc0f7a6..0fcea813 100644 --- a/ScreenToGif/Windows/Other/Upload.xaml.cs +++ b/ScreenToGif/Windows/Other/Upload.xaml.cs @@ -12,7 +12,7 @@ namespace ScreenToGif.Windows.Other; -public partial class Upload : Window +public partial class Upload { public UploadPreset CurrentPreset { get; set; } diff --git a/ScreenToGif/Windows/Other/UploadDetailsDialog.xaml b/ScreenToGif/Windows/Other/UploadDetailsDialog.xaml index 15c72bc9..4d78842c 100644 --- a/ScreenToGif/Windows/Other/UploadDetailsDialog.xaml +++ b/ScreenToGif/Windows/Other/UploadDetailsDialog.xaml @@ -1,10 +1,10 @@ - + @@ -64,4 +64,4 @@ ContentWidth="18" ContentHeight="18" Padding="5,0" MinWidth="90" Margin="5" IsCancel="True" Click="CancelButton_Click"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/UploadDetailsDialog.xaml.cs b/ScreenToGif/Windows/Other/UploadDetailsDialog.xaml.cs index 42ac8891..78bb8098 100644 --- a/ScreenToGif/Windows/Other/UploadDetailsDialog.xaml.cs +++ b/ScreenToGif/Windows/Other/UploadDetailsDialog.xaml.cs @@ -7,7 +7,7 @@ namespace ScreenToGif.Windows.Other; -public partial class UploadDetailsDialog : Window +public partial class UploadDetailsDialog { public UploadDetailsDialog() { diff --git a/ScreenToGif/Windows/Other/UploadHistory.xaml b/ScreenToGif/Windows/Other/UploadHistory.xaml index c3d5b032..c8af90e1 100644 --- a/ScreenToGif/Windows/Other/UploadHistory.xaml +++ b/ScreenToGif/Windows/Other/UploadHistory.xaml @@ -1,12 +1,12 @@ - + - + - + @@ -74,4 +74,4 @@ Padding="4,0" Margin="5" Click="OkButton_Click" IsCancel="True"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/UploadHistory.xaml.cs b/ScreenToGif/Windows/Other/UploadHistory.xaml.cs index a70438d2..67052f18 100644 --- a/ScreenToGif/Windows/Other/UploadHistory.xaml.cs +++ b/ScreenToGif/Windows/Other/UploadHistory.xaml.cs @@ -7,7 +7,7 @@ namespace ScreenToGif.Windows.Other; -public partial class UploadHistory : Window +public partial class UploadHistory { public UploadPreset CurrentPreset { get; set; } @@ -16,8 +16,7 @@ public UploadHistory() { InitializeComponent(); } - - + private void Window_Loaded(object sender, RoutedEventArgs e) { DataGrid.ItemsSource = CurrentPreset?.History; @@ -30,7 +29,7 @@ private void DataGrid_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Delete) { - if (!(DataGrid.SelectedItem is History selected)) + if (DataGrid.SelectedItem is not History selected) return; Delete(selected); diff --git a/ScreenToGif/Windows/Other/VideoSource.xaml b/ScreenToGif/Windows/Other/VideoSource.xaml index 6b4b9701..c3c51ca6 100644 --- a/ScreenToGif/Windows/Other/VideoSource.xaml +++ b/ScreenToGif/Windows/Other/VideoSource.xaml @@ -1,11 +1,11 @@ - + @@ -152,4 +152,4 @@ ContentWidth="18" ContentHeight="18" Padding="5,0" MinWidth="90" Margin="5" IsCancel="True" Click="CancelButton_Click"/> - \ No newline at end of file + \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/VideoSource.xaml.cs b/ScreenToGif/Windows/Other/VideoSource.xaml.cs index 6718397f..e71c51ce 100644 --- a/ScreenToGif/Windows/Other/VideoSource.xaml.cs +++ b/ScreenToGif/Windows/Other/VideoSource.xaml.cs @@ -17,7 +17,7 @@ namespace ScreenToGif.Windows.Other; -public partial class VideoSource : Window +public partial class VideoSource { #region Variables From af6e38d96a1c694bc9bb0518e848970727ef6ed8 Mon Sep 17 00:00:00 2001 From: Nicke Manarin Date: Mon, 4 Dec 2023 15:00:48 -0300 Subject: [PATCH 4/9] Removed Gfycat and Flattr features as they are no longer working. --- ScreenToGif.Model/Enums/UploadDestinations.cs | 3 +- ScreenToGif.Model/Enums/UploadService.cs | 2 - .../Models/Upload/Gfycat/GfycatAuthRequest.cs | 25 -- .../Upload/Gfycat/GfycatCreateRequest.cs | 19 -- .../Upload/Gfycat/GfycatCreateResponse.cs | 25 -- .../Upload/Gfycat/GfycatErrorResponse.cs | 13 - .../Upload/Gfycat/GfycatUploadResponse.cs | 55 ---- ScreenToGif.Util/Secret.cs | 4 - .../UploadPresets/Gfycat/GfycatPreset.cs | 132 --------- .../UploadPresets/History/GfycatHistory.cs | 152 ---------- .../UploadPresets/UploadPreset.cs | 2 - ScreenToGif/Cloud/CloudFactory.cs | 2 - ScreenToGif/Cloud/Gfycat.cs | 270 ------------------ .../Localization/StringResources.da.xaml | 2 +- .../Localization/StringResources.de.xaml | 1 - .../Localization/StringResources.el.xaml | 1 - .../Localization/StringResources.en.xaml | 2 +- .../Localization/StringResources.pt.xaml | 2 +- ScreenToGif/UserControls/GfycatPanel.xaml | 144 ---------- ScreenToGif/UserControls/GfycatPanel.xaml.cs | 105 ------- .../Util/Extensions/PresetExtensions.cs | 12 - ScreenToGif/Windows/Options.xaml | 10 +- ScreenToGif/Windows/Options.xaml.cs | 8 +- ScreenToGif/Windows/Other/GoTo.xaml | 5 +- ScreenToGif/Windows/Other/Upload.xaml | 2 - ScreenToGif/Windows/Other/Upload.xaml.cs | 10 - .../Windows/Other/UploadDetailsDialog.xaml | 67 ----- .../Windows/Other/UploadDetailsDialog.xaml.cs | 131 --------- 28 files changed, 16 insertions(+), 1190 deletions(-) delete mode 100644 ScreenToGif.Model/Models/Upload/Gfycat/GfycatAuthRequest.cs delete mode 100644 ScreenToGif.Model/Models/Upload/Gfycat/GfycatCreateRequest.cs delete mode 100644 ScreenToGif.Model/Models/Upload/Gfycat/GfycatCreateResponse.cs delete mode 100644 ScreenToGif.Model/Models/Upload/Gfycat/GfycatErrorResponse.cs delete mode 100644 ScreenToGif.Model/Models/Upload/Gfycat/GfycatUploadResponse.cs delete mode 100644 ScreenToGif.ViewModel/UploadPresets/Gfycat/GfycatPreset.cs delete mode 100644 ScreenToGif.ViewModel/UploadPresets/History/GfycatHistory.cs delete mode 100644 ScreenToGif/Cloud/Gfycat.cs delete mode 100644 ScreenToGif/UserControls/GfycatPanel.xaml delete mode 100644 ScreenToGif/UserControls/GfycatPanel.xaml.cs delete mode 100644 ScreenToGif/Windows/Other/UploadDetailsDialog.xaml delete mode 100644 ScreenToGif/Windows/Other/UploadDetailsDialog.xaml.cs diff --git a/ScreenToGif.Model/Enums/UploadDestinations.cs b/ScreenToGif.Model/Enums/UploadDestinations.cs index 23196c1a..1e3f275a 100644 --- a/ScreenToGif.Model/Enums/UploadDestinations.cs +++ b/ScreenToGif.Model/Enums/UploadDestinations.cs @@ -7,8 +7,7 @@ public enum UploadDestinations { NotDefined = 0, Imgur, - Gfycat, - Yandex, + Yandex = 3, YouTrack, Custom } \ No newline at end of file diff --git a/ScreenToGif.Model/Enums/UploadService.cs b/ScreenToGif.Model/Enums/UploadService.cs index 227479d1..80c7e2d9 100644 --- a/ScreenToGif.Model/Enums/UploadService.cs +++ b/ScreenToGif.Model/Enums/UploadService.cs @@ -8,7 +8,5 @@ public enum UploadService None = 0, ImgurAnonymous = 1, Imgur = 2, - GfycatAnonymous = 3, - Gfycat = 4, Yandex = 5, } \ No newline at end of file diff --git a/ScreenToGif.Model/Models/Upload/Gfycat/GfycatAuthRequest.cs b/ScreenToGif.Model/Models/Upload/Gfycat/GfycatAuthRequest.cs deleted file mode 100644 index a75cc818..00000000 --- a/ScreenToGif.Model/Models/Upload/Gfycat/GfycatAuthRequest.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Runtime.Serialization; - -namespace ScreenToGif.Domain.Models.Upload.Gfycat; - -[DataContract] -public class GfycatAuthRequest -{ - [DataMember(Name = "grant_type", EmitDefaultValue = false)] - public string GrantType { get; set; } - - [DataMember(Name = "client_id", EmitDefaultValue = false)] - public string ClientId { get; set; } - - [DataMember(Name = "client_secret", EmitDefaultValue = false)] - public string ClientSecret { get; set; } - - [DataMember(Name = "username", EmitDefaultValue = false)] - public string Username { get; set; } - - [DataMember(Name = "password", EmitDefaultValue = false)] - public string Password { get; set; } - - [DataMember(Name = "refresh_token", EmitDefaultValue = false)] - public string RefreshToken { get; set; } -} \ No newline at end of file diff --git a/ScreenToGif.Model/Models/Upload/Gfycat/GfycatCreateRequest.cs b/ScreenToGif.Model/Models/Upload/Gfycat/GfycatCreateRequest.cs deleted file mode 100644 index dac4b4ec..00000000 --- a/ScreenToGif.Model/Models/Upload/Gfycat/GfycatCreateRequest.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Runtime.Serialization; - -namespace ScreenToGif.Domain.Models.Upload.Gfycat; - -[DataContract] -public class GfycatCreateRequest -{ - [DataMember(Name = "title", EmitDefaultValue = false)] - public string Tile { get; set; } - - [DataMember(Name = "description", EmitDefaultValue = false)] - public string Description { get; set; } - - [DataMember(Name = "tags", EmitDefaultValue = false)] - public string[] Tags { get; set; } - - [DataMember(Name = "private", EmitDefaultValue = false)] - public bool IsPrivate { get; set; } -} \ No newline at end of file diff --git a/ScreenToGif.Model/Models/Upload/Gfycat/GfycatCreateResponse.cs b/ScreenToGif.Model/Models/Upload/Gfycat/GfycatCreateResponse.cs deleted file mode 100644 index 44b6b91d..00000000 --- a/ScreenToGif.Model/Models/Upload/Gfycat/GfycatCreateResponse.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Runtime.Serialization; - -namespace ScreenToGif.Domain.Models.Upload.Gfycat; - -[DataContract] -public class GfycatCreateResponse -{ - [DataMember(Name = "isOk")] - public string IsOk { get; set; } - - [DataMember(Name = "gfyname")] - public string Name { get; set; } - - [DataMember(Name = "secret")] - public string Secret { get; set; } - - [DataMember(Name = "uploadType")] - public string UploadType { get; set; } - - [DataMember(Name = "errorType")] - public string ErrorType { get; set; } - - [DataMember(Name = "errorMessage")] - public GfycatErrorResponse Error { get; set; } -} \ No newline at end of file diff --git a/ScreenToGif.Model/Models/Upload/Gfycat/GfycatErrorResponse.cs b/ScreenToGif.Model/Models/Upload/Gfycat/GfycatErrorResponse.cs deleted file mode 100644 index 8be93536..00000000 --- a/ScreenToGif.Model/Models/Upload/Gfycat/GfycatErrorResponse.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Runtime.Serialization; - -namespace ScreenToGif.Domain.Models.Upload.Gfycat; - -[DataContract] -public class GfycatErrorResponse -{ - [DataMember(Name = "code", EmitDefaultValue = false)] - public string Code { get; set; } - - [DataMember(Name = "description", EmitDefaultValue = false)] - public string Description { get; set; } -} \ No newline at end of file diff --git a/ScreenToGif.Model/Models/Upload/Gfycat/GfycatUploadResponse.cs b/ScreenToGif.Model/Models/Upload/Gfycat/GfycatUploadResponse.cs deleted file mode 100644 index d46ab7a7..00000000 --- a/ScreenToGif.Model/Models/Upload/Gfycat/GfycatUploadResponse.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System.Runtime.Serialization; - -namespace ScreenToGif.Domain.Models.Upload.Gfycat; - -/// -/// Gfycat upload response. -/// Not used properties: -/// “gfyNumber”, “mobilePosterUrl”, “posterUrl”, “thumb100PosterUrl”, “max5mbGif”, “max2mbGif”, “width”, “height”, -/// “avgColor”, “frameRate”, “numFrames”, “source”, “createDate”, “nsfw”, “likes”, “published”, “dislikes”, “extraLemmas”, “md5”, -/// “views”, “tags”, “userName”, “title”, “description”, “languageCategories”, “task”, “gfyname”, “md5Found” -/// -[DataContract] -public class GfycatUploadResponse -{ - [DataMember(Name = "task", EmitDefaultValue = false)] - public string Task { get; set; } - - [DataMember(Name = "time", EmitDefaultValue = false)] - public int Time { get; set; } - - [DataMember(Name = "gfyname", EmitDefaultValue = false)] - public string GfyName { get; set; } - - - [DataMember(Name = "gfyId", EmitDefaultValue = false)] - public string GfyId { get; set; } - - [DataMember(Name = "gfyName", EmitDefaultValue = false)] - public string GfyNameAux { get; set; } - - [DataMember(Name = "mp4Url", EmitDefaultValue = false)] - public string Mp4Url { get; set; } - - [DataMember(Name = "webmUrl", EmitDefaultValue = false)] - public string WebmUrl { get; set; } - - [DataMember(Name = "gifUrl", EmitDefaultValue = false)] - public string GifUrl { get; set; } - - [DataMember(Name = "mobileUrl", EmitDefaultValue = false)] - public string MobileUrl { get; set; } - - - [DataMember(Name = "mp4Size", EmitDefaultValue = false)] - public int Mp4Size { get; set; } - - [DataMember(Name = "webmSize", EmitDefaultValue = false)] - public int WebmSize { get; set; } - - [DataMember(Name = "gifSize", EmitDefaultValue = false)] - public int GifSize { get; set; } - - [DataMember(Name = "errorMessage", EmitDefaultValue = false)] - public GfycatErrorResponse Error { get; set; } -} \ No newline at end of file diff --git a/ScreenToGif.Util/Secret.cs b/ScreenToGif.Util/Secret.cs index bcc83370..c4a04022 100644 --- a/ScreenToGif.Util/Secret.cs +++ b/ScreenToGif.Util/Secret.cs @@ -17,9 +17,5 @@ public static class Secret public static string ImgurSecret => ""; - public static string GfycatId => ""; - - public static string GfycatSecret => ""; - public static string YandexId => ""; } \ No newline at end of file diff --git a/ScreenToGif.ViewModel/UploadPresets/Gfycat/GfycatPreset.cs b/ScreenToGif.ViewModel/UploadPresets/Gfycat/GfycatPreset.cs deleted file mode 100644 index 664fb506..00000000 --- a/ScreenToGif.ViewModel/UploadPresets/Gfycat/GfycatPreset.cs +++ /dev/null @@ -1,132 +0,0 @@ -using System.ComponentModel; -using System.Globalization; -using ScreenToGif.Domain.Enums; -using ScreenToGif.Domain.Models.Upload.Gfycat; -using ScreenToGif.Util; - -namespace ScreenToGif.ViewModel.UploadPresets.Gfycat; - -public class GfycatPreset : UploadPreset -{ - private string _accessToken = ""; - private string _refreshToken = ""; - private DateTime? _accessTokenExpiryDate; - private DateTime? _refreshTokenExpiryDate; - private bool _askForDetails; - private string _defaultTitle = ""; - private string _defaultDescription = ""; - private string _defaultTags = ""; - private bool _defaultIsPrivate; - private bool _useDirectLinks = false; - private ExportFormats _urlType = ExportFormats.Mp4; - - - public string AccessToken - { - get => _accessToken; - set => SetProperty(ref _accessToken, value); - } - - public string RefreshToken - { - get => _refreshToken; - set => SetProperty(ref _refreshToken, value); - } - - public DateTime? AccessTokenExpiryDate - { - get => _accessTokenExpiryDate; - set => SetProperty(ref _accessTokenExpiryDate, value); - } - - public DateTime? RefreshTokenExpiryDate - { - get => _refreshTokenExpiryDate; - set - { - SetProperty(ref _refreshTokenExpiryDate, value); - OnPropertyChanged(nameof(Status)); - } - } - - - public bool AskForDetails - { - get => _askForDetails; - set => SetProperty(ref _askForDetails, value); - } - - public string DefaultTitle - { - get => _defaultTitle; - set => SetProperty(ref _defaultTitle, value); - } - - public string DefaultDescription - { - get => _defaultDescription; - set => SetProperty(ref _defaultDescription, value); - } - - public string DefaultTags - { - get => _defaultTags; - set => SetProperty(ref _defaultTags, value); - } - - public bool DefaultIsPrivate - { - get => _defaultIsPrivate; - set => SetProperty(ref _defaultIsPrivate, value); - } - - - public bool UseDirectLinks - { - get => _useDirectLinks; - set => SetProperty(ref _useDirectLinks, value); - } - - public ExportFormats UrlType - { - get => _urlType; - set => SetProperty(ref _urlType, value); - } - - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public string Status => RefreshToken == null || !RefreshTokenExpiryDate.HasValue ? - LocalizationHelper.Get("S.Options.Upload.Preset.Info.NotAuthorized") : RefreshTokenExpiryDate < DateTime.UtcNow ? - string.Format(LocalizationHelper.Get("S.Options.Upload.Preset.Info.Expired"), RefreshTokenExpiryDate.Value.ToLocalTime().ToString("g", CultureInfo.CurrentUICulture)) : - string.Format(LocalizationHelper.Get("S.Options.Upload.Preset.Info.Valid"), RefreshTokenExpiryDate.Value.ToLocalTime().ToString("g", CultureInfo.CurrentUICulture)); - - - public GfycatPreset() : base(null, TimeSpan.FromMinutes(1)) - { - Type = UploadDestinations.Gfycat; - ImageId = "Vector.Gfycat"; - AllowedTypes = new List - { - ExportFormats.Gif, - - ExportFormats.Avi, - ExportFormats.Mov, - ExportFormats.Mkv, - ExportFormats.Mp4, - ExportFormats.Webm - }; - } - - public GfycatCreateRequest ToCreateRequest() - { - var tags = DefaultTags?.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries) ?? new string[] { }; - tags = tags.Length > 0 ? tags.Select(s => s.Trim()).ToArray() : null; - - return new GfycatCreateRequest - { - Tile = DefaultTitle, - Description = DefaultDescription, - Tags = tags, - IsPrivate = DefaultIsPrivate - }; - } -} \ No newline at end of file diff --git a/ScreenToGif.ViewModel/UploadPresets/History/GfycatHistory.cs b/ScreenToGif.ViewModel/UploadPresets/History/GfycatHistory.cs deleted file mode 100644 index f79aea25..00000000 --- a/ScreenToGif.ViewModel/UploadPresets/History/GfycatHistory.cs +++ /dev/null @@ -1,152 +0,0 @@ -using System.ComponentModel; -using System.Runtime.Serialization; -using System.Windows; -using System.Windows.Documents; -using System.Windows.Media; -using ScreenToGif.Domain.Enums; -using ScreenToGif.Domain.Interfaces; -using ScreenToGif.Util.Extensions; -using ScreenToGif.ViewModel.UploadPresets.Gfycat; - -namespace ScreenToGif.ViewModel.UploadPresets.History; - -public class GfycatHistory : History -{ - private string _gfyId; - private string _gfyName; - private string _mp4Url; - private string _webmUrl; - private string _gifUrl; - private string _mobileUrl; - private long _webmSize; - private long _gifSize; - - - [DataMember(EmitDefaultValue = false)] - public string GfyId - { - get => _gfyId; - set => SetProperty(ref _gfyId, value); - } - - [DataMember(EmitDefaultValue = false)] - public string GfyName - { - get => _gfyName; - set => SetProperty(ref _gfyName, value); - } - - [DataMember(EmitDefaultValue = false)] - public string Mp4Url - { - get => _mp4Url; - set - { - SetProperty(ref _mp4Url, value); - OnPropertyChanged(nameof(Content)); - } - } - - [DataMember(EmitDefaultValue = false)] - public string WebmUrl - { - get => _webmUrl; - set - { - SetProperty(ref _webmUrl, value); - OnPropertyChanged(nameof(Content)); - } - } - - [DataMember(EmitDefaultValue = false)] - public string GifUrl - { - get => _gifUrl; - set - { - SetProperty(ref _gifUrl, value); - OnPropertyChanged(nameof(Content)); - } - } - - [DataMember(EmitDefaultValue = false)] - public string MobileUrl - { - get => _mobileUrl; - set - { - SetProperty(ref _mobileUrl, value); - OnPropertyChanged(nameof(Content)); - } - } - - [DataMember(EmitDefaultValue = false)] - public long WebmSize - { - get => _webmSize; - set => SetProperty(ref _webmSize, value); - } - - [DataMember(EmitDefaultValue = false)] - public long GifSize - { - get => _gifSize; - set => SetProperty(ref _gifSize, value); - } - - [IgnoreDataMember] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public override FlowDocument Content - { - get - { - var document = new FlowDocument - { - PagePadding = new Thickness(3), - FontFamily = new FontFamily("Segoe UI") - }; - - if (!WasSuccessful) - { - document.Blocks.Add(new Paragraph(new Run(Message))); - return document; - } - - var paragraph = new Paragraph() - .WithKeyLink("S.Options.Upload.History.Detail.Link", Link) - .WithLineBreak() - .WithKeyLink("Mp4:", Mp4Url, true) - .WithLineBreak() - .WithKeyLink("Webm:", WebmUrl, true) - .WithLineBreak() - .WithKeyLink("Gif:", GifUrl, true); - - document.Blocks.Add(paragraph); - return document; - } - } - - - public GfycatHistory() - { - Type = UploadDestinations.Gfycat; - } - - public override string GetLink(IPreset preset) - { - if (!(preset is GfycatPreset gfycatPreset) || !gfycatPreset.UseDirectLinks) - return Link; - - switch (gfycatPreset.UrlType) - { - case ExportFormats.Webm: - return WebmUrl; - - case ExportFormats.Gif: - return GifUrl; - - default: - return Link; - } - } -} \ No newline at end of file diff --git a/ScreenToGif.ViewModel/UploadPresets/UploadPreset.cs b/ScreenToGif.ViewModel/UploadPresets/UploadPreset.cs index 74e6e4df..764ea32d 100644 --- a/ScreenToGif.ViewModel/UploadPresets/UploadPreset.cs +++ b/ScreenToGif.ViewModel/UploadPresets/UploadPreset.cs @@ -104,8 +104,6 @@ public string TypeName { case UploadDestinations.Imgur: return "Imgur"; - case UploadDestinations.Gfycat: - return "Gfycat"; case UploadDestinations.Yandex: return "Yandex"; case UploadDestinations.Custom: diff --git a/ScreenToGif/Cloud/CloudFactory.cs b/ScreenToGif/Cloud/CloudFactory.cs index 7b6dc0c3..0d11c1ec 100644 --- a/ScreenToGif/Cloud/CloudFactory.cs +++ b/ScreenToGif/Cloud/CloudFactory.cs @@ -12,8 +12,6 @@ public static IUploader CreateCloud(UploadDestinations service) { case UploadDestinations.Imgur: return new Imgur(); - case UploadDestinations.Gfycat: - return new Gfycat(); case UploadDestinations.Yandex: return new YandexDisk(); } diff --git a/ScreenToGif/Cloud/Gfycat.cs b/ScreenToGif/Cloud/Gfycat.cs deleted file mode 100644 index 158a0585..00000000 --- a/ScreenToGif/Cloud/Gfycat.cs +++ /dev/null @@ -1,270 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.IO; -using System.Threading; -using System.Threading.Tasks; -using System.Windows; -using ScreenToGif.Domain.Interfaces; -using ScreenToGif.Domain.Models.Upload.Gfycat; -using ScreenToGif.Util; -using ScreenToGif.ViewModel.UploadPresets.Gfycat; -using ScreenToGif.ViewModel.UploadPresets.History; -using ScreenToGif.Windows.Other; - -namespace ScreenToGif.Cloud; - -public class Gfycat : IUploader -{ - public async Task UploadFileAsync(IUploadPreset preset, string path, CancellationToken cancellationToken, IProgress progressCallback = null) - { - if (preset is not GfycatPreset gfycatPreset) - throw new Exception("Gfycat preset is null."); - - if (!await IsAuthorized(gfycatPreset)) - throw new UploadException("It was not possible to get the authorization to upload to Gfycat."); - - var headers = new NameValueCollection - { - { "Authorization", "Bearer " + gfycatPreset.AccessToken } - }; - - if (cancellationToken.IsCancellationRequested) - return null; - - return await Upload(gfycatPreset, path, headers); - } - - private async Task Upload(GfycatPreset preset, string path, NameValueCollection headers) - { - var create = preset.AskForDetails ? Application.Current.Dispatcher.Invoke(() => UploadDetailsDialog.OkCancel(preset)) : preset.ToCreateRequest(); - - var result = await WebHelper.Post("https://api.gfycat.com/v1/gfycats", Serializer.Serialize(create), headers); - var createResponse = Serializer.Deserialize(result); - - if (createResponse.Error != null) - return new GfycatHistory - { - PresetName = preset.Title, - DateInUtc = DateTime.UtcNow, - Result = 400, - GfyName = createResponse.Name, - Message = createResponse.Error.Code + " - " + createResponse.Error.Description - }; - - await using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) - { - var args = new Dictionary - { - { "key", createResponse.Name } - }; - - //I can't send the authorization header along the file upload. - result = await WebHelper.SendFile("https://filedrop.gfycat.com", stream, createResponse.Name, args); - - //If response is empty/null, it means that the file was already processed. - var uploadResponse = string.IsNullOrWhiteSpace(result) ? null : Serializer.Deserialize(result); - - while (uploadResponse?.Task != "complete") - { - result = await WebHelper.Get("https://api.gfycat.com/v1/gfycats/fetch/status/" + createResponse.Name, headers); - uploadResponse = Serializer.Deserialize(result); - - if (uploadResponse.Task != "complete") - Thread.Sleep(1000); - else if (uploadResponse.Task == "error") - return new GfycatHistory - { - PresetName = preset.Title, - DateInUtc = DateTime.UtcNow, - Result = 400, - GfyName = createResponse.Name, - Message = uploadResponse.Error?.Code + " - " + uploadResponse.Error?.Description - }; - } - - var history = new GfycatHistory - { - PresetName = preset.Title, - DateInUtc = DateTime.UtcNow, - Result = 200, - Link = "https://gfycat.com/" + uploadResponse.GfyName, - Size = uploadResponse.Mp4Size, - DeletionLink = "https://gfycat.com/delete/" + createResponse.Secret, - Mp4Url = uploadResponse.Mp4Url, - WebmUrl = uploadResponse.WebmUrl, - GifUrl = uploadResponse.GifUrl, - MobileUrl = uploadResponse.MobileUrl, - WebmSize = uploadResponse.WebmSize, - GifSize = uploadResponse.GifSize, - GfyId = uploadResponse.GfyId, - GfyName = uploadResponse.GfyName - }; - - return history; - } - } - - [Obsolete("Maybe switch to using HttpClient, as it's a better solution")] - public Task UploadFileAsync(string path, CancellationToken cancellationToken, IProgress progressCallback = null) - { - //var handler = new HttpClientHandler - //{ - // Proxy = WebHelper.GetProxy(), - // PreAuthenticate = true, - // UseDefaultCredentials = false, - //}; - - //using (var client = new HttpClient(handler)) - //{ - // //var request = new HttpRequestMessage - // //{ - // // RequestUri = new Uri("https://api.gfycat.com/v1/gfycats"), - // // Method = HttpMethod.Get, - // // Headers = { { "", ""} } - // //}; - - // using (var res = await client.PostAsync(@"https://api.gfycat.com/v1/gfycats", null, cancellationToken)) - // { - // var result = await res.Content.ReadAsStringAsync(); - // //{"isOk":true,"gfyname":"ThreeWordCode","secret":"15alphanumerics","uploadType":"filedrop.gfycat.com"} - - // var ser = new JavaScriptSerializer(); - - // if (!(ser.DeserializeObject(result) is Dictionary thing)) - // throw new Exception("It was not possible to get the gfycat name: " + res); - - // var name = thing["gfyname"] as string; - - // using (var content = new MultipartFormDataContent()) - // { - // content.Add(new StringContent(name), "key"); - // content.Add(new ByteArrayContent(File.ReadAllBytes(path)), "file", name); - - // using (var res2 = await client.PostAsync("https://filedrop.gfycat.com", content, cancellationToken)) - // { - // if (!res2.IsSuccessStatusCode) - // throw new Exception("It was not possible to get the gfycat upload result: " + res2); - - // //{"task": "complete", "gfyname": "ThreeWordCode"} - // //{"progress": "0.03", "task": "encoding", "time": 10} - - // //If the task is not yet completed, try waiting. - // var input2 = ""; - - // while (!input2.Contains("complete")) - // { - // using (var res3 = await client.GetAsync("https://api.gfycat.com/v1/gfycats/fetch/status/" + name, cancellationToken)) - // { - // input2 = await res3.Content.ReadAsStringAsync(); - - // if (!res3.IsSuccessStatusCode) - // throw new UploadingException("It was not possible to get the gfycat upload status: " + res3); - // } - - // if (!input2.Contains("complete")) - // Thread.Sleep(1000); - // } - - // if (res2.IsSuccessStatusCode) - // return new History { Link = "https://gfycat.com/" + name }; - // } - // } - // } - //} - - throw new UploadException("Unknown error"); - } - - - public static async Task GetTokens(GfycatPreset preset) - { - var auth = new GfycatAuthRequest - { - GrantType = "client_credentials", - ClientId = Secret.GfycatId, - ClientSecret = Secret.GfycatSecret - }; - - return await GetTokens(preset, auth); - } - - public static async Task GetTokens(GfycatPreset preset, string username, string password) - { - var auth = new GfycatAuthRequest - { - GrantType = "password", - ClientId = Secret.GfycatId, - ClientSecret = Secret.GfycatSecret, - Username = username, - Password = password - }; - - return await GetTokens(preset, auth); - } - - public static async Task RefreshToken(GfycatPreset preset) - { - var auth = new GfycatAuthRequest - { - GrantType = "refresh", - ClientId = Secret.GfycatId, - ClientSecret = Secret.GfycatSecret, - RefreshToken = preset.RefreshToken - }; - - return await GetTokens(preset, auth); - } - - - public static bool IsAuthorizationExpired(GfycatPreset preset) - { - return DateTime.UtcNow > preset.AccessTokenExpiryDate; - } - - public static async Task IsAuthorized(IUploadPreset preset) - { - if (preset is not GfycatPreset gfycatPreset) - return false; - - //When in anonymous mode, only the access token is used. - if (preset.IsAnonymous) - { - //If the access token is still valid, no need to refresh it. - if (!string.IsNullOrWhiteSpace(gfycatPreset.AccessToken) && IsAuthorizationExpired(gfycatPreset)) - return true; - - if (!await GetTokens(gfycatPreset)) - return false; - } - - //When in authenticated mode, if there's no refresh token, it means that the app if not authorized. - if (string.IsNullOrWhiteSpace(gfycatPreset.RefreshToken)) - return false; - - if (!IsAuthorizationExpired(gfycatPreset)) - return true; - - return await RefreshToken(gfycatPreset); - } - - - private static async Task GetTokens(GfycatPreset preset, GfycatAuthRequest auth) - { - var response = await WebHelper.Post("https://api.gfycat.com/v1/oauth/token", Serializer.Serialize(auth)); - - if (string.IsNullOrEmpty(response)) - return false; - - var token = Serializer.Deserialize(response); - - if (string.IsNullOrEmpty(token?.AccessToken)) - return false; - - preset.AccessToken = token.AccessToken; - preset.RefreshToken = token.RefreshToken; - preset.AccessTokenExpiryDate = DateTime.UtcNow + TimeSpan.FromSeconds(token.ExpiresIn - 10); - preset.RefreshTokenExpiryDate = DateTime.UtcNow + TimeSpan.FromSeconds(token.RefreshTokenExpiresIn - 10); - return true; - } -} \ No newline at end of file diff --git a/ScreenToGif/Resources/Localization/StringResources.da.xaml b/ScreenToGif/Resources/Localization/StringResources.da.xaml index 04dbc522..2ef52ea9 100644 --- a/ScreenToGif/Resources/Localization/StringResources.da.xaml +++ b/ScreenToGif/Resources/Localization/StringResources.da.xaml @@ -598,7 +598,7 @@ Åbner Paypals hjemmeside. Vælg selv valuta. Abonnér Donér månedligt via Patreon. - Donér månedligt via Flattr. + Donér via Stripe. Spilgaver Spilgaver via Steam. Spilgaver via GOG. diff --git a/ScreenToGif/Resources/Localization/StringResources.de.xaml b/ScreenToGif/Resources/Localization/StringResources.de.xaml index 21820860..615c8f84 100644 --- a/ScreenToGif/Resources/Localization/StringResources.de.xaml +++ b/ScreenToGif/Resources/Localization/StringResources.de.xaml @@ -600,7 +600,6 @@ Öffnet PayPal-Webseite. Sie müssen eine Währung auswählen. Abonnieren Monatlich via Patreon spenden - Monatlich via Flattr spenden Spiele als Geschenk Spiele als Geschenk via Steam Spiele als Geschenk via GOG diff --git a/ScreenToGif/Resources/Localization/StringResources.el.xaml b/ScreenToGif/Resources/Localization/StringResources.el.xaml index f979a44f..ab4dd891 100644 --- a/ScreenToGif/Resources/Localization/StringResources.el.xaml +++ b/ScreenToGif/Resources/Localization/StringResources.el.xaml @@ -517,7 +517,6 @@ Ανοίγει τον ιστότοπο Paypal. Πρέπει να επιλέξετε το νόμισμα. Εγγραφείτε Μηνιαία Δωρεά μέσω Patreon. - Μηνιαία Δωρεά μέσω Flattr. Δωρίστε παιχνίδια Δωρίστε παιχνίδια μέσω του Steam. Δωρίστε παιχνίδια μέσω του GOG. diff --git a/ScreenToGif/Resources/Localization/StringResources.en.xaml b/ScreenToGif/Resources/Localization/StringResources.en.xaml index 20966ef9..a1937676 100644 --- a/ScreenToGif/Resources/Localization/StringResources.en.xaml +++ b/ScreenToGif/Resources/Localization/StringResources.en.xaml @@ -601,7 +601,7 @@ Opens the Paypal website. You must select the currency. Subscribe Donate monthly via Patreon. - Donate monthly via Flattr. + Donate via Stripe. Gift games Gift games via Steam. Gift games via GOG. diff --git a/ScreenToGif/Resources/Localization/StringResources.pt.xaml b/ScreenToGif/Resources/Localization/StringResources.pt.xaml index b7b35f67..1f0c319c 100644 --- a/ScreenToGif/Resources/Localization/StringResources.pt.xaml +++ b/ScreenToGif/Resources/Localization/StringResources.pt.xaml @@ -601,7 +601,7 @@ Abre o site do Paypal. Você deve selecionar a moeda. Inscrever Doar mensalmente via Patreon. - Doar mensalmente via Flattr. + Doar via Stripe. Doe jogos Doe jogos via Steam. Doe jogos via GOG. diff --git a/ScreenToGif/UserControls/GfycatPanel.xaml b/ScreenToGif/UserControls/GfycatPanel.xaml deleted file mode 100644 index 2b427aa4..00000000 --- a/ScreenToGif/UserControls/GfycatPanel.xaml +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ScreenToGif/UserControls/GfycatPanel.xaml.cs b/ScreenToGif/UserControls/GfycatPanel.xaml.cs deleted file mode 100644 index 28f7cb19..00000000 --- a/ScreenToGif/UserControls/GfycatPanel.xaml.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using ScreenToGif.Cloud; -using ScreenToGif.Domain.Interfaces; -using ScreenToGif.Util; -using ScreenToGif.Util.Settings; -using ScreenToGif.ViewModel.UploadPresets; -using ScreenToGif.ViewModel.UploadPresets.Gfycat; -using ScreenToGif.Windows.Other; - -namespace ScreenToGif.UserControls; - -public partial class GfycatPanel : UserControl, IPanel -{ - private string _originalTitle = ""; - - public GfycatPanel() - { - InitializeComponent(); - } - - - private void Panel_Loaded(object sender, RoutedEventArgs e) - { - _originalTitle = NameTextBox.Text.Trim(); - - NameTextBox.Focus(); - } - - private async void AuthorizeButton_Click(object sender, RoutedEventArgs e) - { - if (DataContext is not GfycatPreset preset) - return; - - if (string.IsNullOrWhiteSpace(UserTextBox.Text) || PasswordTextBox.SecurePassword.Length < 1) - { - StatusBand.Warning(LocalizationHelper.Get("S.Options.Upload.Preset.Warning.Credentials")); - return; - } - - try - { - ThisPanel.IsEnabled = false; - StatusBand.Hide(); - - //When in authenticated mode, the user must authorize the app by using the username and password. - if (await Gfycat.GetTokens(preset, UserTextBox.Text, PasswordTextBox.Password)) - { - StatusBand.Info(LocalizationHelper.Get("S.Options.Upload.Preset.Info.Authorized")); - UserTextBox.Clear(); - PasswordTextBox.Clear(); - return; - } - - StatusBand.Warning(LocalizationHelper.Get("S.Options.Upload.Preset.Warning.AuthError")); - UserTextBox.Focus(); - } - catch (Exception ex) - { - LogWriter.Log(ex, "Authorizing access - Gfycat"); - - StatusBand.Error(LocalizationHelper.Get("S.Options.Upload.Preset.Warning.AuthError"), () => new ExceptionViewer(ex).ShowDialog()); - UserTextBox.Focus(); - } - finally - { - ThisPanel.IsEnabled = true; - } - } - - - public async Task IsValid() - { - if (DataContext is not GfycatPreset preset) - return false; - - if (string.IsNullOrWhiteSpace(preset.Title)) - { - StatusBand.Warning(LocalizationHelper.Get("S.Options.Upload.Preset.Warning.Title")); - return false; - } - - if (UserSettings.All.UploadPresets.OfType().Any(a => a.Title != _originalTitle && a.Title == preset.Title.Trim())) - { - StatusBand.Warning(LocalizationHelper.Get("S.Options.Upload.Preset.Warning.Repeated")); - return false; - } - - if (!preset.IsAnonymous && !await Gfycat.IsAuthorized(preset)) - { - StatusBand.Warning(LocalizationHelper.Get("S.Options.Upload.Preset.Warning.Authenticate")); - return false; - } - - return true; - } - - public UploadPreset GetPreset() - { - return DataContext as GfycatPreset; - } -} \ No newline at end of file diff --git a/ScreenToGif/Util/Extensions/PresetExtensions.cs b/ScreenToGif/Util/Extensions/PresetExtensions.cs index 737a6136..65701413 100644 --- a/ScreenToGif/Util/Extensions/PresetExtensions.cs +++ b/ScreenToGif/Util/Extensions/PresetExtensions.cs @@ -5,7 +5,6 @@ using ScreenToGif.Domain.Enums; using ScreenToGif.Util.Settings; using ScreenToGif.ViewModel.UploadPresets; -using ScreenToGif.ViewModel.UploadPresets.Gfycat; using ScreenToGif.ViewModel.UploadPresets.Imgur; using ScreenToGif.ViewModel.UploadPresets.Yandex; using ScreenToGif.Windows; @@ -29,9 +28,6 @@ public static async Task IsValid(UploadPreset preset) { switch (preset) { - case GfycatPreset gfycat: - return await IsValid(gfycat); - case ImgurPreset imgur: return await IsValid(imgur); @@ -42,14 +38,6 @@ public static async Task IsValid(UploadPreset preset) return await preset.IsValid(); } - public static async Task IsValid(GfycatPreset preset) - { - if (!preset.IsAnonymous && !await Gfycat.IsAuthorized(preset)) - return new ValidatedEventArgs("S.SaveAs.Warning.Upload.NotAuthorized", StatusReasons.UploadServiceUnauthorized, () => App.MainViewModel.OpenOptions.Execute(Options.UploadIndex)); - - return await preset.IsValid(); - } - public static async Task IsValid(ImgurPreset preset) { if (!preset.IsAnonymous && !await Imgur.IsAuthorized(preset)) diff --git a/ScreenToGif/Windows/Options.xaml b/ScreenToGif/Windows/Options.xaml index 501a2a23..ae2b9840 100644 --- a/ScreenToGif/Windows/Options.xaml +++ b/ScreenToGif/Windows/Options.xaml @@ -1711,20 +1711,20 @@ FontStyle="Italic" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5" TextWrapping="Wrap"/> - + - + Click="StripeButton_Click" Style="{StaticResource Style.Button.Horizontal.Special}" + ToolTipService.ToolTip="https://donate.stripe.com/cN23dfaz9dJW1wc000" ToolTipService.Placement="Top" ToolTipService.HorizontalOffset="-5"/> - diff --git a/ScreenToGif/Windows/Options.xaml.cs b/ScreenToGif/Windows/Options.xaml.cs index 3488b0ac..5d5d3edc 100644 --- a/ScreenToGif/Windows/Options.xaml.cs +++ b/ScreenToGif/Windows/Options.xaml.cs @@ -1786,17 +1786,17 @@ private void PatreonButton_Click(object sender, RoutedEventArgs e) } } - private void FlattrButton_Click(object sender, RoutedEventArgs e) + private void StripeButton_Click(object sender, RoutedEventArgs e) { try { - ProcessHelper.StartWithShell("https://flattr.com/@NickeManarin/domain/screentogif.com"); + ProcessHelper.StartWithShell("https://donate.stripe.com/cN23dfaz9dJW1wc000"); } catch (Exception ex) { - LogWriter.Log(ex, "Error • Opening the Flattr website"); + LogWriter.Log(ex, "Error • Opening the Stripe website"); - ErrorDialog.Ok(LocalizationHelper.Get("S.Options.Title"), "Error opening the Flattr website", ex.Message, ex); + ErrorDialog.Ok(LocalizationHelper.Get("S.Options.Title"), "Error opening the Stripe website", ex.Message, ex); } } diff --git a/ScreenToGif/Windows/Other/GoTo.xaml b/ScreenToGif/Windows/Other/GoTo.xaml index f890af2d..434e0d36 100644 --- a/ScreenToGif/Windows/Other/GoTo.xaml +++ b/ScreenToGif/Windows/Other/GoTo.xaml @@ -2,7 +2,7 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:n="clr-namespace:ScreenToGif.Controls" - Title="{DynamicResource S.GoTo.Title}" SizeToContent="WidthAndHeight" MinHeight="150" MinWidth="330" ResizeMode="CanMinimize" + Title="{DynamicResource S.GoTo.Title}" MinHeight="180" Height="180" MinWidth="340" Width="340" ResizeMode="CanMinimize" Icon="/ScreenToGif;component/Resources/Logo.ico" WindowStartupLocation="CenterOwner" Loaded="Window_Loaded"> @@ -13,6 +13,7 @@ + @@ -21,7 +22,7 @@ - + diff --git a/ScreenToGif/Windows/Other/Upload.xaml b/ScreenToGif/Windows/Other/Upload.xaml index 0e276217..4321bf99 100644 --- a/ScreenToGif/Windows/Other/Upload.xaml +++ b/ScreenToGif/Windows/Other/Upload.xaml @@ -5,7 +5,6 @@ xmlns:c="clr-namespace:ScreenToGif.Util.Converters;assembly=ScreenToGif.Util" xmlns:u="clr-namespace:ScreenToGif.Util" xmlns:p="clr-namespace:ScreenToGif.ViewModel.UploadPresets;assembly=ScreenToGif.ViewModel" - xmlns:g="clr-namespace:ScreenToGif.ViewModel.UploadPresets.Gfycat;assembly=ScreenToGif.ViewModel" xmlns:i="clr-namespace:ScreenToGif.ViewModel.UploadPresets.Imgur;assembly=ScreenToGif.ViewModel" xmlns:y="clr-namespace:ScreenToGif.ViewModel.UploadPresets.Yandex;assembly=ScreenToGif.ViewModel" Title="{DynamicResource S.Options.Upload.Preset.Title}" Width="400" Height="500" MinWidth="380" MinHeight="300" @@ -89,7 +88,6 @@ - diff --git a/ScreenToGif/Windows/Other/Upload.xaml.cs b/ScreenToGif/Windows/Other/Upload.xaml.cs index 0fcea813..cf831c9c 100644 --- a/ScreenToGif/Windows/Other/Upload.xaml.cs +++ b/ScreenToGif/Windows/Other/Upload.xaml.cs @@ -6,7 +6,6 @@ using ScreenToGif.UserControls; using ScreenToGif.Util; using ScreenToGif.ViewModel.UploadPresets; -using ScreenToGif.ViewModel.UploadPresets.Gfycat; using ScreenToGif.ViewModel.UploadPresets.Imgur; using ScreenToGif.ViewModel.UploadPresets.Yandex; @@ -46,9 +45,6 @@ private void Window_Loaded(object sender, RoutedEventArgs e) if (!ImgurPresetItem.AllowedTypes.Contains(Type.Value)) TypeComboBox.Items.Remove(ImgurPresetItem); - - if (!GfycatPresetItem.AllowedTypes.Contains(Type.Value)) - TypeComboBox.Items.Remove(GfycatPresetItem); } TypeComboBox.Focus(); @@ -74,9 +70,6 @@ private void TypeComboBox_Selected(object sender, RoutedEventArgs e) case UploadDestinations.Imgur: CurrentPreset = new ImgurPreset(); break; - case UploadDestinations.Gfycat: - CurrentPreset = new GfycatPreset(); - break; case UploadDestinations.Yandex: CurrentPreset = new YandexPreset(); break; @@ -88,9 +81,6 @@ private void TypeComboBox_Selected(object sender, RoutedEventArgs e) case UploadDestinations.Imgur: MainPresenter.Content = new ImgurPanel { DataContext = CurrentPreset }; break; - case UploadDestinations.Gfycat: - MainPresenter.Content = new GfycatPanel { DataContext = CurrentPreset }; - break; case UploadDestinations.Yandex: MainPresenter.Content = new YandexPanel { DataContext = CurrentPreset }; break; diff --git a/ScreenToGif/Windows/Other/UploadDetailsDialog.xaml b/ScreenToGif/Windows/Other/UploadDetailsDialog.xaml deleted file mode 100644 index 4d78842c..00000000 --- a/ScreenToGif/Windows/Other/UploadDetailsDialog.xaml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ScreenToGif/Windows/Other/UploadDetailsDialog.xaml.cs b/ScreenToGif/Windows/Other/UploadDetailsDialog.xaml.cs deleted file mode 100644 index 78bb8098..00000000 --- a/ScreenToGif/Windows/Other/UploadDetailsDialog.xaml.cs +++ /dev/null @@ -1,131 +0,0 @@ -using System; -using System.Linq; -using System.Windows; -using System.Windows.Input; -using ScreenToGif.Domain.Models.Upload.Gfycat; -using ScreenToGif.ViewModel.UploadPresets.Gfycat; - -namespace ScreenToGif.Windows.Other; - -public partial class UploadDetailsDialog -{ - public UploadDetailsDialog() - { - InitializeComponent(); - } - - #region Methods - - private void PrepareOk(GfycatPreset preset) - { - TitleTextBox.Text = preset.DefaultTitle; - DescriptionTextBox.Text = preset.DefaultDescription; - TagsTextBox.Text = preset.DefaultTags; - IsPrivateCheckBox.IsChecked = preset.DefaultIsPrivate; - - CancelButton.Visibility = Visibility.Collapsed; - AcceptButton.Focus(); - } - - private void PrepareOkCancel(GfycatPreset preset) - { - TitleTextBox.Text = preset.DefaultTitle; - DescriptionTextBox.Text = preset.DefaultDescription; - TagsTextBox.Text = preset.DefaultTags; - IsPrivateCheckBox.IsChecked = preset.DefaultIsPrivate; - - CancelButton.Focus(); - } - - /// - /// Handle all pressed keys that get sent to this Window - /// - private void DialogKeyDown(object sender, KeyEventArgs e) - { - switch (e.Key) - { - case Key.NumPad1: - case Key.D1: - case Key.Y: - DialogResult = true; //[Y]/[1] will answer 'Yes'. - break; - case Key.NumPad2: - case Key.D2: - case Key.Escape: - case Key.N: - DialogResult = false; //[ESC]/[2]/[N] will answer 'No'. - break; - } - } - - /// - /// Shows a Ok dialog. - /// - /// True if Ok - public static GfycatCreateRequest Ok(GfycatPreset preset) - { - var dialog = new UploadDetailsDialog(); - dialog.PrepareOk(preset); - var result = dialog.ShowDialog(); - - if (!result.HasValue || !result.Value) - return null; - - var tags = dialog.TagsTextBox.Text.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); - tags = tags.Length > 0 ? tags.Select(s => s.Trim()).ToArray() : null; - - return new GfycatCreateRequest - { - Tile = dialog.TitleTextBox.Text, - Description = dialog.DescriptionTextBox.Text, - Tags = tags, - IsPrivate = dialog.IsPrivateCheckBox.IsChecked == true - }; - } - - /// - /// Shows a Ok/Cancel dialog. - /// - /// True if Ok - public static GfycatCreateRequest OkCancel(GfycatPreset preset) - { - var dialog = new UploadDetailsDialog(); - dialog.PrepareOkCancel(preset); - var result = dialog.ShowDialog(); - - if (!result.HasValue || !result.Value) - return null; - - var tags = dialog.TagsTextBox.Text.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); - tags = tags.Length > 0 ? tags.Select(s => s.Trim()).ToArray() : null; - - return new GfycatCreateRequest - { - Tile = dialog.TitleTextBox.Text, - Description = dialog.DescriptionTextBox.Text, - Tags = tags, - IsPrivate = dialog.IsPrivateCheckBox.IsChecked == true - }; - } - - #endregion - - #region Events - - private void Dialog_Loaded(object sender, RoutedEventArgs e) - { - TitleTextBox.Focus(); - } - - private void AcceptButton_Click(object sender, RoutedEventArgs e) - { - DialogResult = true; - } - - private void CancelButton_Click(object sender, RoutedEventArgs e) - { - DialogResult = false; - } - - #endregion -} \ No newline at end of file From 9018012f08b11b9fb2a640598ef46f2f4de02832 Mon Sep 17 00:00:00 2001 From: Nicke Manarin Date: Mon, 4 Dec 2023 15:12:06 -0300 Subject: [PATCH 5/9] Czech translation --- .../Localization/StringResources.cs.xaml | 1805 +++++++++++------ 1 file changed, 1182 insertions(+), 623 deletions(-) diff --git a/ScreenToGif/Resources/Localization/StringResources.cs.xaml b/ScreenToGif/Resources/Localization/StringResources.cs.xaml index 14e83839..07356479 100644 --- a/ScreenToGif/Resources/Localization/StringResources.cs.xaml +++ b/ScreenToGif/Resources/Localization/StringResources.cs.xaml @@ -8,17 +8,18 @@ - Ok + OK Zpět Zrušit Ano Ne Přidat - + Úpravy Id Název Popis - + Po kliknutí vyberte barvu. + Kliknutím přejdete do dokumentace. Potlačit Náhled Velikost @@ -27,23 +28,45 @@ Zpoždění Zpoždění (ms): Hodnota -+ (ms): - + Procent: Vnější okraj: Vnitřní okraj: - - - - Ach ne, aplikace přestala pracovat :( - - - - - - - + Výška min.: + a/nebo + + + Ale ne, aplikace přestala pracovat... :( + Vyžadováno + Chybějící závislost + .Net Framework 4.8 není nainstalován + Abyste mohli tuto aplikaci bez problémů používat, potřebujete správnou verzi .Net Framework. Chcete otevřít webovou stránku pro její stažení? + Povolena pouze jedna instance + Aplikace již je spuštěna + ScreenToGif je již spuštěn, ale zřejmě není vidět žádné jeho okno. Zkontrolujte SysTray, ikona ScreenToGif by tam měla být... + + Uložit nastavení + Chcete se pokusit znovu o uložení? + Vypadá to, že ScreenToGif nemá dostatečná práva k uložení nastavení na disk. Chcete to zkusit znovu, ale tentokrát s použitím práv správce? + Ukončení ScreenToGif Jste si jisti, že chcete aplikaci ukončit? - Všechna okna budou uzavřena a ikona bude odstraněna z hlavní lišty. + Všechna okna budou uzavřena a ikona bude odstraněna z lišty. + + + Přepnutí grafického adaptéru + Přepnutí na správný grafický adaptér pro zachycení vybrané obrazovky + Vzhledem k omezení DirectX musí být ScreenToGif spuštěn na stejném grafickém adaptéru jako snímaná obrazovka. + Přepněte grafický adaptér pro aplikaci ScreenToGif otevřením nabídky Nastavení systému Windows > Systém > Obrazovka > Nastavení grafiky nebo kliknutím na níže uvedený odkaz. + Přepněte grafický adaptér pro ScreenToGif pomocí nastavení grafického adaptéru. + Otevřít Nastavení Windows + + + Enter + Esc + Mezerník + + + Pravý klik Nový záznam obrazovky @@ -52,233 +75,274 @@ Ukončení - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Nové nahrání obrazovky + Nové nahrání webové kamery + Nové nahrání plátna + Nová animace + Připojit nahrání obrazovky + Připojit nahrání webové kamery + Připojit nahrání plátna + Připojit obsah souboru (obrázek, animace, video) + Uložit editovaný soubor jako... + Otevřít soubor (animaci, video či projekt) + Načíst nedávný projekt + Zahodit aktuální projekt + Změnit prodlevy snímků + Zmenšit/zvětšit prodlevu zobrazení snímku + Změnit prodlevy snímků procentuálně + Zvětšení 100% + Přizpůsobit okno velikosti snímku + Přizpůsobit snímek velikosti okna + Vybrat první snímek + Vybrat předchozí snímek + Přehrát animaci + Vybrat následující rámec + Vybrat poslední snímek + Odvolat poslední změnu + Vrátit poslední "zpět" + Odvolat všechny změny + Zkopírování vybraných snímků do schránky + Vyjmout vybrané snímky a vložit je do schránky + Vložit snímky ze schránky + Smazat všechny vybrané snímky + Smazat všechny předchozí snímky + Smazat všechny následující snímky + Smazat duplicitní snímky + Omezit počet snímků + Vytvořit plynulou smyčku animace + Obrátit animaci + Připojit kopii animace v opačném pořadí. + Posun vybraného snímku vlevo + Posun vybraného snímku vpravo + Změnit velikost všech snímků + Oříznout všechny snímky + Otočit nebo překlopit snímky + Přidat na vybrané snímky nadpis + Přidání plovoucího textu na vybrané snímky + Přidat úvodní snímek s titulkem + Úprava zaznamenaných stisků kláves během nahrávání + Volné kreslení + Přidat kresbu + Kliknutí myší + Vybrat obrázek a použít ho jako vodoznak + Přidat okraj + Přidat vržený stín + Skrytí citlivých částí snímků + Pomocí nástrojů pro kreslení vyberte, které části snímku nemají zůstat během animace statické. + Ukazatel průběhu nebo času přehrávání + Vybrat všechny snímky + Přejít na snímek podle indexu + Obrátit výběr + Zrušit označení všech + Přechod do snímku nebo barvy + Prolnutí s následujícím snímkem + Skrýt dokončená enkódování + Posun nahoru + Posun dolů + Přidat + Otevřít + Upravit vybrané + Uložit vybrané + Smazat vybrané + Zobrazit historii - ScreenToGif - StartUp + ScreenToGif - spuštění Záznamník - Otevře záznamník plochy, který umožňuje nahrát vybranou plochu. + Otevře záznamník, který umožňuje nahrát vybranou oblast obrazovky. Webová kamera Otevře záznamník webové kamery. Plátno Otevře záznamník plátna, který umožňuje nahrát kresbu. Editor - Otevře okno editoru, centrální bod aplikace, ve kterém lze editovat nové záznamy. + Otevře okno editoru, ve kterém lze editovat obrázky, animace, videa a projekty. Nastavení - K dispozici je nová verze + K dispozici je nová verze • {0} Stáhnout nejnovější verzi ScreenToGif. Aktualizace - + Aktualizace je dostupná Nová verze! Je k dispozici nová verze {0}! Klikněte zde pro více informací. - + Zdá se, že váš systém již není podporován nebo se něco změnilo v systému aktualizací. Zkuste aktualizaci stáhnout ručně z webových stránek. + Verze Přenosný Instalační program - - - - + Co je nového? + Oprava chyb: + Nová verze je k dispozici. Chcete spustit prohlížeč a stáhnout si ji? + Po aktualizaci aplikaci spusťte. Stáhnout - - - - + Instalace + Ruční instalace + Stahování... + Nelze zobrazit podrobnosti o stahování. + Aktualizaci se nepodařilo stáhnout. + Před aktualizací je nutné počkat na dokončení veškerého enkódování. + + + ScreenToGif - stažení + Stažení + {0} z {1} ScreenToGif - Nastavení Aplikace - Rekordér - - + Nahrávání + Editor + Úlohy Klávesové zkratky Jazyk Dočasné soubory Doplňky - Přenos dat + Odesílání dat Přispět O aplikaci Další - - - - - + Chybějící klávesová zkratka pro sledování kurzoru + Chcete-li používat funkci sledování kurzoru myši, musíte nastavit klávesovou zkratku, která ji v případě potřeby přepne. + - - - - - - - - - - - - - + Spouštění + Spouštět ručně + Aplikace bude spouštěna ručně. + Spouštět s Windows + Aplikace se spustí se startem Windows. + Není možné střídat režimy spouštění. + Spustit lze jen jednou + Aplikaci budete moci spustit jen jednou pro každého uživatele a spustitelný soubor, což znamená, že vedle sebe mohou existovat různé instance různých uživatelů. Při pokusu o opětovné spuštění aplikace stejným uživatelem se druhá instance pokusí předat fokus první instanci a ukončí se. + Lze spustit vícekrát. + Aplikaci budete moci spustit vícekrát najednou bez omezení. + Spustit minimalizovaně v SysTray (oznamovací oblasti). + (V SysTray bude ikona programu.) + Spouštět do: Úvodní nabídka Záznamník plochy - Záznamník web. kamery + Záznamník webkamery Záznamník plátna Okno editoru - - - Barevné schéma + (vybrané okno se zobrazí při startu aplikace) + Téma + Barevné schéma: Světlejší Světlé Střední Tmavé - + Velmi tmavé + Dle systému Vlastní - - - Zobraz aplikaci v systémové liště (oznamovací oblast). - Nechej aplikaci otevřenou i v případě, že jsou všechna okna zavřena. - - - - - - - - - - - - - - - - - - - + Vzorky barev. + Ikona v SysTray + Zobraz ikonu v systémové liště (oznamovací oblasti). + Nechat aplikaci spuštěnou i v případě, že jsou všechna okna zavřena. + Bez akce + Otevřít okno + Bez oken + Minimalizovat/obnovit všechna okna + Minimalizovat všechna okna + Obnovit všechna okna + Levý klik: + Dvojklik: + Klik prostředním: + Okno: + Nebo otevřít: + Hlavní + Obejití chyby "Nedostatečná kvóta...". + (experimentální) + Zeptat se při ukončení programu (pomocí "Konec"). + Vypnutí hardware akcelerace. + (uživatelské rozhraní se vykresluje sofwarově) + Kontrola aktualizace překladu. + (nový překlad bude stažen a nainstalován automaticky) Kontrola aktualizací. - - - + Automaticky instalovat aktualizace při ukončení aplikace. + Rychle stáhnout přenosnou verzi. + (nutné ruční rozzipování a přepsání spustitelného souboru) + Rychlá aktualizace se zvýšenými právy. + Potvrdit spuštění instalace. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + Rozhraní + Staré + Nové + + Frekvence zaznamenávání + Ručně + Snímek bude zachycen po stisknutí tlačítka zachycení nebo použitím klávesové zkratky. + Interaktivně + Snímky budou zachyceny vždy, když na něco kliknete nebo něco napíšete. + Za vteřinu + Snímky budou zaznamenávány opakovaně, podle nastavení snímkové frekvence na panelu rekordéru. + Za minutu + Snímky budou zaznamenávány opakovaně, podle nastavení snímkové frekvence na panelu rekordéru. + Za hodinu + Snímky budou zaznamenávány opakovaně, podle nastavení snímkové frekvence na panelu rekordéru. + Zobrazení snímku při přehrávání: + (v ms, každý zachycený snímek bude mít nastavenu tuto prodlevu) + Zpoždění spuštění: + (v ms, každý snímek bude čekat tuto dobu, než se spustí snímání.) + Každý snímek bude zachycen v intervalu {0}. + + Způsob záznamu + Použít starší metodu snímání, která je pomalejší a nemusí fungovat při snímání her, ale nevyžaduje žádné další moduly plug-in. + Použít metodu zachycení pomocí rozhraní Duplication API, která je rychlejší a dokáže zachytit hry na celou obrazovku, ale vyžaduje systém Windows 8 nebo novější. + Uložit do souboru + Každý zachycený snímek se uloží přímo na disk jako obrázek. + Paměť cache + Každý zachycený snímek se nejprve uloží do paměti ve struktuře pixelů (předtím může být komprimován). + Komprese: + Optimální + (Pomalejší, ale zároveň i lepší komprese) + Rychlejší + (Rychlejší, ale méně optimalizovaná komprese) + Bez komprese + (Při zachycování snímků se neprovádí žádná komprese.) + Mezipaměť: + (V MB. Po dosažení této velikosti se data zapíší/vyprázdní na disk.) + Zabránit zachycení úplně černých snímků. + (Zabraňuje tomu, aby BitBlt s mezipamětí nesprávně vytvářel snímky se všemi pixely černými.) Zobrazit kurzor myši v nahraném záznamu. Zvolte barvu kurzoru - Použít odpočítávání před nahráváním. - (v sekundách, čeká než začne nahrávat) Pevná rychlost snímků. (Konstantní zpoždění, které se při nahrávání nemění) - - - Povolit asynchroní nahrávání. - (Snižuje opoždění rozhraní při nahrávání) + Snímat pouze když se něco změní. + (Snímek bude zachycen pouze tehdy, když se v oblasti snímání něco změní.) + Zlepšit výkon snímání při připojení ke vzdálené ploše. + (Zakáže zachycení vrstev okna) + Rychlé čištění paměti během snímání. + (Snižuje využití paměti během snímání, ale snižuje výkon.) + + Vodítka + Pro pravidlo třetin + Kliknutím zapnete/vypnete zobrazení vodítek pro pravidlo třetin. + Vodící kříž + Kliknutím vypnete/zapnete zobrazení vodicího kříže. + Vodítka se zobrazí pouze v případě, když je nahrávání pozastaveno nebo zastaveno. + Skrýt záhlaví (tenký režim). Povolit lupu obrazovky. (Umožňuje zvětšování při výběru v nahrávané oblasti) - - - - + Animovat okraje výběru. + (Animace ve stylu "pochodujících mravenců") + Povolit posouvání výběru. + (Zobrazí uchopovací značku v blízkosti rohu výběru, která umožňuje pohyb oblasti záznamu.) + Kompaktní mód. + (Zobrazí menší verzi ovládacího panelu rekordéru.) + Tlačítko pro zahození zobrazit i během nahrávání. + (Je viditelné pouze při pozastavení.) + Zlepšení výkonu při výběru obrazovky. + (Snižuje zpoždění při výběru obrazovky zobrazením statického pohledu na obrazovku.) + + Pamatovat si předchozí velikost oblasti záznamu. + Pamatovat si předchozí umístění oblasti záznamu. + Použít odpočítávání před nahráváním. + (v sekundách, čeká než začne nahrávat) + Zapnout sledování kurzoru. + (Oblast záznamu se sama přemisťuje podle pozice kurzoru.) + (Posun v pixelech, po kterém dojde k posouvání oblasti záznamu) + (Dodatečný posun v pixelech, od kterého se uživatelské rozhraní začíná skrývat.) + Před zahozením nahrávky se zeptat. Pozadí editoru @@ -297,7 +361,7 @@ Základní barva Barva sudá Barva lichá - + Zobrazovat enkódování v odděleném okně. Rozšířit záhlaví (okno chrome). Automatické nastavení velikosti okna dle velikosti snímku. Automatické nastavení přiblížení snímku dle velikosti okna. @@ -306,25 +370,35 @@ Vyžaduj potvrzení před uzavřením Editoru (v případě, že existuje otevřený projekt). Povolit trojklik pro výběr textu. Přidání obrysu okolo textu. - - - + V případě potřeby vynechat snímek + (Přeskočit snímek, pokud ho prohlížeč není schopen zobrazit včas) + Přeskočit snímek, pokud ho prohlížeč není schopen zobrazit včas. + Nastavit limit pro historii zpět/znovu. + (Starší akce budou po dosažení limitu odstraněny.) + (Maximální počet uložených akcí) + Synchronizace výstupní složky předvoleb. + (Předvolby budou používat stejnou cestu) + Synchronizovat také název souboru. + (Předvolby budou používat stejný název souboru.) + Synchronizace pouze mezi předvolbami stejného formátu souboru. + (Synchronizovány budou pouze předvolby stejného formátu.) - - - - - - - - + Automatická úloha + Seznam úloh (spouštěných automaticky) + Úloha + Detaily + Zapnuto + Zapnuto + Vybrat úlohu + Vyberte úlohu + Úlohy se spouští v pořadí shora dolů. Spustí se při prvním otevření projektu v editoru. (proto nefungují při připojení další části projektu) Globální Záznam plochy: (Otevře záznamník obrazovky) - Záznam webové kamery: + Záznam webkamery: (Otevře záznamník webové kamery) Záznam plátna: (Otevře záznamník plátna a umožňuje nahrát kresby) @@ -333,18 +407,18 @@ Nastavení: (Otevře okno nastavení. Lze otevřít pouze jedno) Ukončení: - (Uzavře všechna okna a odstraní aplikaci ze systémové lišty) - Záznamníky + (Uzavře všechna okna a odstraní ikonu ze systémové lišty) + Záznam Spustit/Pozastavit: (Spustí nebo pozastaví nahrávání. Používá se k pořízení snímků, pokud je režim snímků aktivován) Zastavit: (Zastaví nahrávání a otevře editor) Zahodit: (Zahodit aktivní záznam, pokud je pozastaven) - - - - + Sledování kurzoru: + (Zapne posun oblasti záznamu na základě polohy kurzoru.) + Vypnout sledování: + (Dočasně zakáže posun oblasti záznamu na základě polohy kurzoru, akceptovány budou pouze modifikační klávesy.) Kliknutím nastavíte zaměření na klávesnici, a poté stiskněte požadované klávesy a modifikátory. Některé kombinace kláves nejsou povoleny. @@ -364,26 +438,26 @@ Otevře vaši e-mailovou aplikaci - - - - - - Nedostatek místa na zvoleném disku. Vyčistěte složku temp nebo změňte umístění. - - - - - - - - - - + Stav + Jednotka: + {0} volno z {1} + Aktualizovat zjištěné hodnoty velikosti. + Vymazat složku mezipaměti. Budete se moci rozhodnout, zda chcete zachovat poslední projekty. + Nedostatek místa na zvolené jednotce. Vymažte složku nebo změňte umístění. + Nelze načíst údaje o jednotce. + Žádné soubory + {0:##,##0} soubor + {0:##,##0} souborů + Žádné složky + {0:##,##0} složka + {0:##,##0} složek + {0} použito + Cesty + Mezipaměť/Cache: Zvolte umístění dočasných souborů - - Zvolte umístění chybových protokolů - + Logy: + Zvolte umístění chybových (log) protokolů + Přejít do vybrané složky. Umístění konfiguračního souboru AppData: Lokální: @@ -391,59 +465,110 @@ Vytvořit prázdný soubor pro lokální nastavení. Odstranit konfigurační soubor. Otevřít složku s konfiguračním souborem. Podržte klávesu Ctrl při kliknutí na soubor. - • Struktura nastaveného načítání: Default ◄ AppData ◄ Local. • Pokud v lokálním adresáři není žádní konfigurační soubor, aplikace prohledá složku AppData a případně složku Default. • Pokud neexistuje lokální nastavení, jsou všechna nastavení uložena v konfiguračním souboru ve složce AppData. - Automaticky odstraňte staré projekty. + • Struktura nastaveného načítání: "Lokální>AppData>Default". • Pokud v lokálním adresáři není žádný konfigurační soubor, aplikace prohledá složku AppData a případně složku Default. • Pokud neexistuje lokální nastavení, jsou všechna nastavení uložena v konfiguračním souboru ve složce AppData. + Smazat všechny soubory z cache/mezipaměti při ukončení aplikace. + Zeptat se před odstraněním souborů z cache/mezipaměti. + Automaticky odstraňovat staré projekty. Při otevření editoru se na pozadí spustí úloha pro odstranění starších projektů dle nastavení. - (ve dnech. Starší projekty budou odstraněny po otevření editoru) + (Počet dní, po kterých budou starší projekty odstraněny při otevření editoru.) - - - - - - - + ScreenToGif - Vymazání mezipaměti/cache. + Chcete vymazat složku mezipaměti/cache? + Když vytvoříte záznam nebo otevřete záznam k úpravě, vytvoří se projekt a uloží se do složky mezipaměti. + Chcete tyto projekty ze složky mezipaměti odstranit? + Neodstraňujte poslední projekty. + (Odstraněny budou pouze projekty starší než {0} dnů, které se nyní nepoužívají.) + (Všechny projekty, které se v současné době nepoužívají, budou odstraněny.) Proxy Režim: Vypnuto - Manuál + Ruční Systém - (Používá systém proxy) + (Použije systémové nastavení proxy) Host: Port: Uživatelské jméno: Heslo: - Získat klíč OAuth - Zde vložte autorizační klíč. + + Předvolby odesílání (uploadu) + Služby + Jméno + Popis + Zapnuto + + + Služba pro upload + Výběr služby pro upload + Nahoře vyberte službu uploadu + Vlastní + Zapnout tuto předvolbu. + + Detaily + Jméno: + Popis: + Režim: + Anonymní + Ověření + Autorizace + Vyžádat token + Vložte OAuth token + Přihlašovací jméno: + Heslo: Povolit - Obnovit - Smazat - Imgur (anonymní) + Přihlašovací jméno ani heslo nebudou uloženy. + Volby Použijte přímé odkazy. - Získejte odkazy s rozšířením Gifv namísto Gif. - Odeslat soubory gif do vybraného alba. - Album: - Dotázat se před nahráním - Stránku pro získání autorizačního klíče nebylo možné otevřít. + Album + Předvolbě musíte dát jedinečný název. + Název je již používán jinou předvolbou. + Je nutné dokončit proces ověřování. + Pro autorizaci této aplikace musíte zadat své uživatelské jméno a heslo. + Nepodařilo se získat autorizační token. Pro autorizaci této aplikace zadejte autorizační klíč. - Autorizace Imgur byla dokončena. - Autorizace Imgur se nepovedla. Zkuste to znovu za pár sekun nebo si opatřete nový klíč. - - - Pro obnovení autorizace aplikace, je potřeba nejprve dokončit autorizační proces. + Autorizace se nezdařila. Zkontrolujte, zda zadané údaje jsou v pořádku, a za chvíli to zkuste znovu. + Nelze načíst seznam alb. + Authorizace dokončena. Neautorizovaný. Autorizace vyprší za {0}. Autorizace je platná do {0}. - Autorizace Imgur odstraněna. - Nelze načíst seznam alb. - Gfycat (anonymní) - OAuth klíč: - Vyberte cíl - Vyberte album (volitelné) - Lze vybrat cílové album: + + Získejte odkazy s rozšířením Gifv namísto Gif. + Odeslat soubory gif do vybraného alba. + Album: + Dotázat se před nahráním + Znovu načíst seznam. + + Výchozí + Požádat o vyplnění údajů o nahrávání. + URL: + + + Vyberte album (volitelné): + Lze vybrat cílové album + + + Detaily uploadu (doporučeno) + Podrobnosti uploadu + Název: + Popis: + Štítky: + Štítky oddělujte středníkem ; + Zobrazí se pouze těm, kteří přistupují přes přímý odkaz. + + + Historie uploadu + Datum + Předvolba + Úspěšné? + Smazání historie. + Odkaz: + Snížení kvality: + Smazání odkazu: + Jste si jisti, že chcete odstranit položku historie? + Tuto akci nelze vzít zpět. Chcete vybranou položku historie vymazat? Dostupné externí nástroje @@ -451,22 +576,21 @@ Stahování... Staženo {0} Kliknutím sem otevřete vlastnosti souboru. - + Aplikace distribuované Microsoft Store nelze stahovat z jiných aplikací. Musíte je stáhnout ručně. FFmpeg umístění Vyberte umístění spustitelného souboru FFmpeg - + FFmpeg exe soubor Cesta spustitelného souboru FFMpeg obsahuje neplatné znaky. Prosím zvolte platné umístění souboru. Gifski umístění Vyberte umístění spustitelného souboru Gifski - + Gifski knihovna Cesta spustitelného souboru Gifski obsahuje neplatné znaky. Prosím zvolte platné umístění souboru. - - - - - - - + FFmpeg licence + Gifski licence + SharpDx licence + Chybí oprávnění pro zápis do složky + Stahovanou položku není možné uložit do složky kvůli chybějící oprávněním k zápisu. Chcete spustit stahovač s právy správce, aby se stahování dokončilo? + Přispět Přispět US$ @@ -474,55 +598,56 @@ Otevře stránku Paypal s vybranou měnou: Dolar Otevře stránku Paypal s vybranou měnou: Euro Otevře stránku Paypal. Je třeba vybrat měnu. - - - - - - - + Odhlášení + Měsíční podpora přes Patreon. + Gift games + Gift games přes Steam. + Gift games přes GOG. + Koupit kafe pomocí Ko-fi. Krypto měny - - - + Kopírovat Bitcoin adresu. + Podpora + Chcete-li projekt podpořit :) Verze: + Zkontrolovat aktualizace + Máte nejnovější verzi ScreenToGif. Autor: Nicke Manarin - + Microsoft Store verze. Některé funkce jsou zakázány kvůli zásadám. Kontakt - - - + Připojení k serveru + Navštívit web + Připojit do místnosti Technické informace Licence: (Tato aplikace je zcela zdarma) Zdrojový kód: - + Ochrana soukromí: Velké díky patří Všem mým podporovatelů a lidem kteří mi poskytlí zpětnou vazbu a/nebo finanční podporu. Lokalizace - - - + Zjištění kódu jazyka... + Rozpoznáno jako {0} + Není možné Poslední zdroj je tím právě používaným. Pro použití vlastního zdroje proveďte jeho přesun do dolní části seznamu. - - - - - - - - - - - - - - + Export zdroje... + Uložit seznam zdrojů + Otevřít seznam zdrojů + Seznam zdrojů + Import zdroje... + Název souboru neodpovídá platnému vzoru + Zkuste přejmenovat: StringResources.en.xaml, kde 'en' nahradíte potřebným kódem jazyka. + Nelze připojit zdroj se stejným jménem + Zkuste odstranit stejné zdroje nebo jazykové kódy. + Nadbytečný jazykový kód + Kód "{0}" je nadbytečný. Zkuste místo toho použít "{1}". + Neznámý jazyk + Znak "{0}" a jemu příbuzné nejsou uznány jako platné jazykové kódy. + Nebylo možné použít lokalizační soubor. Záznam @@ -533,48 +658,73 @@ Přichycení Výška Šířka + Sledování kurzoru je zapnuto. - - + Kliknutím přepínáte mezi režimy snímání. + ruční + interaktivní Maximální počet snímků za sekundu fps - - - - - - - - + Rozsah od 1 do 60 snímků za sekundu, vyšší hodnota znamená, že bude zachyceno více snímků. Nejkratší prodleva je 17 milisekund. + Maximální počet snímků za minutu + fpm + Rozsah od 1 do 60 snímků za minutu, vyšší hodnoty znamenají, že bude zachyceno více snímků. Nejkratší prodleva je 1 sekunda. + Maximální počet snímků za hodinu + fph + Rozsah od 1 do 60 snímků za hodinu, vyšší hodnota znamená, že bude zachyceno více snímků. Nejkratší prodleva je 1 minuta. + + Kliknutí nebo stisk klávesy pro sejmutí Přichytit k oknu (přetáhnout a uvolnit) Před zahájením ScreenToGif (pozastaven) - - - - - - - - + Zastavuji... + Před spuštěním... + + Uplynulý čas snímání. + Celkový počet snímků: + Ruční snímání: + Snímání pozastaveno. + Váš počítač nepodporuje přesný režim snímání, to znamená, že požadované snímková frekvence nemusí být dosaženo. + + Nepodařilo se sejmutí obrazovky + Nepodařilo se sejmutí obrazovky. Pět snímků po sobě nebylo zvolenou metodou nic sejmuto. + Nebylo možné spustit/pozastavit snímání obrazovky. + Pro zachycení obrazovky pomocí rozhraní API (Duplikace plochy) je vyžadován systém Windows 8 nebo novější. + Oblast + Vyberte oblast Okno + Vyberte okno Plocha + Vyberte obrazovku + Interní displej + Obecná obrazovka + Graphický adaptér: {0} + Rozlišení: {0} x {1} + Nativní rozlišení: {0} x {1} + DPI: {0} ({1:0.##}%) + Táhnout a přesunout výběr. Přijmout Znovu - + Pravý klik Zrušit výběr (Esc) Kliknutím a tažením vyberte oblast obrazovky - + Kliknutím a tažením vyberte oblast Klikněte sem pro výběr tohoto okna Klikněte sem pro výběr této obrazovky Stisknout Esc pro zrušení + Stiskněte {0} pro zastavení nahrávání + Okno záznamníku bude minimalizováno, obnovte jej nebo stiskněte {0} pro pozastavení snímání. + + Vyřazení nahrávky + Jste si jisti, že chcete záznam zahodit? + Touto akcí se záznam zahodí a odstraní se všechny snímky. Tuto operaci nelze vrátit zpět. ScreenToGif - Záznamník webové kamery - Nebylo nalezeno žádné zařízení pro video :( - Zkontrolovat zařízení pro video. + Nebylo nalezeno žádné zařízení pro nahrávání:( + Zkontrolovat webovou kameru. Rozsah: {0:0.##}x Změnit rozsah videa. @@ -595,41 +745,93 @@ Počáteční barva Aktuální barva Nejnovější barva - - + Přetáhnout na; vzorek barvy + Kliknout a přetáhnout barva z obrazovky Prohlížeč výjimek Otevřít vnitřní výjimku - - - - + Výjimky + Zpráva + Zásobník + Zdroj Něco je špatně. Poslat zprávu - - - - - - - - + + Přednastavené + Enkodér + Jméno + Popis + Další + Automatické uložení po modifikaci. + Změnu nastavení (enkódování i exportování) je nutné uložit ručně stiskem příslušného tlačítka. + Všechny změny nastavení (enkódování i exportování) budou uloženy automaticky. + Některé vlastnosti předvolby jsou určeny pouze pro čtení. + Předvolbu je nutné pojmenovat. + Předvolba se stejným názvem již existuje. + + + Automatické uložení + Změny nastavení budou automaticky uloženy. + Výchozí ({0}) + Výchozí nastavení pro enkodér. + Pro Twitter ({0}) + Dodrží limit pro upload na Twitter (velikost a rozlišení). + HEVC ({0}) + High Efficiency Video Coding. + VP8 ({0}) + Starší a známější kodek. + Animace + Video + Obrázek + Projekt + Vysoká kvalita + Hodí se pro nahrávky s více barvami a přechody. + Vysoká kvalita • průhledné pozadí + Umožňuje uložení animace s průhledným pozadím. + Vysoká kvalita • Grafika + Lepší kvalita nahrávání, nižší počet barev. + KGy SOFT • vyvážené + Dobrá kvalita pro obrázky podobné fotografiím pomocí Wuova kvantizeru bez ditheringu. + KGy SOFT • vysoká kvalita + Vysoká kvalita pro obrázky podobné fotografiím pomocí Wuova kvantizéru s vyšší bitovou úrovní a Floyd-Steinbergovým rozptylem. + KGy SOFT • nízká kvalita, rychlá + Kvantizace všech snímků pomocí předdefinované "webově bezpečné" palety a Bayerova uspořádaného ditheringu 8x8. + FFmpeg • vyšší kvalita + Vyšší kvalita obrazu, ale větší velikost souboru. + FFmpeg • nižší kvalita + Nižší kvalita obrazu, ale menší velikost souboru. + Gifski • Vyšší kvalita + Vyšší kvalita obrazu, ale větší velikost souboru. + Gifski • nižší kvalita + Nižší kvalita obrazu, ale menší velikost souboru. + Gifski • nižší kvalita, rychlejší + Ještě nižší kvalita obrazu, ale rychlejší kódování a menší velikost souboru. + Systém • nižší kvalita + Nižší kvalita, ale rychlejší kódování. + + FFmpeg - vysoká kvalita + Vysoká kvalita obrázků, malá velikost, ale pomalejší enkódování. + FFmpeg - nižší kvalita + Nižší kvalita obrázků, malá velikost, rachlé enk=odování. + Vysoká kvalita + Vysoká kvalita obrázku a malá velikost souboru. + Vložit snímky - Obě strany by měly mít stejnou velikost, toto okno umožňuje změnit umístění a velikost obrázku a plátna. Kliknutím vyberte a změňte velikost. + Obě strany by měly mít stejnou velikost, toto okno umožňuje změnit umístění a velikost snímkuu a plátna. Kliknutím vyberte a změňte velikost. Velikost plátna: - Přizpůsobit obrázek plátnu - Přizpůsobit velikost plátna dle obrázků uvnitř (z levého horního rohu). + Přizpůsobit snímek plátnu + Přizpůsobit velikost plátna dle snímku (z levého horního rohu). Existuje rozdíl ve velikosti snímků. Před vložením snímků je třeba tento rozdíl odstranit. Nové snímky Aktuální snímek - Velikost obrázku: - Umístění obrázku: - Obnovit velikost obrázku a jeho pozici - Nové snímky bude vloženy do aktuálního listu snímků na pozici: + Velikost snímku: + Umístění snímku: + Obnovit velikost snímku a jeho pozici + Nové snímky bude vloženy do aktuálního listu snímků na pozici: Za Před Snímek @@ -638,7 +840,7 @@ Importovat snímky z videa - + Způsob importu: Nahrávání... Rozsah Velikost @@ -651,14 +853,14 @@ Výběr: Snímky: Trvání: - - - - + Video nebylo možné načíst + Prohlížeč se nepodařilo spustit. Zkuste použít jiný způsob importu nebo zkontrolujte, zda video není poškozené. Pokud jste chtěli použít Windows MediaPlayer, zkontrolujte, zda je zapnuta funkce Windows nazvaná "Funkce médií/Windows Media Player", a ujistěte se, že máte potřebný kodek videa. + Časový limit pro náhled snímku. + Není vybrán snímek pro import. Kódování - + Enkóduji... Spuštění Dokončeno @@ -668,14 +870,14 @@ Zobrazit výstup příkazu/ů. Spuštění příkazu se nezdařilo Odeslání se nezdařilo. - Ctrl + Kliknutím otevřete stránku pro odstranění obrázku (je-li k dispozici). + Ctrl + klik otevře stránku pro odstranění obrázku (je-li k dispozici). - - - - - - + Uplynulo, v minutách: + Analýza: + Enkódování: + Upload: + Kopírování: + Příkazy: Soubor odstraněn nebo přesunut Zrušeno @@ -684,16 +886,16 @@ Nahrávání Provádění příkazů Zpracování {0} - - - + Připravuji druhý průchod + Zpracování {0}- druhý průchod + Vytvářím soubor Analýza nezměněných pixelů - + Uložit výsledek analýzy Otevřít soubor Prozkoumat složku Odstranit ze seznamu Zobrazit detaily - + Skrýt dokončená enkódování Zkopírovat jako obrázek Zkopírovat název souboru @@ -701,12 +903,12 @@ Zkopírovat odkaz - ScreenToGif - Výstupní povely - Výstupní povely + ScreenToGif - příkaz výstupu + Příkaz výstupu - - + Upozornění + Skrýt všechna oznámení ScreenToGif - Editor @@ -714,15 +916,15 @@ Domů Přehrávání Upravit - Obrázek + Snímky Přechody Statistika Nastavení Nápověda - - - - Celkový počet, počet vybraných, index výběru + Extra + Aktualizace je dostupná! + Klikněte zde a přečtěte si více. + Celkový počet snímků, počet vybraných, číslo snímku Příprava snímků @@ -732,56 +934,63 @@ Otevřít soubor médií (obrázek nebo video) Otevřít soubor médií (obrázek nebo video) nebo soubor projektu - - - - - - - - - - - - - - - + Všechny podporované soubory + Obrázky + Video + + PNG animace + GIF animace + WEBP animace + + AVI video + MKV video + MOV video + MP4 video + WEBM video + + BMP obrázek + JPEG obrázek + PNG obrázek + ZIP s obrázky + + ScreenToGif projekt + ScreenToGif projekt jako Zip + PSD soubor - Pro spuštění nového záznamu přejděte na "Soubor > Nový" + Vyberte, co chcete spustit, na kartě "Soubor " Pro import přetáhněte obrázky, videa nebo projekty Děkuji, že používáte tuto aplikaci! Čím nižší je frekvence snímků, počet barev nebo množství změn mezi snímky, tím menší je velikost. - Máte dotazy či připomínky? Otevřete "Nastavení > O aplikaci" pro možnosti kontaktu - Máte potíže? Kontaktujte mě přes volbu Zpětná vazba - Pro vyzkoušení nového záznamníku přejděte do "Nastavení > Rekordér" a zapněte jej. + Máte dotazy či připomínky? Otevřete "Nastavení > O aplikaci" pro možnosti kontaktu. + Máte potíže? Kontaktujte mě přes volbu Zpětná vazba. + Nechcete vyzkoušet nové rozhraní záznamníku? Přejděte do "Nastavení > Nahrávání" a zapněte ho. Nahrávání - Nahrávání web. kamery + Nahrávání webkamery Nahrávání plátna - Prázný projekt + Prázdný projekt Nový Nahrávání - Nahrávání web. kamery - - Média - Vložit + Nahrávání webkamery + Nahrávání plátna + Soubor + Připojit Uložit jako - Vložit - Nedávné Projekty + Otevřít + Nedávné projekty Uložit jako projekt - Zahodit Projekt + Zahodit projekt Úpravy Zpět - Vpřed + Znovu Reset @@ -794,13 +1003,13 @@ Zvětšení Přizpůsobit obsahu - Přizpůsobit obrazovce + Přizpůsobit oknu Výběr Vybrat vše - Přejít - Opačně + Přejít na + Obrátit výběr Zrušit výběr @@ -813,30 +1022,31 @@ Poslední - - - + Volby přehrávání + Opakovat přehrávání + Používá se pouze pro přehrávání. Pokud si přejete změnit nastavení opakování pro exportovaný Gif či Apng. u některých enkodérů je tato volba k dispozici v "Uložit jako". Snímky Smazat - Odstranit duplicity + Smazat duplicity Snížit počet snímků - Odstranit všechny předchozí - Odstranit všechny následující + Plynulá smyčka + Odstranit vše předchozí + Odstranit vše následující Přeskupení Obrátit - Jojo + JoJo Posunout vlevo Posunout vpravo - Zpoždění (trvání) - Přechod + Zpoždění (prodleva) + Zpoždění Zvýšit nebo snížit - + Procentuálně Velikost a rotace @@ -854,19 +1064,19 @@ Vrstvy Kreslení - - + Tvary + Události myši Vodoznak Kinematograf Ohraničení - + Stín Průběh Rozostřit - Způsoby - Prolnutí - Prolnutí ze strany + Způsob přechodu + Přechod do... + Prolnutí Základní @@ -874,8 +1084,8 @@ Celková doba trvání Velikost snímku Průměrná doba trvání (zpoždění) - - + Aktuální čas + Aktuální čas (kumulativní) pro zobrazený aktuální snímek. DPI snímku a rozsah Vybraný snímek @@ -912,51 +1122,54 @@ Vyberte alespoň jeden snímek vedle kterého se má vložit titulní strana. Zvolte tloušťku ohraničení větší než 0 alespoň na jedné straně. Vyberte alespoň jeden snímek pro uložení ohraničení. - - + Aby se v rámečku něco změnilo, musí být neprůhlednost větší než nula. + Pokud nastavít hloubku stínu a poloměr rozostření na nulu, nebude to mít žádný význam, protože bude skryt za rámečkem. Vyberte alespoň jeden pixel pro použití Cinemagraph. Pixely vyberete jejich obkreslením. - Prolnutí + Přechod Vyberte alespoň jeden snímek pro uložení prolnutí. - + Průhledná barva nebude mít na tento přechod žádný vliv. Prolnutí ze strany Vyberte alespoň jeden snímek pro použití funkce přechodu snímků. Nahrávání snímků Není možné načíst projekt - Nebylo možné načíst snímky, jelikož jsou poškozeny nebo obrázky nejsou tam, kde se očekávají. + Nebylo možné načíst snímky, jelikož jsou poškozeny nebo nejsou tam, kde se očekávají. Některé snímky nemohly být načteny Nebylo možné načíst snímky, jelikož nebyly nalezeny nebo byly poškozeny. Vyberte alespoň jeden snímek k uložení vrstvy. - FFmpeg nenalezen. Přidejte jej do cesty a proměnných prostředí nebo nastavte jeho umístění v Nastavení. - Gifski nenalezen. Přidejte jej do cesty a proměnných prostředí nebo nastavte jeho umístění v Nastavení. - Nedostatek místa na disku, na kterém si tato aplikace ukládá svou vyrovnávací paměť (zbývá {0}%). Kliknutí sem otevřete Volby > Dočasné soubory k uvolnění místa. - + FFmpeg nenalezen. Vstupte do "Nastavení > Doplňky" a tam buď nastavte jeho umístění nebo ho stáhněte. + Gifski nenalezen. Vstupte do "Nastavení > Doplňky" a tam buď nastavte jeho umístění nebo ho stáhněte. + Nedostatek místa na disku, na kterém si tato aplikace ukládá svou vyrovnávací paměť (zbývá {0}%). Kliknutí otevřete "Nastavení > Dočasné soubory" k uvolnění místa. + Pokusili jste se importovat obrázky s různým DPI, což není podporováno. Některé z nich se importovaly, ostatní je třeba importovat samostatně. + Pokusili jste se importovat obrázky s různou velikostí, což není podporováno. Některé z nich se importovaly, ostatní je třeba importovat samostatně. - + Načtení snímků z mezipaměti Aktualizace snímků Příprava k importu Import snímků - - - - Zahodit snímky - Zahodit adresáře + Analýza duplicit + Nastavit zpoždění + Odstranit duplicity + Odstranit snímky + Odstranit adresáře Změna velikosti snímků Oříznutí snímků Použít překryv snímků Vytvoření úvodního snímku Použít otočení/Otočení snímků - Změna zpoždění + Změna prodlevy Použít efekt přechodu Příprava k uložení + Ukončit načítání a odstranit projekt. + Hledání ideální smyčky + Zahazování snímků nepoužitých ve smyčce Snímek: Otevřít obrázek Prozkoumat složku - Exportovat obrázek Přejít na snímek @@ -996,9 +1209,9 @@ Snímky oříznuty Snímky převráceny/otočeny Převrácení se vztahuje na vybrané snímky a otočení platí pro všechny. - Tato akce se uloží na všechny snímky - Tato akce se uloží na vybrané snímky - + Tato akce se použije na všechny snímky + Tato akce se použije na vybrané snímky + Tato akce se vztahuje na všechny nebo jen vybrané snímky - v závislosti na nastavení. Kinematograf upraví všechny snímky dle prvního snímku Použita vrstva Vytvořen titulní snímek @@ -1010,7 +1223,7 @@ Skrýt - Uložit změny + Použít Otevřít Uložit Zrušit @@ -1021,31 +1234,38 @@ Datum vytvoření Počet snímku Nebyl vybrán žádny projekt. K načtení vyberte projekt ze seznamu. - - + Tento projekt je již zobrazen tímto editorem. + Tento projekt je již otevřen jinou instancí editoru. Projekt nelze otevřít podruhé, pokud je otevřen v jiné instanci editoru. Položky schránky Položka schránky: - - + {0} obrázek + {0} obrázků Prozkoumat obsah Odstranit - Vložit akci - Na předchozí snímek - Na následující snímek + Vložit snímek ze schránky + před označený snímek + za označený snímek - Aktuální vlastnosti + Změna Dpi - Nové vlastnosti + Nastavení + Pixely (px) + Procenta (%) DPI: - Udržovat poměr stran. + Zachovat poměr stran. + Převzorkování: + Fant • Vysoká kvalita + Lineární • Nižší kvalita + Nejbližší soused• Nižší kvalita, rychlejší + Kvalita škálování. Vyberte jinou hodnotu pro změnu velikosti. - Body - Zhora: + Oříznout + Shora: Zleva: Zdola: Zprava: @@ -1055,23 +1275,23 @@ Převrátit horizontálně Převrátit vertikálně - Otočit 90º vlevo - Otočit 90º vpravo + Otočit 90° vlevo + Otočit 90° vpravo - Snížit rychlost snímků + Snížit počet snímků Faktor: - Odstranit počet: - - - - - - - Odstraní {0} snímků po každém {1} snímku bez počítání odstraněných snímků. - - - + Počet odstranění: + Úprava zpoždění: + Neupravovat + Sečíst s předchozí prodlevou + Rozdělit na zbývající snímky + Snížit snímkovou frekvenci celého projektu. + Pokud tato možnost není zapnuta, je třeba vybrat, více po sobě jdoucích snímků, než je faktor odstranění. + Odstraní {0} snímek/snímky po každém {1}. snímku; nezapočítává odstraněné snímky. + Musíte vybrat snímky, na které se má snížení snímkové frekvence použít (nebo zaškrtněte možnost použít na celý projekt). + Vybrané snímky musí následovat za sebou. Mezi vybranými snímky nelze ponechat některé nevybrané. + Počet vybraných snímků musí být větší než faktor odstranění, aby funkce mohla něco odstranit. Odstranit duplicity @@ -1079,34 +1299,48 @@ Odstranění snímku: Odstranit první snímek Odstranit poslední snímek - Nastavit spoždění: + Nastavit zpoždění: Neupravovat Použít průměr Použít součet - Tato akce analyzuje každý snímek (pixel po pixelu) a odstraňuje ty, které jsou nejméně z {0} % podobné bezprostředně sousedícím snímkům. Je možné nastavit zpoždění (trvání záznamu) snímků. + Tato akce analyzuje každý snímek (pixel po pixelu) a odstraňuje ty, které jsou nejméně z {0} % podobné bezprostředně sousedícím snímkům. Je možné nastavit zpoždění (trvání zobrazení) snímků. + + + Úpravy pro plynulou smyčku + Začít snímkem: + Směr porovnávání: + Od konce + Od začátku + Pokusí se najít snímek z {0} % podobný počátečnímu snímku a odstraní všechny následující snímky, aby smyčka opakování byla plynulá. Můžete si vybrat, zda chcete ignorovat některé počáteční snímky a zahájit porovnávání od začátku nebo od konce. + Počet snímků, které se mají ignorovat, musí být menší než celkový počet snímků. + Při zvoleném nastavení není možné vytvořit plynulou smyčku. + Plynulá smyčka, založená na vybraných nastaveních, je již vytvořena. Text Písmo - Rodina: + Font: Styl: Tloušťka: Velikost: Barva: - Barva pozadí: Obrys Tloušťka: Uspořádání Svisle: Vodorovně: + Zarovnání: + Efekty: - + Stisky kláves Klávesy Oddělovač: Uprav stisknuté klávesy Ignorovat Ctrl, Alt, Shift, a tlačítko Windows pokud nejsou používány jako modifikátory. Ignorovat stisknutí tlačítka Ctrl, pokud není použito v kombinaci s další klávesou (Ctrl + C). + Ignoruje programové simulace stisků kláves. + Zaznamenává pouze stisky fyzických kláves. Prodloužit dobu zobrazení stisknutých kláves. Zobrazovat stisknuté klávesy dříve. V (ms): @@ -1116,8 +1350,8 @@ Zaznamenané klávesy Odstranit klávesu Přidat klávesu: - - + Malá písmena. + Umožní vkládat malá písmena. Způsob @@ -1131,28 +1365,32 @@ Obdélník Elipsa Další: - Zvýrazňovač - Přizpůsobit křivce - Neexistují žádné výkresy, které by měly být aplikovány na zvolené snímky. + Zvýrazňovač (průhledné) + Vyhladit křivky + Neexistují žádné kresby, které by měly být aplikovány na zvolené snímky. Vyberte alespoň jeden snímek, na který se použije kresba. - - - - - - - + Vložit + Tvary + Zaoblení: + Tečkování: + Nastavuje velikost čárek a mezer. Můžete nastavit více velikostí a vytvořit tak propracovaný styl čárek. Výchozí hodnota je "1 0" nebo prázdná, což znamená pomlčku bez mezer. + Odvolat otočení + Smazat + Výplň - - - + + Myš - události + Barva zvýraznění kurzoru: + Klik levým tlačítkem: + Klik prostředním tlačítkem: + Klik pravým tlačítkem: Obrázek Soubor: - + Není vybráno Neprůhlednost: Vyberte obrázek Vyberte obrázek pro uložení na vybraný snímek. @@ -1160,173 +1398,423 @@ Vzhled - + Záporná hodnota způsobí přidání rámečku vně snímků. V případě kladné hodnoty bude rámeček zakrývat část snímku. - - - - - + Barva stínu: + Barva pozadí: + Posun: + Rozmazání: + Hloubka: - Možnosti Rozostření + Pixelizace + Rozmazání + Ztmavení + Zesvětlení + Možnosti rozostření Velikost pixelů: + Rozmazání: + Ztmavení: + Zesvětlení: Vypočítat průměrnou barvu pro každý blok rozdělený do pixelů. - Pomocí nástroje vyberte obdélník, který má být rozdělen do pixelů. + Použijte zakrytí na inverzi výběru. + Vyhlazení + Pomocí nástroje vyberte část, která má být zakryta (rozpixelována). + Pomocí nástroje vyberte část, která nemá být zakryta (rozpixelována). Nebyl proveden žádný výběr. Pomocí nástroje vyberte obdélník, který má být rozdělen do pixelů. Typ - Bar - Text + Ukazatel + Čas/snímky Přesnost: Minuty Sekundy Milisekundy Procento Číslo snímku - + Aktuální datum/čas Vlastní - Zobrazit celkem. + Zobrazit celkem Formát: - - - - - - - - - - - - - + Formát + $ms = milisekund + $s = sekund + $m = minut + $*p = procent + $f = číslo snímku + Celkem: + Příklad: + Lze použít formát data a času z prostředí .Net Framework. Specifikace je k dispozici na těchto dvou odkazech. + Výchozí formát + Vlastní formát + Číslovat od: + Číslovat snímky od zadané hodnoty. Orientace: - - - - - + Použít nastavení + Typ prodlevy: + Překrytí (v ms) + Zvýšit či snížit (v ms) + Měřítko (v %) Nová hodnota - Minimálně 10ms na snímek. + Minimálně 10 ms na snímek. Zmenšení/Zvětšení hodnoty - - Nová hodnota nahradí trvání (zpožení) všech vybraných snímků. Hodnota musí být v rozmezí 10ms až 25500ms. - Tato hodnota zkrátí/prodlouží trvání (zpoždění) každého vybraného snímku. Tuto dobu lze zkrátit/prodloužit výběrem hodnoty mezi -10000ms a 10000ms, ale výsledná délka každého snímku bude omezena mezi 10ms a 25500ms - + Měřítko + Nová hodnota nahradí trvání (zpoždění) všech vybraných snímků. Hodnota musí být v rozmezí 10 ms až 25500 ms. + Tato hodnota zkrátí/prodlouží trvání (zpoždění) každého vybraného snímku. Tuto dobu lze zkrátit/prodloužit výběrem hodnoty mezi -10000 ms a 10000 ms, ale výsledná délka zobrazení každého snímku bude omezena mezi 10 ms a 25500 ms + Nastavení délky zobrazení (zpoždění) každého vybraného snímku o procentuální hodnotu. Délku zobrazení každého snímku můžete nastavit hodnotou mezi 1% a 1000%, ale konečná délka zobrazení každého snímku bude omezena na 10 ms až 25500 ms. - Použijte pero k výběru pixelů, které by neměli zůstat statické (které by se měli měnit mezi snímky) malováním na ně. + Použijte pero k označení oblasti (částí), které se budou měnit (animovat) - zamalujte je. Nezamalované části budou skryty. - Délka přechodu - Zpoždění přechodu + Délka přechodu - počet nových snímků + Trvání přechodu Přechod do... Další snímek Barva Barva - Přechod bude použit mezi vybraným a následujícím snímkem. + Přechod bude vytvořen mezi vybraným a následujícím snímkem. Typ souboru - Gif + Formát výstupního souboru. + Export předvolby, která obsahuje všechna aktuálně zobrazená nastavení. Spravujte své exportní předvolby pomocí níže uvedených tlačítek. + Animovaný obrázek + Video + Rámce + Jiné + Apng - Obrázky (snímky) - Projekt - - Video + Animated Portable Network Graphics + Gif + Graphics Interchange Format + Webp + Web Picture + + AVI + Audio Video Interleave + MKV + Matroska + MOV + QuickTime + MP4 + Mpeg-4 + Webm + Web Movie + + BMP + Bitmapa + JPEG + Joint Photographic Experts Group + PNG + Portable Network Graphics + + Project + ScreenToGif projekt + PSD + Adobe Photoshop + + + Předvolby: + Výchozí + Nové nastavení předvolby. + Uložit aktuální nastavení jako předvolbu. + Úprava základních nastavení předvoleb. + Odstranění aktuálně vybrané předvolby. + Obnovení výchozích nastavení této předvolby. + + + Smazat předvolbu + Opravdu chete smazat tuto předvolbu? + Tuto akci nelze vrátit zpět. Chcete vybranou předvolbu odstranit? + Obnovení přednastavení + Určitě chcete předvolbu resetovat? + Tuto akci nelze vrátit zpět. Chcete obnovit výchozí nastavení vybrané předvolby? Kódování + Enkódování a kvantizace + Enkodér použitý při generování výstupního souboru. ScreenToGif - + Vnitřní enkodér + KGy SOFT + KGy SOFT GIF enkodér Systém - Použití výchozí palety. - - + Enkodér dostupný v systému FFmpeg + Externí enkodér, vytvořen FFmpeg.org Gifski + Externí enkodér, vytvořen Gif.ski + Nastavení enkódování + + + Použít rozšířený režim. + Ruční zadání parametrů pro nastavení enkodéru. + Parametry: + Seznam parametrů, které budou předány programu FFmpeg. Speciální parametry: {I} je vstupní cesta (snímky). {O} je výstupní cesta (exportovaný soubor). {W} je šířka snímku. {H} je výška snímku. + Chcete-li kódovat dvouprůchodově, přidejte '-pass 2'.. + Náhled + Seznam parametrů, které budou předány aplikaci FFmpeg. + Info o kodeku + Info o formátu + Info o filtru Nastavení Gif - - - - - - - - - - - - - + Redukční algoritmus barev (kvantizace). + Neurální síť + Vysoce věrná kvantizace. Pomalejší, ale vhodná pro větší množství barev. + Octree + Vhodné pro animace s menším počtem barev. Je rychlejší, ale může vytvářet barevné pruhy. + Střední řez + Lepší než Octree, pomalejší vytvoření. + Odstíny šedé + Používá pevnou paletu odstínů šedé, díky tomu je mnohem rychlejší. + Nejpoužívanější barvy + Vybere nejpoužívanější barvy ve snímcích. + Sampling (vzorkování): + Faktor vzorkování: Při hodnotě 1 bude gif vypadat lépe, ale bude se pomaleji vykreslovat. Kvalita: Barvy: Maximální počet barev (na každý snímek). - - + Použít globální tabulku barev. + Může snížit kvalitu a/nebo velikost gifu. + Kvalitnější + Rychlejší + Použije rychlejší proces kódování. + Může snížit kvalitu gifu. Smyčka: Smyčka Gif. Nekonečné opakování. - Opakovat počet. - - - - + Počet opakování. + Zapnout průhlednost. + Zapne režim plné průhlednosti, díky kterému bude pozadí Gifu zcela průhledné. Pokud je tato možnost povolena, nahrazení chromatickým klíčem nebude použito. + Vyberte barvu, která bude průhledná. + Jakmile vyberete barvu, bude převedena na průhlednou a ve vygenerovaném Gifu se zobrazí jako průhledná. Pokud není vybrána žádná barva, všechny průhledné barvy (Alfa = 0 %) se zobrazí normálně. Zjištění nezměněných pixelů. - - - - + Analýzou a detekcí nezměněných pixelů mezi následujícími snímky bude možné uložit do Gifu pouze potřebné (změněné) části. + Nahradit nezměněné pixely chroma klíčem (barvou). + Opakující se/nezměněné pixely budou nahrazeny chroma klíčem, sníží se tím počet potřebných barev na snímku. + Chroma klíč: + Rozptyl (Dither): + Dither scale: + + + Kvantizer + Barva pozadí: + Pixely s průhledností (alfa), které vybraný kvantizer považuje za neprůhledné, budou před získáním kvantizované barvy smíchány s touto barvou. + Práh alfa: + Určuje práh hodnoty alfa, při které bude kvantizovaná barva průhledná. Pokud 0, pak výsledek nebude nikdy průhledný. Pokud 255, pak se za průhledné považují pouze zcela průhledné pixely. + Práh bílé: + Určuje nejnižší vstupní jas, aby výsledná barva byla považována za bílou. Ovlivňuje jas výsledného obrazu. Chybový difuzní dithering však může hodnotu tohoto parametru kompenzovat. + Přímé mapování + Je-li tato možnost zaškrtnuta, kvantizovaná barva se určí přímým mapováním namísto vyhledávání nejbližší položky palety. Urychluje kvantizaci, ale může vést k vyššímu kontrastu. Chybový difuzní dithering však může hodnotu tohoto parametru kompenzovat. + Velikost palety: + Určuje maximální velikost palety pro snímek. + Vlastní bitová úroveň. + Je-li zaškrtnuto, lze bitovou úroveň konfigurovat ručně. ⚠️ Upozornění: Nejvyšší bitová úroveň může vyžadovat hodně paměti! + Vyšší hodnota znamená větší věrnost, rozsáhlejší barevný prostor, pomalejší zpracování a větší spotřebu paměti. Například pokud je hodnota 1, pak výsledek nesmí mít více než 8 barev, nebo pokud je hodnota 2, nesmí mít více než 64 barev. U kvantizerů Octree a Wu to ovlivňuje i maximální počet monochromatických odstínů. Například je-li 5 (což je výchozí hodnota pro kvantizer Wu), lze rozlišit pouze 32 monochromatických odstínů. ⚠️ Pozor: Wu kvantizer spotřebuje při nejvyšší hodnotě nejméně 650 MB. + Černá a bílá + Pevná 1b paleta pouze s černou a bílou barvou. + 4 odstíny šedé + Pevná 2b paleta se 4 odstíny šedé. + 16 odstínů šedé + Pevná 4b paleta s 16 odstíny šedé. + 256 odstínů šedé + Pevná 8b paleta s 256 odstíny šedé. + Výchozí systémová 4b paleta + Pevná 4b paleta se standardními 16 barvami RGB. + Výchozí systémová 8b paleta + Pevná 8b paleta obsahující 'bezpečné' barvy a průhlednost. + RGB 332 paleta + Pevná 8b paleta s barevným prostorem 332 RGB barev. + Octree kvantizer + Optimalizace palety pro každý snímek pomocí algoritmu Octree. + Median Cut kvantizer + Optimalizace palety pro každý snímek pomocí algoritmu Median Cut.. + Wu kvantizer + Optimalizace palety pro každý snímek pomocí algoritmu Xiaolin Wu. + + Rozptyl (dither) + Síla: + Zadejte sílu rozptylu, nebo 0 pro automatickou volbu síly rozptylu. + Zrno: + Pole Náhodné zrno umožňuje vybrat nové zrno pro algoritmus používaný ve dvou metodách náhodného ditheringu. Tlačítko Nové zrno vybere nové náhodné číslo za vás. + Nic + Rámce a kvantizace bez rozptylu. + Smyčkové zpracování + Pokud je zaškrtnuto, bude směr šíření změněn z řádku na řádek. To pomáhá snížit efekt zvlnění při rozptylu. + Bayer 2x2 + Bayerova maska se vzorkem 2x2. + Bayer 3x3 + Bayerova maska se vzorkem 3x3. + Bayer 4x4 + Bayerova maska se vzorkem 4x4. + Bayer 8x8 + Bayerova maska se vzorkem 8x8. + Tečkované polotóny + Maska 8x8 s tečkovanými polotóny. + Modrý šum + Maska 64x64 modrým vzorem. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Nastavení Apng + Predikce: + Žádná + Pod + Nad + Průměr + Smíšená Smyčka Apng. Zjištění nezměněných pixelů. Použít průhlednou barvu na všechny nezměněné pixely. - - Nastavení videa - Fps: - Převrátit video (vertikálně). - Nastavení obrázků - Zazipovat obrázky. - - - - - - - - Doplňky: - - - - - - - - - - - - - - - - + + Předvolby: + Žádná + Výchozí + Obrázek + Fotogragie + Kresba + Ikona + Text + Bezztrátový režim + + + Režim: + Normální + Rozšířený + Způsob konfigurace parametrů kodéru: Normální: používá standardní ovládací prvky uživatelského rozhraní. Pokročilý: pro zadání parametrů používá textové pole. + Kodek: + Kodér videa, který je zodpovědný za převod pixelů snímku do výstupního souboru. + Předvolby: + Žádná + Velmi pomalé + Pomalejší + Pomalé + Střední + Rychlé + Rychlejší + Velmi rychlé + Super rychlé + Ultra rychlé + Kvalita + Vyvážená + Rychlá + Výchozí + Bezztrátová + Bezztrátová (Vysoký výkon) + Vysoký výkon + Vysoká kvalita + Bluray disk + Nízké zpoždění + Nízké zpoždění (Vysoký výkon) + Nízké zpoždění (Vyšší kvalita) + Rychlost kódování k poměru komprese, pomalejší předvolby mohou poskytnout lepší kompresi (menší velikost souboru při zachování kvality). + Speciální hardware: + Vyp. + Zap. + Automatický výběr + Určuje použití speciálního hardwaru (grafické karty). Vypnuto: nepoužívá speciální hardware. Zapnuto: používá vyhrazený hardware a umožňuje vybrat speciální kodéry. Auto: používá vyhrazený hardware a automaticky vybírá správný kodér, pokud je to možné. + Formát pixelů: + Automatický + Vsync: + Metoda synchronizace videa. Auto: volí mezi 1 a 2 v závislosti na možnostech muxeru (formátu). Průchozí: každý snímek je předán kodéru se svými časovými značkami. Konstantní: snímky mohou být duplikovány nebo odstraněny, aby bylo dosaženo přesné snímkové frekvence. Variabilní: snímky jsou předávány se svými časovými razítky nebo odstraněny, aby se zabránilo tomu, že 2 snímky budou mít stejná časová razítka. Drop: stejně jako průchozí, ale zruší všechna časová razítka, takže kodér vygeneruje nová časová razítka na základě snímkové frekvence. + Průchozí + Konstantní framerate + Proměnný framerate + Drop + Framerate: + Film + Vlastní + Průchod: + Konstantní. Nastavení řízení kvality a rychlosti. Pokud tuto vlastnost nechcete nastavovat, nechte ji prázdnou. + Úroveň kvality: + Menší hodnoty znamenají vyšší kvalitu. + Bitrate: + Bitreat ukládaného videa. + Bitrate mód: + Konstantní + Proměnný + Min. bitrate: + Minimální tolerance bitrate (datového toku). Nejužitečnější při použití režimu CBR. Pokud tuto vlastnost nechcete nastavovat, nechte ji prázdnou nebo nastavte nulu. + Max. bitrate: + Maximální tolerance bitrate (datového toku). Vyžaduje nastavení velikosti vyrovnávací paměti. Pokud tuto vlastnost nechcete nastavovat, nechte ji prázdnou nebo nastavte nulu. + Vyrovnávací paměť: + Velikost vyrovnávací paměti. Pokud tuto vlastnost nechcete nastavovat, nechte ji prázdnou nebo nastavte nulu. + + + Zazipovat snímky. + Exportuje snímky do ZIP archivu. + + + Komprese snímků. + Komprimovat obrazová data pomocí algoritmu RLE. + Uložit data časové osy. + Exportuje časování snímků namísto pouhých snímků. + + Možnosti uložení + Částečný export. Uložit soubor do adresáře dle vlastního výběru. - Přepsat (pokud již existuje). + Přepsání: + Zakázat + Jen upozornit, že soubor stejného jména již existuje. + Zeptat se + Dotázat se na přepsání souboru stejného jména. + Povolit + Povolit přepsání bez dotazu či upozornění. Uložit také jako projekt (stejný adresář, stejný název souboru). Přenést soubor. - Přenést cíl. Zkopírovat do schránky Soubor Zkopírovat výstupní soubor do schránky. @@ -1339,9 +1827,30 @@ Po kódování provést zapsané příkazy. Zadejte příkazy, které mají být provedeny po kódování. Po spuštění více příkazů, zadejte každý na samostatný řádek. Makra: {p} = Cesta výstupního souboru. {f} = Cesta výstupní složky. {u} = URL of the uploaded file. - + + Částečný export + Režim: + Vyberte metodu částečného exportu. + Výraz + Exportuje části animace na základě jednoduchého výrazu. + Rozsah snímků + Exportuje pouze část animace - ve zvoleném rozsahu snímků. + Časový rozsah + Exportuje pouze část animace - ve zvoleném časovém rozsahu. + Výběr + Exportuje pouze část animace - vybrané snímky. + Není vybrán žádný snímek. + 1 snímek vybrán. + {0} snímků vybráno. + Od: + Do: + Výraz: + Zadejte čísla snímků oddělená čárkou nebo sekvence snímků oddělené znaménkem minus: 1, 3, 4, 6 - 9 + + Soubor Cílová složka. + Vybrat cílovou složku Vybrat umístění. Formát souboru Název souboru. Vložte formát data a času mezi '?' @@ -1350,55 +1859,92 @@ Snížit číslo souboru Soubor se stejným názvem již existuje. Uložit do schránky. - Vyberte místo, kam chcete soubor uložit (do adresáře, do schránky nebo přeneste někam jinam). + + + Vyberte místo, kam chcete soubor uložit (do složky, do schránky, nebo někam jinam). + Nevybrali jste příponu souboru. + Při výběru rozšířeného režimu je třeba zadat parametry do pole. + V poli parametrů chybí speciální parametry {I} (vstup) a/nebo {O} (výstup). Pro provedení příkazů je třeba napsat něco do textového pole pro příkazy. + Pokud chcete exportovat pouze vybrané snímky, musíte vybrat alespoň jeden snímek. + Příkaz k částečnému exportu projektu je neplatný. Nebyla vybrána žádná služba pro přenos. Vyberte cíl. - Nelze přenést na vybranou službu, jelikož nebyla povolena. Přejděte do Nastavení > Přenos dat a povolte tuto aplikaci. + Nelze přenést na vybranou službu, jelikož nebyla povolena. Přejděte do Nastavení > Odesílání dat a povolte tuto aplikaci. Nelze vybrat možnost kopírování odkazu, jelikož nebyl nastaven soubor pro přenos. Vyberte výstupní adresář. Výstupní adresář neexistuje. Výstupní adresář obsahuje neplatné znaky. Prosím, zvolte platný adresář. Vyberte název souboru. Název výstupního souboru obsahuje neplatné znaky. Prosím, zvolte platný název souboru. - Název souboru již existuje. Nastavte možnost přepsání nebo vyberte jiný název souboru. - - - + Název souboru již existuje. Povolte možnost přepsání nebo vyberte jiný název souboru. + Název projektu již existuje. Povolte možnost přepsání nebo vyberte jiný název souboru. + Operace byla ukončena. + + + Odeslání + Vyberte předvolbu, která obsahuje podrobnosti o službě používané pro odesílání. + Tato služba odesílání dat má svá omezení. + Přidání nové předvolby pro odesílání. + Upravit nastavení předvolby odesílání. + Zobrazit historii odesílání pomocí této předvolby. + Odstranění aktuálně vybrané předvolby odesílání. + Výběr předvolby pro odesílání + Vyberte si jednu z těchto položek. + Pro tento formát není k dispozici předvolba odesílání + Přidejte předvolbu pomocí tlačítka níže. + + + Odstranění předvolby pro odesílání + Jste si jisti, že chcete předvolbu pro odesílání odstranit? + Tuto akci nelze vrátit zpět. Chcete odstranit vybranou předvolbu odesílání? + + Export snímků Opravdu chcete exportovat snímky? Tato akce provede export {0} snímků přímo do vybraného adresáře. + Přepsat + Chcete tento soubor přepsat? + V této složce již existuje soubor s názvem '{0}'.\r\nChcete jej přepsat? + Chcete tyto soubory přepsat? + V této složce již existuje soubor nebo soubory se stejným názvem.\r\nChcete je přepsat? + + + Prohlížeč příkazů + Příkaz + Cesta vstupu + Cesta výstupu Zpětná vazba Odeslat - + Náhled Odeslat zpětnou vazbu Předmět * Zpráva * - + Pokud budete hlásit chybu, nezapomeňte vysvětlit, jak k ní došlo, krok za krokem. Typ zpětné vazby Návrh Problém/Chyba Váš email (volitelně) Uveďte předmět zpětné vazby. Zadejte zprávu zpětné vazby. - + Chcete-li obdržet odpověď od vývojáře, musíte zadat svůj e-mail. Probíhá odesílání na pozadí... Toto okno bude brzy zavřeno. Přílohy (volitelné, 20MB maximálně) Přidat přílohy Odstranit všechny přílohy - Rozumím anglicky. - a portugalsky (brazilská a evropská). - + Rozumím anglicky + a portugalsky (brazilské a evropské nářečí). + Toto budete posílat, plus všechny přílohy. - - - - - - - + Problémy? + Nevidíte nějaké okno? + Pokud některé z oken nevidíte (je mimo obrazovku), pomocí níže uvedených možností obnovte jeho pozici. + Zde je uvedeno, kde se v současné době nacházejí jednotlivá okna: + Zde je uvedeno, kde se příště otevřou jednotlivá okna: + Přesunout všechna okna na hlavní obrazovku. + Obnovení startovní pozice všech oken. Obyčejné @@ -1424,10 +1970,10 @@ Ultra tenké - Dolů + Nahoru Na střed - Nahoru - Roztáhnutí + Dolů + Roztáhnout Vlevo @@ -1437,4 +1983,17 @@ Vodorovně Svisle + + + Vlevo + Vpravo + Na střed + Na oba okraje + + + Žádné + Podtržení + Přeškrtnutí + Horní linka + Dolní linka \ No newline at end of file From 64c19a17dd8ee97e701b46e91622a40bd0bfd17f Mon Sep 17 00:00:00 2001 From: Nicke Manarin Date: Mon, 4 Dec 2023 15:31:27 -0300 Subject: [PATCH 6/9] Version bump --- ScreenToGif.Model/ScreenToGif.Domain.csproj | 2 +- ScreenToGif.Native/ScreenToGif.Native.csproj | 2 +- ScreenToGif.Util/ScreenToGif.Util.csproj | 2 +- ScreenToGif.ViewModel/ScreenToGif.ViewModel.csproj | 2 +- ScreenToGif/ScreenToGif.csproj | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ScreenToGif.Model/ScreenToGif.Domain.csproj b/ScreenToGif.Model/ScreenToGif.Domain.csproj index ed2a83eb..f3786399 100644 --- a/ScreenToGif.Model/ScreenToGif.Domain.csproj +++ b/ScreenToGif.Model/ScreenToGif.Domain.csproj @@ -6,7 +6,7 @@ embedded True AnyCPU;ARM64;x64;x86 - 2.38.1 + 2.40.0 true diff --git a/ScreenToGif.Native/ScreenToGif.Native.csproj b/ScreenToGif.Native/ScreenToGif.Native.csproj index 81e6e892..258f2cec 100644 --- a/ScreenToGif.Native/ScreenToGif.Native.csproj +++ b/ScreenToGif.Native/ScreenToGif.Native.csproj @@ -6,7 +6,7 @@ True embedded AnyCPU;ARM64;x64;x86 - 2.38.1 + 2.40.0 7.0 diff --git a/ScreenToGif.Util/ScreenToGif.Util.csproj b/ScreenToGif.Util/ScreenToGif.Util.csproj index e6550480..f6dac7f7 100644 --- a/ScreenToGif.Util/ScreenToGif.Util.csproj +++ b/ScreenToGif.Util/ScreenToGif.Util.csproj @@ -5,7 +5,7 @@ True embedded AnyCPU;ARM64;x64;x86 - 2.38.1 + 2.40.0 7.0 diff --git a/ScreenToGif.ViewModel/ScreenToGif.ViewModel.csproj b/ScreenToGif.ViewModel/ScreenToGif.ViewModel.csproj index 3876c7a4..68db0b5b 100644 --- a/ScreenToGif.ViewModel/ScreenToGif.ViewModel.csproj +++ b/ScreenToGif.ViewModel/ScreenToGif.ViewModel.csproj @@ -5,7 +5,7 @@ disable embedded AnyCPU;ARM64;x64;x86 - 2.38.1 + 2.40.0 7.0 diff --git a/ScreenToGif/ScreenToGif.csproj b/ScreenToGif/ScreenToGif.csproj index a23c114a..d17f4260 100644 --- a/ScreenToGif/ScreenToGif.csproj +++ b/ScreenToGif/ScreenToGif.csproj @@ -141,7 +141,7 @@ OnBuildSuccess Nicke Manarin Nicke Manarin - 2.39.0 + 2.40.0 Copyright© Nicke Manarin 2023 https://www.screentogif.com Readme.md From e95da2a28cc0b0eb5324e13b496fd3bc89a5a7bf Mon Sep 17 00:00:00 2001 From: Nicke Manarin Date: Mon, 4 Dec 2023 21:46:11 -0300 Subject: [PATCH 7/9] Small fix for colection modified error. --- ScreenToGif.Util/Arguments.cs | 2 +- ScreenToGif/Windows/Editor.xaml.cs | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/ScreenToGif.Util/Arguments.cs b/ScreenToGif.Util/Arguments.cs index 3412ee7f..26b22a7c 100644 --- a/ScreenToGif.Util/Arguments.cs +++ b/ScreenToGif.Util/Arguments.cs @@ -17,7 +17,7 @@ public static class Arguments /// The path of the files passed as arguments to this executable. /// Only files that exists are not ignored. /// - public static List FileNames { get; set; } = new List(); + public static List FileNames { get; set; } = new(); /// /// True if this instance should not try to display anything, besides the download window. diff --git a/ScreenToGif/Windows/Editor.xaml.cs b/ScreenToGif/Windows/Editor.xaml.cs index f2785850..d60f7ddf 100644 --- a/ScreenToGif/Windows/Editor.xaml.cs +++ b/ScreenToGif/Windows/Editor.xaml.cs @@ -53,6 +53,7 @@ using ScreenToGif.ViewModel.ExportPresets; using ScreenToGif.ViewModel.ExportPresets.Image; using ScreenToGif.ViewModel.ExportPresets.Other; +using System.Collections.Immutable; namespace ScreenToGif.Windows { @@ -3257,7 +3258,7 @@ private void InkCanvas_PreviewKeyDown(object sender, KeyEventArgs e) internal async void LoadFromArguments() { - if (!Arguments.FileNames.Any()) + if (Arguments.FileNames.Count < 1) return; #region Validation @@ -3285,7 +3286,7 @@ internal async void LoadFromArguments() #endregion - await Task.Run(() => ImportFrom(Arguments.FileNames)); + await Task.Run(() => ImportFrom(Arguments.FileNames.ToImmutableList())); ClosePanel(removeEvent: true); CommandManager.InvalidateRequerySuggested(); @@ -3874,7 +3875,7 @@ private List InsertInternal(string fileName, string pathTemp, ref Siz return listFrames; } - private bool ImportFrom(List fileList) + private bool ImportFrom(IList fileList) { #region Disable UI @@ -4083,7 +4084,8 @@ private List ImportFromProject(string source, string pathTemp) { var ser = new DataContractJsonSerializer(typeof(ProjectInfo)); var project = ser.ReadObject(ms) as ProjectInfo; - list = project.Frames; + + list = project?.Frames; } } else From 5313936f39b4983031280f563c75a6707a52e34f Mon Sep 17 00:00:00 2001 From: Nicke Manarin Date: Tue, 5 Dec 2023 07:58:33 -0300 Subject: [PATCH 8/9] Fixed frame selection ordering with Ctrl + A Using Ctrl + A to select all frames with a previous selection was keeping the previous selection in the first position of the selected list, which would affect all other operations (copy for example). --- ScreenToGif/Windows/Editor.xaml.cs | 1 + ScreenToGif/Windows/Other/VideoSource.xaml.cs | 3 +++ 2 files changed, 4 insertions(+) diff --git a/ScreenToGif/Windows/Editor.xaml.cs b/ScreenToGif/Windows/Editor.xaml.cs index d60f7ddf..d779da00 100644 --- a/ScreenToGif/Windows/Editor.xaml.cs +++ b/ScreenToGif/Windows/Editor.xaml.cs @@ -1390,6 +1390,7 @@ private void SelectAll_Executed(object sender, ExecutedRoutedEventArgs e) { Pause(); + FrameListView.UnselectAll(); FrameListView.SelectAll(); ShowHint("S.Hint.SelectAll"); diff --git a/ScreenToGif/Windows/Other/VideoSource.xaml.cs b/ScreenToGif/Windows/Other/VideoSource.xaml.cs index e71c51ce..d743fc1a 100644 --- a/ScreenToGif/Windows/Other/VideoSource.xaml.cs +++ b/ScreenToGif/Windows/Other/VideoSource.xaml.cs @@ -853,6 +853,9 @@ private async Task GetMultipleScreencaps() await _process.WaitForExitAsync(); + if (_process == null) + return; + var error = await _process?.StandardError?.ReadToEndAsync(); if (!string.IsNullOrWhiteSpace(error)) From 20eae10f85242b96681ffe6d526e95277f5ca6f5 Mon Sep 17 00:00:00 2001 From: Nicke Manarin Date: Tue, 5 Dec 2023 14:36:38 -0300 Subject: [PATCH 9/9] Fixed border color for recorders. --- ScreenToGif/Themes/Colors/Dark.xaml | 3 +-- ScreenToGif/Themes/Colors/Light.xaml | 3 +-- ScreenToGif/Themes/Colors/Medium.xaml | 3 +-- ScreenToGif/Themes/Colors/VeryDark.xaml | 3 +-- ScreenToGif/Themes/Generic.xaml | 2 +- ScreenToGif/Windows/Board.xaml | 2 +- ScreenToGif/Windows/NewRecorder.xaml | 4 ++-- 7 files changed, 8 insertions(+), 12 deletions(-) diff --git a/ScreenToGif/Themes/Colors/Dark.xaml b/ScreenToGif/Themes/Colors/Dark.xaml index 73716c03..90d31db1 100644 --- a/ScreenToGif/Themes/Colors/Dark.xaml +++ b/ScreenToGif/Themes/Colors/Dark.xaml @@ -1,4 +1,4 @@ - @@ -47,7 +47,6 @@ - diff --git a/ScreenToGif/Themes/Colors/Light.xaml b/ScreenToGif/Themes/Colors/Light.xaml index f8b96005..09c7fc58 100644 --- a/ScreenToGif/Themes/Colors/Light.xaml +++ b/ScreenToGif/Themes/Colors/Light.xaml @@ -1,4 +1,4 @@ - @@ -47,7 +47,6 @@ - diff --git a/ScreenToGif/Themes/Colors/Medium.xaml b/ScreenToGif/Themes/Colors/Medium.xaml index a7057af8..1d208232 100644 --- a/ScreenToGif/Themes/Colors/Medium.xaml +++ b/ScreenToGif/Themes/Colors/Medium.xaml @@ -1,4 +1,4 @@ - @@ -47,7 +47,6 @@ - diff --git a/ScreenToGif/Themes/Colors/VeryDark.xaml b/ScreenToGif/Themes/Colors/VeryDark.xaml index b30f80fc..22dfc0f1 100644 --- a/ScreenToGif/Themes/Colors/VeryDark.xaml +++ b/ScreenToGif/Themes/Colors/VeryDark.xaml @@ -1,4 +1,4 @@ - @@ -47,7 +47,6 @@ - diff --git a/ScreenToGif/Themes/Generic.xaml b/ScreenToGif/Themes/Generic.xaml index a1ff38c1..a0b74e48 100644 --- a/ScreenToGif/Themes/Generic.xaml +++ b/ScreenToGif/Themes/Generic.xaml @@ -42,7 +42,7 @@ - + diff --git a/ScreenToGif/Windows/Board.xaml b/ScreenToGif/Windows/Board.xaml index b5da971f..c36450d5 100644 --- a/ScreenToGif/Windows/Board.xaml +++ b/ScreenToGif/Windows/Board.xaml @@ -177,7 +177,7 @@ - + diff --git a/ScreenToGif/Windows/NewRecorder.xaml b/ScreenToGif/Windows/NewRecorder.xaml index 3549f53e..a7e375ff 100644 --- a/ScreenToGif/Windows/NewRecorder.xaml +++ b/ScreenToGif/Windows/NewRecorder.xaml @@ -67,8 +67,8 @@ - - + +