#region License Information (GPL v3) /* ShareX - A program that allows you to take screenshots and share any file type Copyright (c) 2007-2017 ShareX Team This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Optionally you can also view the license at . */ #endregion License Information (GPL v3) using Newtonsoft.Json; using ShareX.HelpersLib; using ShareX.ImageEffectsLib; using ShareX.IndexerLib; using ShareX.MediaLib; using ShareX.ScreenCaptureLib; using ShareX.UploadersLib; using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing; using System.Drawing.Design; using System.Linq; namespace ShareX { public class TaskSettings { [JsonIgnore] public TaskSettings TaskSettingsReference { get; private set; } public string Description = ""; public HotkeyType Job = HotkeyType.None; public bool UseDefaultAfterCaptureJob = true; public AfterCaptureTasks AfterCaptureJob = AfterCaptureTasks.CopyImageToClipboard | AfterCaptureTasks.SaveImageToFile | AfterCaptureTasks.UploadImageToHost; public bool UseDefaultAfterUploadJob = true; public AfterUploadTasks AfterUploadJob = AfterUploadTasks.CopyURLToClipboard; public bool UseDefaultDestinations = true; public ImageDestination ImageDestination = ImageDestination.Imgur; public FileDestination ImageFileDestination = FileDestination.Dropbox; public TextDestination TextDestination = TextDestination.Pastebin; public FileDestination TextFileDestination = FileDestination.Dropbox; public FileDestination FileDestination = FileDestination.Dropbox; public UrlShortenerType URLShortenerDestination = UrlShortenerType.BITLY; public URLSharingServices URLSharingServiceDestination = URLSharingServices.Twitter; public bool OverrideFTP = false; public int FTPIndex = 0; public bool OverrideCustomUploader = false; public int CustomUploaderIndex = 0; public bool UseDefaultGeneralSettings = true; public TaskSettingsGeneral GeneralSettings = new TaskSettingsGeneral(); public bool UseDefaultImageSettings = true; public TaskSettingsImage ImageSettings = new TaskSettingsImage(); [JsonIgnore] public TaskSettingsImage ImageSettingsReference { get { if (UseDefaultImageSettings) { return Program.DefaultTaskSettings.ImageSettings; } return TaskSettingsReference.ImageSettings; } } public bool UseDefaultCaptureSettings = true; public TaskSettingsCapture CaptureSettings = new TaskSettingsCapture(); [JsonIgnore] public TaskSettingsCapture CaptureSettingsReference { get { if (UseDefaultCaptureSettings) { return Program.DefaultTaskSettings.CaptureSettings; } return TaskSettingsReference.CaptureSettings; } } public bool UseDefaultUploadSettings = true; public TaskSettingsUpload UploadSettings = new TaskSettingsUpload(); public bool UseDefaultActions = true; public List ExternalPrograms = new List(); public bool UseDefaultToolsSettings = true; public TaskSettingsTools ToolsSettings = new TaskSettingsTools(); [JsonIgnore] public TaskSettingsTools ToolsSettingsReference { get { if (UseDefaultToolsSettings) { return Program.DefaultTaskSettings.ToolsSettings; } return TaskSettingsReference.ToolsSettings; } } public bool UseDefaultAdvancedSettings = true; public TaskSettingsAdvanced AdvancedSettings = new TaskSettingsAdvanced(); public bool WatchFolderEnabled = false; public List WatchFolderList = new List(); public override string ToString() { return !string.IsNullOrEmpty(Description) ? Description : Job.GetLocalizedDescription(); } public bool IsUsingDefaultSettings { get { return UseDefaultAfterCaptureJob && UseDefaultAfterUploadJob && UseDefaultDestinations && !OverrideFTP && !OverrideCustomUploader && UseDefaultGeneralSettings && UseDefaultImageSettings && UseDefaultCaptureSettings && UseDefaultUploadSettings && UseDefaultActions && UseDefaultToolsSettings && UseDefaultAdvancedSettings && !WatchFolderEnabled; } } public string CaptureFolder { get { if (!string.IsNullOrEmpty(AdvancedSettings.CapturePath)) { return Helpers.ExpandFolderVariables(AdvancedSettings.CapturePath); } return Program.ScreenshotsFolder; } } public static TaskSettings GetDefaultTaskSettings() { TaskSettings taskSettings = new TaskSettings(); taskSettings.SetDefaultSettings(); taskSettings.TaskSettingsReference = Program.DefaultTaskSettings; return taskSettings; } public static TaskSettings GetSafeTaskSettings(TaskSettings taskSettings) { TaskSettings safeTaskSettings; if (taskSettings.IsUsingDefaultSettings && Program.DefaultTaskSettings != null) { safeTaskSettings = Program.DefaultTaskSettings.Copy(); safeTaskSettings.Description = taskSettings.Description; safeTaskSettings.Job = taskSettings.Job; } else { safeTaskSettings = taskSettings.Copy(); safeTaskSettings.SetDefaultSettings(); } safeTaskSettings.TaskSettingsReference = taskSettings; return safeTaskSettings; } private void SetDefaultSettings() { if (Program.DefaultTaskSettings != null) { TaskSettings defaultTaskSettings = Program.DefaultTaskSettings.Copy(); if (UseDefaultAfterCaptureJob) { AfterCaptureJob = defaultTaskSettings.AfterCaptureJob; } if (UseDefaultAfterUploadJob) { AfterUploadJob = defaultTaskSettings.AfterUploadJob; } if (UseDefaultDestinations) { ImageDestination = defaultTaskSettings.ImageDestination; ImageFileDestination = defaultTaskSettings.ImageFileDestination; TextDestination = defaultTaskSettings.TextDestination; TextFileDestination = defaultTaskSettings.TextFileDestination; FileDestination = defaultTaskSettings.FileDestination; URLShortenerDestination = defaultTaskSettings.URLShortenerDestination; URLSharingServiceDestination = defaultTaskSettings.URLSharingServiceDestination; } if (UseDefaultGeneralSettings) { GeneralSettings = defaultTaskSettings.GeneralSettings; } if (UseDefaultImageSettings) { ImageSettings = defaultTaskSettings.ImageSettings; } if (UseDefaultCaptureSettings) { CaptureSettings = defaultTaskSettings.CaptureSettings; } if (UseDefaultUploadSettings) { UploadSettings = defaultTaskSettings.UploadSettings; } if (UseDefaultActions) { ExternalPrograms = defaultTaskSettings.ExternalPrograms; } if (UseDefaultToolsSettings) { ToolsSettings = defaultTaskSettings.ToolsSettings; } if (UseDefaultAdvancedSettings) { AdvancedSettings = defaultTaskSettings.AdvancedSettings; } } } public FileDestination GetFileDestinationByDataType(EDataType dataType) { switch (dataType) { case EDataType.Image: return ImageFileDestination; case EDataType.Text: return TextFileDestination; default: case EDataType.File: return FileDestination; } } } public class TaskSettingsGeneral { public bool PlaySoundAfterCapture = true; public bool ShowAfterCaptureTasksForm = false; public bool ShowBeforeUploadForm = false; public bool PlaySoundAfterUpload = true; public PopUpNotificationType PopUpNotification = PopUpNotificationType.ToastNotification; public bool ShowAfterUploadForm = false; } public class TaskSettingsImage { #region Image / General public EImageFormat ImageFormat = EImageFormat.PNG; public PNGBitDepth ImagePNGBitDepth = PNGBitDepth.Default; public int ImageJPEGQuality = 90; public GIFQuality ImageGIFQuality = GIFQuality.Default; public bool ImageAutoUseJPEG = true; public int ImageAutoUseJPEGSize = 2048; public FileExistAction FileExistAction = FileExistAction.Ask; #endregion Image / General #region Image / Effects public List ImageEffectPresets = new List() { ImageEffectPreset.GetDefaultPreset() }; public int SelectedImageEffectPreset = 0; public bool ShowImageEffectsWindowAfterCapture = false; public bool ImageEffectOnlyRegionCapture = false; #endregion Image / Effects #region Image / Thumbnail public int ThumbnailWidth = 200; public int ThumbnailHeight = 0; public string ThumbnailName = "-thumbnail"; public bool ThumbnailCheckSize = false; #endregion Image / Thumbnail } public class TaskSettingsCapture { #region Capture / General public bool ShowCursor = true; public bool CaptureTransparent = false; public bool CaptureShadow = true; public int CaptureShadowOffset = 20; public bool CaptureClientArea = false; public bool IsDelayScreenshot = false; public decimal DelayScreenshot = 2.0m; public bool CaptureAutoHideTaskbar = false; public Rectangle CaptureCustomRegion = new Rectangle(0, 0, 0, 0); #endregion Capture / General #region Capture / Region capture public RegionCaptureOptions SurfaceOptions = new RegionCaptureOptions(); #endregion Capture / Region capture #region Capture / Screen recorder public FFmpegOptions FFmpegOptions = new FFmpegOptions(Program.DefaultFFmpegFilePath); public int ScreenRecordFPS = 30; public int GIFFPS = 15; public bool ScreenRecordShowCursor = true; public bool ScreenRecordAutoStart = true; public float ScreenRecordStartDelay = 0f; public bool ScreenRecordFixedDuration = false; public float ScreenRecordDuration = 3f; public bool RunScreencastCLI = false; public int VideoEncoderSelected = 0; #endregion Capture / Screen recorder #region Capture / Scrolling capture public ScrollingCaptureOptions ScrollingCaptureOptions = new ScrollingCaptureOptions(); #endregion Capture / Scrolling capture } public class TaskSettingsUpload { #region Upload public bool UseCustomTimeZone = false; public TimeZoneInfo CustomTimeZone = TimeZoneInfo.Utc; public string NameFormatPattern = "%y-%mo-%d_%h-%mi-%s"; public string NameFormatPatternActiveWindow = "%pn_%y-%mo-%d_%h-%mi-%s"; public bool RegionCaptureUseWindowPattern = true; public bool FileUploadUseNamePattern = false; #endregion Upload #region Upload / Clipboard upload public bool ClipboardUploadURLContents = false; public bool ClipboardUploadShortenURL = false; public bool ClipboardUploadShareURL = false; public bool ClipboardUploadAutoIndexFolder = false; #endregion Upload / Clipboard upload public List UploaderFilters = new List(); } public class TaskSettingsTools { public string ScreenColorPickerFormat = "$r, $g, $b"; public IndexerSettings IndexerSettings = new IndexerSettings(); public ImageCombinerOptions ImageCombinerOptions = new ImageCombinerOptions(); public VideoThumbnailOptions VideoThumbnailOptions = new VideoThumbnailOptions(); } public class TaskSettingsAdvanced { [Category("General"), DefaultValue(false), Description("Allow after capture tasks for image files by loading them as bitmap when files are handled during file upload, clipboard file upload, drag && drop file upload, watch folder and other image file tasks.")] public bool ProcessImagesDuringFileUpload { get; set; } [Category("General"), DefaultValue(false), Description("Use after capture tasks for clipboard image upload.")] public bool ProcessImagesDuringClipboardUpload { get; set; } [Category("General"), DefaultValue(true), Description("Allows file related after capture tasks (\"Perform actions\", \"Copy file to clipboard\" etc.) to be used when doing file upload.")] public bool UseAfterCaptureTasksDuringFileUpload { get; set; } [Category("General"), DefaultValue(true), Description("Save text as file for tasks such as clipboard text upload, drag and drop text upload, index folder etc.")] public bool TextTaskSaveAsFile { get; set; } [Category("General"), DefaultValue(false), Description("If task contains upload job then this setting will clear clipboard when task start.")] public bool AutoClearClipboard { get; set; } [Category("General"), DefaultValue(true), Description("Use built-in region capture annotation to annotate images instead of Greenshot image editor.")] public bool UseShareXForAnnotation { get; set; } [Category("Sound"), DefaultValue(false), Description("Enable/disable custom capture sound.")] public bool UseCustomCaptureSound { get; set; } [Category("Sound"), DefaultValue(""), Description("Capture sound file path."), Editor(typeof(WavFileNameEditor), typeof(UITypeEditor))] public string CustomCaptureSoundPath { get; set; } [Category("Sound"), DefaultValue(""), Description("If this text is not empty then when the screen is captured text to speech engine will say the phrase entered instead of playing the default sound.")] public string SpeechCapture { get; set; } [Category("Sound"), DefaultValue(false), Description("Enable/disable custom task complete sound.")] public bool UseCustomTaskCompletedSound { get; set; } [Category("Sound"), DefaultValue(""), Description("Task complete sound file path."), Editor(typeof(WavFileNameEditor), typeof(UITypeEditor))] public string CustomTaskCompletedSoundPath { get; set; } [Category("Sound"), DefaultValue(""), Description("If this text is not empty then when a task is completed text to speech engine will say the phrase entered instead of playing the default sound.")] public string SpeechTaskCompleted { get; set; } [Category("Sound"), DefaultValue(false), Description("Enable/disable custom error sound.")] public bool UseCustomErrorSound { get; set; } [Category("Sound"), DefaultValue(""), Description("Error sound file path."), Editor(typeof(WavFileNameEditor), typeof(UITypeEditor))] public string CustomErrorSoundPath { get; set; } [Category("Paths"), Description("Custom capture path takes precedence over path configured in Application configuration."), Editor(typeof(DirectoryNameEditor), typeof(UITypeEditor))] public string CapturePath { get; set; } [Category("Capture"), DefaultValue(false), Description("Disable annotation support in region capture.")] public bool RegionCaptureDisableAnnotation { get; set; } [Category("Upload"), Description("Files with these file extensions will be uploaded using image uploader."), Editor("System.Windows.Forms.Design.StringCollectionEditor,System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))] public List ImageExtensions { get; set; } [Category("Upload"), DefaultValue(false), Description("Copy URL before start upload. Only works for FTP, FTPS, SFTP and Dropbox public URLs.")] public bool EarlyCopyURL { get; set; } [Category("Upload"), Description("Files with these file extensions will be uploaded using text uploader."), Editor("System.Windows.Forms.Design.StringCollectionEditor,System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))] public List TextExtensions { get; set; } [Category("After upload"), DefaultValue(false), Description("If result URL starts with \"http://\" then replace it with \"https://\".")] public bool ResultForceHTTPS { get; set; } [Category("After upload"), DefaultValue("$result"), Description("Clipboard content format after uploading. Supported variables: $result, $url, $shorturl, $thumbnailurl, $deletionurl, $filepath, $filename, $filenamenoext, $folderpath, $foldername, $uploadtime and other variables such as %y-%mo-%d etc.")] public string ClipboardContentFormat { get; set; } [Category("After upload"), DefaultValue("$result"), Description("Balloon tip content format after uploading. Supported variables: $result, $url, $shorturl, $thumbnailurl, $deletionurl, $filepath, $filename, $filenamenoext, $folderpath, $foldername, $uploadtime and other variables such as %y-%mo-%d etc.")] public string BalloonTipContentFormat { get; set; } [Category("After upload"), DefaultValue("$result"), Description("After upload task \"Open URL\" format. Supported variables: $result, $url, $shorturl, $thumbnailurl, $deletionurl, $filepath, $filename, $filenamenoext, $folderpath, $foldername, $uploadtime and other variables such as %y-%mo-%d etc.")] public string OpenURLFormat { get; set; } [Category("After upload"), DefaultValue(0), Description("Automatically shorten URL if the URL is longer than the specified number of characters. 0 means automatic URL shortening is not active.")] public int AutoShortenURLLength { get; set; } private float toastWindowDuration; [Category("After upload / Notifications"), DefaultValue(3f), Description("Specify how long should toast notification window will stay on screen (in seconds).")] public float ToastWindowDuration { get { return toastWindowDuration; } set { toastWindowDuration = value.Between(0, 30); } } private float toastWindowFadeDuration; [Category("After upload / Notifications"), DefaultValue(1f), Description("After toast window duration end, toast window will start fading, specify duration of this fade animation (in seconds).")] public float ToastWindowFadeDuration { get { return toastWindowFadeDuration; } set { toastWindowFadeDuration = value.Between(0, 30); } } [Category("After upload / Notifications"), DefaultValue(ContentAlignment.BottomRight), Description("Specify where should toast notification window appear on the screen.")] public ContentAlignment ToastWindowPlacement { get; set; } [Category("After upload / Notifications"), DefaultValue(ToastClickAction.OpenUrl), Description("Specify action after toast notification window is left clicked."), TypeConverter(typeof(EnumDescriptionConverter))] public ToastClickAction ToastWindowClickAction { get; set; } private Size toastWindowSize; [Category("After upload / Notifications"), DefaultValue(typeof(Size), "400, 300"), Description("Maximum toast notification window size.")] public Size ToastWindowSize { get { return toastWindowSize; } set { toastWindowSize = new Size(Math.Max(value.Width, 100), Math.Max(value.Height, 100)); } } [Category("After upload"), DefaultValue(false), Description("After upload form will be automatically closed after 60 seconds.")] public bool AutoCloseAfterUploadForm { get; set; } [Category("Interaction"), DefaultValue(false), Description("Disable notifications.")] public bool DisableNotifications { get; set; } [Category("Upload text"), DefaultValue("txt"), Description("File extension when saving text to the local hard disk.")] public string TextFileExtension { get; set; } [Category("Upload text"), DefaultValue("text"), Description("Text format e.g. csharp, cpp, etc.")] public string TextFormat { get; set; } [Category("Upload text"), DefaultValue(""), Description("Custom text input. Use %input for text input. Example you can create web page with your text in it."), Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))] public string TextCustom { get; set; } [Category("Upload text"), DefaultValue(true), Description("HTML encode custom text input.")] public bool TextCustomEncodeInput { get; set; } [Category("Name pattern"), DefaultValue(100), Description("Maximum name pattern length for file name.")] public int NamePatternMaxLength { get; set; } [Category("Name pattern"), DefaultValue(50), Description("Maximum name pattern title (%t) length for file name.")] public int NamePatternMaxTitleLength { get; set; } public TaskSettingsAdvanced() { this.ApplyDefaultPropertyValues(); ImageExtensions = Helpers.ImageFileExtensions.ToList(); TextExtensions = Helpers.TextFileExtensions.ToList(); } } }